diff --git a/app/Providers/QueryListenProvider.php b/app/Providers/QueryListenProvider.php new file mode 100644 index 000000000..7ffdead0f --- /dev/null +++ b/app/Providers/QueryListenProvider.php @@ -0,0 +1,25 @@ +sql, [$query->time]); + }); + + $this->app['router']->aliasMiddleware('clockwork', ClockworkMiddleware::class); + } +} diff --git a/composer.json b/composer.json index 76a932a9d..c8029d6bb 100644 --- a/composer.json +++ b/composer.json @@ -35,6 +35,10 @@ { "type": "vcs", "url": "https://github.com/sandesh556/pdf-laravel5.git" + }, + { + "type": "vcs", + "url": "https://github.com/ladybirdweb/clockwork.git" } ], "require": { @@ -70,7 +74,8 @@ "unisharp/laravel-ckeditor": "dev-master", "thomaswelton/laravel-gravatar": "dev-master", "symfony/mailgun-mailer": "^6.2", - "symfony/http-client": "^6.2" + "symfony/http-client": "^6.2", + "itsgoingd/clockwork": "dev-master" }, "require-dev": { "phpunit/phpunit": "^9.5.10", @@ -81,9 +86,10 @@ "nunomaduro/collision": "^6.3", "mockery/mockery": "^1.4.4", "fakerphp/faker": "^1.9.1", - "barryvdh/laravel-debugbar": "^3.7", + "barryvdh/laravel-debugbar": "^3.8", "spatie/laravel-ignition": "^1.4", - "laravel/pint": "^1.4" + "laravel/pint": "^1.4", + "beyondcode/laravel-query-detector": "^1.7" }, "autoload": { "classmap": [ diff --git a/composer.lock b/composer.lock index 198b4400b..d8cf50e2a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "de4b83b369c705c49ee38aa8f3984384", + "content-hash": "ec936e44c27edb7acd9fdd54c2266a10", "packages": [ { "name": "aws/aws-crt-php", @@ -2558,6 +2558,73 @@ ], "time": "2022-05-21T17:30:32+00:00" }, + { + "name": "itsgoingd/clockwork", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ladybirdweb/clockwork.git", + "reference": "e29be8125ce999947d60986dcd8e606c04c012ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ladybirdweb/clockwork/zipball/e29be8125ce999947d60986dcd8e606c04c012ab", + "reference": "e29be8125ce999947d60986dcd8e606c04c012ab", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Clockwork\\Support\\Laravel\\ClockworkServiceProvider" + ], + "aliases": { + "Clockwork": "Clockwork\\Support\\Laravel\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "Clockwork\\": "Clockwork/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "itsgoingd", + "email": "itsgoingd@luzer.sk", + "homepage": "https://twitter.com/itsgoingd" + } + ], + "description": "php dev tools in your browser", + "homepage": "https://underground.works/clockwork", + "keywords": [ + "debugging", + "devtools", + "laravel", + "logging", + "lumen", + "profiling", + "slim" + ], + "support": { + "source": "https://github.com/ladybirdweb/clockwork/tree/master" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/itsgoingd" + } + ], + "time": "2023-04-14T10:39:18+00:00" + }, { "name": "laravel/framework", "version": "v9.52.0", @@ -10063,30 +10130,30 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.7.0", + "version": "v3.8.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "3372ed65e6d2039d663ed19aa699956f9d346271" + "reference": "eb01216141e62433178c52b0cbdb785b45bae871" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3372ed65e6d2039d663ed19aa699956f9d346271", - "reference": "3372ed65e6d2039d663ed19aa699956f9d346271", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/eb01216141e62433178c52b0cbdb785b45bae871", + "reference": "eb01216141e62433178c52b0cbdb785b45bae871", "shasum": "" }, "require": { - "illuminate/routing": "^7|^8|^9", - "illuminate/session": "^7|^8|^9", - "illuminate/support": "^7|^8|^9", + "illuminate/routing": "^9|^10", + "illuminate/session": "^9|^10", + "illuminate/support": "^9|^10", "maximebf/debugbar": "^1.17.2", - "php": ">=7.2.5", - "symfony/finder": "^5|^6" + "php": "^8.0", + "symfony/finder": "^6" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^5|^6|^7", - "phpunit/phpunit": "^8.5|^9.0", + "orchestra/testbench-dusk": "^5|^6|^7|^8", + "phpunit/phpunit": "^8.5.30|^9.0", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", @@ -10131,7 +10198,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.7.0" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.0" }, "funding": [ { @@ -10143,7 +10210,67 @@ "type": "github" } ], - "time": "2022-07-11T09:26:42+00:00" + "time": "2023-02-04T15:47:28+00:00" + }, + { + "name": "beyondcode/laravel-query-detector", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/beyondcode/laravel-query-detector.git", + "reference": "40c7e168fcf7eeb80d8e96f7922e05ab194269c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beyondcode/laravel-query-detector/zipball/40c7e168fcf7eeb80d8e96f7922e05ab194269c8", + "reference": "40c7e168fcf7eeb80d8e96f7922e05ab194269c8", + "shasum": "" + }, + "require": { + "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0|^10.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "laravel/legacy-factories": "^1.0", + "orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0|^8.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BeyondCode\\QueryDetector\\QueryDetectorServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BeyondCode\\QueryDetector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marcel Pociot", + "email": "marcel@beyondco.de", + "homepage": "https://beyondcode.de", + "role": "Developer" + } + ], + "description": "Laravel N+1 Query Detector", + "homepage": "https://github.com/beyondcode/laravel-query-detector", + "keywords": [ + "beyondcode", + "laravel-query-detector" + ], + "support": { + "issues": "https://github.com/beyondcode/laravel-query-detector/issues", + "source": "https://github.com/beyondcode/laravel-query-detector/tree/1.7.0" + }, + "time": "2023-02-15T10:37:22+00:00" }, { "name": "doctrine/instantiator", @@ -13321,7 +13448,8 @@ "chumper/zipper": 20, "brozot/laravel-fcm": 20, "unisharp/laravel-ckeditor": 20, - "thomaswelton/laravel-gravatar": 20 + "thomaswelton/laravel-gravatar": 20, + "itsgoingd/clockwork": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/config/app.php b/config/app.php index 1dea56ca6..0319c9597 100644 --- a/config/app.php +++ b/config/app.php @@ -186,6 +186,8 @@ return [ \Yajra\DataTables\DataTablesServiceProvider::class, \Bugsnag\BugsnagLaravel\BugsnagServiceProvider::class, Maatwebsite\Excel\ExcelServiceProvider::class, + App\Providers\QueryListenProvider::class + ], /* |-------------------------------------------------------------------------- diff --git a/config/clockwork.php b/config/clockwork.php new file mode 100644 index 000000000..92333215c --- /dev/null +++ b/config/clockwork.php @@ -0,0 +1,417 @@ + env('CLOCKWORK_ENABLE', null), + 'middlewares'=>['web','auth','roles'], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Features + |------------------------------------------------------------------------------------------------------------------ + | + | You can enable or disable various Clockwork features here. Some features have additional settings (eg. slow query + | threshold for database queries). + | + */ + + 'features' => [ + + // Cache usage stats and cache queries including results + 'cache' => [ + 'enabled' => env('CLOCKWORK_CACHE_ENABLED', true), + + // Collect cache queries + 'collect_queries' => env('CLOCKWORK_CACHE_QUERIES', true), + + // Collect values from cache queries (high performance impact with a very high number of queries) + 'collect_values' => env('CLOCKWORK_CACHE_COLLECT_VALUES', false) + ], + + // Database usage stats and queries + 'database' => [ + 'enabled' => env('CLOCKWORK_DATABASE_ENABLED', true), + + // Collect database queries (high performance impact with a very high number of queries) + 'collect_queries' => env('CLOCKWORK_DATABASE_COLLECT_QUERIES', true), + + // Collect details of models updates (high performance impact with a lot of model updates) + 'collect_models_actions' => env('CLOCKWORK_DATABASE_COLLECT_MODELS_ACTIONS', true), + + // Collect details of retrieved models (very high performance impact with a lot of models retrieved) + 'collect_models_retrieved' => env('CLOCKWORK_DATABASE_COLLECT_MODELS_RETRIEVED', false), + + // Query execution time threshold in milliseconds after which the query will be marked as slow + 'slow_threshold' => env('CLOCKWORK_DATABASE_SLOW_THRESHOLD'), + + // Collect only slow database queries + 'slow_only' => env('CLOCKWORK_DATABASE_SLOW_ONLY', false), + + // Detect and report duplicate queries + 'detect_duplicate_queries' => env('CLOCKWORK_DATABASE_DETECT_DUPLICATE_QUERIES', false) + ], + + // Dispatched events + 'events' => [ + 'enabled' => env('CLOCKWORK_EVENTS_ENABLED', true), + + // Ignored events (framework events are ignored by default) + 'ignored_events' => [ + // App\Events\UserRegistered::class, + // 'user.registered' + ], + ], + + // Laravel log (you can still log directly to Clockwork with laravel log disabled) + 'log' => [ + 'enabled' => env('CLOCKWORK_LOG_ENABLED', true) + ], + + // Sent notifications + 'notifications' => [ + 'enabled' => env('CLOCKWORK_NOTIFICATIONS_ENABLED', true), + ], + + // Performance metrics + 'performance' => [ + // Allow collecting of client metrics. Requires separate clockwork-browser npm package. + 'client_metrics' => env('CLOCKWORK_PERFORMANCE_CLIENT_METRICS', true) + ], + + // Dispatched queue jobs + 'queue' => [ + 'enabled' => env('CLOCKWORK_QUEUE_ENABLED', true) + ], + + // Redis commands + 'redis' => [ + 'enabled' => env('CLOCKWORK_REDIS_ENABLED', true) + ], + + // Routes list + 'routes' => [ + 'enabled' => env('CLOCKWORK_ROUTES_ENABLED', false), + + // Collect only routes from particular namespaces (only application routes by default) + 'only_namespaces' => [ 'App' ] + ], + + // Rendered views + 'views' => [ + 'enabled' => env('CLOCKWORK_VIEWS_ENABLED', true), + + // Collect views including view data (high performance impact with a high number of views) + 'collect_data' => env('CLOCKWORK_VIEWS_COLLECT_DATA', false), + + // Use Twig profiler instead of Laravel events for apps using laravel-twigbridge (more precise, but does + // not support collecting view data) + 'use_twig_profiler' => env('CLOCKWORK_VIEWS_USE_TWIG_PROFILER', false) + ] + + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable web UI + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork comes with a web UI accessible via http://your.app/clockwork. Here you can enable or disable this + | feature. You can also set a custom path for the web UI. + | + */ + + 'web' => env('CLOCKWORK_WEB', true), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable toolbar + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can show a toolbar with basic metrics on all responses. Here you can enable or disable this feature. + | Requires a separate clockwork-browser npm library. + | For installation instructions see https://underground.works/clockwork/#docs-viewing-data + | + */ + + 'toolbar' => env('CLOCKWORK_TOOLBAR', true), + + /* + |------------------------------------------------------------------------------------------------------------------ + | HTTP requests collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork collects data about HTTP requests to your app. Here you can choose which requests should be collected. + | + */ + + 'requests' => [ + // With on-demand mode enabled, Clockwork will only profile requests when the browser extension is open or you + // manually pass a "clockwork-profile" cookie or get/post data key. + // Optionally you can specify a "secret" that has to be passed as the value to enable profiling. + 'on_demand' => env('CLOCKWORK_REQUESTS_ON_DEMAND', false), + + // Collect only errors (requests with HTTP 4xx and 5xx responses) + 'errors_only' => env('CLOCKWORK_REQUESTS_ERRORS_ONLY', false), + + // Response time threshold in milliseconds after which the request will be marked as slow + 'slow_threshold' => env('CLOCKWORK_REQUESTS_SLOW_THRESHOLD'), + + // Collect only slow requests + 'slow_only' => env('CLOCKWORK_REQUESTS_SLOW_ONLY', false), + + // Sample the collected requests (e.g. set to 100 to collect only 1 in 100 requests) + 'sample' => env('CLOCKWORK_REQUESTS_SAMPLE', false), + + // List of URIs that should not be collected + 'except' => [ + '/horizon/.*', // Laravel Horizon requests + '/telescope/.*', // Laravel Telescope requests + '/_debugbar/.*', // Laravel DebugBar requests + ], + + // List of URIs that should be collected, any other URI will not be collected if not empty + 'only' => [ + // '/api/.*' + ], + + // Don't collect OPTIONS requests, mostly used in the CSRF pre-flight requests and are rarely of interest + 'except_preflight' => env('CLOCKWORK_REQUESTS_EXCEPT_PREFLIGHT', true) + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Artisan commands collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect data about executed artisan commands. Here you can enable and configure which commands + | should be collected. + | + */ + + 'artisan' => [ + // Enable or disable collection of executed Artisan commands + 'collect' => env('CLOCKWORK_ARTISAN_COLLECT', false), + + // List of commands that should not be collected (built-in commands are not collected by default) + 'except' => [ + // 'inspire' + ], + + // List of commands that should be collected, any other command will not be collected if not empty + 'only' => [ + // 'inspire' + ], + + // Enable or disable collection of command output + 'collect_output' => env('CLOCKWORK_ARTISAN_COLLECT_OUTPUT', false), + + // Enable or disable collection of built-in Laravel commands + 'except_laravel_commands' => env('CLOCKWORK_ARTISAN_EXCEPT_LARAVEL_COMMANDS', true) + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Queue jobs collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect data about executed queue jobs. Here you can enable and configure which queue jobs should + | be collected. + | + */ + + 'queue' => [ + // Enable or disable collection of executed queue jobs + 'collect' => env('CLOCKWORK_QUEUE_COLLECT', false), + + // List of queue jobs that should not be collected + 'except' => [ + // App\Jobs\ExpensiveJob::class + ], + + // List of queue jobs that should be collected, any other queue job will not be collected if not empty + 'only' => [ + // App\Jobs\BuggyJob::class + ] + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Tests collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect data about executed tests. Here you can enable and configure which tests should be + | collected. + | + */ + + 'tests' => [ + // Enable or disable collection of ran tests + 'collect' => env('CLOCKWORK_TESTS_COLLECT', false), + + // List of tests that should not be collected + 'except' => [ + // Tests\Unit\ExampleTest::class + ] + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable data collection when Clockwork is disabled + |------------------------------------------------------------------------------------------------------------------ + | + | You can enable this setting to collect data even when Clockwork is disabled, e.g. for future analysis. + | + */ + + 'collect_data_always' => env('CLOCKWORK_COLLECT_DATA_ALWAYS', false), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Metadata storage + |------------------------------------------------------------------------------------------------------------------ + | + | Configure how is the metadata collected by Clockwork stored. Two options are available: + | - files - A simple fast storage implementation storing data in one-per-request files. + | - sql - Stores requests in a sql database. Supports MySQL, PostgreSQL and SQLite. Requires PDO. + | + */ + + 'storage' => env('CLOCKWORK_STORAGE', 'files'), + + // Path where the Clockwork metadata is stored + 'storage_files_path' => env('CLOCKWORK_STORAGE_FILES_PATH', storage_path('clockwork')), + + // Compress the metadata files using gzip, trading a little bit of performance for lower disk usage + 'storage_files_compress' => env('CLOCKWORK_STORAGE_FILES_COMPRESS', false), + + // SQL database to use, can be a name of database configured in database.php or a path to a SQLite file + 'storage_sql_database' => env('CLOCKWORK_STORAGE_SQL_DATABASE', storage_path('clockwork.sqlite')), + + // SQL table name to use, the table is automatically created and updated when needed + 'storage_sql_table' => env('CLOCKWORK_STORAGE_SQL_TABLE', 'clockwork'), + + // Maximum lifetime of collected metadata in minutes, older requests will automatically be deleted, false to disable + 'storage_expiration' => env('CLOCKWORK_STORAGE_EXPIRATION', 60 * 24 * 7), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Authentication + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can be configured to require authentication before allowing access to the collected data. This might be + | useful when the application is publicly accessible. Setting to true will enable a simple authentication with a + | pre-configured password. You can also pass a class name of a custom implementation. + | + */ + + 'authentication' => env('CLOCKWORK_AUTHENTICATION', false), + + // Password for the simple authentication + 'authentication_password' => env('CLOCKWORK_AUTHENTICATION_PASSWORD', 'VerySecretPassword'), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Stack traces collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect stack traces for log messages and certain data like database queries. Here you can set + | whether to collect stack traces, limit the number of collected frames and set further configuration. Collecting + | long stack traces considerably increases metadata size. + | + */ + + 'stack_traces' => [ + // Enable or disable collecting of stack traces + 'enabled' => env('CLOCKWORK_STACK_TRACES_ENABLED', true), + + // Limit the number of frames to be collected + 'limit' => env('CLOCKWORK_STACK_TRACES_LIMIT', 10), + + // List of vendor names to skip when determining caller, common vendors are automatically added + 'skip_vendors' => [ + // 'phpunit' + ], + + // List of namespaces to skip when determining caller + 'skip_namespaces' => [ + // 'Laravel' + ], + + // List of class names to skip when determining caller + 'skip_classes' => [ + // App\CustomLog::class + ] + + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Serialization + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork serializes the collected data to json for storage and transfer. Here you can configure certain aspects + | of serialization. Serialization has a large effect on the cpu time and memory usage. + | + */ + + // Maximum depth of serialized multi-level arrays and objects + 'serialization_depth' => env('CLOCKWORK_SERIALIZATION_DEPTH', 10), + + // A list of classes that will never be serialized (e.g. a common service container class) + 'serialization_blackbox' => [ + \Illuminate\Container\Container::class, + \Illuminate\Foundation\Application::class, + \Laravel\Lumen\Application::class + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Register helpers + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork comes with a "clock" global helper function. You can use this helper to quickly log something and to + | access the Clockwork instance. + | + */ + + 'register_helpers' => env('CLOCKWORK_REGISTER_HELPERS', true), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Send headers for AJAX request + |------------------------------------------------------------------------------------------------------------------ + | + | When trying to collect data, the AJAX method can sometimes fail if it is missing required headers. For example, an + | API might require a version number using Accept headers to route the HTTP request to the correct codebase. + | + */ + + 'headers' => [ + // 'Accept' => 'application/vnd.com.whatever.v1+json', + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Server timing + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork supports the W3C Server Timing specification, which allows for collecting a simple performance metrics + | in a cross-browser way. E.g. in Chrome, your app, database and timeline event timings will be shown in the Dev + | Tools network tab. This setting specifies the max number of timeline events that will be sent. Setting to false + | will disable the feature. + | + */ + + 'server_timing' => env('CLOCKWORK_SERVER_TIMING', 10) + +]; diff --git a/config/querydetector.php b/config/querydetector.php new file mode 100644 index 000000000..03f5ec7b0 --- /dev/null +++ b/config/querydetector.php @@ -0,0 +1,69 @@ + env('QUERY_DETECTOR_ENABLED', null), + + /* + * Threshold level for the N+1 query detection. If a relation query will be + * executed more then this amount, the detector will notify you about it. + */ + 'threshold' => (int) env('QUERY_DETECTOR_THRESHOLD', 1), + + /* + * Here you can whitelist model relations. + * + * Right now, you need to define the model relation both as the class name and the attribute name on the model. + * So if an "Author" model would have a "posts" relation that points to a "Post" class, you need to add both + * the "posts" attribute and the "Post::class", since the relation can get resolved in multiple ways. + */ + 'except' => [ + //Author::class => [ + // Post::class, + // 'posts', + //] + ], + + /* + * Here you can set a specific log channel to write to + * in case you are trying to isolate queries or have a lot + * going on in the laravel.log. Defaults to laravel.log though. + */ + 'log_channel' => env('QUERY_DETECTOR_LOG_CHANNEL', 'daily'), + + /* + * Define the output format that you want to use. Multiple classes are supported. + * Available options are: + * + * Alert: + * Displays an alert on the website + * \BeyondCode\QueryDetector\Outputs\Alert::class + * + * Console: + * Writes the N+1 queries into your browsers console log + * \BeyondCode\QueryDetector\Outputs\Console::class + * + * Clockwork: (make sure you have the itsgoingd/clockwork package installed) + * Writes the N+1 queries warnings to Clockwork log + * \BeyondCode\QueryDetector\Outputs\Clockwork::class + * + * Debugbar: (make sure you have the barryvdh/laravel-debugbar package installed) + * Writes the N+1 queries into a custom messages collector of Debugbar + * \BeyondCode\QueryDetector\Outputs\Debugbar::class + * + * JSON: + * Writes the N+1 queries into the response body of your JSON responses + * \BeyondCode\QueryDetector\Outputs\Json::class + * + * Log: + * Writes the N+1 queries into the Laravel.log file + * \BeyondCode\QueryDetector\Outputs\Log::class + */ + 'output' => [ + \BeyondCode\QueryDetector\Outputs\Alert::class, + \BeyondCode\QueryDetector\Outputs\Log::class, + ] +]; diff --git a/lang/en/lang.php b/lang/en/lang.php index bb911e346..b84f6a746 100755 --- a/lang/en/lang.php +++ b/lang/en/lang.php @@ -1415,6 +1415,7 @@ return [ */ 'error-debug' => 'Error logs and debugging', 'debug-options' => 'Debugging options', + 'clock-work' =>'Clock work', 'view-logs' => 'View error logs', 'not-authorised-error-debug' => 'You are not authorised to access the URL', 'error-debug-settings' => 'Error and debugging settings', diff --git a/resources/views/themes/default1/admin/helpdesk/setting.blade.php b/resources/views/themes/default1/admin/helpdesk/setting.blade.php index 30385c666..009f5e80a 100644 --- a/resources/views/themes/default1/admin/helpdesk/setting.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/setting.blade.php @@ -540,13 +540,27 @@
{!! Lang::get('lang.debug-options') !!}
+ + @if(Config::get('app.debug')) +
+
+ + +
{!!Lang::get('lang.clock-work')!!}
+
+
+ @endif + - - - - - + +
diff --git a/vendor/barryvdh/laravel-debugbar/composer.json b/vendor/barryvdh/laravel-debugbar/composer.json index b911a5e3d..4312ed4ab 100644 --- a/vendor/barryvdh/laravel-debugbar/composer.json +++ b/vendor/barryvdh/laravel-debugbar/composer.json @@ -10,17 +10,17 @@ } ], "require": { - "php": ">=7.2.5", + "php": "^8.0", "maximebf/debugbar": "^1.17.2", - "illuminate/routing": "^7|^8|^9", - "illuminate/session": "^7|^8|^9", - "illuminate/support": "^7|^8|^9", - "symfony/finder": "^5|^6" + "illuminate/routing": "^9|^10", + "illuminate/session": "^9|^10", + "illuminate/support": "^9|^10", + "symfony/finder": "^6" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^5|^6|^7", - "phpunit/phpunit": "^8.5|^9.0", + "orchestra/testbench-dusk": "^5|^6|^7|^8", + "phpunit/phpunit": "^8.5.30|^9.0", "squizlabs/php_codesniffer": "^3.5" }, "autoload": { @@ -52,8 +52,8 @@ } }, "scripts": { - "check-style": "phpcs -p --standard=PSR12 config/ src/ tests/", - "fix-style": "phpcbf -p --standard=PSR12 config/ src/ tests/", + "check-style": "phpcs -p --standard=PSR12 config/ src/ tests/ --ignore=src/Resources/* ", + "fix-style": "phpcbf -p --standard=PSR12 config/ src/ tests/ --ignore=src/Resources*", "test": "phpunit" } } diff --git a/vendor/barryvdh/laravel-debugbar/config/debugbar.php b/vendor/barryvdh/laravel-debugbar/config/debugbar.php index fe3b192d7..5c4643cf7 100644 --- a/vendor/barryvdh/laravel-debugbar/config/debugbar.php +++ b/vendor/barryvdh/laravel-debugbar/config/debugbar.php @@ -92,7 +92,7 @@ return [ | Vendor files are included by default, but can be set to false. | This can also be set to 'js' or 'css', to only include javascript or css vendor files. | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) - | and for js: jquery and and highlight.js + | and for js: jquery and highlight.js | So if you want syntax highlighting, set it to true. | jQuery is set to not conflict with existing jQuery scripts. | @@ -198,7 +198,8 @@ return [ 'types' => ['SELECT'], // Deprecated setting, is always only SELECT ], 'hints' => false, // Show hints for common mistakes - 'show_copy' => false, // Show copy button next to the query + 'show_copy' => false, // Show copy button next to the query, + 'slow_threshold' => false, // Only track queries that last longer than this time in ms ], 'mail' => [ 'full_log' => false, @@ -206,6 +207,7 @@ return [ 'views' => [ 'timeline' => false, // Add the views to the timeline (Experimental) 'data' => false, //Note: Can slow down the application, because the data can be quite large.. + 'exclude_paths' => [], // Add the paths which you don't want to appear in the views ], 'route' => [ 'label' => true, // show complete route on bar diff --git a/vendor/barryvdh/laravel-debugbar/readme.md b/vendor/barryvdh/laravel-debugbar/readme.md index 54eaafba1..5bac5ccd9 100644 --- a/vendor/barryvdh/laravel-debugbar/readme.md +++ b/vendor/barryvdh/laravel-debugbar/readme.md @@ -1,4 +1,4 @@ -## Laravel Debugbar +## Debugbar for Laravel ![Unit Tests](https://github.com/barryvdh/laravel-debugbar/workflows/Unit%20Tests/badge.svg) [![Packagist License](https://poser.pugx.org/barryvdh/laravel-debugbar/license.png)](http://choosealicense.com/licenses/mit/) [![Latest Stable Version](https://poser.pugx.org/barryvdh/laravel-debugbar/version.png)](https://packagist.org/packages/barryvdh/laravel-debugbar) diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php index fbeaf81b5..f07aa3bf7 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php @@ -134,7 +134,7 @@ class QueryCollector extends PDOCollector $pdo = null; try { $pdo = $connection->getPdo(); - } catch (\Exception $e) { + } catch (\Throwable $e) { // ignore error for non-pdo laravel drivers } $bindings = $connection->prepareBindings($bindings); @@ -511,6 +511,41 @@ class QueryCollector extends PDOCollector 'type' => 'explain', ]; } + } elseif ($query['driver'] === 'sqlite') { + $vmi = ''; + $vmi .= " + + + + + + + + + "; + + foreach ($query['explain'] as $explain) { + $vmi .= " + + + + + + + + + "; + } + + $vmi .= '
AddressOpcodeP1P2P3P4P5Comment
{$explain->addr}{$explain->opcode}{$explain->p1}{$explain->p2}{$explain->p3}{$explain->p4}{$explain->p5}{$explain->comment}
'; + + $statements[] = [ + 'sql' => " - EXPLAIN:", + 'type' => 'explain', + 'params' => [ + 'Virtual Machine Instructions' => $vmi, + ] + ]; } else { foreach ($query['explain'] as $explain) { $statements[] = [ diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php index 7a1b0c577..b0ae1baa4 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php @@ -5,24 +5,51 @@ namespace Barryvdh\Debugbar\DataCollector; use Barryvdh\Debugbar\DataFormatter\SimpleFormatter; use DebugBar\Bridge\Twig\TwigCollector; use Illuminate\View\View; -use Symfony\Component\VarDumper\Cloner\VarCloner; +use InvalidArgumentException; class ViewCollector extends TwigCollector { + protected $name; protected $templates = []; protected $collect_data; + protected $exclude_paths; + + /** + * A list of known editor strings. + * + * @var array + */ + protected $editors = [ + 'sublime' => 'subl://open?url=file://%file&line=%line', + 'textmate' => 'txmt://open?url=file://%file&line=%line', + 'emacs' => 'emacs://open?url=file://%file&line=%line', + 'macvim' => 'mvim://open/?url=file://%file&line=%line', + 'phpstorm' => 'phpstorm://open?file=%file&line=%line', + 'idea' => 'idea://open?file=%file&line=%line', + 'vscode' => 'vscode://file/%file:%line', + 'vscode-insiders' => 'vscode-insiders://file/%file:%line', + 'vscode-remote' => 'vscode://vscode-remote/%file:%line', + 'vscode-insiders-remote' => 'vscode-insiders://vscode-remote/%file:%line', + 'vscodium' => 'vscodium://file/%file:%line', + 'nova' => 'nova://core/open/file?filename=%file&line=%line', + 'xdebug' => 'xdebug://%file@%line', + 'atom' => 'atom://core/open/file?filename=%file&line=%line', + 'espresso' => 'x-espresso://open?filepath=%file&lines=%line', + 'netbeans' => 'netbeans://open/?f=%file:%line', + ]; /** * Create a ViewCollector * * @param bool $collectData Collects view data when tru + * @param string[] $excludePaths Paths to exclude from collection */ - public function __construct($collectData = true) + public function __construct($collectData = true, $excludePaths = []) { $this->setDataFormatter(new SimpleFormatter()); $this->collect_data = $collectData; - $this->name = 'views'; $this->templates = []; + $this->exclude_paths = $excludePaths; } public function getName() @@ -35,7 +62,7 @@ class ViewCollector extends TwigCollector return [ 'views' => [ 'icon' => 'leaf', - 'widget' => 'PhpDebugBar.Widgets.TemplatesWidget', + 'widget' => 'PhpDebugBar.Widgets.LaravelViewTemplatesWidget', 'map' => 'views', 'default' => '[]' ], @@ -46,6 +73,36 @@ class ViewCollector extends TwigCollector ]; } + /** + * Get the editor href for a given file and line, if available. + * + * @param string $filePath + * @param int $line + * + * @throws InvalidArgumentException If editor resolver does not return a string + * + * @return null|string + */ + protected function getEditorHref($filePath, $line) + { + if (empty(config('debugbar.editor'))) { + return null; + } + + if (empty($this->editors[config('debugbar.editor')])) { + throw new InvalidArgumentException( + 'Unknown editor identifier: ' . config('debugbar.editor') . '. Known editors:' . + implode(', ', array_keys($this->editors)) + ); + } + + $filePath = $this->replaceSitesPath($filePath); + + $url = str_replace(['%file', '%line'], [$filePath, $line], $this->editors[config('debugbar.editor')]); + + return $url; + } + /** * Add a View instance to the Collector * @@ -71,6 +128,12 @@ class ViewCollector extends TwigCollector $path = ''; } + foreach ($this->exclude_paths as $excludePath) { + if (strpos($path, $excludePath) !== false) { + return; + } + } + if (!$this->collect_data) { $params = array_keys($view->getData()); } else { @@ -86,6 +149,7 @@ class ViewCollector extends TwigCollector 'param_count' => count($params), 'params' => $params, 'type' => $type, + 'editorLink' => $this->getEditorHref($view->getPath(), 0), ]; if ($this->getXdebugLink($path)) { @@ -104,4 +168,16 @@ class ViewCollector extends TwigCollector 'templates' => $templates, ]; } + + /** + * Replace remote path + * + * @param string $filePath + * + * @return string + */ + protected function replaceSitesPath($filePath) + { + return str_replace(config('debugbar.remote_sites_path'), config('debugbar.local_sites_path'), $filePath); + } } diff --git a/vendor/barryvdh/laravel-debugbar/src/DataFormatter/QueryFormatter.php b/vendor/barryvdh/laravel-debugbar/src/DataFormatter/QueryFormatter.php index f8574f5d6..dc49853e6 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataFormatter/QueryFormatter.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataFormatter/QueryFormatter.php @@ -4,6 +4,7 @@ namespace Barryvdh\Debugbar\DataFormatter; use DebugBar\DataFormatter\DataFormatter; +#[\AllowDynamicProperties] class QueryFormatter extends DataFormatter { /** diff --git a/vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php b/vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php index 9825e9133..369e1be3f 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php @@ -9,6 +9,7 @@ use DebugBar\DataFormatter\DataFormatter; * * @see https://github.com/symfony/symfony/blob/v3.4.4/src/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php */ +#[\AllowDynamicProperties] class SimpleFormatter extends DataFormatter { /** diff --git a/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php b/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php index 428b15a9d..9c967909e 100644 --- a/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php +++ b/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php @@ -23,6 +23,7 @@ class JavascriptRenderer extends BaseJavascriptRenderer $this->cssVendors['fontawesome'] = __DIR__ . '/Resources/vendor/font-awesome/style.css'; $this->jsFiles['laravel-sql'] = __DIR__ . '/Resources/sqlqueries/widget.js'; $this->jsFiles['laravel-cache'] = __DIR__ . '/Resources/cache/widget.js'; + $this->jsFiles['laravel-view'] = __DIR__ . '/Resources/templates/widget.js'; $theme = config('debugbar.theme', 'auto'); switch ($theme) { diff --git a/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php b/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php index 1842aa5de..5cf221095 100644 --- a/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php +++ b/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php @@ -34,6 +34,7 @@ use DebugBar\DebugBar; use DebugBar\Storage\PdoStorage; use DebugBar\Storage\RedisStorage; use Exception; +use Throwable; use Illuminate\Contracts\Foundation\Application; use Illuminate\Session\SessionManager; use Illuminate\Support\Str; @@ -204,7 +205,8 @@ class LaravelDebugbar extends DebugBar if ($this->shouldCollect('views', true) && isset($this->app['events'])) { try { $collectData = $this->app['config']->get('debugbar.options.views.data', true); - $this->addCollector(new ViewCollector($collectData)); + $excludePaths = $this->app['config']->get('debugbar.options.views.exclude_paths', []); + $this->addCollector(new ViewCollector($collectData, $excludePaths)); $this->app['events']->listen( 'composing:*', function ($view, $data = []) use ($debugbar) { @@ -258,7 +260,7 @@ class LaravelDebugbar extends DebugBar try { $logMessage = (string) $message; if (mb_check_encoding($logMessage, 'UTF-8')) { - $logMessage .= (!empty($context) ? ' ' . json_encode($context) : ''); + $logMessage .= (!empty($context) ? ' ' . json_encode($context, JSON_PRETTY_PRINT) : ''); } else { $logMessage = "[INVALID UTF-8 DATA]"; } @@ -635,7 +637,7 @@ class LaravelDebugbar extends DebugBar /** * Adds an exception to be profiled in the debug bar * - * @param Exception $e + * @param Throwable $e */ public function addThrowable($e) { diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode.css b/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode.css index 69baff9b9..50f7832d2 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode.css +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode.css @@ -24,6 +24,8 @@ div.phpdebugbar-openhandler, div.phpdebugbar div.phpdebugbar-header > div > *, div.phpdebugbar ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-label, div.phpdebugbar ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-collector, +div.phpdebugbar ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item, +div.phpdebugbar ul.phpdebugbar-widgets-list li span.phpdebugbar-widgets-label, div.phpdebugbar code.phpdebugbar-widgets-sql span.hljs-keyword, div.phpdebugbar-openhandler .phpdebugbar-openhandler-header, div.phpdebugbar-openhandler .phpdebugbar-openhandler-header a { diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css b/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css index 424c6ad49..346e55cc0 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css @@ -13,6 +13,7 @@ div.phpdebugbar { div.phpdebugbar * { direction: ltr; + font-size: initial; text-align: left; } diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/templates/widget.js b/vendor/barryvdh/laravel-debugbar/src/Resources/templates/widget.js new file mode 100644 index 000000000..bb39188b5 --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/templates/widget.js @@ -0,0 +1,98 @@ +(function($) { + + var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-'); + + /** + * Widget for the displaying templates data + * + * Options: + * - data + */ + var TemplatesWidget = PhpDebugBar.Widgets.LaravelViewTemplatesWidget = PhpDebugBar.Widget.extend({ + + className: csscls('templates'), + + render: function() { + this.$status = $('
').addClass(csscls('status')).appendTo(this.$el); + + this.$list = new PhpDebugBar.Widgets.ListWidget({ itemRenderer: function(li, tpl) { + $('').addClass(csscls('name')).text(tpl.name).appendTo(li); + + if (typeof tpl.editorLink !== 'undefined' && tpl.editorLink !== null) { + $('') + .addClass(csscls('editor-link')) + .on('click', function (event) { + event.stopPropagation(); + }) + .appendTo(li); + } + if (typeof tpl.xdebug_link !== 'undefined' && tpl.xdebug_link !== null) { + if (tpl.xdebug_link.ajax) { + $('').on('click', function () { + $.ajax(tpl.xdebug_link.url); + }).addClass(csscls('editor-link')).appendTo(li); + } else { + $('').addClass(csscls('editor-link')).appendTo(li); + } + } + if (tpl.render_time_str) { + $('').addClass(csscls('render-time')).text(tpl.render_time_str).appendTo(li); + } + if (tpl.memory_str) { + $('').addClass(csscls('memory')).text(tpl.memory_str).appendTo(li); + } + if (typeof(tpl.param_count) != 'undefined') { + $('').addClass(csscls('param-count')).text(tpl.param_count).appendTo(li); + } + if (typeof(tpl.type) != 'undefined' && tpl.type) { + $('').addClass(csscls('type')).text(tpl.type).appendTo(li); + } + if (tpl.params && !$.isEmptyObject(tpl.params)) { + var table = $('
Params
').addClass(csscls('params')).appendTo(li); + for (var key in tpl.params) { + if (typeof tpl.params[key] !== 'function') { + table.append('' + key + '
' + tpl.params[key] + '
'); + } + } + li.css('cursor', 'pointer').click(function() { + if (table.is(':visible')) { + table.hide(); + } else { + table.show(); + } + }); + } + }}); + this.$list.$el.appendTo(this.$el); + this.$callgraph = $('
').addClass(csscls('callgraph')).appendTo(this.$el); + + this.bindAttr('data', function(data) { + this.$list.set('data', data.templates); + this.$status.empty(); + this.$callgraph.empty(); + + var sentence = data.sentence || "templates were rendered"; + $('').text(data.nb_templates + " " + sentence).appendTo(this.$status); + + if (data.accumulated_render_time_str) { + this.$status.append($('').addClass(csscls('render-time')).text(data.accumulated_render_time_str)); + } + if (data.memory_usage_str) { + this.$status.append($('').addClass(csscls('memory')).text(data.memory_usage_str)); + } + if (data.nb_blocks > 0) { + $('
').text(data.nb_blocks + " blocks were rendered").appendTo(this.$status); + } + if (data.nb_macros > 0) { + $('
').text(data.nb_macros + " macros were rendered").appendTo(this.$status); + } + if (typeof data.callgraph !== 'undefined') { + this.$callgraph.html(data.callgraph); + } + }); + } + + }); + +})(PhpDebugBar.$); diff --git a/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Debug.php b/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Debug.php index 42bc2cb32..a70b69a4f 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Debug.php +++ b/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Debug.php @@ -10,7 +10,7 @@ use Twig_SimpleFunction; /** * Access Laravels auth class in your Twig templates. */ -class Debug extends Twig_Extension +class Debug extends Extension { /** * @var \Barryvdh\Debugbar\LaravelDebugbar @@ -44,8 +44,15 @@ class Debug extends Twig_Extension */ public function getFunctions() { + // Maintain compatibility with Twig 2 and 3. + $simpleFunction = 'Twig_SimpleFunction'; + + if (!class_exists($simpleFunction)) { + $simpleFunction = '\Twig\TwigFunction'; + } + return [ - new Twig_SimpleFunction( + new $simpleFunction( 'debug', [$this, 'debug'], ['needs_context' => true, 'needs_environment' => true] @@ -57,10 +64,10 @@ class Debug extends Twig_Extension * Based on Twig_Extension_Debug / twig_var_dump * (c) 2011 Fabien Potencier * - * @param Twig_Environment $env + * @param \Twig_Environment|\Twig\Environment $env * @param $context */ - public function debug(Twig_Environment $env, $context) + public function debug($env, $context) { if (!$env->isDebug() || !$this->debugbar) { return; diff --git a/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Dump.php b/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Dump.php index b42fafa42..edd17ba03 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Dump.php +++ b/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Dump.php @@ -3,14 +3,11 @@ namespace Barryvdh\Debugbar\Twig\Extension; use DebugBar\DataFormatter\DataFormatterInterface; -use Twig_Environment; -use Twig_Extension; -use Twig_SimpleFunction; /** * Dump variables using the DataFormatter */ -class Dump extends Twig_Extension +class Dump extends Extension { /** * @var \DebugBar\DataFormatter\DataFormatter @@ -40,8 +37,15 @@ class Dump extends Twig_Extension */ public function getFunctions() { + // Maintain compatibility with Twig 2 and 3. + $simpleFunction = '\Twig_SimpleFunction'; + + if (!class_exists($simpleFunction)) { + $simpleFunction = '\Twig\TwigFunction'; + } + return [ - new Twig_SimpleFunction( + new $simpleFunction( 'dump', [$this, 'dump'], ['is_safe' => ['html'], 'needs_context' => true, 'needs_environment' => true] @@ -53,12 +57,12 @@ class Dump extends Twig_Extension * Based on Twig_Extension_Debug / twig_var_dump * (c) 2011 Fabien Potencier * - * @param Twig_Environment $env + * @param \Twig_Environment|\Twig\Environment $env * @param $context * * @return string */ - public function dump(Twig_Environment $env, $context) + public function dump($env, $context) { $output = ''; diff --git a/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Extension.php b/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Extension.php new file mode 100644 index 000000000..dda2a6171 --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/Twig/Extension/Extension.php @@ -0,0 +1,14 @@ + */ -class StopwatchNode extends \Twig_Node +class StopwatchNode extends Node { + /** + * @param \Twig_NodeInterface|\Twig\Node\Node $name + * @param $body + * @param \Twig_Node_Expression_AssignName|\Twig\Node\Expression\AssignNameExpression $var + * @param $lineno + * @param $tag + */ public function __construct( - \Twig_NodeInterface $name, + $name, $body, - \Twig_Node_Expression_AssignName $var, + $var, $lineno = 0, $tag = null ) { parent::__construct(['body' => $body, 'name' => $name, 'var' => $var], [], $lineno, $tag); } - public function compile(\Twig_Compiler $compiler) + /** + * @param \Twig_Compiler|\Twig\Compiler $env + * @return void + */ + public function compile($compiler) { + // Maintain compatibility with Twig 2 and 3. + $extension = \Barryvdh\Debugbar\Twig\Extension\Stopwatch::class; + if (class_exists('\Twig_Node')) { + $extension = 'stopwatch'; + } + $compiler ->addDebugInfo($this) ->write('') @@ -28,11 +45,11 @@ class StopwatchNode extends \Twig_Node ->raw(' = ') ->subcompile($this->getNode('name')) ->write(";\n") - ->write("\$this->env->getExtension('stopwatch')->getDebugbar()->startMeasure(") + ->write(sprintf("\$this->env->getExtension('%s')->getDebugbar()->startMeasure(", $extension)) ->subcompile($this->getNode('var')) ->raw(");\n") ->subcompile($this->getNode('body')) - ->write("\$this->env->getExtension('stopwatch')->getDebugbar()->stopMeasure(") + ->write(sprintf("\$this->env->getExtension('%s')->getDebugbar()->stopMeasure(", $extension)) ->subcompile($this->getNode('var')) ->raw(");\n"); } diff --git a/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/StopwatchTokenParser.php b/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/StopwatchTokenParser.php index cb197a208..896af4992 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/StopwatchTokenParser.php +++ b/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/StopwatchTokenParser.php @@ -9,7 +9,7 @@ use Barryvdh\Debugbar\Twig\Node\StopwatchNode; * * @author Wouter J */ -class StopwatchTokenParser extends \Twig_TokenParser +class StopwatchTokenParser extends TokenParser { protected $debugbarAvailable; @@ -18,7 +18,10 @@ class StopwatchTokenParser extends \Twig_TokenParser $this->debugbarAvailable = $debugbarAvailable; } - public function parse(\Twig_Token $token) + /** + * @param \Twig_Token|\Twig\Token $token + */ + public function parse($token) { $lineno = $token->getLine(); $stream = $this->parser->getStream(); @@ -26,17 +29,31 @@ class StopwatchTokenParser extends \Twig_TokenParser // {% stopwatch 'bar' %} $name = $this->parser->getExpressionParser()->parseExpression(); - $stream->expect(\Twig_Token::BLOCK_END_TYPE); + // Maintain compatibility with Twig 2 and 3. + if (class_exists("\Twig_Token")) { + $blockEndType = \Twig_Token::BLOCK_END_TYPE; + } else { + $blockEndType = \Twig\Token::BLOCK_END_TYPE; + } + + $stream->expect($blockEndType); // {% endstopwatch %} $body = $this->parser->subparse([$this, 'decideStopwatchEnd'], true); - $stream->expect(\Twig_Token::BLOCK_END_TYPE); + $stream->expect($blockEndType); + + // Maintain compatibility with Twig 2 and 3. + if (class_exists("\Twig_Node_Expression_AssignName")) { + $assignNameExpression = new \Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()); + } else { + $assignNameExpression = new \Twig\Node\Expression\AssignNameExpression($this->parser->getVarName(), $token->getLine()); + } if ($this->debugbarAvailable) { return new StopwatchNode( $name, $body, - new \Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), + $assignNameExpression, $lineno, $this->getTag() ); @@ -50,7 +67,10 @@ class StopwatchTokenParser extends \Twig_TokenParser return 'stopwatch'; } - public function decideStopwatchEnd(\Twig_Token $token) + /** + * @param \Twig_Token|\Twig\Token $token + */ + public function decideStopwatchEnd($token) { return $token->test('endstopwatch'); } diff --git a/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/TokenParser.php b/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/TokenParser.php new file mode 100644 index 000000000..2ff179628 --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/Twig/TokenParser/TokenParser.php @@ -0,0 +1,14 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/beyondcode/laravel-query-detector/README.md b/vendor/beyondcode/laravel-query-detector/README.md new file mode 100644 index 000000000..e356d240a --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/README.md @@ -0,0 +1,53 @@ +# Laravel N+1 Query Detector + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/beyondcode/laravel-query-detector.svg?style=flat-square)](https://packagist.org/packages/beyondcode/laravel-query-detector) +[![Build Status](https://img.shields.io/travis/beyondcode/laravel-query-detector/master.svg?style=flat-square)](https://travis-ci.org/beyondcode/laravel-query-detector) +[![Quality Score](https://img.shields.io/scrutinizer/g/beyondcode/laravel-query-detector.svg?style=flat-square)](https://scrutinizer-ci.com/g/beyondcode/laravel-query-detector) +[![Total Downloads](https://img.shields.io/packagist/dt/beyondcode/laravel-query-detector.svg?style=flat-square)](https://packagist.org/packages/beyondcode/laravel-query-detector) + +The Laravel N+1 query detector helps you to increase your application's performance by reducing the number of queries it executes. This package monitors your queries in real-time, while you develop your application and notify you when you should add eager loading (N+1 queries). + +![Example alert](https://beyondco.de/github/n+1/alert.png) + + +## Installation + +You can install the package via composer: + +```bash +composer require beyondcode/laravel-query-detector --dev +``` + +The package will automatically register itself. + +## Documentation + +You can find the documentation on our [website](http://beyondco.de/docs/laravel-query-detector). + + +### Testing + +``` bash +composer test +``` + +### Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +### Security + +If you discover any security related issues, please email marcel@beyondco.de instead of using the issue tracker. + +## Credits + +- [Marcel Pociot](https://github.com/mpociot) +- [All Contributors](../../contributors) + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/vendor/beyondcode/laravel-query-detector/composer.json b/vendor/beyondcode/laravel-query-detector/composer.json new file mode 100644 index 000000000..23ff06e92 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/composer.json @@ -0,0 +1,51 @@ +{ + "name": "beyondcode/laravel-query-detector", + "description": "Laravel N+1 Query Detector", + "keywords": [ + "beyondcode", + "laravel-query-detector" + ], + "homepage": "https://github.com/beyondcode/laravel-query-detector", + "license": "MIT", + "authors": [ + { + "name": "Marcel Pociot", + "email": "marcel@beyondco.de", + "homepage": "https://beyondcode.de", + "role": "Developer" + } + ], + "require": { + "php": "^7.1 || ^8.0", + "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0|^10.0" + }, + "require-dev": { + "laravel/legacy-factories": "^1.0", + "orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0|^8.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "autoload": { + "psr-4": { + "BeyondCode\\QueryDetector\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "BeyondCode\\QueryDetector\\Tests\\": "tests" + } + }, + "scripts": { + "test": "vendor/bin/phpunit", + "test-coverage": "vendor/bin/phpunit --coverage-html coverage" + }, + "config": { + "sort-packages": true + }, + "extra": { + "laravel": { + "providers": [ + "BeyondCode\\QueryDetector\\QueryDetectorServiceProvider" + ] + } + } +} diff --git a/vendor/beyondcode/laravel-query-detector/config/config.php b/vendor/beyondcode/laravel-query-detector/config/config.php new file mode 100644 index 000000000..03f5ec7b0 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/config/config.php @@ -0,0 +1,69 @@ + env('QUERY_DETECTOR_ENABLED', null), + + /* + * Threshold level for the N+1 query detection. If a relation query will be + * executed more then this amount, the detector will notify you about it. + */ + 'threshold' => (int) env('QUERY_DETECTOR_THRESHOLD', 1), + + /* + * Here you can whitelist model relations. + * + * Right now, you need to define the model relation both as the class name and the attribute name on the model. + * So if an "Author" model would have a "posts" relation that points to a "Post" class, you need to add both + * the "posts" attribute and the "Post::class", since the relation can get resolved in multiple ways. + */ + 'except' => [ + //Author::class => [ + // Post::class, + // 'posts', + //] + ], + + /* + * Here you can set a specific log channel to write to + * in case you are trying to isolate queries or have a lot + * going on in the laravel.log. Defaults to laravel.log though. + */ + 'log_channel' => env('QUERY_DETECTOR_LOG_CHANNEL', 'daily'), + + /* + * Define the output format that you want to use. Multiple classes are supported. + * Available options are: + * + * Alert: + * Displays an alert on the website + * \BeyondCode\QueryDetector\Outputs\Alert::class + * + * Console: + * Writes the N+1 queries into your browsers console log + * \BeyondCode\QueryDetector\Outputs\Console::class + * + * Clockwork: (make sure you have the itsgoingd/clockwork package installed) + * Writes the N+1 queries warnings to Clockwork log + * \BeyondCode\QueryDetector\Outputs\Clockwork::class + * + * Debugbar: (make sure you have the barryvdh/laravel-debugbar package installed) + * Writes the N+1 queries into a custom messages collector of Debugbar + * \BeyondCode\QueryDetector\Outputs\Debugbar::class + * + * JSON: + * Writes the N+1 queries into the response body of your JSON responses + * \BeyondCode\QueryDetector\Outputs\Json::class + * + * Log: + * Writes the N+1 queries into the Laravel.log file + * \BeyondCode\QueryDetector\Outputs\Log::class + */ + 'output' => [ + \BeyondCode\QueryDetector\Outputs\Alert::class, + \BeyondCode\QueryDetector\Outputs\Log::class, + ] +]; diff --git a/vendor/beyondcode/laravel-query-detector/docs/_index.md b/vendor/beyondcode/laravel-query-detector/docs/_index.md new file mode 100644 index 000000000..ed8a55ef4 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/docs/_index.md @@ -0,0 +1,4 @@ +--- +packageName: Laravel Query Detector +githubUrl: https://github.com/beyondcode/laravel-query-detector +--- \ No newline at end of file diff --git a/vendor/beyondcode/laravel-query-detector/docs/installation.md b/vendor/beyondcode/laravel-query-detector/docs/installation.md new file mode 100644 index 000000000..3559ca203 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/docs/installation.md @@ -0,0 +1,17 @@ +--- +title: Installation +order: 1 +--- +# Laravel N+1 Query Detector + +The Laravel N+1 query detector helps you to increase your application's performance by reducing the number of queries it executes. This package monitors your queries in real-time, while you develop your application and notify you when you should add eager loading (N+1 queries). + +# Installation + +You can install the package via composer: + +``` +composer require beyondcode/laravel-query-detector --dev +``` + +The package will automatically register itself. \ No newline at end of file diff --git a/vendor/beyondcode/laravel-query-detector/docs/usage.md b/vendor/beyondcode/laravel-query-detector/docs/usage.md new file mode 100644 index 000000000..be34cfdbf --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/docs/usage.md @@ -0,0 +1,92 @@ +--- +title: Usage +order: 2 +--- + +## Usage + +If you run your application in the `debug` mode, the query monitor will be automatically active. So there is nothing you have to do. + +By default, this package will display an `alert()` message to notify you about an N+1 query found in the current request. + +If you rather want this information to be written to your `laravel.log` file, written to your browser's console log as a warning or listed in a new tab for the [Laravel Debugbar (barryvdh/laravel-debugbar)](https://github.com/barryvdh/laravel-debugbar), you can publish the configuration and change the output behaviour (see example below). + +You can publish the package's configuration using this command: + +```bash +php artisan vendor:publish --provider="BeyondCode\QueryDetector\QueryDetectorServiceProvider" +``` + +This will add the `querydetector.php` file in your config directory with the following contents: + +```php +return [ + /* + * Enable or disable the query detection. + * If this is set to "null", the app.debug config value will be used. + */ + 'enabled' => env('QUERY_DETECTOR_ENABLED', null), + + /* + * Threshold level for the N+1 query detection. If a relation query will be + * executed more then this amount, the detector will notify you about it. + */ + 'threshold' => (int) env('QUERY_DETECTOR_THRESHOLD', 1), + + /* + * Here you can whitelist model relations. + * + * Right now, you need to define the model relation both as the class name and the attribute name on the model. + * So if an "Author" model would have a "posts" relation that points to a "Post" class, you need to add both + * the "posts" attribute and the "Post::class", since the relation can get resolved in multiple ways. + */ + 'except' => [ + //Author::class => [ + // Post::class, + // 'posts', + //] + ], + + /* + * Define the output format that you want to use. Multiple classes are supported. + * Available options are: + * + * Alert: + * Displays an alert on the website + * \BeyondCode\QueryDetector\Outputs\Alert::class + * + * Console: + * Writes the N+1 queries into your browsers console log + * \BeyondCode\QueryDetector\Outputs\Console::class + * + * Clockwork: (make sure you have the itsgoingd/clockwork package installed) + * Writes the N+1 queries warnings to Clockwork log + * \BeyondCode\QueryDetector\Outputs\Clockwork::class + * + * Debugbar: (make sure you have the barryvdh/laravel-debugbar package installed) + * Writes the N+1 queries into a custom messages collector of Debugbar + * \BeyondCode\QueryDetector\Outputs\Debugbar::class + * + * JSON: + * Writes the N+1 queries into the response body of your JSON responses + * \BeyondCode\QueryDetector\Outputs\Json::class + * + * Log: + * Writes the N+1 queries into the Laravel.log file + * \BeyondCode\QueryDetector\Outputs\Log::class + */ + 'output' => [ + \BeyondCode\QueryDetector\Outputs\Log::class, + \BeyondCode\QueryDetector\Outputs\Alert::class, + ] + +]; +``` + +If you use **Lumen**, you need to copy the config file manually and register the Lumen Service Provider in `bootstrap/app.php` file + +```php +$app->register(\BeyondCode\QueryDetector\LumenQueryDetectorServiceProvider::class); +``` + +If you need additional logic to run when the package detects unoptimized queries, you can listen to the `\BeyondCode\QueryDetector\Events\QueryDetected` event and write a listener to run your own handler. (e.g. send warning to Sentry/Bugsnag, send Slack notification, etc.) diff --git a/vendor/beyondcode/laravel-query-detector/src/Events/QueryDetected.php b/vendor/beyondcode/laravel-query-detector/src/Events/QueryDetected.php new file mode 100644 index 000000000..635ac4f88 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Events/QueryDetected.php @@ -0,0 +1,26 @@ +queries = $queries; + } + + /** + * @return Collection + */ + public function getQueries() + { + return $this->queries; + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/LumenQueryDetectorServiceProvider.php b/vendor/beyondcode/laravel-query-detector/src/LumenQueryDetectorServiceProvider.php new file mode 100644 index 000000000..c73202ec4 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/LumenQueryDetectorServiceProvider.php @@ -0,0 +1,21 @@ +app->configure('querydetector'); + $this->mergeConfigFrom(__DIR__ . '/../config/config.php', 'querydetector'); + + $this->app->middleware([ + QueryDetectorMiddleware::class + ]); + + $this->app->singleton(QueryDetector::class); + $this->app->alias(QueryDetector::class, 'querydetector'); + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Alert.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Alert.php new file mode 100644 index 000000000..08eb3c766 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Alert.php @@ -0,0 +1,53 @@ +headers->get('Content-Type'), 'text/html') !== 0 || $response->isRedirection()) { + return; + } + + $content = $response->getContent(); + + $outputContent = $this->getOutputContent($detectedQueries); + + $pos = strripos($content, ''); + + if (false !== $pos) { + $content = substr($content, 0, $pos) . $outputContent . substr($content, $pos); + } else { + $content = $content . $outputContent; + } + + // Update the new content and reset the content length + $response->setContent($content); + + $response->headers->remove('Content-Length'); + } + + protected function getOutputContent(Collection $detectedQueries) + { + $output = ''; + + return $output; + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Clockwork.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Clockwork.php new file mode 100644 index 000000000..fea7055fd --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Clockwork.php @@ -0,0 +1,19 @@ +warning("{$detectedQueries->count()} N+1 queries detected:", $detectedQueries->toArray()); + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Console.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Console.php new file mode 100644 index 000000000..6b4680f2d --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Console.php @@ -0,0 +1,62 @@ +headers->get('Content-Type'), 'text/html') !== 0 || $response->isRedirection()) { + return; + } + + $content = $response->getContent(); + + $outputContent = $this->getOutputContent($detectedQueries); + + $pos = strripos($content, ''); + + if (false !== $pos) { + $content = substr($content, 0, $pos) . $outputContent . substr($content, $pos); + } else { + $content = $content . $outputContent; + } + + // Update the new content and reset the content length + $response->setContent($content); + + $response->headers->remove('Content-Length'); + } + + protected function getOutputContent(Collection $detectedQueries) + { + $output = ''; + + return $output; + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Debugbar.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Debugbar.php new file mode 100644 index 000000000..ea887aad8 --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Debugbar.php @@ -0,0 +1,34 @@ +collector = new MessagesCollector('N+1 Queries'); + + if (!LaravelDebugbar::hasCollector($this->collector->getName())) { + LaravelDebugbar::addCollector($this->collector); + } + } + + public function output(Collection $detectedQueries, Response $response) + { + foreach ($detectedQueries as $detectedQuery) { + $this->collector->addMessage(sprintf('Model: %s => Relation: %s - You should add `with(%s)` to eager-load this relation.', + $detectedQuery['model'], + $detectedQuery['relation'], + $detectedQuery['relation'] + )); + } + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Json.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Json.php new file mode 100644 index 000000000..e2f57141c --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Json.php @@ -0,0 +1,27 @@ +getData(true); + if (! is_array($data)){ + $data = [ $data ]; + } + + $data['warning_queries'] = $detectedQueries; + $response->setData($data); + } + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Log.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Log.php new file mode 100644 index 000000000..75635306f --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Log.php @@ -0,0 +1,41 @@ +log('Detected N+1 Query'); + + foreach ($detectedQueries as $detectedQuery) { + $logOutput = 'Model: '.$detectedQuery['model'] . PHP_EOL; + + $logOutput .= 'Relation: '.$detectedQuery['relation'] . PHP_EOL; + + $logOutput .= 'Num-Called: '.$detectedQuery['count'] . PHP_EOL; + + $logOutput .= 'Call-Stack:' . PHP_EOL; + + foreach ($detectedQuery['sources'] as $source) { + $logOutput .= '#'.$source->index.' '.$source->name.':'.$source->line . PHP_EOL; + } + + $this->log($logOutput); + } + } + + private function log(string $message) + { + LaravelLog::channel(config('querydetector.log_channel'))->info($message); + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/Outputs/Output.php b/vendor/beyondcode/laravel-query-detector/src/Outputs/Output.php new file mode 100644 index 000000000..0dbe5315e --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/Outputs/Output.php @@ -0,0 +1,13 @@ +queries = Collection::make(); + } + + public function boot() + { + DB::listen(function($query) { + $backtrace = collect(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 50)); + + $this->logQuery($query, $backtrace); + }); + + foreach ($this->getOutputTypes() as $outputType) { + app()->singleton($outputType); + app($outputType)->boot(); + } + } + + public function isEnabled(): bool + { + $configEnabled = value(config('querydetector.enabled')); + + if ($configEnabled === null) { + $configEnabled = config('app.debug'); + } + + return $configEnabled; + } + + public function logQuery($query, Collection $backtrace) + { + $modelTrace = $backtrace->first(function ($trace) { + return Arr::get($trace, 'object') instanceof Builder; + }); + + // The query is coming from an Eloquent model + if (! is_null($modelTrace)) { + /* + * Relations get resolved by either calling the "getRelationValue" method on the model, + * or if the class itself is a Relation. + */ + $relation = $backtrace->first(function ($trace) { + return Arr::get($trace, 'function') === 'getRelationValue' || Arr::get($trace, 'class') === Relation::class ; + }); + + // We try to access a relation + if (is_array($relation) && isset($relation['object'])) { + if ($relation['class'] === Relation::class) { + $model = get_class($relation['object']->getParent()); + $relationName = get_class($relation['object']->getRelated()); + $relatedModel = $relationName; + } else { + $model = get_class($relation['object']); + $relationName = $relation['args'][0]; + $relatedModel = $relationName; + } + + $sources = $this->findSource($backtrace); + + $key = md5($query->sql . $model . $relationName . $sources[0]->name . $sources[0]->line); + + $count = Arr::get($this->queries, $key.'.count', 0); + $time = Arr::get($this->queries, $key.'.time', 0); + + $this->queries[$key] = [ + 'count' => ++$count, + 'time' => $time + $query->time, + 'query' => $query->sql, + 'model' => $model, + 'relatedModel' => $relatedModel, + 'relation' => $relationName, + 'sources' => $sources + ]; + } + } + } + + protected function findSource($stack) + { + $sources = []; + + foreach ($stack as $index => $trace) { + $sources[] = $this->parseTrace($index, $trace); + } + + return array_values(array_filter($sources)); + } + + public function parseTrace($index, array $trace) + { + $frame = (object) [ + 'index' => $index, + 'name' => null, + 'line' => isset($trace['line']) ? $trace['line'] : '?', + ]; + + if (isset($trace['class']) && + isset($trace['file']) && + !$this->fileIsInExcludedPath($trace['file']) + ) { + $frame->name = $this->normalizeFilename($trace['file']); + + return $frame; + } + + return false; + } + + /** + * Check if the given file is to be excluded from analysis + * + * @param string $file + * @return bool + */ + protected function fileIsInExcludedPath($file) + { + $excludedPaths = [ + '/vendor/laravel/framework/src/Illuminate/Database', + '/vendor/laravel/framework/src/Illuminate/Events', + ]; + + $normalizedPath = str_replace('\\', '/', $file); + + foreach ($excludedPaths as $excludedPath) { + if (strpos($normalizedPath, $excludedPath) !== false) { + return true; + } + } + + return false; + } + + /** + * Shorten the path by removing the relative links and base dir + * + * @param string $path + * @return string + */ + protected function normalizeFilename($path): string + { + if (file_exists($path)) { + $path = realpath($path); + } + + return str_replace(base_path(), '', $path); + } + + public function getDetectedQueries(): Collection + { + $exceptions = config('querydetector.except', []); + + $queries = $this->queries + ->values(); + + foreach ($exceptions as $parentModel => $relations) { + foreach ($relations as $relation) { + $queries = $queries->reject(function ($query) use ($relation, $parentModel) { + return $query['model'] === $parentModel && $query['relatedModel'] === $relation; + }); + } + } + + $queries = $queries->where('count', '>', config('querydetector.threshold', 1))->values(); + + if ($queries->isNotEmpty()) { + event(new QueryDetected($queries)); + } + + return $queries; + } + + protected function getOutputTypes() + { + $outputTypes = config('querydetector.output'); + + if (! is_array($outputTypes)) { + $outputTypes = [$outputTypes]; + } + + return $outputTypes; + } + + protected function applyOutput(Response $response) + { + foreach ($this->getOutputTypes() as $type) { + app($type)->output($this->getDetectedQueries(), $response); + } + } + + public function output($request, $response) + { + if ($this->getDetectedQueries()->isNotEmpty()) { + $this->applyOutput($response); + } + + return $response; + } +} diff --git a/vendor/beyondcode/laravel-query-detector/src/QueryDetectorMiddleware.php b/vendor/beyondcode/laravel-query-detector/src/QueryDetectorMiddleware.php new file mode 100644 index 000000000..df0d5de0c --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/QueryDetectorMiddleware.php @@ -0,0 +1,40 @@ +detector = $detector; + } + + /** + * Handle an incoming request. + * + * @param Request $request + * @param Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if (! $this->detector->isEnabled()) { + return $next($request); + } + + $this->detector->boot(); + + /** @var \Illuminate\Http\Response $response */ + $response = $next($request); + + // Modify the response to add the Debugbar + $this->detector->output($request, $response); + + return $response; + } +} \ No newline at end of file diff --git a/vendor/beyondcode/laravel-query-detector/src/QueryDetectorServiceProvider.php b/vendor/beyondcode/laravel-query-detector/src/QueryDetectorServiceProvider.php new file mode 100644 index 000000000..8d62987ac --- /dev/null +++ b/vendor/beyondcode/laravel-query-detector/src/QueryDetectorServiceProvider.php @@ -0,0 +1,46 @@ +app->runningInConsole()) { + $this->publishes([ + __DIR__.'/../config/config.php' => config_path('querydetector.php'), + ], 'config'); + } + + $this->registerMiddleware(QueryDetectorMiddleware::class); + } + + /** + * Register the application services. + */ + public function register() + { + $this->app->singleton(QueryDetector::class); + + $this->app->alias(QueryDetector::class, 'querydetector'); + + $this->mergeConfigFrom(__DIR__.'/../config/config.php', 'querydetector'); + } + + /** + * Register the middleware + * + * @param string $middleware + */ + protected function registerMiddleware($middleware) + { + $kernel = $this->app[Kernel::class]; + $kernel->pushMiddleware($middleware); + } +} diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index fd56bd7d8..afef3fa2a 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -42,9 +42,6 @@ namespace Composer\Autoload; */ class ClassLoader { - /** @var \Closure(string):void */ - private static $includeFile; - /** @var ?string */ private $vendorDir; @@ -109,7 +106,6 @@ class ClassLoader public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; - self::initializeIncludeClosure(); } /** @@ -429,7 +425,7 @@ class ClassLoader public function loadClass($class) { if ($file = $this->findFile($class)) { - (self::$includeFile)($file); + includeFile($file); return true; } @@ -559,23 +555,18 @@ class ClassLoader return false; } - - private static function initializeIncludeClosure(): void - { - if (self::$includeFile !== null) { - return; - } - - /** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - */ - self::$includeFile = static function($file) { - include $file; - }; - } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private + */ +function includeFile($file) +{ + include $file; } diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 8f3e08da6..6691fda94 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -146,12 +146,14 @@ return array( 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'), 'Complex\\' => array($vendorDir . '/markbaker/complex/classes/src'), 'Collective\\Html\\' => array($vendorDir . '/laravelcollective/html/src'), + 'Clockwork\\' => array($vendorDir . '/itsgoingd/clockwork/Clockwork'), 'Chumper\\Zipper\\' => array($vendorDir . '/chumper/zipper/src/Chumper/Zipper'), 'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), 'Bugsnag\\PsrLogger\\' => array($vendorDir . '/bugsnag/bugsnag-psr-logger/src'), 'Bugsnag\\BugsnagLaravel\\' => array($vendorDir . '/bugsnag/bugsnag-laravel/src'), 'Bugsnag\\' => array($vendorDir . '/bugsnag/bugsnag/src'), 'Brick\\Math\\' => array($vendorDir . '/brick/math/src'), + 'BeyondCode\\QueryDetector\\' => array($vendorDir . '/beyondcode/laravel-query-detector/src'), 'Barryvdh\\Debugbar\\' => array($vendorDir . '/barryvdh/laravel-debugbar/src'), 'Aws\\' => array($vendorDir . '/aws/aws-sdk-php/src'), 'App\\' => array($baseDir . '/app', $vendorDir . '/laravel/pint/app'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 516b878d8..583fd0ebb 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -33,18 +33,25 @@ class ComposerAutoloaderInit10c1836cea18dd9470bc2e97275d9d56 $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit10c1836cea18dd9470bc2e97275d9d56::$files; - $requireFile = static function ($fileIdentifier, $file) { - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - - require $file; - } - }; - foreach ($filesToLoad as $fileIdentifier => $file) { - ($requireFile)($fileIdentifier, $file); + $includeFiles = \Composer\Autoload\ComposerStaticInit10c1836cea18dd9470bc2e97275d9d56::$files; + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire10c1836cea18dd9470bc2e97275d9d56($fileIdentifier, $file); } return $loader; } } + +/** + * @param string $fileIdentifier + * @param string $file + * @return void + */ +function composerRequire10c1836cea18dd9470bc2e97275d9d56($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 1f53aff78..b76810a77 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -250,6 +250,7 @@ class ComposerStaticInit10c1836cea18dd9470bc2e97275d9d56 'Composer\\CaBundle\\' => 18, 'Complex\\' => 8, 'Collective\\Html\\' => 16, + 'Clockwork\\' => 10, 'Chumper\\Zipper\\' => 15, 'Carbon\\' => 7, ), @@ -259,6 +260,7 @@ class ComposerStaticInit10c1836cea18dd9470bc2e97275d9d56 'Bugsnag\\BugsnagLaravel\\' => 23, 'Bugsnag\\' => 8, 'Brick\\Math\\' => 11, + 'BeyondCode\\QueryDetector\\' => 25, 'Barryvdh\\Debugbar\\' => 18, ), 'A' => @@ -836,6 +838,10 @@ class ComposerStaticInit10c1836cea18dd9470bc2e97275d9d56 array ( 0 => __DIR__ . '/..' . '/laravelcollective/html/src', ), + 'Clockwork\\' => + array ( + 0 => __DIR__ . '/..' . '/itsgoingd/clockwork/Clockwork', + ), 'Chumper\\Zipper\\' => array ( 0 => __DIR__ . '/..' . '/chumper/zipper/src/Chumper/Zipper', @@ -860,6 +866,10 @@ class ComposerStaticInit10c1836cea18dd9470bc2e97275d9d56 array ( 0 => __DIR__ . '/..' . '/brick/math/src', ), + 'BeyondCode\\QueryDetector\\' => + array ( + 0 => __DIR__ . '/..' . '/beyondcode/laravel-query-detector/src', + ), 'Barryvdh\\Debugbar\\' => array ( 0 => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 2df7f86cd..6d29ff477 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -152,34 +152,34 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.7.0", - "version_normalized": "3.7.0.0", + "version": "v3.8.0", + "version_normalized": "3.8.0.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "3372ed65e6d2039d663ed19aa699956f9d346271" + "reference": "eb01216141e62433178c52b0cbdb785b45bae871" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3372ed65e6d2039d663ed19aa699956f9d346271", - "reference": "3372ed65e6d2039d663ed19aa699956f9d346271", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/eb01216141e62433178c52b0cbdb785b45bae871", + "reference": "eb01216141e62433178c52b0cbdb785b45bae871", "shasum": "" }, "require": { - "illuminate/routing": "^7|^8|^9", - "illuminate/session": "^7|^8|^9", - "illuminate/support": "^7|^8|^9", + "illuminate/routing": "^9|^10", + "illuminate/session": "^9|^10", + "illuminate/support": "^9|^10", "maximebf/debugbar": "^1.17.2", - "php": ">=7.2.5", - "symfony/finder": "^5|^6" + "php": "^8.0", + "symfony/finder": "^6" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^5|^6|^7", - "phpunit/phpunit": "^8.5|^9.0", + "orchestra/testbench-dusk": "^5|^6|^7|^8", + "phpunit/phpunit": "^8.5.30|^9.0", "squizlabs/php_codesniffer": "^3.5" }, - "time": "2022-07-11T09:26:42+00:00", + "time": "2023-02-04T15:47:28+00:00", "type": "library", "extra": { "branch-alias": { @@ -223,7 +223,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.7.0" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.0" }, "funding": [ { @@ -237,6 +237,69 @@ ], "install-path": "../barryvdh/laravel-debugbar" }, + { + "name": "beyondcode/laravel-query-detector", + "version": "1.7.0", + "version_normalized": "1.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/beyondcode/laravel-query-detector.git", + "reference": "40c7e168fcf7eeb80d8e96f7922e05ab194269c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beyondcode/laravel-query-detector/zipball/40c7e168fcf7eeb80d8e96f7922e05ab194269c8", + "reference": "40c7e168fcf7eeb80d8e96f7922e05ab194269c8", + "shasum": "" + }, + "require": { + "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0|^10.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "laravel/legacy-factories": "^1.0", + "orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0|^8.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "time": "2023-02-15T10:37:22+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BeyondCode\\QueryDetector\\QueryDetectorServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "BeyondCode\\QueryDetector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marcel Pociot", + "email": "marcel@beyondco.de", + "homepage": "https://beyondcode.de", + "role": "Developer" + } + ], + "description": "Laravel N+1 Query Detector", + "homepage": "https://github.com/beyondcode/laravel-query-detector", + "keywords": [ + "beyondcode", + "laravel-query-detector" + ], + "support": { + "issues": "https://github.com/beyondcode/laravel-query-detector/issues", + "source": "https://github.com/beyondcode/laravel-query-detector/tree/1.7.0" + }, + "install-path": "../beyondcode/laravel-query-detector" + }, { "name": "brick/math", "version": "0.10.2", @@ -3019,6 +3082,76 @@ ], "install-path": "../intervention/image" }, + { + "name": "itsgoingd/clockwork", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ladybirdweb/clockwork.git", + "reference": "e29be8125ce999947d60986dcd8e606c04c012ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ladybirdweb/clockwork/zipball/e29be8125ce999947d60986dcd8e606c04c012ab", + "reference": "e29be8125ce999947d60986dcd8e606c04c012ab", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "time": "2023-04-14T10:39:18+00:00", + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Clockwork\\Support\\Laravel\\ClockworkServiceProvider" + ], + "aliases": { + "Clockwork": "Clockwork\\Support\\Laravel\\Facade" + } + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Clockwork\\": "Clockwork/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "itsgoingd", + "email": "itsgoingd@luzer.sk", + "homepage": "https://twitter.com/itsgoingd" + } + ], + "description": "php dev tools in your browser", + "homepage": "https://underground.works/clockwork", + "keywords": [ + "debugging", + "devtools", + "laravel", + "logging", + "lumen", + "profiling", + "slim" + ], + "support": { + "source": "https://github.com/ladybirdweb/clockwork/tree/master" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/itsgoingd" + } + ], + "install-path": "../itsgoingd/clockwork" + }, { "name": "laravel/dusk", "version": "v6.25.2", @@ -13877,6 +14010,7 @@ "dev": true, "dev-package-names": [ "barryvdh/laravel-debugbar", + "beyondcode/laravel-query-detector", "doctrine/instantiator", "fakerphp/faker", "filp/whoops", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 863d5b944..866a3e75c 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'laravel/laravel', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '2381fd7cf5b871b9db0df601f4fdd55c221c4f20', + 'reference' => 'c25c1d94b8fa38df50e8d839730bf32cb534b8cb', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -29,14 +29,23 @@ 'dev_requirement' => false, ), 'barryvdh/laravel-debugbar' => array( - 'pretty_version' => 'v3.7.0', - 'version' => '3.7.0.0', - 'reference' => '3372ed65e6d2039d663ed19aa699956f9d346271', + 'pretty_version' => 'v3.8.0', + 'version' => '3.8.0.0', + 'reference' => 'eb01216141e62433178c52b0cbdb785b45bae871', 'type' => 'library', 'install_path' => __DIR__ . '/../barryvdh/laravel-debugbar', 'aliases' => array(), 'dev_requirement' => true, ), + 'beyondcode/laravel-query-detector' => array( + 'pretty_version' => '1.7.0', + 'version' => '1.7.0.0', + 'reference' => '40c7e168fcf7eeb80d8e96f7922e05ab194269c8', + 'type' => 'library', + 'install_path' => __DIR__ . '/../beyondcode/laravel-query-detector', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'brick/math' => array( 'pretty_version' => '0.10.2', 'version' => '0.10.2.0', @@ -588,6 +597,17 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'itsgoingd/clockwork' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'e29be8125ce999947d60986dcd8e606c04c012ab', + 'type' => 'library', + 'install_path' => __DIR__ . '/../itsgoingd/clockwork', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'dev_requirement' => false, + ), 'kodova/hamcrest-php' => array( 'dev_requirement' => true, 'replaced' => array( @@ -615,7 +635,7 @@ 'laravel/laravel' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '2381fd7cf5b871b9db0df601f4fdd55c221c4f20', + 'reference' => 'c25c1d94b8fa38df50e8d839730bf32cb534b8cb', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -1247,8 +1267,8 @@ 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '1.0|2.0|3.0', - 1 => '1.0.0 || 2.0.0 || 3.0.0', + 0 => '1.0.0 || 2.0.0 || 3.0.0', + 1 => '1.0|2.0|3.0', ), ), 'psr/simple-cache' => array( diff --git a/vendor/itsgoingd/clockwork/.editorconfig b/vendor/itsgoingd/clockwork/.editorconfig new file mode 100644 index 000000000..54bc5035b --- /dev/null +++ b/vendor/itsgoingd/clockwork/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = tab + +[*.php] +insert_final_newline = true diff --git a/vendor/itsgoingd/clockwork/.gitattributes b/vendor/itsgoingd/clockwork/.gitattributes new file mode 100644 index 000000000..0aa53e186 --- /dev/null +++ b/vendor/itsgoingd/clockwork/.gitattributes @@ -0,0 +1 @@ +.github/ export-ignore \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/CHANGELOG.md b/vendor/itsgoingd/clockwork/CHANGELOG.md new file mode 100644 index 000000000..ff903af17 --- /dev/null +++ b/vendor/itsgoingd/clockwork/CHANGELOG.md @@ -0,0 +1,706 @@ +5.1.12 + +- improved Timeline event run method to stop the event in case of an exception (implemented by UlrichEckhardt, thanks!) +- fixed some deprecation warnings on PHP 8.2 (implemented by faytekin, thanks!) +- fixed some deprecation warnings on PHP 8.1 (implemented by villermen, thanks!) + +5.1.11 + +- fixed crash when resolving authenticated user in Laravel without using Eloquent (reported by m-thalmann-athesia, thanks!) + +5.1.10 + +- fixed crash when resolving authenticated user in Laravel (reported by LucaRed, thanks!) + +5.1.9 + +- added support for Eloquent strict mode (reported by Sergiobop, thanks!) + +5.1.8 + +- updated list of built-in Laravel commands to ignore when collecting commands and included Horizon commands +- fixed collecting of Laravel queue jobs when used with Horizon +- fixed collecting of authanticated user name when the User model includes name() method (implemented by devfrey, thanks!) + +5.1.7 + +- added support for authentiaction in the Vanilla integration +- added support for compressed Xdebug profiles +- improved collecting of Laravel Artisan commands to support abbreviated commands (implemented by mike-peters90, thanks!) +- fixed doubled backslashes in collected Laravel database query bindings (reported by pys1992, thanks!) +- fixed compatibility with PostgreSQL in SQL storage (implemented by screw, thanks!) +- fixed possible crash during file storage cleanup when used with Laravel Octane (reported by flexchar, thanks!) +- fixed infinite loop when collecting queries in Doctrine 3.x (reported by N-M, thanks!) + +5.1.6 + +- added Monolog 2.x compatible handler (idea by mahagr, thanks!) +- improved log to handle all Throwable classes as exceptions (idea by EdmondDantes, thanks!) +- fixed support for capturing console output in Laravel 9 (reported by mikerockett, thanks!) + +5.1.5 + +- removed support for psr/log +- fixed some typos (implemented by fridzema, thanks!) + +*BREAKING* + +- `Clockwork\Request\Log` no longer implements the PSR log interface, it is unlikely you are using this class directly + +5.1.4 + +- added Laravel 9 support +- added support for manually registering Clockwork middleware in Laravel +- fixed some failing tests might not been collected in Laravel (reported by ajcastro, thanks!) +- fixed not respecting the collect tests setting in Laravel (reported by SimBig, thanks!) +- fixed some deprecation warnings on PHP 8.1 (implemented by usernotnull, thanks!) + +5.1.3 + +- added PSR to the default filtered namespaces from stack traces in the Laravel integration +- fixed not being able to log non-string values when using psr/log >=2.0 (reported by Wit3, thanks!) +- fixed some deprecation warnings on PHP 8.1 (reported by Pinnokkio, thanks!) +- fixed wrong redirect when accessing web ui with an url including a trailing slash (implemented by ssnepenthe, thanks!) +- fixed update-token could be leaked via the Clockwork rest api (implemented by ssnepenthe, thanks!) + +5.1.2 + +- fixed some deprecation warnings on PHP 8.1 (reported by Codomic, thanks!) + +5.1.1 + +- added support for psr/log 2.0 (used in recent Laravel versions) (implemented by byGits, thanks!) +- improved timeline api event run method to return the return value of passed closure +- improved collecting Laravel database queries to not quote integers (implemented by thisiskj, thanks!) +- improved toolbar details link to always be absolute and work with subdirectories (reported by superDuperCyberTechno, thanks!) +- fixed some deprecation warnings on PHP 8.1 (implemented by gharlan, thanks!) +- fixed collecting Laravel database queries to produce correct queries when bindings contain question marks (reported by woshixiaobai, thanks!) +- fixed filtering collected and recorded requests by closure (implemented by ssnepenthe, thanks!) +- fixed some inconsistencies in the Clockwork metadata api +- fixed some web UI assets being server with wrong mime-types (implemented by ssnepenthe, thanks!) +- fixed missing method on storage interface and missing default parameter value in sql storage (implemented by ssnepenthe, thanks!) + +*BREAKING* + +- timeline api event run method now returns the return value of passed closure instead of the event instance + +5.1 + +- added initial support for Laravel Octane +- added support for Web UI in the vanilla integration +- added support for collecting Laravel cache queries without values (implemented by akalongman, thanks!) +- added ability to filter Laravel routes from particular namespaces (idea by hailwood, thanks!) +- improved collecting of request URL to include full URL including the query string +- improved Clockwork Browser payload to include Web UI path +- updated Clockwork App (5.1) +- fixed logging falsy values via Clockwork::log (reported by Karmalakas, thanks!) +- fixed PHP 8 incompatibility when processing some Laravel notifications (implemented by nanaya, thanks!) +- fixed request body being collected even when already parsed into POST data +- fixed collecting request URLs with non-standard ports + +5.0.8 + +- fixed crash when collecting Laravel mailables built via MailMessage (implemented by cbl, thanks!) +- fixed crash when collecting artisan command in Lumen (reported by 2Attack, thanks!) +- fixed crash when collecting database queries in Laravel with connection implementation not using PDO (implemented by lenssoft, thanks!) +- fixed crash when HTTP request body contains valid json which does not contain array (eg. a number) (reported by Mradxz, thanks!) +- fixed collected jobs dispatched from other jobs not having a correct parent job set (implemented by josvar, thanks!) + +5.0.7 + +- changed delay listening to events until the app is booted (improves comatibility with some other packages) +- changed default settings to enable toolbar (separately installed component) +- changed default except requests filter to include debugbar api (implemented by edgardmessias, thanks!) +- fixed wrong type-hint for the timeline event run method (reported by hferradj, thanks!) +- fixed on-demand mode not working in Laravel (reported by yemenifree, thanks!) +- fixed crash when collecting Laravel notifications with recipient names (reported by iainheng, thanks!) +- fixed possible crashes and other issues when collecting Laravel notifications (reported by beekmanbv, thanks!) +- fixed crash when creating runnable queries in DBAL data source (implemented by N-M, thanks!) + +5.0.6 + +- fixed vanilla integration overriding other cookies when used with a PSR-7 response (reported by leemason, thanks!) + +5.0.5 + +- added support for toolbar in the vanilla integration (idea by reeslo, thanks!) +- added support for client metrics in the vanilla integration +- improved PSR-7 support in the vanilla integration +- fixed toolbar might not work when not collecting database models +- fixed crash collecting Slack and Nexmo notifications (reported by abalozz, thanks!) +- fixed timeline api usage not being updated in the Slim integration leading to crash (reported by jiaojie1989, implemented by seanhamlin, thanks!) +- fixed api path being interpreted as regex in the vanilla integration (implemented by pqr, thanks!) +- fixed Symfony storage not being updated for latest storage api (implemented by auchanhub, thanks!) + +5.0.4 + +- fixed Lumen integration crash (implemented by alexbegoon, thanks!) +- fixed PHP 5.6 incompatibility (implemented by sanis, thanks!) + +5.0.3 + +- fixed PHP 8.0 incompatibility in log (implemented by mtorromeo, thanks!) + +5.0.2 + +- fixed data sources not being initialized for extended data requests (reported by tmishutin, thanks!) +- fixed inconsistent handling of time and duration arguments in various Request::add* methods (reported by mahagr, thanks!) +- updated Clockwork App (5.0.2) + +5.0.1 + +- fixed performance issues related to collecting stack traces for Eloquent models actions (reported by mstaack, thanks!) +- fixed collecting database and unsupported Laravel notifications (implemented by YannikFirre, thanks!) +- fixed log and timeline sorting leading to invalid metadata format +- updated Clockwork App (5.0.1) + +5.0 + +- added collecting of client-metrics and web-vitals +- added collecting of Eloquent models actions and retrieved, created, updated and deleted models counts +- added collecting of Laravel notifications +- added reworked timeline api +- added configurable web ui path (default changed to /clockwork) +- added toolbar support +- added on-demand mode (with optional secret) +- added option to collect error requests only (requests with 4xx and 5xx responses) +- added option to specify slow threshold and collect slow requests only +- added option to sample collected requests (collect only 1 in x requests) +- added option to collect only specified urls +- added option to not collect pre-flight requests (enabled by default) +- added option to filter collected and recorded requests by closure +- added Laravel controller timeline event +- added support for updating existing requests +- added Slim 4 support +- updated to Clockwork App 5.0 +- improved reworked the central Clockwork class api +- improved requests recording to use a terminate callback +- improved global log instance to live on the request instance +- improved global timeline instance to live on the request instance +- improved Symfony routes registration to register web ui paths only when enabled +- improved SQL storage to be more compatible with different PDO error modes +- improved Clockwork rest api with only/except filters +- improved handling of corrupted index records in file storage +- improved cleaned up the code-base, added and improved comments, use modern php features +- removed Laravel total, initialization, boot and run timeline events +- removed legacy clockwork.controller events +- removed duplicate file/line information from collected metadata +- fixed authentication route not being registered when web ui is disabled +- fixed database queries not being collected for queue jobs +- fixed multi-line database queries not being counted properly (implemented by edgardmessias, thanks!) +- fixed StackFrame not processing Windows paths correctly + +*BREAKING* + +- multiple changes to the Laravel config file, please review and re-publish +- minimal required PHP version is now 5.6 (previously 5.5) +- the timeline api was reworked, please see documentation for details +- the global log instance was moved to request instance, please see documentation for details +- the central Clockwork class api was reworked, old api is available but deprecated +- changed Slim middleware namespaces + +4.1.8 + +- fixed handling of index file locking failures in file storage (reported by mahagr, thanks!) + +4.1.7 + +- fixed a rare crash in Eloquent duplicate queries detection (reported by mstaack, thanks!) +- fixed code-style in the Laravel config (implemented by fgilio, thanks!) + +4.1.6 + +- added support for filtering collected requests by method to Laravel integration (options requests filtered by default) (idea by mortenscheel, thanks!) +- added support for filtering collected requests by uri and method to vanilla integration +- fixed handling of failed file operations on index file in file storage (reported by staabm, thanks!) + +4.1.5 + +- fixed crash on initialization in Lumen apps using queue (reported by gramparallelo, thanks!) + +4.1.4 + +- added support for a time property to the Request:add* apis, defaults to "current time - duration" +- fixed crash when collecting console commands with array arguments or options in the Laravel integration (implemented by mortenscheel, thanks!) +- fixed default storage directory being one level too deep in vanilla integration + +4.1.3 + +- fixed file storage not unlocking index when cleanup has nothing to clean (implemented by Nacoma, thanks!) + +4.1.2 + +- fixed interaction when making HTTP requests in feature tests when collecting tests in Laravel +- updated to Clockwork App 4.1.1 + +4.1.1 + +- added ext-json to composer.json require section (idea by staabm, thanks!) +- fixed Clockwork being initialized too soon in Laravel integration leading to possible crashes (reported by tminich, thanks!) + +4.1 + +- added support for command type requests with command specific metadata (commandName, commandArguments, commandArgumentsDefaults, commandOptions, commandOptionsDefaults, commandExitCode, commandOutput) +- added support for collecting executed artisan commands in Laravel integration +- added support for queue-job type requests with queue-job specific metadata (jobName, jobDescription, jobStatus, jobPayload, jobQueue, jobConnection, jobOptions) +- added support for collecting executed queue-jobs in Laravel integration (also supports Laravel Horizon) +- added support for test type requests with test specific metadata (testName, testStatus, testStatusMessage, testAsserts) +- added support for collecting test runs in Laravel integration using PHPunit +- added support for disabling collection of view data when collecting rendered views (new default is to collect views without data) +- added Twig data source using the built-in Twig profiler to collect more precise Twig profiling data +- added support for setting parent requests on requests +- improved collecting of database queries, cache queries, dispatched queue jobs and redis commands to also collect time +- improved the data sources filters api to allow multiple filter types +- improved collecting of Laravel views to use a separate data source +- improved Eloquent data source to have an additional "early" filter applied before the query is added to query counts +- improved Eloquent data source now passes raw stack trace as second argument to filters +- improved Laravel data source to work when response is not provided +- improved Laravel events data source to include Laravel namespace in the default ignored events +- improved Laravel views data source to strip view data prefixed with __ +- improved PHP data source to not set request time for cli commands +- improved serializer to omit data below depth limit, support debugInfo, jsonSerialize and toArray methods (partially implemented by mahagr, thanks!) +- improved log to allow overriding serializer settings via context, no longer enabled toString by default +- improved Request class now has pre-populated request time on creation +- improved StackTrace helper with limit option, last method, fixed filter output keys +- improved Lumen queue and redis feature detection +- improved vanilla integration to allow manually sending the headers early (implemented by tminich, thanks!) +- fixed Symfony support, added support for latest Symfony 5.x and 4.x (reported by llaville, thanks!) +- removed dark theme for the web UI setting (now configurable in the Clockwork app itself) +- updated to Clockwork App 4.1 + +*BREAKING* + +- multiple new settings were added to the Laravel config file +- DataSourceInterface::reset method was added, default empty implementation is provided in the base DataSource class +- LaravelDataSource constructor arguments changed to reflect removing the views collecting support + +4.0.17 + +- improved performance and memory usage when doing file storage cleanup (reported by ikkez, thanks!) +- fixed crash after running file storage cleanup +- fixed typo in clockwork:clean argument description + +4.0.16 + +- fixed Laravel middleware being registered too late, causing "collect data always" setting to not work (reported by Youniteus, thanks!) + +4.0.15 + +- fixed cleanup not working with file storage (implemented by LucidTaZ, thanks!) + +4.0.14 + +- fixed compatibility with Laravel 5.4 and earlier when resolving authenticated user + +4.0.13 + +- fixed stack traces processing not handling call_user_func frames properly leading to wrong traces (reported by marcus-at-localhost, thanks!) +- fixed wrong stack traces skip namespaces defaults leading to wrong traces +- fixed vanilla integration config file missing and no longer used settings + +4.0.12 + +- added a simple index file locking to the file storage +- improved handling of invalid index data in the file storage (reported by nsbucky and tkaven, thanks!) +- fixed Laravel data source crash when running without auth service (implemented by DrBenton, thanks!) + +4.0.11 + +- updated web UI (Clockwork App 4.0.6) + +4.0.10 + +- fixed wrong file:line for log messages (requires enabled stack traces atm) + +4.0.9 + +- fixed duplicate queries detection reporting all relationship queries instead of only duplicates (reported by robclancy, thanks!) +- improved the default .gitignore for metadata storage to ignore compressed metadata as well (implemented by clugg, thanks!) + +4.0.8 + +- updated web UI (Clockwork App 4.0.5) + +4.0.7 + +- updated web UI (Clockwork App 4.0.4) + +4.0.6 + +- fixed possible crash in LaravelDataSource when resolving authenticated user in non-standard auth implementations (4.0 regression) (implemented by zarunet, thanks!) +- fixed StackTrace::filter calling array_filter with swapped arguments (implemented by villermen, thanks!) +- fixed PHP 5.x incompatibility tenaming the Storage\Search empty and notEmpty methods to isEmpty and isNotEmpty (reported by eduardodgarciac, thanks!) +- updated web UI (Clockwork App 4.0.3) + +4.0.5 + +- fixed multiple issues causing FileStorage cleanup to not delete old metadata or crash (partially implemented by jaumesala, reported by SerafimArts, thanks!) +- updated web UI (Clockwork App 4.0.2) + +4.0.4 + +- fixed web UI not working (4.0.2 regression) (reported by williamqian and lachlankrautz, thanks!) + +4.0.3 + +- fixed crash when using SQL storage (reported by sebastiaanluca, thanks!) + +4.0.2 + +- updated web UI (Clockwork App 4.0.1) + +4.0.1 + +- fixed Lumen support (reported by Owlnofeathers, thanks!) + +4.0 + +- added "features" configuration +- added requests search (extended storage api) +- added collecting request body data (idea by lkloon123, thanks!) +- added collecting of dispatched queue jobs +- added collecting Redis commands (idea by tillkruss, thanks!) +- added collecting of database query stats separate from queries +- added collecting of executed middleware +- added ability to specify slow database query threshold +- added ability to collect only slow database queries +- added ability to disable collecting of database queries keeping database stats +- added ability to disable collecting of cache queries keeping cache stats +- added duplicate (N+1) database query detection (inspired by beyondcode/laravel-query-detector, thanks!) +- added configuration to limit number of collected frames for stack traces (defaults to 10) +- added configuration to specify skipped vendors, namespaces and files for stack traces +- added index file to file storage +- added support for compression in file storage +- added new filters api to data sources +- improved file and sql storage to support search api +- improved symfony storage to work with file storage changes +- improved log api to allow passing custom stack traces in context +- improved refactored and cleaned up Laravel service provider +- improved Lumen integration to share more code with Laravel integration +- improved refactored sql storage a bit +- improved timeline api, description is now optional and defaults to event name when calling startEvent (idea by robclancy, thanks!) +- updated web UI +- fixed regexp in vanilla integration Clockwork REST api processing +- removed storage filter support (replaced by features configuration) +- BREAKING configuration format changes, please re-deploy if using customized Clockwork config +- NOTE metadata files from previous versions will need to be manually removed on upgrade + +3.1.4 + +- improved DBALDataSource to work with custom types (thanks villermen) + +3.1.3 + +- updated LaravelCacheDataSource to support Laravel 5.8 + +3.1.2 + +- fixed missing use statement in vanilla integration (thanks micc83) + +3.1.1 + +- exposed the Request::setAuthenticatedUser method on the main Clockwork class +- fixed possible crash in LaravelDataSource when resolving authenticated user in non-standard auth implementations (thanks freshleafmedia, motia) + +3.1 + +- added new integration for vanilla PHP (thanks martbean) +- added support for collecting authenticated user info +- added bunch of helper methods for adding data like database queries or events to Clockwork +- added serializer options to the config files +- updated web UI to match latest Chrome version +- improved collecting of exceptions +- improved filtered uris implementation in Laravel to no longer have any performance overhead (thanks marcusbetts) +- improved compatibility with Laravel Telescope +- fixed numeric keys being lost on serialization of arrays (thanks ametad) +- fixed serialization of parent class private properties +- fixed a possible crash when resolving stack traces (thanks mbardelmeijer) +- deprecated Clockwork::subrequest method in favor of Clockwork::addSubrequest + +3.0.2 + +- fixed infinite redirect if dark web theme is enabled on Laravel or Lumen <5.5 (thanks pixelskribe) + +3.0.1 + +- improved LaravelDataSource to not collect views data if it is filtered (by default) + +3.0 + +- updated web UI to match latest Chrome version +- added new api for user-data (custom tabs in Clockwork app) +- added support for authentication (thanks xiaohuilam) +- added support for collecting stack traces for log messages, queries, etc. (thanks sisve) +- added new api for recording subrequests (thanks L3o-pold) +- added Symfony integration beta +- added Xdebug profiler support +- added collecting of full URLs for requests +- added collecting of peak memory usage +- added ability to use dark theme for the web UI +- added new extend-api to data soruces for extending data when it's being sent to the application +- improved data serialization implementation - handles recursion, unlimited depth, type metadata, clear marking for protected and private properties +- improved data serialization with configurable defaults, limit and blackboxing of classes +- improved handling of binary bindings in EloquentDataSource (thanks sergio91pt and coderNeos) +- improved stack traces collection to resolve original view names +- BREAKING improved Laravel integration to type-hint contracts instead of concrete implementations (thanks robclancy) +- improved default configuration to not collect data for Laravel Horizon requests (thanks fgilio) +- improved LaravelDataSource view data collecting to remove Laravel Twigbridge metadata +- changed Laravel integration to register middleware in the boot method instead of register (thanks dionysiosarvanitis) +- changed Laravel and Lumen integrations to use a single shared Log instance +- fixed Clockwork HTTP API returning empty object instead of null if request was not found +- fixed Clockwork routes not returning 404 when disabled on runtime with route cache enabled (thanks joskfg) +- BREAKING dropped Laravel 4 support +- BREAKING dropped PHP 5.4 support, requires PHP 5.5 + +2.2.5 + +- changed SQL storage schema URI column type from VARCHAR to TEXT (thanks sumidatx) +- fixed possible crash in file storage cleanup if the file was already deleted (thanks bcalik) +- fixed event handling in Eloquent data source compatibility with some 3rd party packages (thanks erikgaal) + +2.2.4 + +- drop support for collecting Laravel controller middleware (as this can have unexpected side-effects) (thanks phh) + +2.2.3 + +- improved Server-Timing now uses the new header format (thanks kohenkatz) +- fixed Laravel crash when gathering middleware if the controller class doesn't exist + +2.2.2 + +- fixed compatibility with Laravel 5.2 (thanks peppeocchi) + +2.2.1 + +- fixed Laravel 4.x support once again (thanks bcalik) + +2.2 + +- added support for collecting route middleware (thanks Vercoutere) +- added support for collecting routes and middleware in newer Lumen versions +- updated Web UI to match Clockwork Chrome 2.2 +- improved Laravel support to register most event handlers only when collecting data +- fixed Lumen middleware not being registered automatically (thanks lucian-dragomir) +- fixed published Lumen config not being loaded + +2.1.1 + +- fixed Laravel 4.x support (added legacy version of the config file) (thanks bcalik) + +2.1 + +- updated Web UI to match Clockwork Chrome 2.1 +- improved Laravel support to load the default config and use env variables in the default config +- improved Lumen support to use the standard config subsystem instead of directly accessing env variables (thanks davoaust, SunMar) +- improved reliability of storing metadata in some cases (by using JSON_PARTIAL_OUTPUT_ON_ERROR when supported) +- fixed wrong mime-type for javascript assets in Web UI causing it to not work in some browsers (thanks sleavitt) +- fixed path checking in Web UI causing it to not work on Windows (thanks Malezha) +- fixed parameters conversion in DBALDataSource (thanks andrzejenne) + +2.0.4 + +- improved mkdir error handling in FileStorage (thanks FBnil) +- fixed crash in LaravelEventsDataSource when firing events with associative array as payload + +2.0.3 + +- fixed Clockwork now working when used with Laravel route cache + +2.0.2 + +- fixed crash on attempt to clean up file storage if the project contains Clockwork 1.x metadata + +2.0.1 + +- fixed Web UI not working in Firefox + +2.0 + +- added Web UI +- added new Laravel cache data source +- added new Laravel events data source +- added new more robust metadata storage API +- added automatic metadata cleanup (defaults to 1 week) +- added better metadata serialization including class names for objects +- added PostgreSQL compatibility for the SQL storage (thanks oldskool73) +- added Slim 3 middleware (thanks sperrichon) +- added PSR message data source (thanks sperrichon) +- added Doctrine DBAL data source (thanks sperrichon) +- changed Clockwork request ids now use dashes instead of dots (thanks Tibbelit) +- changed Laravel and Lumen integrations to no longer log data for console commands +- changed simplified the clock Laravel helper (thanks Jergus Lejko) +- fixed wrong version data logged in SQL storage +- removed PHP 5.3 support, code style changes +- removed CodeIgniter support +- removed ability to register additional data sources via Clockwork config + +UPGRADING + +- update the required Clockwork version to ^2.0 in your composer.json +- PHP 5.3 - no longer supported, you can continue using the latest 1.x version +- CodeIgniter - no longer supported, you can continue using the latest 1.x version +- Slim 2 - update the imported namespace from Clockwork\Support\Slim to Clockwork\Support\Slim\Legacy +- ability to register additional data sources via Clockwork config was removed, please call app('clockwork')->addDataSource(...) in your own service provider + +1.14.5 + +- fixed incompatibility with Laravel 4.1 an 4.2 (introduced in 1.14.3) + +1.14.4 + +- added support for Lumen 5.5 (thanks nebez) + +1.14.3 + +- added support for Laravel 5.5 package auto-discovery (thanks Omranic) +- added automatic registration of the Laravel middleware (no need to edit your Http/Kernel.php anymore, existing installations don't need to be changed) +- updated Laravel artisan clockwork:clean command for Laravel 5.5 (thanks rosswilson252) +- fixed crash when retrieving all requests from Sql storage (thanks pies) + +1.14.2 + +- fixed missing imports in Doctrine data source (thanks jenssegers) + +1.14.1 +- fixed collecting Eloquent queries when using PDO_ODBC driver for real (thanks abhimanyu003) + +1.14 +- added support for Server-Timing headers (thanks Garbee) +- fixed compatibility with Lumen 5.4 (thanks Dimasdanz) +- fixed collecting Eloquent queries with bindings containing backslashes (thanks fitztrev) +- fixed collecting Eloquent queries when using PDO_ODBC driver (thanks abhimanyu003) +- fixed collecting Doctrine queries with array bindings (thanks RolfJanssen) +- replaced Doctrine bindings preparation code with more complete version from laravel-doctrine +- fixed PHP 5.3 compatibility + +1.13.1 +- fixed compatibility with Lumen 5.4 (thanks meanevo) + +1.13 +- added support for Laravel 5.4 (thanks KKSzymanowski) +- improved Laravel "clock" helper function now takes multiple arguments to be logged at once (eg. `clock($foo, $bar, $baz)`) + +1.12 +- added collecting of caller file name and line number for queries and model name (Laravel 4.2+) for ORM queries to the Eloquent data source (thanks OmarMakled and fitztrev for the idea) +- added collecting of context, caller file name and line number to the logger (thanks crissi for the idea) +- fixed crash in Lumen data source when running unit tests with simulated requests on Lumen +- fixed compatibility with Laravel 4.0 + +1.11.2 +- switched to PSR-4 autoloading +- fixed Swift data source crash when sending email with no from/to address specified (thanks marksecurelogin) + +1.11.1 +- added support for DateTimeImmutable in Doctrine data source (thanks morfin) +- fixed not being able to log null values via the "clock" helper function +- fixed Laravel 4.2-dev not being properly detected as 4.2 release (thanks DemianD) + +1.11 +- added support for Lumen 5.2 (thanks lukeed) +- added "clock" helper function +- fixed data sources being initialized too late (thanks morfin) +- fixed code style in Doctrine data source +- removed Laravel log dependency from Doctrine data source +- NOTE laravel-doctrine provides ootb support for Clockwork, you should use this instead of included Doctrine data source with Laravel + +1.10.1 +- fixed collecting of database queries in Laravel 5.2 (thanks sebastiandedeyne) + +1.10 +- added Laravel 5.2 support (thanks jonphipps) +- improved file storage to allow configuring directory permissions (thanks patrick-radius) +- fixed interaction with PHPUnit in Lumen (thanks troyharvey) +- removed "router dispatch" timeline event for now (due to Laravel 5.2 changes) + +1.9 +- added Lumen support (thanks dawiyo) +- added aliases for all Clockwork parts so they can be resolved by the IoC container in Laravel and Lumen +- fixed Laravel framework initialisation, booting and running timeline events not being recorded properly (thanks HipsterJazzbo, sisve) +- fixed how Laravel clockwork:clean artisan command is registered (thanks freekmurze) +- removed Lumen framework initialisation, booting and running timeline events as they are not supported by Lumen + +1.8.1 +- fixed SQL data storage initialization if PDO is set to throw exception on error (thanks YOzaz) + +1.8 +- added SQL data storage implementation +- added new config options for data storage for Laravel (please re-publish the config file) +- fixed not being able to use the Larvel route caching when using Clockwork (thanks Garbee, kylestev, cbakker86) + +1.7 +- added support for Laravel 5 (thanks Garbee, slovenianGooner) +- improved support for Laravel 4.1 and 4.2, Clockwork data is now available for error responses +- added Doctrine data source (thanks matiux) +- fixed compatibility with some old PHP 5.3 versions (thanks hailwood) +- updated Laravel data source to capture the context for log messages (thanks hermanzhu) + +1.6 +- improved Eloquent data source to support multiple databases (thanks ingro) +- improved compatibility with Laravel apps not using database +- improved compatibility with various CodeIngiter installations +- fixed a bug where log messages and timeline data might not be sorted correctly +- fixed missing static keyword in CodeIgniter hook (thanks noevidenz) +- changed Timeline::endEvent behavior to return false instead of throwing exception when called for non-existing event + +1.5 +- improved Slim support to use DI container to share Clockwork instance instead of config +- improved Slim support now adds all messages logged via Slim's log interface to Clockwork log as well +- improved CodeIgniter support to make Clockwork available through the CI app (tnx BradEstey) +- fixed Laravel support breaking flash messages (tnx hannesvdvreken) +- fixed CodeIgniter support PSR-0 autoloading and other improvements (tnx pwhelan) +- fixed file storage warning when recursive data is collected + +1.4.4 +- changed Laravel support to disable permanent data collection by default (tnx jenssegers) +- improved Laravel support to return Clockwork data with proper Content-Type (tnx maximebeaudoin) +- fixed CodeIgniter support compatibility with PHP 5.3 (tnx BradEstey) + +1.4.3 +- fixed incorrect requests ids being generated depending on set locale + +1.4.2 +- fixed Laravel support compatibility with PHP 5.3 + +1.4.1 +- fixed Laravel support compatibility with PHP 5.3 + +1.4 +- added support for collecting emails and views data +- added support for CodeIgniter 2.1 (tnx pwhelan) +- added data source and plugin for collecting emails data from Swift mailer +- added support for collecting emails and views data from Laravel +- added --age argument to Laravel artisan clockwork::clean command, specifies how old the request data must be to be deleted (in hours) +- improved Laravel service provider +- fixed compatibility with latest Laravel 4.1 + +1.3 +NOTE: Clockwork\Request\Log::log method arguments have been changed from log($message, $level) to log($level, $message), levels are now specified via Psr\Log\LogLevel class, it's recommended to use shortcut methods for various levels (emergency, alert, critical, error, warning, notice, info and debug($message)) +- clockwork log class now implements PSR logger interface, updated Laravel and Monolog support to use all available log levels +- clockwork log now accepts objects and arrays as input and logs their json representation +- added support for specifying additional headers on metadata requests (Laravel) (tnx philsturgeon) + +1.2 +- added support for Laravel 4.1 +- added facade for Laravel +- added ability to disable collecting data about requests to specified URIs in Laravel +- added clockwork:clean artisan command for cleaning request metadata for Laravel +- added an easy way to add timeline events and log records via main Clockwork class +- added support for Slim apps running in subdirs (requires Clockwork Chrome 1.1+) +- file storage now creates default gitignore file for the request data when creating the storage dir +- fixed a few bugs which might cause request data to not appear in Chrome extension +- fixed a few bugs that could lead to PHP errors/exceptions + +1.1 +- added support for Laravel 4 apps running in subdirs (requires Clockwork Chrome 1.1+) +- added data-protocol version to the request data +- updated Laravel 4 service provider to work with Clockwork Web +- fixed a bug where Clockwork would break Laravel 4 apps not using database +- fixed a bug where calling Timeline::endEvent after Timeline::finalize caused exception to be thrown +- fixed a bug where using certain filters would store incorrect data + +0.9.1 +- added support for application routes (ootb support for Laravel 4 only atm) +- added configuration file for Laravel 4 +- added support for filtering stored data in Storage +- added library version constant Clockwork::VERSION diff --git a/vendor/itsgoingd/clockwork/Clockwork/Authentication/AuthenticatorInterface.php b/vendor/itsgoingd/clockwork/Clockwork/Authentication/AuthenticatorInterface.php new file mode 100644 index 000000000..df98ff567 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Authentication/AuthenticatorInterface.php @@ -0,0 +1,13 @@ +password = $password; + } + + public function attempt(array $credentials) + { + if (! isset($credentials['password'])) { + return false; + } + + if (! hash_equals($credentials['password'], $this->password)) { + return false; + } + + return password_hash($this->password, \PASSWORD_DEFAULT); + } + + public function check($token) + { + return password_verify($this->password, $token); + } + + public function requires() + { + return [ AuthenticatorInterface::REQUIRES_PASSWORD ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Clockwork.php b/vendor/itsgoingd/clockwork/Clockwork/Clockwork.php new file mode 100644 index 000000000..c78277190 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Clockwork.php @@ -0,0 +1,283 @@ +request = new Request; + $this->authenticator = new NullAuthenticator; + + $this->shouldCollect = new ShouldCollect; + $this->shouldRecord = new ShouldRecord; + } + + // Add a new data source + public function addDataSource(DataSourceInterface $dataSource) + { + $this->dataSources[] = $dataSource; + return $this; + } + + // Resolve the current request, sending it through all data sources, finalizing log and timeline + public function resolveRequest() + { + foreach ($this->dataSources as $dataSource) { + $dataSource->resolve($this->request); + } + + $this->request->log()->sort(); + $this->request->timeline()->finalize($this->request->time); + + return $this; + } + + // Resolve the current request as a "command" type request with command-specific data + public function resolveAsCommand($name, $exitCode = null, $arguments = [], $options = [], $argumentsDefaults = [], $optionsDefaults = [], $output = null) + { + $this->resolveRequest(); + + $this->request->type = RequestType::COMMAND; + $this->request->commandName = $name; + $this->request->commandArguments = $arguments; + $this->request->commandArgumentsDefaults = $argumentsDefaults; + $this->request->commandOptions = $options; + $this->request->commandOptionsDefaults = $optionsDefaults; + $this->request->commandExitCode = $exitCode; + $this->request->commandOutput = $output; + + return $this; + } + + // Resolve the current request as a "queue-job" type request with queue-job-specific data + public function resolveAsQueueJob($name, $description = null, $status = 'processed', $payload = [], $queue = null, $connection = null, $options = []) + { + $this->resolveRequest(); + + $this->request->type = RequestType::QUEUE_JOB; + $this->request->jobName = $name; + $this->request->jobDescription = $description; + $this->request->jobStatus = $status; + $this->request->jobPayload = (new Serializer)->normalize($payload); + $this->request->jobQueue = $queue; + $this->request->jobConnection = $connection; + $this->request->jobOptions = (new Serializer)->normalizeEach($options); + + return $this; + } + + // Resolve the current request as a "test" type request with test-specific data, accepts test name, status, status + // message in case of failure and array of ran asserts + public function resolveAsTest($name, $status = 'passed', $statusMessage = null, $asserts = []) + { + $this->resolveRequest(); + + $this->request->type = RequestType::TEST; + $this->request->testName = $name; + $this->request->testStatus = $status; + $this->request->testStatusMessage = $statusMessage; + + foreach ($asserts as $assert) { + $this->request->addTestAssert($assert['name'], $assert['arguments'], $assert['passed'], $assert['trace']); + } + + return $this; + } + + // Extends the request with an additional data form all data sources, which is not required for normal use + public function extendRequest(Request $request = null) + { + foreach ($this->dataSources as $dataSource) { + $dataSource->extend($request ?: $this->request); + } + + return $this; + } + + // Store the current request via configured storage implementation + public function storeRequest() + { + return $this->storage->store($this->request); + } + + // Reset all data sources to an empty state, clearing any collected data + public function reset() + { + foreach ($this->dataSources as $dataSource) { + $dataSource->reset(); + } + + return $this; + } + + // Get or set the current request instance + public function request(Request $request = null) + { + if (! $request) return $this->request; + + $this->request = $request; + return $this; + } + + // Get the log instance for the current request or log a new message + public function log($level = null, $message = null, array $context = []) + { + if ($level) { + return $this->request->log()->log($level, $message, $context); + } + + return $this->request->log(); + } + + // Get the timeline instance for the current request + public function timeline() + { + return $this->request->timeline(); + } + + // Shortcut to create a new event on the current timeline instance + public function event($description, $data = []) + { + return $this->request->timeline()->event($description, $data); + } + + // Configure which requests should be collected, can be called with arrey of options, a custom closure or with no + // arguments for a fluent configuration api + public function shouldCollect($shouldCollect = null) + { + if ($shouldCollect instanceof Closure) return $this->shouldCollect->callback($shouldCollect); + + if (is_array($shouldCollect)) return $this->shouldCollect->merge($shouldCollect); + + return $this->shouldCollect; + } + + // Configure which requests should be recorded, can be called with arrey of options, a custom closure or with no + // arguments for a fluent configuration api + public function shouldRecord($shouldRecord = null) + { + if ($shouldRecord instanceof Closure) return $this->shouldRecord->callback($shouldRecord); + + if (is_array($shouldRecord)) return $this->shouldRecord->merge($shouldRecord); + + return $this->shouldRecord; + } + + // Get or set all data sources at once + public function dataSources($dataSources = null) + { + if (! $dataSources) return $this->dataSources; + + $this->dataSources = $dataSources; + return $this; + } + + // Get or set a storage implementation + public function storage(StorageInterface $storage = null) + { + if (! $storage) return $this->storage; + + $this->storage = $storage; + return $this; + } + + // Get or set an authenticator implementation + public function authenticator(AuthenticatorInterface $authenticator = null) + { + if (! $authenticator) return $this->authenticator; + + $this->authenticator = $authenticator; + return $this; + } + + // Forward any other method calls to the current request and log instances + public function __call($method, $args) + { + if (in_array($method, [ 'emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug' ])) { + return $this->request->log()->$method(...$args); + } + + return $this->request->$method(...$args); + } + + // DEPRECATED The following apis are deprecated and will be removed in a future version + + // Get all added data sources + public function getDataSources() + { + return $this->dataSources; + } + + // Get the current request instance + public function getRequest() + { + return $this->request; + } + + // Set the current request instance + public function setRequest(Request $request) + { + $this->request = $request; + return $this; + } + + // Get a storage implementation + public function getStorage() + { + return $this->storage; + } + + // Set a storage implementation + public function setStorage(StorageInterface $storage) + { + $this->storage = $storage; + return $this; + } + + // Get an authenticator implementation + public function getAuthenticator() + { + return $this->authenticator; + } + + // Set an authenticator implementation + public function setAuthenticator(AuthenticatorInterface $authenticator) + { + $this->authenticator = $authenticator; + return $this; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/Concerns/EloquentDetectDuplicateQueries.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/Concerns/EloquentDetectDuplicateQueries.php new file mode 100644 index 000000000..1d63942c0 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/Concerns/EloquentDetectDuplicateQueries.php @@ -0,0 +1,64 @@ +duplicateQueries as $query) { + if ($query['count'] <= 1) continue; + + $log->warning( + "N+1 queries: {$query['model']}::{$query['relation']} loaded {$query['count']} times.", + [ 'performance' => true, 'trace' => $query['trace'] ] + ); + } + + $request->log()->merge($log); + } + + protected function detectDuplicateQuery(StackTrace $trace) + { + $relationFrame = $trace->first(function ($frame) { + return $frame->function == 'getRelationValue' + || $frame->class == \Illuminate\Database\Eloquent\Relations\Relation::class; + }); + + if (! $relationFrame || ! $relationFrame->object) return; + + if ($relationFrame->class == \Illuminate\Database\Eloquent\Relations\Relation::class) { + $model = get_class($relationFrame->object->getParent()); + $relation = get_class($relationFrame->object->getRelated()); + } else { + $model = get_class($relationFrame->object); + $relation = $relationFrame->args[0]; + } + + $shortTrace = $trace->skip(StackFilter::make() + ->isNotVendor([ 'itsgoingd', 'laravel', 'illuminate' ]) + ->isNotNamespace([ 'Clockwork', 'Illuminate' ])); + + $hash = implode('-', [ $model, $relation, $shortTrace->first()->file, $shortTrace->first()->line ]); + + if (! isset($this->duplicateQueries[$hash])) { + $this->duplicateQueries[$hash] = [ + 'count' => 0, + 'model' => $model, + 'relation' => $relation, + 'trace' => $trace + ]; + } + + $this->duplicateQueries[$hash]['count']++; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/DBALDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/DBALDataSource.php new file mode 100644 index 000000000..e82e6535d --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/DBALDataSource.php @@ -0,0 +1,191 @@ +connection = $connection; + $this->connectionName = $this->connection->getDatabase(); + + $configuration = $this->connection->getConfiguration(); + $currentLogger = $configuration->getSQLLogger(); + + if ($currentLogger === null) { + $configuration->setSQLLogger($this); + } else { + $loggerChain = new LoggerChain; + $loggerChain->addLogger($currentLogger); + $loggerChain->addLogger($this); + + $configuration->setSQLLogger($loggerChain); + } + } + + // Adds executed database queries to the request + public function resolve(Request $request) + { + $request->databaseQueries = array_merge($request->databaseQueries, $this->queries); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->queries = []; + $this->query = null; + } + + // DBAL SQLLogger event + public function startQuery($sql, array $params = null, array $types = null) + { + $this->query = [ + 'query' => $sql, + 'params' => $params, + 'types' => $types, + 'time' => microtime(true) + ]; + } + + // DBAL SQLLogger event + public function stopQuery() + { + $this->registerQuery($this->query); + $this->query = null; + } + + // Collect an executed database query + protected function registerQuery($query) + { + $query = [ + 'query' => $this->createRunnableQuery($query['query'], $query['params'], $query['types']), + 'bindings' => $query['params'], + 'duration' => (microtime(true) - $query['time']) * 1000, + 'connection' => $this->connectionName, + 'time' => $query['time'] + ]; + + if ($this->passesFilters([ $query ])) { + $this->queries[] = $query; + } + } + + // Takes a query, an array of params and types as arguments, returns runnable query with upper-cased keywords + protected function createRunnableQuery($query, $params, $types) + { + // add params to query + $query = $this->replaceParams($this->connection->getDatabasePlatform(), $query, $params, $types); + + // highlight keywords + $keywords = [ + 'select', 'insert', 'update', 'delete', 'into', 'values', 'set', 'where', 'from', 'limit', 'is', 'null', + 'having', 'group by', 'order by', 'asc', 'desc' + ]; + $regexp = '/\b' . implode('\b|\b', $keywords) . '\b/i'; + + return preg_replace_callback($regexp, function ($match) { return strtoupper($match[0]); }, $query); + } + + /** + * Source at laravel-doctrine/orm LaravelDoctrine\ORM\Loggers\Formatters\ReplaceQueryParams::format(). + * + * @param AbstractPlatform $platform + * @param string $sql + * @param array|null $params + * @param array|null $types + * + * + * @return string + */ + public function replaceParams($platform, $sql, array $params = null, array $types = null) + { + if (is_array($params)) { + foreach ($params as $key => $param) { + $type = isset($types[$key]) ? $types[$key] : null; // Originally used null coalescing + $param = $this->convertParam($platform, $param, $type); + $sql = preg_replace('/\?/', "$param", $sql, 1); + } + } + return $sql; + } + + /** + * Source at laravel-doctrine/orm LaravelDoctrine\ORM\Loggers\Formatters\ReplaceQueryParams::convertParam(). + * + * @param mixed $param + * + * @throws \Exception + * @return string + */ + protected function convertParam($platform, $param, $type = null) + { + if (is_object($param)) { + if (!method_exists($param, '__toString')) { + if ($param instanceof \DateTimeInterface) { + $param = $param->format('Y-m-d H:i:s'); + } elseif (Type::hasType($type)) { + $type = Type::getType($type); + $param = $type->convertToDatabaseValue($param, $platform); + } else { + throw new \Exception('Given query param is an instance of ' . get_class($param) . ' and could not be converted to a string'); + } + } + } elseif (is_array($param)) { + if ($this->isNestedArray($param)) { + $param = json_encode($param, JSON_UNESCAPED_UNICODE); + } else { + $param = implode( + ', ', + array_map( + function ($part) { + return '"' . (string) $part . '"'; + }, + $param + ) + ); + return '(' . $param . ')'; + } + } else { + $param = htmlspecialchars((string) $param); // Originally used the e() Laravel helper + } + return '"' . (string) $param . '"'; + } + + /** + * Source at laravel-doctrine/orm LaravelDoctrine\ORM\Loggers\Formatters\ReplaceQueryParams::isNestedArray(). + * + * @param array $array + * @return bool + */ + private function isNestedArray(array $array) + { + foreach ($array as $key => $value) { + if (is_array($value)) { + return true; + } + } + return false; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/DataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/DataSource.php new file mode 100644 index 000000000..6d1b724d7 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/DataSource.php @@ -0,0 +1,67 @@ +filters[$type] = isset($this->filters[$type]) + ? array_merge($this->filters[$type], [ $filter ]) : [ $filter ]; + + return $this; + } + + // Clear all registered filters + public function clearFilters() + { + $this->filters = []; + + return $this; + } + + // Returns boolean whether the filterable passes all registered filters + protected function passesFilters($args, $type = 'default') + { + $filters = isset($this->filters[$type]) ? $this->filters[$type] : []; + + foreach ($filters as $filter) { + if (! $filter(...$args)) return false; + } + + return true; + } + + // Censors passwords in an array, identified by key containing "pass" substring + public function removePasswords(array $data) + { + $keys = array_keys($data); + $values = array_map(function ($value, $key) { + return strpos($key, 'pass') !== false ? '*removed*' : $value; + }, $data, $keys); + + return array_combine($keys, $values); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/DataSourceInterface.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/DataSourceInterface.php new file mode 100644 index 000000000..730ff1351 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/DataSourceInterface.php @@ -0,0 +1,16 @@ +getConnection()); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/EloquentDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/EloquentDataSource.php new file mode 100644 index 000000000..cb61426e8 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/EloquentDataSource.php @@ -0,0 +1,329 @@ + 0, 'slow' => 0, 'select' => 0, 'insert' => 0, 'update' => 0, 'delete' => 0, 'other' => 0 + ]; + + // Collected models actions + protected $modelsActions = []; + + // Model action counts by model, eg. [ 'retrieved' => [ User::class => 1 ] ] + protected $modelsCount = [ + 'retrieved' => [], 'created' => [], 'updated' => [], 'deleted' => [] + ]; + + // Whether we are collecting database queries or stats only + protected $collectQueries = true; + + // Whether we are collecting models actions or stats only + protected $collectModelsActions = true; + + // Whether we are collecting retrieved models as well when collecting models actions + protected $collectModelsRetrieved = false; + + // Query execution time threshold in ms after which the query is marked as slow + protected $slowThreshold; + + // Enable duplicate queries detection + protected $detectDuplicateQueries = false; + + // Model name to associate with the next executed query, used to map queries to models + public $nextQueryModel; + + // Create a new data source instance, takes a database manager, an event dispatcher as arguments and additional + // options as arguments + public function __construct(ConnectionResolverInterface $databaseManager, EventDispatcher $eventDispatcher, $collectQueries = true, $slowThreshold = null, $slowOnly = false, $detectDuplicateQueries = false, $collectModelsActions = true, $collectModelsRetrieved = false) + { + $this->databaseManager = $databaseManager; + $this->eventDispatcher = $eventDispatcher; + + $this->collectQueries = $collectQueries; + $this->slowThreshold = $slowThreshold; + $this->detectDuplicateQueries = $detectDuplicateQueries; + $this->collectModelsActions = $collectModelsActions; + $this->collectModelsRetrieved = $collectModelsRetrieved; + + if ($slowOnly) $this->addFilter(function ($query) { return $query['duration'] > $this->slowThreshold; }); + } + + // Adds ran database queries, query counts, models actions and models counts to the request + public function resolve(Request $request) + { + $request->databaseQueries = array_merge($request->databaseQueries, $this->queries); + + $request->databaseQueriesCount += $this->count['total']; + $request->databaseSlowQueries += $this->count['slow']; + $request->databaseSelects += $this->count['select']; + $request->databaseInserts += $this->count['insert']; + $request->databaseUpdates += $this->count['update']; + $request->databaseDeletes += $this->count['delete']; + $request->databaseOthers += $this->count['other']; + + $request->modelsActions = array_merge($request->modelsActions, $this->modelsActions); + + $request->modelsRetrieved = $this->modelsCount['retrieved']; + $request->modelsCreated = $this->modelsCount['created']; + $request->modelsUpdated = $this->modelsCount['updated']; + $request->modelsDeleted = $this->modelsCount['deleted']; + + $this->appendDuplicateQueriesWarnings($request); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->queries = []; + $this->count = [ + 'total' => 0, 'slow' => 0, 'select' => 0, 'insert' => 0, 'update' => 0, 'delete' => 0, 'other' => 0 + ]; + + $this->modelsActions = []; + $this->modelsCount = [ + 'retrieved' => [], 'created' => [], 'updated' => [], 'deleted' => [] + ]; + + $this->nextQueryModel = null; + } + + // Start listening to Eloquent events + public function listenToEvents() + { + if ($scope = $this->getModelResolvingScope()) { + $this->eventDispatcher->listen('eloquent.booted: *', function ($model, $data = null) use ($scope) { + if (is_string($model) && is_array($data)) { // Laravel 5.4 wildcard event + $model = reset($data); + } + + $model->addGlobalScope($scope); + }); + } + + if (class_exists(\Illuminate\Database\Events\QueryExecuted::class)) { + // Laravel 5.2 and up + $this->eventDispatcher->listen(\Illuminate\Database\Events\QueryExecuted::class, function ($event) { + $this->registerQuery($event); + }); + } else { + // Laravel 5.0 to 5.1 + $this->eventDispatcher->listen('illuminate.query', function ($event) { + $this->registerLegacyQuery($event); + }); + } + + // register all event listeners individually so we don't have to regex the event type and support Laravel <5.4 + $this->listenToModelEvent('retrieved'); + $this->listenToModelEvent('created'); + $this->listenToModelEvent('updated'); + $this->listenToModelEvent('deleted'); + } + + // Register a listener collecting model events of specified type + protected function listenToModelEvent($event) + { + $this->eventDispatcher->listen("eloquent.{$event}: *", function ($model, $data = null) use ($event) { + if (is_string($model) && is_array($data)) { // Laravel 5.4 wildcard event + $model = reset($data); + } + + $this->collectModelEvent($event, $model); + }); + } + + // Collect an executed database query + protected function registerQuery($event) + { + $trace = StackTrace::get([ 'arguments' => $this->detectDuplicateQueries ])->resolveViewName(); + + if ($this->detectDuplicateQueries) $this->detectDuplicateQuery($trace); + + $query = [ + 'query' => $this->createRunnableQuery($event->sql, $event->bindings, $event->connectionName), + 'duration' => $event->time, + 'connection' => $event->connectionName, + 'time' => microtime(true) - $event->time / 1000, + 'trace' => (new Serializer)->trace($trace), + 'model' => $this->nextQueryModel, + 'tags' => $this->slowThreshold !== null && $event->time > $this->slowThreshold ? [ 'slow' ] : [] + ]; + + $this->nextQueryModel = null; + + if (! $this->passesFilters([ $query, $trace ], 'early')) return; + + $this->incrementQueryCount($query); + + if (! $this->collectQueries || ! $this->passesFilters([ $query, $trace ])) return; + + $this->queries[] = $query; + } + + // Collect an executed database query (pre Laravel 5.2) + protected function registerLegacyQuery($sql, $bindings, $time, $connection) + { + return $this->registerQuery((object) [ + 'sql' => $sql, + 'bindings' => $bindings, + 'time' => $time, + 'connectionName' => $connection + ]); + } + + // Collect a model event and update stats + protected function collectModelEvent($event, $model) + { + $lastQuery = ($queryCount = count($this->queries)) ? $this->queries[$queryCount - 1] : null; + + $action = [ + 'model' => $modelClass = get_class($model), + 'key' => $this->getModelKey($model), + 'action' => $event, + 'attributes' => $this->collectModelsRetrieved && $event == 'retrieved' ? $model->getOriginal() : [], + 'changes' => $this->collectModelsActions ? $model->getChanges() : [], + 'time' => microtime(true) / 1000, + 'query' => $lastQuery ? $lastQuery['query'] : null, + 'duration' => $lastQuery ? $lastQuery['duration'] : null, + 'connection' => $lastQuery ? $lastQuery['connection'] : null, + 'trace' => null, + 'tags' => [] + ]; + + if ($lastQuery) $this->queries[$queryCount - 1]['model'] = $modelClass; + + if (! $this->passesFilters([ $action ], 'models-early')) return; + + $this->incrementModelsCount($action['action'], $action['model']); + + if (! $this->collectModelsActions) return; + if (! $this->collectModelsRetrieved && $event == 'retrieved') return; + if (! $this->passesFilters([ $action ], 'models')) return; + + $action['trace'] = (new Serializer)->trace(StackTrace::get()->resolveViewName()); + + $this->modelsActions[] = $action; + } + + // Takes a query, an array of bindings and the connection as arguments, returns runnable query with upper-cased keywords + protected function createRunnableQuery($query, $bindings, $connection) + { + // add bindings to query + $bindings = $this->databaseManager->connection($connection)->prepareBindings($bindings); + + $index = 0; + $query = preg_replace_callback('/\?/', function ($matches) use ($bindings, $connection, &$index) { + $binding = $this->quoteBinding($bindings[$index++], $connection); + + // convert binary bindings to hexadecimal representation + if (! preg_match('//u', (string) $binding)) $binding = '0x' . bin2hex($binding); + + // escape backslashes in the binding (preg_replace requires to do so) + return (string) $binding; + }, $query, count($bindings)); + + // highlight keywords + $keywords = [ + 'select', 'insert', 'update', 'delete', 'into', 'values', 'set', 'where', 'from', 'limit', 'is', 'null', + 'having', 'group by', 'order by', 'asc', 'desc' + ]; + $regexp = '/\b' . implode('\b|\b', $keywords) . '\b/i'; + + return preg_replace_callback($regexp, function ($match) { return strtoupper($match[0]); }, $query); + } + + // Takes a query binding and a connection name, returns a quoted binding value + protected function quoteBinding($binding, $connection) + { + $connection = $this->databaseManager->connection($connection); + + if (! method_exists($connection, 'getPdo')) return; + + $pdo = $connection->getPdo(); + + if ($pdo === null) return; + + if ($pdo->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'odbc') { + // PDO_ODBC driver doesn't support the quote method, apply simple MSSQL style quoting instead + return "'" . str_replace("'", "''", $binding) . "'"; + } + + return is_string($binding) ? $pdo->quote($binding) : $binding; + } + + // Increment query counts for collected query + protected function incrementQueryCount($query) + { + $sql = ltrim($query['query']); + + $this->count['total']++; + + if (preg_match('/^select\b/i', $sql)) { + $this->count['select']++; + } elseif (preg_match('/^insert\b/i', $sql)) { + $this->count['insert']++; + } elseif (preg_match('/^update\b/i', $sql)) { + $this->count['update']++; + } elseif (preg_match('/^delete\b/i', $sql)) { + $this->count['delete']++; + } else { + $this->count['other']++; + } + + if (in_array('slow', $query['tags'])) { + $this->count['slow']++; + } + } + + // Increment model counts for collected model action + protected function incrementModelsCount($action, $model) + { + if (! isset($this->modelsCount[$action][$model])) { + $this->modelsCount[$action][$model] = 0; + } + + $this->modelsCount[$action][$model]++; + } + + // Returns model resolving scope for the installed Laravel version + protected function getModelResolvingScope() + { + if (interface_exists(\Illuminate\Database\Eloquent\ScopeInterface::class)) { + // Laravel 5.0 to 5.1 + return new ResolveModelLegacyScope($this); + } + + return new ResolveModelScope($this); + } + + // Returns model key without crashing when using Eloquent strict mode and it's not loaded + protected function getModelKey($model) + { + try { + return $model->getKey(); + } catch (\Illuminate\Database\Eloquent\MissingAttributeException $e) {} + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelCacheDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelCacheDataSource.php new file mode 100644 index 000000000..144764f38 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelCacheDataSource.php @@ -0,0 +1,138 @@ + 0, 'hit' => 0, 'write' => 0, 'delete' => 0 + ]; + + // Whether we are collecting cache queries or stats only + protected $collectQueries = true; + + // Whether we are collecting values from cache queries + protected $collectValues = true; + + // Create a new data source instance, takes an event dispatcher and additional options as argument + public function __construct(EventDispatcher $eventDispatcher, $collectQueries = true, $collectValues = true) + { + $this->eventDispatcher = $eventDispatcher; + + $this->collectQueries = $collectQueries; + $this->collectValues = $collectValues; + } + + // Adds cache queries and stats to the request + public function resolve(Request $request) + { + $request->cacheQueries = array_merge($request->cacheQueries, $this->queries); + + $request->cacheReads += $this->count['read']; + $request->cacheHits += $this->count['hit']; + $request->cacheWrites += $this->count['write']; + $request->cacheDeletes += $this->count['delete']; + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->queries = []; + + $this->count = [ + 'read' => 0, 'hit' => 0, 'write' => 0, 'delete' => 0 + ]; + } + + // Start listening to cache events + public function listenToEvents() + { + if (class_exists(\Illuminate\Cache\Events\CacheHit::class)) { + $this->eventDispatcher->listen(\Illuminate\Cache\Events\CacheHit::class, function ($event) { + $this->registerQuery([ 'type' => 'hit', 'key' => $event->key, 'value' => $event->value ]); + }); + $this->eventDispatcher->listen(\Illuminate\Cache\Events\CacheMissed::class, function ($event) { + $this->registerQuery([ 'type' => 'miss', 'key' => $event->key ]); + }); + $this->eventDispatcher->listen(\Illuminate\Cache\Events\KeyWritten::class, function ($event) { + $this->registerQuery([ + 'type' => 'write', 'key' => $event->key, 'value' => $event->value, + 'expiration' => property_exists($event, 'seconds') ? $event->seconds : $event->minutes * 60 + ]); + }); + $this->eventDispatcher->listen(\Illuminate\Cache\Events\KeyForgotten::class, function ($event) { + $this->registerQuery([ 'type' => 'delete', 'key' => $event->key ]); + }); + } else { + // legacy Laravel 5.1 style events + $this->eventDispatcher->listen('cache.hit', function ($key, $value) { + $this->registerQuery([ 'type' => 'hit', 'key' => $key, 'value' => $value ]); + }); + $this->eventDispatcher->listen('cache.missed', function ($key) { + $this->registerQuery([ 'type' => 'miss', 'key' => $key ]); + }); + $this->eventDispatcher->listen('cache.write', function ($key, $value, $minutes) { + $this->registerQuery([ + 'type' => 'write', 'key' => $key, 'value' => $value, 'expiration' => $minutes * 60 + ]); + }); + $this->eventDispatcher->listen('cache.delete', function ($key) { + $this->registerQuery([ 'type' => 'delete', 'key' => $key ]); + }); + } + } + + // Collect an executed query + protected function registerQuery(array $query) + { + $trace = StackTrace::get()->resolveViewName(); + + $record = [ + 'type' => $query['type'], + 'key' => $query['key'], + 'time' => microtime(true), + 'connection' => null, + 'trace' => (new Serializer)->trace($trace) + ]; + + if ($this->collectValues && isset($query['value'])) { + $record['value'] = (new Serializer)->normalize($query['value']); + } + + $this->incrementQueryCount($record); + + if ($this->collectQueries && $this->passesFilters([ $record ])) { + $this->queries[] = $record; + } + } + + // Increment query counts for collected query + protected function incrementQueryCount($query) + { + if ($query['type'] == 'write') { + $this->count['write']++; + } elseif ($query['type'] == 'delete') { + $this->count['delete']++; + } else { + $this->count['read']++; + + if ($query['type'] == 'hit') { + $this->count['hit']++; + } + } + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelDataSource.php new file mode 100644 index 000000000..22b7a1629 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelDataSource.php @@ -0,0 +1,223 @@ +app = $app; + + $this->collectLog = $collectLog; + $this->collectRoutes = $collectRoutes; + $this->routesOnlyNamespaces = $routesOnlyNamespaces; + + $this->log = new Log; + } + + // Adds request, response information, middleware, routes, session data, user and log entries to the request + public function resolve(Request $request) + { + $request->method = $this->getRequestMethod(); + $request->url = $this->getRequestUrl(); + $request->uri = $this->getRequestUri(); + $request->controller = $this->getController(); + $request->headers = $this->getRequestHeaders(); + $request->responseStatus = $this->getResponseStatus(); + $request->middleware = $this->getMiddleware(); + $request->routes = $this->getRoutes(); + $request->sessionData = $this->getSessionData(); + + $this->resolveAuthenticatedUser($request); + + $request->log()->merge($this->log); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->log = new Log; + } + + // Set Laravel application instance for the current request + public function setApplication(Application $app) + { + $this->app = $app; + return $this; + } + + // Set Laravel response instance for the current request + public function setResponse(Response $response) + { + $this->response = $response; + return $this; + } + + // Listen for the log events + public function listenToEvents() + { + if (! $this->collectLog) return; + + if (class_exists(\Illuminate\Log\Events\MessageLogged::class)) { + // Laravel 5.4 + $this->app['events']->listen(\Illuminate\Log\Events\MessageLogged::class, function ($event) { + $this->log->log($event->level, $event->message, $event->context); + }); + } else { + // Laravel 5.0 to 5.3 + $this->app['events']->listen('illuminate.log', function ($level, $message, $context) { + $this->log->log($level, $message, $context); + }); + } + } + + // Get a textual representation of the current route's controller + protected function getController() + { + $router = $this->app['router']; + + $route = $router->current(); + $controller = $route ? $route->getActionName() : null; + + if ($controller instanceof \Closure) { + $controller = 'anonymous function'; + } elseif (is_object($controller)) { + $controller = 'instance of ' . get_class($controller); + } elseif (is_array($controller) && count($controller) == 2) { + if (is_object($controller[0])) { + $controller = get_class($controller[0]) . '->' . $controller[1]; + } else { + $controller = $controller[0] . '::' . $controller[1]; + } + } elseif (! is_string($controller)) { + $controller = null; + } + + return $controller; + } + + // Get the request headers + protected function getRequestHeaders() + { + return $this->app['request']->headers->all(); + } + + // Get the request method + protected function getRequestMethod() + { + return $this->app['request']->getMethod(); + } + + // Get the request URL + protected function getRequestUrl() + { + return $this->app['request']->fullUrl(); + } + + // Get the request URI + protected function getRequestUri() + { + return $this->app['request']->getRequestUri(); + } + + // Get the response status code + protected function getResponseStatus() + { + return $this->response ? $this->response->getStatusCode() : null; + } + + // Get an array of middleware for the matched route + protected function getMiddleware() + { + $route = $this->app['router']->current(); + + if (! $route) return; + + return method_exists($route, 'gatherMiddleware') ? $route->gatherMiddleware() : $route->middleware(); + } + + // Get an array of application routes + protected function getRoutes() + { + if (! $this->collectRoutes) return []; + + return array_values(array_filter(array_map(function ($route) { + $action = $route->getActionName() ?: 'anonymous function'; + $namespace = strpos($action, '\\') !== false ? explode('\\', $action)[0] : null; + + if (count($this->routesOnlyNamespaces) && ! in_array($namespace, $this->routesOnlyNamespaces)) return; + + return [ + 'method' => implode(', ', $route->methods()), + 'uri' => $route->uri(), + 'name' => $route->getName(), + 'action' => $action, + 'middleware' => $route->middleware(), + 'before' => method_exists($route, 'beforeFilters') ? implode(', ', array_keys($route->beforeFilters())) : '', + 'after' => method_exists($route, 'afterFilters') ? implode(', ', array_keys($route->afterFilters())) : '' + ]; + }, $this->app['router']->getRoutes()->getRoutes()))); + } + + // Get the session data (normalized with removed passwords) + protected function getSessionData() + { + if (! isset($this->app['session'])) return []; + + return $this->removePasswords((new Serializer)->normalizeEach($this->app['session']->all())); + } + + // Add authenticated user data to the request + protected function resolveAuthenticatedUser(Request $request) + { + if (! isset($this->app['auth'])) return; + if (! ($user = $this->app['auth']->user())) return; + + if ($user instanceof \Illuminate\Database\Eloquent\Model) { + // retrieve attributes in this awkward way to make sure we don't trigger exceptions with Eloquent strict mode on + $keyName = method_exists($user, 'getAuthIdentifierName') ? $user->getAuthIdentifierName() : $user->getKeyName(); + $user = $user->getAttributes(); + + $userId = isset($user[$keyName]) ? $user[$keyName] : null; + $userEmail = isset($user['email']) ? $user['email'] : $userId; + $userName = isset($user['name']) ? $user['name'] : null; + } else { + $userId = $user->getAuthIdentifier(); + $userEmail = isset($user->email) ? $user->email : $userId; + $userName = isset($user->name) ? $user->name : null; + } + + $request->setAuthenticatedUser($userEmail, $userId, [ + 'email' => $userEmail, + 'name' => $userName + ]); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelEventsDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelEventsDataSource.php new file mode 100644 index 000000000..6b3095a58 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelEventsDataSource.php @@ -0,0 +1,143 @@ +dispatcher = $dispatcher; + + $this->ignoredEvents = is_array($ignoredEvents) + ? array_merge($ignoredEvents, $this->defaultIgnoredEvents()) : []; + } + + // Adds fired events to the request + public function resolve(Request $request) + { + $request->events = array_merge($request->events, $this->events); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->events = []; + } + + // Start listening to the events + public function listenToEvents() + { + $this->dispatcher->listen('*', function ($event = null, $data = null) { + if (method_exists($this->dispatcher, 'firing')) { // Laravel 5.0 - 5.3 + $data = func_get_args(); + $event = $this->dispatcher->firing(); + } + + $this->registerEvent($event, $data); + }); + } + + // Collect a fired event, prepares data for serialization and resolves registered listeners + protected function registerEvent($event, array $data) + { + if (! $this->shouldCollect($event)) return; + + $trace = StackTrace::get()->resolveViewName(); + + $event = [ + 'event' => $event, + 'data' => (new Serializer)->normalize(count($data) == 1 && isset($data[0]) ? $data[0] : $data), + 'time' => microtime(true), + 'listeners' => $this->findListenersFor($event), + 'trace' => (new Serializer)->trace($trace) + ]; + + if ($this->passesFilters([ $event ])) { + $this->events[] = $event; + } + } + + // Returns registered listeners for the specified event + protected function findListenersFor($event) + { + $listener = $this->dispatcher->getListeners($event)[0]; + + return array_filter(array_map(function ($listener) { + if ($listener instanceof \Closure) { + // Laravel 5.4+ (and earlier versions in some cases) wrap the listener into a closure, + // attempt to resolve the original listener + $use = (new \ReflectionFunction($listener))->getStaticVariables(); + $listener = isset($use['listener']) ? $use['listener'] : $listener; + } + + if (is_string($listener)) { + return $listener; + } elseif (is_array($listener) && count($listener) == 2) { + if (is_object($listener[0])) { + return get_class($listener[0]) . '@' . $listener[1]; + } else { + return $listener[0] . '::' . $listener[1]; + } + } elseif ($listener instanceof \Closure) { + $listener = new \ReflectionFunction($listener); + + if (strpos($listener->getNamespaceName(), 'Clockwork\\') === 0) { // skip our own listeners + return; + } + + $filename = str_replace(base_path(), '', $listener->getFileName()); + $startLine = $listener->getStartLine(); + $endLine = $listener->getEndLine(); + + return "Closure ({$filename}:{$startLine}-{$endLine})"; + } + }, $this->dispatcher->getListeners($event))); + } + + // Returns whether the event should be collected (depending on ignored events) + protected function shouldCollect($event) + { + return ! preg_match('/^(?:' . implode('|', $this->ignoredEvents) . ')$/', $event); + } + + // Returns default ignored events (framework-specific events) + protected function defaultIgnoredEvents() + { + return [ + 'Illuminate\\\\.+', + 'Laravel\\\\.+', + 'auth\.(?:attempt|login|logout)', + 'artisan\.start', + 'bootstrapped:.+', + 'composing:.+', + 'creating:.+', + 'illuminate\.query', + 'connection\..+', + 'eloquent\..+', + 'kernel\.handled', + 'illuminate\.log', + 'mailer\.sending', + 'router\.(?:before|after|matched)', + 'router.filter:.+', + 'locale\.changed', + 'clockwork\..+' + ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelNotificationsDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelNotificationsDataSource.php new file mode 100644 index 000000000..bda507c4a --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelNotificationsDataSource.php @@ -0,0 +1,250 @@ +dispatcher = $dispatcher; + } + + // Add sent notifications to the request + public function resolve(Request $request) + { + $request->notifications = array_merge($request->notifications, $this->notifications); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->notifications = []; + } + + // Listen to the email and notification events + public function listenToEvents() + { + $this->dispatcher->listen(MessageSending::class, function ($event) { $this->sendingMessage($event); }); + $this->dispatcher->listen(MessageSent::class, function ($event) { $this->sentMessage($event); }); + + $this->dispatcher->listen(NotificationSending::class, function ($event) { $this->sendingNotification($event); }); + $this->dispatcher->listen(NotificationSent::class, function ($event) { $this->sentNotification($event); }); + } + + // Collect a sent email + protected function sendingMessage($event) + { + $trace = StackTrace::get()->resolveViewName(); + + $mailable = ($frame = $trace->first(function ($frame) { return is_subclass_of($frame->object, Mailable::class); })) + ? $frame->object : null; + + $notification = (object) [ + 'subject' => $event->message->getSubject(), + 'from' => $this->messageAddressToString($event->message->getFrom()), + 'to' => $this->messageAddressToString($event->message->getTo()), + 'content' => $this->messageBody($event->message), + 'type' => 'mail', + 'data' => [ + 'cc' => $this->messageAddressToString($event->message->getCc()), + 'bcc' => $this->messageAddressToString($event->message->getBcc()), + 'replyTo' => $this->messageAddressToString($event->message->getReplyTo()), + 'mailable' => (new Serializer)->normalize($mailable) + ], + 'time' => microtime(true), + 'trace' => (new Serializer)->trace($trace) + ]; + + if ($this->updateLastNotification($notification)) return; + + if ($this->passesFilters([ $notification ])) { + $this->notifications[] = $this->lastNotification = $notification; + } else { + $this->lastNotification = null; + } + } + + // Update last notification with time taken to send it + protected function sentMessage($event) + { + if ($this->lastNotification) { + $this->lastNotification->duration = (microtime(true) - $this->lastNotification->time) * 1000; + } + } + + // Collect a sent notification + protected function sendingNotification($event) + { + $trace = StackTrace::get()->resolveViewName(); + + $channelSpecific = $this->resolveChannelSpecific($event); + + $notification = (object) [ + 'subject' => $channelSpecific['subject'], + 'from' => $channelSpecific['from'], + 'to' => $channelSpecific['to'], + 'content' => $channelSpecific['content'], + 'type' => $event->channel, + 'data' => array_merge($channelSpecific['data'], [ + 'notification' => (new Serializer)->normalize($event->notification), + 'notifiable' => (new Serializer)->normalize($event->notifiable) + ]), + 'time' => microtime(true), + 'trace' => (new Serializer)->trace($trace) + ]; + + if ($this->passesFilters([ $notification ])) { + $this->notifications[] = $this->lastNotification = $notification; + } else { + $this->lastNotification = null; + } + } + + // Update last notification with time taken to send it and response + protected function sentNotification($event) + { + if ($this->lastNotification) { + $this->lastNotification->duration = (microtime(true) - $this->lastNotification->time) * 1000; + $this->lastNotification->data['response'] = $event->response; + } + } + + // Update last sent email notification with additional data from the message sent event + protected function updateLastNotification($notification) + { + if (! $this->lastNotification) return false; + + if ($this->lastNotification->to !== $notification->to) return false; + + $this->lastNotification->subject = $notification->subject; + $this->lastNotification->from = $notification->from; + $this->lastNotification->to = $notification->to; + $this->lastNotification->content = $notification->content; + + $this->lastNotification->data = array_merge($this->lastNotification->data, $notification->data); + + return true; + } + + // Resolve notification channel specific data + protected function resolveChannelSpecific($event) + { + if (method_exists($event->notification, 'toMail')) { + $channelSpecific = $this->resolveMailChannelSpecific($event, $event->notification->toMail($event->notifiable)); + } elseif (method_exists($event->notification, 'toSlack')) { + $channelSpecific = $this->resolveSlackChannelSpecific($event, $event->notification->toSlack($event->notifiable)); + } elseif (method_exists($event->notification, 'toNexmo')) { + $channelSpecific = $this->resolveNexmoChannelSpecific($event, $event->notification->toNexmo($event->notifiable)); + } elseif (method_exists($event->notification, 'toBroadcast')) { + $channelSpecific = [ 'data' => [ 'data' => (new Serializer)->normalize($event->notification->toBroadcast($event->notifiable)) ] ]; + } elseif (method_exists($event->notification, 'toArray')) { + $channelSpecific = [ 'data' => [ 'data' => (new Serializer)->normalize($event->notification->toArray($event->notifiable)) ] ]; + } else { + $channelSpecific = []; + } + + return array_merge( + [ 'subject' => null, 'from' => null, 'to' => null, 'content' => null, 'data' => [] ], $channelSpecific + ); + } + + // Resolve mail notification channel specific data + protected function resolveMailChannelSpecific($event, $message) + { + return [ + 'subject' => $message->subject ?: get_class($event->notification), + 'from' => $this->notificationAddressToString($message->from), + 'to' => $this->notificationAddressToString($event->notifiable->routeNotificationFor('mail', $event->notification)), + 'data' => [ + 'cc' => $this->notificationAddressToString($message->cc), + 'bcc' => $this->notificationAddressToString($message->bcc), + 'replyTo' => $this->notificationAddressToString($message->replyTo) + ] + ]; + } + + // Resolve Slack notification channel specific data + protected function resolveSlackChannelSpecific($event, $message) + { + return [ + 'subject' => get_class($event->notification), + 'from' => $message->username, + 'to' => $message->channel, + 'content' => $message->content + ]; + } + + // Resolve Nexmo notification channel specific data + protected function resolveNexmoChannelSpecific($event, $message) + { + return [ + 'subject' => get_class($event->notification), + 'from' => $message->from, + 'to' => $event->notifiable->routeNotificationFor('nexmo', $event->notification), + 'content' => $message->content + ]; + } + + protected function messageAddressToString($address) + { + if (! $address) return; + + return array_map(function ($address, $key) { + // Laravel 8 or earlier + if (! ($address instanceof \Symfony\Component\Mime\Address)) { + return $address ? "{$address} <{$key}>" : $key; + } + + // Laravel 9 or later + return $address->toString(); + }, $address, array_keys($address)); + } + + protected function messageBody($message) + { + // Laravel 8 or earlier + if (! ($message instanceof \Symfony\Component\Mime\Email)) { + return $message->getBody(); + } + + // Laravel 9 or later + return $message->getHtmlBody() ?: $message->getTextBody(); + } + + protected function notificationAddressToString($address) + { + if (! $address) return; + if (! is_array($address)) $address = [ $address ]; + + return array_map(function ($address) { + if (! is_array($address)) return $address; + + $email = isset($address['address']) ? $address['address'] : $address[0]; + $name = isset($address['name']) ? $address['name'] : $address[1]; + + return $name ? "{$name} <{$email}>" : $email; + }, $address); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelQueueDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelQueueDataSource.php new file mode 100644 index 000000000..9355584e8 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelQueueDataSource.php @@ -0,0 +1,90 @@ +queue = $queue; + } + + // Adds dispatched queue jobs to the request + public function resolve(Request $request) + { + $request->queueJobs = array_merge($request->queueJobs, $this->getJobs()); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->jobs = []; + } + + // Listen to the queue events + public function listenToEvents() + { + $this->queue->createPayloadUsing(function ($connection, $queue, $payload) { + $this->registerJob([ + 'id' => $id = (new Request)->id, + 'connection' => $connection, + 'queue' => $queue, + 'name' => $payload['displayName'], + 'data' => isset($payload['data']['command']) ? $payload['data']['command'] : null, + 'maxTries' => $payload['maxTries'], + 'timeout' => $payload['timeout'], + 'time' => microtime(true) + ]); + + return [ 'clockwork_id' => $id, 'clockwork_parent_id' => $this->currentRequestId ]; + }); + } + + // Set Clockwork ID of the current request + public function setCurrentRequestId($requestId) + { + $this->currentRequestId = $requestId; + return $this; + } + + // Collect a dispatched queue job + protected function registerJob(array $job) + { + $trace = StackTrace::get()->resolveViewName(); + + $job = array_merge($job, [ + 'trace' => (new Serializer)->trace($trace) + ]); + + if ($this->passesFilters([ $job ])) { + $this->jobs[] = $job; + } + } + + // Get an array of dispatched queue jobs commands + protected function getJobs() + { + return array_map(function ($query) { + return array_merge($query, [ + 'data' => isset($query['data']) ? (new Serializer)->normalize($query['data']) : null + ]); + }, $this->jobs); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelRedisDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelRedisDataSource.php new file mode 100644 index 000000000..f6301ba78 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelRedisDataSource.php @@ -0,0 +1,86 @@ +eventDispatcher = $eventDispatcher; + + $this->skipCacheCommands = $skipCacheCommands; + + if ($this->skipCacheCommands) { + $this->addFilter(function ($command, $trace) { + return ! $trace->first(function ($frame) { return $frame->class == 'Illuminate\Cache\RedisStore'; }); + }); + } + } + + // Adds redis commands to the request + public function resolve(Request $request) + { + $request->redisCommands = array_merge($request->redisCommands, $this->getCommands()); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->commands = []; + } + + // Listen to the cache events + public function listenToEvents() + { + $this->eventDispatcher->listen(\Illuminate\Redis\Events\CommandExecuted::class, function ($event) { + $this->registerCommand([ + 'command' => $event->command, + 'parameters' => $event->parameters, + 'duration' => $event->time, + 'connection' => $event->connectionName, + 'time' => microtime(true) - $event->time / 1000 + ]); + }); + } + + // Collect an executed command + protected function registerCommand(array $command) + { + $trace = StackTrace::get()->resolveViewName(); + + $command = array_merge($command, [ + 'trace' => (new Serializer)->trace($trace) + ]); + + if ($this->passesFilters([ $command, $trace ])) { + $this->commands[] = $command; + } + } + + // Get an array of executed redis commands + protected function getCommands() + { + return array_map(function ($query) { + return array_merge($query, [ + 'parameters' => isset($query['parameters']) ? (new Serializer)->normalize($query['parameters']) : null + ]); + }, $this->commands); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelViewsDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelViewsDataSource.php new file mode 100644 index 000000000..d31b9805d --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LaravelViewsDataSource.php @@ -0,0 +1,71 @@ +dispatcher = $dispatcher; + + $this->collectData = $collectData; + + $this->views = new Timeline; + } + + // Adds rendered views to the request + public function resolve(Request $request) + { + $request->viewsData = array_merge($request->viewsData, $this->views->finalize()); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->views = new Timeline; + } + + // Listen to the views events + public function listenToEvents() + { + $this->dispatcher->listen('composing:*', function ($view, $data = null) { + if (is_string($view) && is_array($data)) { // Laravel 5.4 wildcard event + $view = $data[0]; + } + + $data = array_filter( + $this->collectData ? $view->getData() : [], + function ($v, $k) { return strpos($k, '__') !== 0; }, + \ARRAY_FILTER_USE_BOTH + ); + + $this->views->event('Rendering a view', [ + 'name' => 'view ' . $view->getName(), + 'start' => $time = microtime(true), + 'end' => $time, + 'data' => [ + 'name' => $view->getName(), + 'data' => (new Serializer)->normalize($data) + ] + ]); + }); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/LumenDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LumenDataSource.php new file mode 100644 index 000000000..77d89a9e1 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/LumenDataSource.php @@ -0,0 +1,201 @@ +app = $app; + + $this->collectLog = $collectLog; + $this->collectRoutes = $collectRoutes; + + $this->log = new Log; + } + + // Adds request, response information, middleware, routes, session data, user and log entries to the request + public function resolve(Request $request) + { + $request->method = $this->getRequestMethod(); + $request->uri = $this->getRequestUri(); + $request->controller = $this->getController(); + $request->headers = $this->getRequestHeaders(); + $request->responseStatus = $this->getResponseStatus(); + $request->routes = $this->getRoutes(); + $request->sessionData = $this->getSessionData(); + + $this->resolveAuthenticatedUser($request); + + $request->log()->merge($this->log); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->log = new Log; + } + + // Set Lumen response instance for the current request + public function setResponse(Response $response) + { + $this->response = $response; + return $this; + } + + // Listen for the log events + public function listenToEvents() + { + if (! $this->collectLog) return; + + if (class_exists(\Illuminate\Log\Events\MessageLogged::class)) { + // Lumen 5.4 + $this->app['events']->listen(\Illuminate\Log\Events\MessageLogged::class, function ($event) { + $this->log->log($event->level, $event->message, $event->context); + }); + } else { + // Lumen 5.0 to 5.3 + $this->app['events']->listen('illuminate.log', function ($level, $message, $context) { + $this->log->log($level, $message, $context); + }); + } + } + + // Get a textual representation of current route's controller + protected function getController() + { + $routes = method_exists($this->app, 'getRoutes') ? $this->app->getRoutes() : []; + + $method = $this->getRequestMethod(); + $pathInfo = $this->getPathInfo(); + + if (isset($routes[$method.$pathInfo]['action']['uses'])) { + $controller = $routes[$method.$pathInfo]['action']['uses']; + } elseif (isset($routes[$method.$pathInfo]['action'][0])) { + $controller = $routes[$method.$pathInfo]['action'][0]; + } else { + $controller = null; + } + + if ($controller instanceof \Closure) { + $controller = 'anonymous function'; + } elseif (is_object($controller)) { + $controller = 'instance of ' . get_class($controller); + } elseif (! is_string($controller)) { + $controller = null; + } + + return $controller; + } + + // Get the request headers + protected function getRequestHeaders() + { + return $this->app['request']->headers->all(); + } + + // Get the request method + protected function getRequestMethod() + { + if ($this->app->bound('request')) { + return $this->app['request']->getMethod(); + } elseif (isset($_POST['_method'])) { + return strtoupper($_POST['_method']); + } else { + return $_SERVER['REQUEST_METHOD']; + } + } + + // Get the request URI + protected function getRequestUri() + { + return $this->app['request']->getRequestUri(); + } + + // Get the response status code + protected function getResponseStatus() + { + return $this->response ? $this->response->getStatusCode() : null; + } + + // Get an array of application routes + protected function getRoutes() + { + if (! $this->collectRoutes) return []; + + if (isset($this->app->router)) { + $routes = array_values($this->app->router->getRoutes()); + } elseif (method_exists($this->app, 'getRoutes')) { + $routes = array_values($this->app->getRoutes()); + } else { + $routes = []; + } + + return array_map(function ($route) { + return [ + 'method' => $route['method'], + 'uri' => $route['uri'], + 'name' => isset($route['action']['as']) ? $route['action']['as'] : null, + 'action' => isset($route['action']['uses']) && is_string($route['action']['uses']) ? $route['action']['uses'] : 'anonymous function', + 'middleware' => isset($route['action']['middleware']) ? $route['action']['middleware'] : null, + ]; + }, $routes); + } + + // Get the session data (normalized with passwords removed) + protected function getSessionData() + { + if (! isset($this->app['session'])) return []; + + return $this->removePasswords((new Serializer)->normalizeEach($this->app['session']->all())); + } + + // Add authenticated user data to the request + protected function resolveAuthenticatedUser(Request $request) + { + if (! isset($this->app['auth'])) return; + if (! ($user = $this->app['auth']->user())) return; + if (! isset($user->email) || ! isset($user->id)) return; + + $request->setAuthenticatedUser($user->email, $user->id, [ + 'email' => $user->email, + 'name' => isset($user->name) ? $user->name : null + ]); + } + + // Get the request path info + protected function getPathInfo() + { + if ($this->app->bound('request')) { + return $this->app['request']->getPathInfo(); + } else { + $query = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; + return '/' . trim(str_replace("?{$query}", '', $_SERVER['REQUEST_URI']), '/'); + } + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/MonologDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/MonologDataSource.php new file mode 100644 index 000000000..8671add16 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/MonologDataSource.php @@ -0,0 +1,37 @@ +log = new Log; + + $monolog->pushHandler(new ClockworkHandler($this->log)); + } + + // Adds log entries to the request + public function resolve(Request $request) + { + $request->log()->merge($this->log); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->log = new Log; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/PhpDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/PhpDataSource.php new file mode 100644 index 000000000..af0272b03 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/PhpDataSource.php @@ -0,0 +1,155 @@ +time = PHP_SAPI !== 'cli' ? $this->getRequestTime() : $request->time; + $request->method = $this->getRequestMethod(); + $request->url = $this->getRequestUrl(); + $request->uri = $this->getRequestUri(); + $request->headers = $this->getRequestHeaders(); + $request->getData = $this->getGetData(); + $request->postData = $this->getPostData(); + $request->requestData = $this->getRequestData(); + $request->sessionData = $this->getSessionData(); + $request->cookies = $this->getCookies(); + $request->responseStatus = $this->getResponseStatus(); + $request->responseTime = $this->getResponseTime(); + $request->memoryUsage = $this->getMemoryUsage(); + + return $request; + } + + // Get the request cookies (normalized with passwords removed) + protected function getCookies() + { + return $this->removePasswords((new Serializer)->normalizeEach($_COOKIE)); + } + + // Get the request GET data (normalized with passwords removed) + protected function getGetData() + { + return $this->removePasswords((new Serializer)->normalizeEach($_GET)); + } + + // Get the request POST data (normalized with passwords removed) + protected function getPostData() + { + return $this->removePasswords((new Serializer)->normalizeEach($_POST)); + } + + // Get the request body data (attempt to parse as json, normalized with passwords removed) + protected function getRequestData() + { + // The data will already be parsed into POST data by PHP in case of application/x-www-form-urlencoded requests + if (count($_POST)) return; + + $requestData = file_get_contents('php://input'); + $requestJsonData = json_decode($requestData, true); + + return is_array($requestJsonData) + ? $this->removePasswords((new Serializer)->normalizeEach($requestJsonData)) + : $requestData; + } + + // Get the request headers + protected function getRequestHeaders() + { + $headers = []; + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) !== 'HTTP_') continue; + + $header = substr($key, 5); + $header = str_replace('_', ' ', $header); + $header = ucwords(strtolower($header)); + $header = str_replace(' ', '-', $header); + + if (! isset($headers[$header])) { + $headers[$header] = [ $value ]; + } else { + $headers[$header][] = $value; + } + } + + ksort($headers); + + return $headers; + } + + // Get the request method + protected function getRequestMethod() + { + if (isset($_SERVER['REQUEST_METHOD'])) { + return $_SERVER['REQUEST_METHOD']; + } + } + + // Get the response time + protected function getRequestTime() + { + if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { + return $_SERVER['REQUEST_TIME_FLOAT']; + } + } + + // Get the request URL + protected function getRequestUrl() + { + $https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'; + $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null; + $addr = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : null; + $port = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : null; + $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null; + + $scheme = $https ? 'https' : 'http'; + $host = $host ?: $addr; + $port = (! $https && $port != 80 || $https && $port != 443) ? ":{$port}" : ''; + + // remove port number from the host + $host = $host ? preg_replace('/:\d+$/', '', trim($host)) : null; + + return "{$scheme}://{$host}{$port}{$uri}"; + } + + // Get the request URI + protected function getRequestUri() + { + if (isset($_SERVER['REQUEST_URI'])) { + return $_SERVER['REQUEST_URI']; + } + } + + // Get the response status code + protected function getResponseStatus() + { + return http_response_code(); + } + + // Get the response time (current time, assuming most of the application code has already run at this point) + protected function getResponseTime() + { + return microtime(true); + } + + // Get the session data (normalized with passwords removed) + protected function getSessionData() + { + if (! isset($_SESSION)) return []; + + return $this->removePasswords((new Serializer)->normalizeEach($_SESSION)); + } + + // Get the peak memory usage in bytes + protected function getMemoryUsage() + { + return memory_get_peak_usage(true); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/PsrMessageDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/PsrMessageDataSource.php new file mode 100644 index 000000000..a49407a7b --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/PsrMessageDataSource.php @@ -0,0 +1,96 @@ +psrRequest = $psrRequest; + $this->psrResponse = $psrResponse; + } + + // Adds request and response information to the request + public function resolve(Request $request) + { + if ($this->psrRequest) { + $request->method = $this->psrRequest->getMethod(); + $request->uri = $this->getRequestUri(); + $request->headers = $this->getRequestHeaders(); + $request->getData = $this->sanitize($this->psrRequest->getQueryParams()); + $request->postData = $this->sanitize($this->psrRequest->getParsedBody()); + $request->cookies = $this->sanitize($this->psrRequest->getCookieParams()); + $request->time = $this->getRequestTime(); + } + + if ($this->psrResponse !== null) { + $request->responseStatus = $this->psrResponse->getStatusCode(); + $request->responseTime = $this->getResponseTime(); + } + + return $request; + } + + // Normalize items in the array and remove passwords + protected function sanitize($data) + { + return is_array($data) ? $this->removePasswords((new Serializer)->normalizeEach($data)) : $data; + } + + // Get the response time, fetching it from ServerParams + protected function getRequestTime() + { + $env = $this->psrRequest->getServerParams(); + + if (isset($env['REQUEST_TIME_FLOAT'])) { + return $env['REQUEST_TIME_FLOAT']; + } + } + + // Get the response time (current time, assuming most of the application code has already run at this point) + protected function getResponseTime() + { + return microtime(true); + } + + // Get the request headers + protected function getRequestHeaders() + { + $headers = []; + + foreach ($this->psrRequest->getHeaders() as $header => $values) { + if (strtoupper(substr($header, 0, 5)) === 'HTTP_') { + $header = substr($header, 5); + } + + $header = str_replace('_', ' ', $header); + $header = ucwords(strtolower($header)); + $header = str_replace(' ', '-', $header); + + $headers[$header] = $values; + } + + ksort($headers); + + return $headers; + } + + // Get the request URI + protected function getRequestUri() + { + $uri = $this->psrRequest->getUri(); + + return $uri->getPath() . ($uri->getQuery() ? '?' . $uri->getQuery() : ''); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/SlimDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/SlimDataSource.php new file mode 100644 index 000000000..8f4079918 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/SlimDataSource.php @@ -0,0 +1,104 @@ +slim = $slim; + } + + // Adds request and response information to the request + public function resolve(Request $request) + { + $request->method = $this->getRequestMethod(); + $request->uri = $this->getRequestUri(); + $request->controller = $this->getController(); + $request->headers = $this->getRequestHeaders(); + $request->responseStatus = $this->getResponseStatus(); + + return $request; + } + + // Get a textual representation of current route's controller + protected function getController() + { + $matchedRoutes = $this->slim->router()->getMatchedRoutes( + $this->slim->request()->getMethod(), $this->slim->request()->getResourceUri() + ); + + if (! count($matchedRoutes)) return; + + $controller = end($matchedRoutes)->getCallable(); + + if ($controller instanceof \Closure) { + $controller = 'anonymous function'; + } elseif (is_object($controller)) { + $controller = 'instance of ' . get_class($controller); + } elseif (is_array($controller) && count($controller) == 2) { + if (is_object($controller[0])) { + $controller = get_class($controller[0]) . '->' . $controller[1]; + } else { + $controller = $controller[0] . '::' . $controller[1]; + } + } elseif (! is_string($controller)) { + $controller = null; + } + + return $controller; + } + + // Get the request headers + protected function getRequestHeaders() + { + $headers = []; + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) !== 'HTTP_') continue; + + $header = substr($key, 5); + $header = str_replace('_', ' ', $header); + $header = ucwords(strtolower($header)); + $header = str_replace(' ', '-', $header); + + $value = $this->slim->request()->headers($header, $value); + + if (! isset($headers[$header])) { + $headers[$header] = [ $value ]; + } else { + $headers[$header][] = $value; + } + } + + ksort($headers); + + return $headers; + } + + // Get the request method + protected function getRequestMethod() + { + return $this->slim->request()->getMethod(); + } + + // Get the request URI + protected function getRequestUri() + { + return $this->slim->request()->getPathInfo(); + } + + // Get the response status code + protected function getResponseStatus() + { + return $this->slim->response()->status(); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/SwiftDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/SwiftDataSource.php new file mode 100644 index 000000000..0cad88028 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/SwiftDataSource.php @@ -0,0 +1,45 @@ +swift = $swift; + + $this->timeline = new Timeline; + } + + // Listen to the email events + public function listenToEvents() + { + $this->swift->registerPlugin(new SwiftPluginClockworkTimeline($this->timeline)); + } + + // Adds send emails to the request + public function resolve(Request $request) + { + $request->emailsData = array_merge($request->emailsData, $this->timeline->finalize()); + + return $request; + } + + // Reset the data source to an empty state, clearing any collected data + public function reset() + { + $this->timeline = new Timeline; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/TwigDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/TwigDataSource.php new file mode 100644 index 000000000..145a122df --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/TwigDataSource.php @@ -0,0 +1,40 @@ +twig = $twig; + } + + // Register the Twig profiler extension + public function listenToEvents() + { + $this->twig->addExtension(new Twig_Extension_Profiler($this->profile = new Twig_Profiler_Profile)); + } + + // Adds rendered views to the request + public function resolve(Request $request) + { + $timeline = (new ProfilerClockworkDumper)->dump($this->profile); + + $request->viewsData = array_merge($request->viewsData, $timeline->finalize()); + + return $request; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/DataSource/XdebugDataSource.php b/vendor/itsgoingd/clockwork/Clockwork/DataSource/XdebugDataSource.php new file mode 100644 index 000000000..0e4a74ee1 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/DataSource/XdebugDataSource.php @@ -0,0 +1,31 @@ +xdebug = [ 'profile' => xdebug_get_profiler_filename() ]; + + return $request; + } + + // Extends the request with full profiling data + public function extend(Request $request) + { + $profile = isset($request->xdebug['profile']) ? $request->xdebug['profile'] : null; + + if ($profile && ! preg_match('/\.php$/', $profile) && is_readable($profile)) { + $request->xdebug['profileData'] = file_get_contents($profile); + + if (preg_match('/\.gz$/', $profile)) { + $request->xdebug['profileData'] = gzdecode($request->xdebug['profileData']); + } + } + + return $request; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Helpers/Concerns/ResolvesViewName.php b/vendor/itsgoingd/clockwork/Clockwork/Helpers/Concerns/ResolvesViewName.php new file mode 100644 index 000000000..21c7fba53 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Helpers/Concerns/ResolvesViewName.php @@ -0,0 +1,36 @@ +first(function ($frame) { + return $frame->shortPath ? preg_match('#^/storage/framework/views/[a-z0-9]+\.php$#', $frame->shortPath) : false; + }); + + if (! $viewFrame) return $this; + + $renderFrame = $this->first(function ($frame) { + return $frame->call == 'Illuminate\View\View->getContents()' + && $frame->object instanceof \Illuminate\View\View; + }); + + if (! $renderFrame) return $this; + + $resolvedViewFrame = new StackFrame( + [ 'file' => $renderFrame->object->getPath(), 'line' => $viewFrame->line ], + $this->basePath, + $this->vendorPath + ); + + return $this->copy(array_merge( + array_slice($this->frames, 0, array_search($viewFrame, $this->frames)), + [ $resolvedViewFrame ], + array_slice($this->frames, array_search($viewFrame, $this->frames) + 2) + )); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Helpers/Serializer.php b/vendor/itsgoingd/clockwork/Clockwork/Helpers/Serializer.php new file mode 100644 index 000000000..6da46c6b3 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Helpers/Serializer.php @@ -0,0 +1,139 @@ + [ + \Illuminate\Container\Container::class, + \Illuminate\Foundation\Application::class, + \Laravel\Lumen\Application::class + ], + 'limit' => 10, + 'toArray' => false, + 'toString' => false, + 'debugInfo' => true, + 'jsonSerialize' => false, + 'traces' => true, + 'tracesFilter' => null, + 'tracesSkip' => null, + 'tracesLimit' => null + ]; + + // Create a new instance optionally with options overriding defaults + public function __construct(array $options = []) + { + $this->options = $options + static::$defaults; + } + + // Set default options for all new instances + public static function defaults(array $defaults) + { + static::$defaults = $defaults + static::$defaults; + } + + // Prepares the passed data to be ready for serialization, takes any kind of data to normalize as the first + // argument, other arguments are used internally in recursion + public function normalize($data, $context = null, $limit = null) + { + if ($context === null) $context = [ 'references' => [] ]; + if ($limit === null) $limit = $this->options['limit']; + + if (is_array($data)) { + if ($limit === 0) return [ '__type__' => 'array', '__omitted__' => 'limit' ]; + + return [ '__type__' => 'array' ] + $this->normalizeEach($data, $context, $limit - 1); + } elseif (is_object($data)) { + if ($data instanceof \Closure) return [ '__type__' => 'anonymous function' ]; + + $className = get_class($data); + $objectHash = spl_object_hash($data); + + if ($limit === 0) return [ '__class__' => $className, '__omitted__' => 'limit' ]; + + if (isset($context['references'][$objectHash])) return [ '__type__' => 'recursion' ]; + + $context['references'][$objectHash] = true; + + if (isset($this->cache[$objectHash])) return $this->cache[$objectHash]; + + if ($this->options['blackbox'] && in_array($className, $this->options['blackbox'])) { + return $this->cache[$objectHash] = [ '__class__' => $className, '__omitted__' => 'blackbox' ]; + } elseif ($this->options['toString'] && method_exists($data, '__toString')) { + return $this->cache[$objectHash] = (string) $data; + } + + if ($this->options['debugInfo'] && method_exists($data, '__debugInfo')) { + $data = (array) $data->__debugInfo(); + } elseif ($this->options['jsonSerialize'] && method_exists($data, 'jsonSerialize')) { + $data = (array) $data->jsonSerialize(); + } elseif ($this->options['toArray'] && method_exists($data, 'toArray')) { + $data = (array) $data->toArray(); + } else { + $data = (array) $data; + } + + $data = array_combine( + array_map(function ($key) { + // replace null-byte prefixes of protected and private properties used by php with * (protected) + // and ~ (private) + return preg_replace('/^\0.+?\0/', '~', str_replace("\0*\0", '*', $key)); + }, array_keys($data)), + $this->normalizeEach($data, $context, $limit - 1) + ); + + return $this->cache[$objectHash] = [ '__class__' => $className ] + $data; + } elseif (is_resource($data)) { + return [ '__type__' => 'resource' ]; + } + + return $data; + } + + // Normalize each member of an array (doesn't add metadata for top level) + public function normalizeEach($data, $context = null, $limit = null) { + return array_map(function ($item) use ($context, $limit) { + return $this->normalize($item, $context, $limit); + }, $data); + } + + // Normalize a stack trace instance + public function trace(StackTrace $trace) + { + if (! $this->options['traces']) return null; + + if ($this->options['tracesFilter']) $trace = $trace->filter($this->options['tracesFilter']); + if ($this->options['tracesSkip']) $trace = $trace->skip($this->options['tracesSkip']); + if ($this->options['tracesLimit']) $trace = $trace->limit($this->options['tracesLimit']); + + return array_map(function ($frame) { + return [ + 'call' => $frame->call, + 'file' => $frame->file, + 'line' => $frame->line, + 'isVendor' => (bool) $frame->vendor + ]; + }, $trace->frames()); + } + + // Normalize an exception instance + public function exception(/* Throwable */ $exception) + { + return [ + 'type' => get_class($exception), + 'message' => $exception->getMessage(), + 'code' => $exception->getCode(), + 'file' => $exception->getFile(), + 'line' => $exception->getLine(), + 'trace' => (new Serializer([ 'tracesLimit' => false ]))->trace(StackTrace::from($exception->getTrace())), + 'previous' => $exception->getPrevious() ? $this->exception($exception->getPrevious()) : null + ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Helpers/ServerTiming.php b/vendor/itsgoingd/clockwork/Clockwork/Helpers/ServerTiming.php new file mode 100644 index 000000000..1ace50959 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Helpers/ServerTiming.php @@ -0,0 +1,45 @@ +metrics[] = [ 'metric' => $metric, 'value' => $value, 'description' => $description ]; + + return $this; + } + + // Generate the header value + public function value() + { + return implode(', ', array_map(function ($metric) { + return "{$metric['metric']}; dur={$metric['value']}; desc=\"{$metric['description']}\""; + }, $this->metrics)); + } + + // Create a new instance from a Clockwork request + public static function fromRequest(Request $request, $eventsCount = 10) + { + $header = new static; + + $header->add('app', $request->getResponseDuration(), 'Application'); + + if ($request->getDatabaseDuration()) { + $header->add('db', $request->getDatabaseDuration(), 'Database'); + } + + // add timeline events limited to a set number so the header doesn't get too large + foreach (array_slice($request->timeline()->events, 0, $eventsCount) as $i => $event) { + $header->add("timeline-event-{$i}", $event->duration(), $event->description); + } + + return $header; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackFilter.php b/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackFilter.php new file mode 100644 index 000000000..f36d64426 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackFilter.php @@ -0,0 +1,148 @@ +classes = array_merge($this->classes, is_array($classes) ? $classes : [ $classes ]); + return $this; + } + + public function isNotClass($classes) + { + $this->notClasses = array_merge($this->notClasses, is_array($classes) ? $classes : [ $classes ]); + return $this; + } + + public function isFile($files) + { + $this->files = array_merge($this->files, is_array($files) ? $files : [ $files ]); + return $this; + } + + public function isNotFile($files) + { + $this->notFiles = array_merge($this->notFiles, is_array($files) ? $files : [ $files ]); + return $this; + } + + public function isFunction($functions) + { + $this->functions = array_merge($this->functions, is_array($functions) ? $functions : [ $functions ]); + return $this; + } + + public function isNotFunction($functions) + { + $this->notFunctions = array_merge($this->notFunctions, is_array($functions) ? $functions : [ $functions ]); + return $this; + } + + public function isNamespace($namespaces) + { + $this->namespaces = array_merge($this->namespaces, is_array($namespaces) ? $namespaces : [ $namespaces ]); + return $this; + } + + public function isNotNamespace($namespaces) + { + $this->notNamespaces = array_merge($this->notNamespaces, is_array($namespaces) ? $namespaces : [ $namespaces ]); + return $this; + } + + public function isVendor($vendors) + { + $this->vendors = array_merge($this->vendors, is_array($vendors) ? $vendors : [ $vendors ]); + return $this; + } + + public function isNotVendor($vendors) + { + $this->notVendors = array_merge($this->notVendors, is_array($vendors) ? $vendors : [ $vendors ]); + return $this; + } + + // Apply the filter to a stack frame + public function filter(StackFrame $frame) + { + return $this->matchesClass($frame) + && $this->matchesFile($frame) + && $this->matchesFunction($frame) + && $this->matchesNamespace($frame) + && $this->matchesVendor($frame); + } + + // Return a closure calling this filter + public function closure() + { + return function ($frame) { return $this->filter($frame); }; + } + + protected function matchesClass(StackFrame $frame) + { + if (count($this->classes) && ! in_array($frame->class, $this->classes)) return false; + if (count($this->notClasses) && in_array($frame->class, $this->notClasses)) return false; + + return true; + } + + protected function matchesFile(StackFrame $frame) + { + if (count($this->files) && ! in_array($frame->file, $this->files)) return false; + if (count($this->notFiles) && in_array($frame->file, $this->notFiles)) return false; + + return true; + } + + protected function matchesFunction(StackFrame $frame) + { + if (count($this->functions) && ! in_array($frame->function, $this->functions)) return false; + if (count($this->notFunctions) && in_array($frame->function, $this->notFunctions)) return false; + + return true; + } + + protected function matchesNamespace(StackFrame $frame) + { + foreach ($this->notNamespaces as $namespace) { + if ($frame->class !== null && strpos($frame->class, "{$namespace}\\") !== false) return false; + } + + if (! count($this->namespaces)) return true; + + foreach ($this->namespaces as $namespace) { + if ($frame->class !== null && strpos($frame->class, "{$namespace}\\") !== false) return true; + } + + return false; + } + + protected function matchesVendor(StackFrame $frame) + { + if (count($this->vendors) && ! in_array($frame->vendor, $this->vendors)) return false; + if (count($this->notVendors) && in_array($frame->vendor, $this->notVendors)) return false; + + return true; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackFrame.php b/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackFrame.php new file mode 100644 index 000000000..3eaf2b091 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackFrame.php @@ -0,0 +1,38 @@ + $value) { + $this->$key = $value; + } + + $this->call = $this->formatCall(); + + $this->shortPath = $this->file ? str_replace($basePath, '', $this->file) : null; + $this->vendor = ($this->file && strpos($this->file, $vendorPath) === 0) + ? explode(DIRECTORY_SEPARATOR, str_replace($vendorPath, '', $this->file))[0] : null; + } + + protected function formatCall() + { + if ($this->class) { + return "{$this->class}{$this->type}{$this->function}()"; + } else { + return "{$this->function}()"; + } + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackTrace.php b/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackTrace.php new file mode 100644 index 000000000..884626cc7 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Helpers/StackTrace.php @@ -0,0 +1,127 @@ +frames = $frames; + $this->basePath = $basePath; + $this->vendorPath = $vendorPath; + } + + // Get all frames + public function frames() + { + return $this->frames; + } + + // Get the first frame, optionally filtered by a stack filter or a closure + public function first($filter = null) + { + if (! $filter) return reset($this->frames); + + if ($filter instanceof StackFilter) $filter = $filter->closure(); + + foreach ($this->frames as $frame) { + if ($filter($frame)) return $frame; + } + } + + // Get the last frame, optionally filtered by a stack filter or a closure + public function last($filter = null) + { + if (! $filter) return $this->frames[count($this->frames) - 1]; + + if ($filter instanceof StackFilter) $filter = $filter->closure(); + + foreach (array_reverse($this->frames) as $frame) { + if ($filter($frame)) return $frame; + } + } + + // Get trace filtered by a stack filter or a closure + public function filter($filter = null) + { + if ($filter instanceof StackFilter) $filter = $filter->closure(); + + return $this->copy(array_values(array_filter($this->frames, $filter))); + } + + // Get trace skipping a number of frames or frames matching a stack filter or a closure + public function skip($count = null) + { + if ($count instanceof StackFilter) $count = $count->closure(); + if ($count instanceof \Closure) $count = array_search($this->first($count), $this->frames); + + return $this->copy(array_slice($this->frames, $count)); + } + + // Get trace with a number of frames from the top + public function limit($count = null) + { + return $this->copy(array_slice($this->frames, 0, $count)); + } + + // Get a copy of the trace + public function copy($frames = null) + { + return new static($frames ?: $this->frames, $this->basePath, $this->vendorPath); + } + + protected static function resolveBasePath() + { + return substr(__DIR__, 0, strpos(__DIR__, DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR)); + } + + protected static function resolveVendorPath() + { + return static::resolveBasePath() . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR; + } + + // Fixes call_user_func stack frames missing file and line + protected static function fixCallUserFuncFrame($frame, array $trace, $index) + { + if (isset($frame['file'])) return $frame; + + $nextFrame = isset($trace[$index + 1]) ? $trace[$index + 1] : null; + + if (! $nextFrame || ! in_array($nextFrame['function'], [ 'call_user_func', 'call_user_func_array' ])) return $frame; + + $frame['file'] = $nextFrame['file']; + $frame['line'] = $nextFrame['line']; + + return $frame; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/IncomingRequest.php b/vendor/itsgoingd/clockwork/Clockwork/Request/IncomingRequest.php new file mode 100644 index 000000000..f1e89c156 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/IncomingRequest.php @@ -0,0 +1,20 @@ + $val) $this->$key = $val; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/Log.php b/vendor/itsgoingd/clockwork/Clockwork/Request/Log.php new file mode 100644 index 000000000..aac8900aa --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/Log.php @@ -0,0 +1,125 @@ +messages = $messages; + } + + // Log a new message, with a level and context, context can be used to override serializer defaults, + // $context['trace'] = true can be used to force collecting a stack trace + public function log($level = LogLevel::INFO, $message = null, array $context = []) + { + $trace = $this->hasTrace($context) ? $context['trace'] : StackTrace::get()->resolveViewName(); + + $this->messages[] = [ + 'message' => (new Serializer($context))->normalize($message), + 'exception' => $this->formatException($context), + 'context' => $this->formatContext($context), + 'level' => $level, + 'time' => microtime(true), + 'trace' => (new Serializer(! empty($context['trace']) ? [ 'traces' => true ] : []))->trace($trace) + ]; + } + + public function emergency($message, array $context = []) + { + $this->log(LogLevel::EMERGENCY, $message, $context); + } + + public function alert($message, array $context = []) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + public function critical($message, array $context = []) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + public function error($message, array $context = []) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + public function warning($message, array $context = []) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + public function notice($message, array $context = []) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + public function info($message, array $context = []) + { + $this->log(LogLevel::INFO, $message, $context); + } + + public function debug($message, array $context = []) + { + $this->log(LogLevel::DEBUG, $message, $context); + } + + // Merge another log instance into the current log + public function merge(Log $log) + { + $this->messages = array_merge($this->messages, $log->messages); + + return $this; + } + + // Sort the log messages by timestamp + public function sort() + { + usort($this->messages, function ($a, $b) { return $a['time'] * 1000 - $b['time'] * 1000; }); + } + + // Get all messages as an array + public function toArray() + { + return $this->messages; + } + + // Format message context, removes exception and trace if we are serializing them + protected function formatContext($context) + { + if ($this->hasException($context)) unset($context['exception']); + if ($this->hasTrace($context)) unset($context['trace']); + + return (new Serializer)->normalize($context); + } + + // Format exception if present in the context + protected function formatException($context) + { + if ($this->hasException($context)) { + return (new Serializer)->exception($context['exception']); + } + } + + // Check if context has serializable trace + protected function hasTrace($context) + { + return ! empty($context['trace']) && $context['trace'] instanceof StackTrace && empty($context['raw']); + } + + // Check if context has serializable exception + protected function hasException($context) + { + return ! empty($context['exception']) + && ($context['exception'] instanceof \Throwable || $context['exception'] instanceof \Exception) + && empty($context['raw']); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/LogLevel.php b/vendor/itsgoingd/clockwork/Clockwork/Request/LogLevel.php new file mode 100644 index 000000000..9d179823c --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/LogLevel.php @@ -0,0 +1,13 @@ + value ] + public $clientMetrics = []; + + // Web vitals in the form of [ vital => value ] + public $webVitals = []; + + // Parent request + public $parent; + + // Token to update this request data + public $updateToken; + + // Log instance for the current request + protected $currentLog; + + // Timeline instance for the current request + protected $currentTimeline; + + // Array of property values to override collected values from data sources + protected $overrides = []; + + // Create a new request, if optional data array argument is provided, it will be used to populate the request object, + // otherwise an empty request with current time, autogenerated ID and update token will be created + public function __construct(array $data = []) + { + $this->id = isset($data['id']) ? $data['id'] : $this->generateRequestId(); + $this->time = microtime(true); + $this->updateToken = isset($data['updateToken']) ? $data['updateToken'] : $this->generateUpdateToken(); + + foreach ($data as $key => $val) $this->$key = $val; + + $this->currentLog = new Log($this->log); + $this->currentTimeline = new Timeline\Timeline($this->timelineData); + } + + // Compute the sum of durations of all database queries + public function getDatabaseDuration() + { + return array_reduce($this->databaseQueries, function ($total, $query) { + return isset($query['duration']) ? $total + $query['duration'] : $total; + }, 0); + } + + // Compute response duration in milliseconds + public function getResponseDuration() + { + return ($this->responseTime - $this->time) * 1000; + } + + // Get all request data as an array + public function toArray() + { + return [ + 'id' => $this->id, + 'version' => $this->version, + 'type' => $this->type, + 'time' => $this->time, + 'method' => $this->method, + 'url' => $this->url, + 'uri' => $this->uri, + 'headers' => $this->headers, + 'controller' => $this->controller, + 'getData' => $this->getData, + 'postData' => $this->postData, + 'requestData' => $this->requestData, + 'sessionData' => $this->sessionData, + 'authenticatedUser' => $this->authenticatedUser, + 'cookies' => $this->cookies, + 'responseTime' => $this->responseTime, + 'responseStatus' => $this->responseStatus, + 'responseDuration' => $this->responseDuration ?: $this->getResponseDuration(), + 'memoryUsage' => $this->memoryUsage, + 'middleware' => $this->middleware, + 'databaseQueries' => $this->databaseQueries, + 'databaseQueriesCount' => $this->databaseQueriesCount, + 'databaseSlowQueries' => $this->databaseSlowQueries, + 'databaseSelects' => $this->databaseSelects, + 'databaseInserts' => $this->databaseInserts, + 'databaseUpdates' => $this->databaseUpdates, + 'databaseDeletes' => $this->databaseDeletes, + 'databaseOthers' => $this->databaseOthers, + 'databaseDuration' => $this->getDatabaseDuration(), + 'cacheQueries' => $this->cacheQueries, + 'cacheReads' => $this->cacheReads, + 'cacheHits' => $this->cacheHits, + 'cacheWrites' => $this->cacheWrites, + 'cacheDeletes' => $this->cacheDeletes, + 'cacheTime' => $this->cacheTime, + 'modelsActions' => $this->modelsActions, + 'modelsRetrieved' => $this->modelsRetrieved, + 'modelsCreated' => $this->modelsCreated, + 'modelsUpdated' => $this->modelsUpdated, + 'modelsDeleted' => $this->modelsDeleted, + 'redisCommands' => $this->redisCommands, + 'queueJobs' => $this->queueJobs, + 'timelineData' => $this->timeline()->toArray(), + 'log' => $this->log()->toArray(), + 'events' => $this->events, + 'routes' => $this->routes, + 'notifications' => $this->notifications, + 'emailsData' => $this->emailsData, + 'viewsData' => $this->viewsData, + 'userData' => array_map(function ($data) { + return $data instanceof UserData ? $data->toArray() : $data; + }, $this->userData), + 'subrequests' => $this->subrequests, + 'xdebug' => $this->xdebug, + 'commandName' => $this->commandName, + 'commandArguments' => $this->commandArguments, + 'commandArgumentsDefaults' => $this->commandArgumentsDefaults, + 'commandOptions' => $this->commandOptions, + 'commandOptionsDefaults' => $this->commandOptionsDefaults, + 'commandExitCode' => $this->commandExitCode, + 'commandOutput' => $this->commandOutput, + 'jobName' => $this->jobName, + 'jobDescription' => $this->jobDescription, + 'jobStatus' => $this->jobStatus, + 'jobPayload' => $this->jobPayload, + 'jobQueue' => $this->jobQueue, + 'jobConnection' => $this->jobConnection, + 'jobOptions' => $this->jobOptions, + 'testName' => $this->testName, + 'testStatus' => $this->testStatus, + 'testStatusMessage' => $this->testStatusMessage, + 'testAsserts' => $this->testAsserts, + 'clientMetrics' => $this->clientMetrics, + 'webVitals' => $this->webVitals, + 'parent' => $this->parent, + 'updateToken' => $this->updateToken + ]; + } + + // Get all request data as a JSON string + public function toJson() + { + return json_encode($this->toArray(), \JSON_PARTIAL_OUTPUT_ON_ERROR); + } + + // Return request data except specified keys as an array + public function except($keys) + { + return array_filter($this->toArray(), function ($value, $key) use ($keys) { + return ! in_array($key, $keys); + }, ARRAY_FILTER_USE_BOTH); + } + + // Return only request data with specified keys as an array + public function only($keys) + { + return array_filter($this->toArray(), function ($value, $key) use ($keys) { + return in_array($key, $keys); + }, ARRAY_FILTER_USE_BOTH); + } + + // Return log instance for the current request + public function log() + { + return $this->currentLog; + } + + // Return timeline instance for the current request + public function timeline() + { + return $this->currentTimeline; + } + + // Add a new overridden property + public function override($property, $value) + { + $this->overrides[$property] = $value; + return $this; + } + + // Get or set all overrides at once + public function overrides($overrides = null) + { + if (! $overrides) return $this->overrides; + + $this->overrides = $overrides; + return $this; + } + + // Add database query, takes query, bindings, duration (in ms) and additional data - connection (connection name), + // time (when was the query executed), file (caller file name), line (caller line number), trace (serialized trace), + // model (associated ORM model) + public function addDatabaseQuery($query, $bindings = [], $duration = null, $data = []) + { + $this->databaseQueries[] = [ + 'query' => $query, + 'bindings' => (new Serializer)->normalize($bindings), + 'duration' => $duration, + 'connection' => isset($data['connection']) ? $data['connection'] : null, + 'time' => isset($data['time']) ? $data['time'] : microtime(true) - ($duration ?: 0) / 1000, + 'file' => isset($data['file']) ? $data['file'] : null, + 'line' => isset($data['line']) ? $data['line'] : null, + 'trace' => isset($data['trace']) ? $data['trace'] : null, + 'model' => isset($data['model']) ? $data['model'] : null, + 'tags' => array_merge( + isset($data['tags']) ? $data['tags'] : [], isset($data['slow']) ? [ 'slow' ] : [] + ) + ]; + } + + // Add model action, takes model, action and additional data - key, attributes, changes, time (when was the action + // executed), query, duration (in ms), connection (connection name), trace (serialized trace), file (caller file + // name), line (caller line number), tags + public function addModelAction($model, $action, $data = []) + { + $this->modelActions[] = [ + 'model' => $model, + 'key' => isset($data['key']) ? $data['key'] : null, + 'action' => $action, + 'attributes' => isset($data['attributes']) ? $data['attributes'] : [], + 'changes' => isset($data['changes']) ? $data['changes'] : [], + 'duration' => $duration = isset($data['duration']) ? $data['duration'] : null, + 'time' => isset($data['time']) ? $data['time'] : microtime(true) - ($duration ?: 0) / 1000, + 'query' => isset($data['query']) ? $data['query'] : null, + 'connection' => isset($data['connection']) ? $data['connection'] : null, + 'trace' => isset($data['trace']) ? $data['trace'] : null, + 'file' => isset($data['file']) ? $data['file'] : null, + 'line' => isset($data['line']) ? $data['line'] : null, + 'tags' => isset($data['tags']) ? $data['tags'] : [] + ]; + } + + // Add cache query, takes type, key, value, duration (in ms) and additional data - connection (connection name), + // time (when was the query executed), file (caller file name), line (caller line number), trace (serialized trace), + // expiration + public function addCacheQuery($type, $key, $value = null, $duration = null, $data = []) + { + $this->cacheQueries[] = [ + 'type' => $type, + 'key' => $key, + 'value' => (new Serializer)->normalize($value), + 'duration' => $duration, + 'connection' => isset($data['connection']) ? $data['connection'] : null, + 'time' => isset($data['time']) ? $data['time'] : microtime(true) - ($duration ?: 0) / 1000, + 'file' => isset($data['file']) ? $data['file'] : null, + 'line' => isset($data['line']) ? $data['line'] : null, + 'trace' => isset($data['trace']) ? $data['trace'] : null, + 'expiration' => isset($data['expiration']) ? $data['expiration'] : null + ]; + } + + // Add event, takes event name, data, time and additional data - listeners, duration (in ms), file (caller file + // name), line (caller line number), trace (serialized trace) + public function addEvent($event, $eventData = null, $time = null, $data = []) + { + $this->events[] = [ + 'event' => $event, + 'data' => (new Serializer)->normalize($eventData), + 'duration' => $duration = isset($data['duration']) ? $data['duration'] : null, + 'time' => $time ? $time : microtime(true) - ($duration ?: 0) / 1000, + 'listeners' => isset($data['listeners']) ? $data['listeners'] : null, + 'file' => isset($data['file']) ? $data['file'] : null, + 'line' => isset($data['line']) ? $data['line'] : null, + 'trace' => isset($data['trace']) ? $data['trace'] : null + ]; + } + + // Add route, takes method, uri, action and additional data - name, middleware, before (before filters), after + // (after filters) + public function addRoute($method, $uri, $action, $data = []) + { + $this->routes[] = [ + 'method' => $method, + 'uri' => $uri, + 'action' => $action, + 'name' => isset($data['name']) ? $data['name'] : null, + 'middleware' => isset($data['middleware']) ? $data['middleware'] : null, + 'before' => isset($data['before']) ? $data['before'] : null, + 'after' => isset($data['after']) ? $data['after'] : null + ]; + } + + // Add sent notifucation, takes subject, recipient, sender, and additional data - time, duration, type, content, data + public function addNotification($subject, $to, $from = null, $data = []) + { + $this->notifications[] = [ + 'subject' => $subject, + 'from' => $from, + 'to' => $to, + 'content' => isset($data['content']) ? $data['content'] : null, + 'type' => isset($data['type']) ? $data['type'] : null, + 'data' => isset($data['data']) ? $data['data'] : [], + 'duration' => $duration = isset($data['duration']) ? $data['duration'] : null, + 'time' => isset($data['time']) ? $data['time'] : microtime(true) - ($duration ?: 0) / 1000, + 'trace' => isset($data['trace']) ? $data['trace'] : null, + 'file' => isset($data['file']) ? $data['file'] : null, + 'line' => isset($data['line']) ? $data['line'] : null + ]; + } + + // Add sent email, takes subject, recipient address, sender address, array of headers, and additional data - time + // (when was the email sent), duration (sending time in ms) + public function addEmail($subject, $to, $from = null, $headers = [], $data = []) + { + $this->emailsData[] = [ + 'start' => isset($data['time']) ? $data['time'] : null, + 'end' => isset($data['time'], $data['duration']) ? $data['time'] + $data['duration'] / 1000 : null, + 'duration' => isset($data['duration']) ? $data['duration'] : null, + 'description' => 'Sending an email message', + 'data' => [ + 'subject' => $subject, + 'to' => $to, + 'from' => $from, + 'headers' => (new Serializer)->normalize($headers) + ] + ]; + } + + // Add view, takes view name, view data and additional data - time (when was the view rendered), duration (sending + // time in ms) + public function addView($name, $viewData = [], $data = []) + { + $this->viewsData[] = [ + 'start' => isset($data['time']) ? $data['time'] : null, + 'end' => isset($data['time'], $data['duration']) ? $data['time'] + $data['duration'] / 1000 : null, + 'duration' => isset($data['duration']) ? $data['duration'] : null, + 'description' => 'Rendering a view', + 'data' => [ + 'name' => $name, + 'data' => (new Serializer)->normalize($viewData) + ] + ]; + } + + // Add executed subrequest, takes the requested url, subrequest Clockwork ID and additional data - path if non-default + public function addSubrequest($url, $id, $data = []) + { + $this->subrequests[] = [ + 'url' => $url, + 'id' => $id, + 'path' => isset($data['path']) ? $data['path'] : null + ]; + } + + // Set the authenticated user, takes a username, an id and additional data - email and name + public function setAuthenticatedUser($username, $id = null, $data = []) + { + $this->authenticatedUser = [ + 'id' => $id, + 'username' => $username, + 'email' => isset($data['email']) ? $data['email'] : null, + 'name' => isset($data['name']) ? $data['name'] : null + ]; + } + + // Set parent request, takes the request id and additional options - url and path if non-default + public function setParent($id, $data = []) + { + $this->parent = [ + 'id' => $id, + 'url' => isset($data['url']) ? $data['url'] : null, + 'path' => isset($data['path']) ? $data['path'] : null + ]; + } + + // Add custom user data + public function userData($key = null) + { + if ($key && isset($this->userData[$key])) { + return $this->userData[$key]; + } + + $userData = (new UserData)->title($key); + + return $key ? $this->userData[$key] = $userData : $this->userData[] = $userData; + } + + // Add a ran test assert, takes the assert name, arguments, whether it passed and trace as arguments + public function addTestAssert($name, $arguments = null, $passed = true, $trace = null) + { + $this->testAsserts[] = [ + 'name' => $name, + 'arguments' => (new Serializer)->normalize($arguments), + 'trace' => $trace, + 'passed' => $passed + ]; + } + + // Generate unique request ID in the form of - + protected function generateRequestId() + { + return str_replace('.', '-', sprintf('%.4F', microtime(true))) . '-' . mt_rand(); + } + + // Generate a random update token + protected function generateUpdateToken() + { + $length = 8; + $bytes = function_exists('random_bytes') ? random_bytes($length) : openssl_random_pseudo_bytes($length); + + return substr(bin2hex($bytes), 0, $length); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/RequestType.php b/vendor/itsgoingd/clockwork/Clockwork/Request/RequestType.php new file mode 100644 index 000000000..aad30e6ec --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/RequestType.php @@ -0,0 +1,10 @@ +except = array_merge($this->except, is_array($uris) ? $uris : [ $uris ]); + + return $this; + } + + // Append one or more only URIs + public function only($uris) + { + $this->only = array_merge($this->only, is_array($uris) ? $uris : [ $uris ]); + + return $this; + } + + // Merge multiple settings from array + public function merge(array $data = []) + { + foreach ($data as $key => $val) $this->$key = $val; + } + + // Apply the filter to an incoming request + public function filter(IncomingRequest $request) + { + return $this->passOnDemand($request) + && $this->passSampling() + && $this->passExcept($request) + && $this->passOnly($request) + && $this->passExceptPreflight($request) + && $this->passCallback($request); + } + + protected function passOnDemand(IncomingRequest $request) + { + if (! $this->onDemand) return true; + + if ($this->onDemand !== true) { + $input = isset($request->input['clockwork-profile']) ? $request->input['clockwork-profile'] : ''; + $cookie = isset($request->cookies['clockwork-profile']) ? $request->cookies['clockwork-profile'] : ''; + + return hash_equals($this->onDemand, $input) || hash_equals($this->onDemand, $cookie); + } + + return isset($request->input['clockwork-profile']) || isset($request->cookies['clockwork-profile']); + } + + protected function passSampling() + { + if (! $this->sample) return true; + + return mt_rand(0, $this->sample) == $this->sample; + } + + protected function passExcept(IncomingRequest $request) + { + if (! count($this->except)) return true; + + foreach ($this->except as $pattern) { + if (preg_match('#' . str_replace('#', '\#', $pattern) . '#', $request->uri)) return false; + } + + return true; + } + + protected function passOnly(IncomingRequest $request) + { + if (! count($this->only)) return true; + + foreach ($this->only as $pattern) { + if (preg_match('#' . str_replace('#', '\#', $pattern) . '#', $request->uri)) return true; + } + + return false; + } + + protected function passExceptPreflight(IncomingRequest $request) + { + if (! $this->exceptPreflight) return true; + + return strtoupper($request->method) != 'OPTIONS'; + } + + protected function passCallback(IncomingRequest $request) + { + if (! $this->callback) return true; + + return call_user_func($this->callback, $request); + } + + public function __call($method, $parameters) + { + if (! count($parameters)) return $this->$method; + + $this->$method = count($parameters) ? $parameters[0] : true; + + return $this; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/ShouldRecord.php b/vendor/itsgoingd/clockwork/Clockwork/Request/ShouldRecord.php new file mode 100644 index 000000000..d8c062999 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/ShouldRecord.php @@ -0,0 +1,58 @@ + $val) $this->$key = $val; + } + + // Apply the filter to a request + public function filter(Request $request) + { + return $this->passErrorsOnly($request) + && $this->passSlowOnly($request) + && $this->passCallback($request); + } + + protected function passErrorsOnly(Request $request) + { + if (! $this->errorsOnly) return true; + + return 400 <= $request->responseStatus && $request->responseStatus <= 599; + } + + protected function passSlowOnly(Request $request) + { + if (! $this->slowOnly) return true; + + return $request->getResponseDuration() >= $this->slowOnly; + } + + protected function passCallback(Request $request) + { + if (! $this->callback) return true; + + return call_user_func($this->callback, $request); + } + + // Fluent API + public function __call($method, $parameters) + { + if (! count($parameters)) return $this->$method; + + $this->$method = count($parameters) ? $parameters[0] : true; + + return $this; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/Timeline/Event.php b/vendor/itsgoingd/clockwork/Clockwork/Request/Timeline/Event.php new file mode 100644 index 000000000..f92971ca5 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/Timeline/Event.php @@ -0,0 +1,105 @@ +description = $description; + $this->name = isset($data['name']) ? $data['name'] : $description; + + $this->start = isset($data['start']) ? $data['start'] : null; + $this->end = isset($data['end']) ? $data['end'] : null; + + $this->color = isset($data['color']) ? $data['color'] : null; + $this->data = isset($data['data']) ? $data['data'] : null; + } + + // Begin the event at current time + public function begin() + { + $this->start = microtime(true); + + return $this; + } + + // End the event at current time + public function end() + { + $this->end = microtime(true); + + return $this; + } + + // Begin the event, execute the passed in closure and end the event, returns the closure return value + public function run(\Closure $closure, ...$args) + { + $this->begin(); + try { + return $closure(...$args); + } finally { + $this->end(); + } + } + + // Set or retrieve event duration (in ms), event can be defined with both start and end time or just a single time and duration + public function duration($duration = null) + { + if (! $duration) return ($this->start && $this->end) ? ($this->end - $this->start) * 1000 : 0; + + if ($this->start) $this->end = $this->start + $duration / 1000; + if ($this->end) $this->start = $this->end - $duration / 1000; + + return $this; + } + + // Finalize the event, ends the event, fills in start time if empty and limits the start and end time + public function finalize($start = null, $end = null) + { + $end = $end ?: microtime(true); + + $this->start = $this->start ?: $start; + $this->end = $this->end ?: $end; + + if ($this->start < $start) $this->start = $start; + if ($this->end > $end) $this->end = $end; + } + + // Fluent API + public function __call($method, $parameters) + { + if (! count($parameters)) return $this->$method; + + $this->$method = $parameters[0]; + + return $this; + } + + // Return an array representation of the event + public function toArray() + { + return [ + 'description' => $this->description, + 'start' => $this->start, + 'end' => $this->end, + 'duration' => $this->duration(), + 'color' => $this->color, + 'data' => $this->data + ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/Timeline/Timeline.php b/vendor/itsgoingd/clockwork/Clockwork/Request/Timeline/Timeline.php new file mode 100644 index 000000000..cd2a34c77 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/Timeline/Timeline.php @@ -0,0 +1,72 @@ +create($event['description'], $event); + } + } + + // Find or create a new event, takes description and optional data - name, start, end, duration, color, data + public function event($description, $data = []) + { + $name = isset($data['name']) ? $data['name'] : $description; + + if ($event = $this->find($name)) return $event; + + return $this->create($description, $data); + } + + // Create a new event, takes description and optional data - name, start, end, duration, color, data + public function create($description, $data = []) + { + return $this->events[] = new Event($description, $data); + } + + // Find event by name + public function find($name) + { + foreach ($this->events as $event) { + if ($event->name == $name) return $event; + } + } + + // Merge another timeline instance into the current timeline + public function merge(Timeline $timeline) + { + $this->events = array_merge($this->events, $timeline->events); + + return $this; + } + + // Finalize timeline, ends all events, sorts them and returns as an array + public function finalize($start = null, $end = null) + { + foreach ($this->events as $event) { + $event->finalize($start, $end); + } + + $this->sort(); + + return $this->toArray(); + } + + // Sort the timeline events by start time + public function sort() + { + usort($this->events, function ($a, $b) { return $a->start * 1000 - $b->start * 1000; }); + } + + // Return events as an array + public function toArray() + { + return array_map(function ($event) { return $event->toArray(); }, $this->events); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/UserData.php b/vendor/itsgoingd/clockwork/Clockwork/Request/UserData.php new file mode 100644 index 000000000..ef2351f88 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/UserData.php @@ -0,0 +1,52 @@ +data[$key] = new UserDataItem($data); + } + + return $this->data[] = new UserDataItem($data); + } + + // Add user data shown as counters + public function counters(array $data) + { + return $this->data($data) + ->showAs('counters'); + } + + // Add user data shown as table + public function table($title, array $data) + { + return $this->data($data) + ->showAs('table') + ->title($title); + } + + // Set data title + public function title($title) + { + $this->title = $title; + return $this; + } + + // Transform data and all contents to a serializable array with metadata + public function toArray() + { + return array_merge( + array_map(function ($data) { return $data->toArray(); }, $this->data), + [ '__meta' => array_filter([ 'title' => $this->title ]) ] + ); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Request/UserDataItem.php b/vendor/itsgoingd/clockwork/Clockwork/Request/UserDataItem.php new file mode 100644 index 000000000..6c1d1d812 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Request/UserDataItem.php @@ -0,0 +1,55 @@ +data = $data; + } + + // Set how the item should be presented ("counters" or "table") + public function showAs($showAs) + { + $this->showAs = $showAs; + return $this; + } + + // Set data title (shown as table title in the official app) + public function title($title) + { + $this->title = $title; + return $this; + } + + // Set a map of human-readable labels for the data contents + public function labels($labels) + { + $this->labels = $labels; + return $this; + } + + // Transform contents to a serializable array with metadata + public function toArray() + { + return array_merge($this->data, [ + '__meta' => array_filter([ + 'showAs' => $this->showAs, + 'title' => $this->title, + 'labels' => $this->labels + ]) + ]); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Storage/FileStorage.php b/vendor/itsgoingd/clockwork/Clockwork/Storage/FileStorage.php new file mode 100644 index 000000000..3a8aacbe2 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Storage/FileStorage.php @@ -0,0 +1,331 @@ +path = $path; + $this->expiration = $expiration === null ? 60 * 24 * 7 : $expiration; + $this->compress = $compress; + } + + // Returns all requests + public function all(Search $search = null) + { + return $this->loadRequests($this->searchIndexForward($search)); + } + + // Return a single request by id + public function find($id) + { + return $this->loadRequest($id); + } + + // Return the latest request + public function latest(Search $search = null) + { + $requests = $this->loadRequests($this->searchIndexBackward($search, null, 1)); + return reset($requests); + } + + // Return requests received before specified id, optionally limited to specified count + public function previous($id, $count = null, Search $search = null) + { + return $this->loadRequests($this->searchIndexBackward($search, $id, $count)); + } + + // Return requests received after specified id, optionally limited to specified count + public function next($id, $count = null, Search $search = null) + { + return $this->loadRequests($this->searchIndexForward($search, $id, $count)); + } + + // Store request, requests are stored in JSON representation in files named .json in storage path + public function store(Request $request, $skipIndex = false) + { + $path = "{$this->path}/{$request->id}.json"; + $data = @json_encode($request->toArray(), \JSON_PARTIAL_OUTPUT_ON_ERROR); + + $this->compress + ? file_put_contents("{$path}.gz", gzcompress($data)) + : file_put_contents($path, $data); + + if (! $skipIndex) $this->updateIndex($request); + + $this->cleanup(); + } + + // Update existing request + public function update(Request $request) + { + return $this->store($request, true); + } + + // Cleanup old requests + public function cleanup($force = false) + { + if ($this->expiration === false || (! $force && rand(1, $this->cleanupChance) != 1)) return; + + $this->openIndex('start', true, true); // reopen index with lock + + $expirationTime = time() - ($this->expiration * 60); + + $old = $this->searchIndexForward( + new Search([ 'received' => [ '<' . date('c', $expirationTime) ] ], [ 'stopOnFirstMismatch' => true ]) + ); + + if (! count($old)) return $this->closeIndex(true); + + $this->readPreviousIndex(); + $this->trimIndex(); + $this->closeIndex(true); // explicitly close index to unlock asap + + foreach ($old as $id) { + $path = "{$this->path}/{$id}.json"; + @unlink($this->compress ? "{$path}.gz" : $path); + } + } + + // Load a single request by id from filesystem + protected function loadRequest($id) + { + $path = "{$this->path}/{$id}.json"; + + if (! is_readable($this->compress ? "{$path}.gz" : $path)) return; + + $data = file_get_contents($this->compress ? "{$path}.gz" : $path); + + return new Request(json_decode($this->compress ? gzuncompress($data) : $data, true)); + } + + // Load multiple requests by ids from filesystem + protected function loadRequests($ids) + { + return array_filter(array_map(function ($id) { return $this->loadRequest($id); }, $ids)); + } + + // Search index backward from specified ID or last record, with optional results count limit + protected function searchIndexBackward(Search $search = null, $id = null, $count = null) + { + return $this->searchIndex('previous', $search, $id, $count); + } + + // Search index forward from specified ID or last record, with optional results count limit + protected function searchIndexForward(Search $search = null, $id = null, $count = null) + { + return $this->searchIndex('next', $search, $id, $count); + } + + // Search index in specified direction from specified ID or last record, with optional results count limit + protected function searchIndex($direction, Search $search = null, $id = null, $count = null) + { + $this->openIndex($direction == 'previous' ? 'end' : 'start', false, true); + + if ($id) { + while ($request = $this->readIndex($direction)) { if ($request->id == $id) break; } + } + + $found = []; + + while ($request = $this->readIndex($direction)) { + if (! $search || $search->matches($request)) { + $found[] = $request->id; + } elseif ($search->stopOnFirstMismatch) { + break; + } + + if ($count && count($found) == $count) break; + } + + return $direction == 'next' ? $found : array_reverse($found); + } + + // Open index file, optionally lock or move file pointer to the end, existing handle will be returned by default + protected function openIndex($position = 'start', $lock = false, $force = false) + { + if ($this->indexHandle) { + if (! $force) return; + $this->closeIndex(); + } + + $this->indexHandle = fopen("{$this->path}/index", 'r'); + + if ($lock) flock($this->indexHandle, LOCK_EX); + if ($position == 'end') fseek($this->indexHandle, 0, SEEK_END); + } + + // Close index file, optionally unlock + protected function closeIndex($lock = false) + { + if ($lock) flock($this->indexHandle, LOCK_UN); + fclose($this->indexHandle); + + $this->indexHandle = null; + } + + // Read a line from index in the specified direction (next or previous) + protected function readIndex($direction) + { + return $direction == 'next' ? $this->readNextIndex() : $this->readPreviousIndex(); + } + + // Read previous line from index + protected function readPreviousIndex() + { + $position = ftell($this->indexHandle) - 1; + + if ($position <= 0) return; + + $line = ''; + + // reads 1024B chunks of the file backwards from the current position, until a newline is found or we reach the top + while ($position > 0) { + // find next position to read from, make sure we don't read beyond file boundary + $position -= $chunkSize = min($position, 1024); + + // read the chunk from the position + fseek($this->indexHandle, $position); + $chunk = fread($this->indexHandle, $chunkSize); + + // if a newline is found, append only the part after the last newline, otherwise we can append the whole chunk + $line = ($newline = strrpos($chunk, "\n")) === false + ? $chunk . $line : substr($chunk, $newline + 1) . $line; + + // if a newline was found, fix the position so we read from that newline next time + if ($newline !== false) $position += $newline + 1; + + // move file pointer to the correct position (revert fread, apply newline fix) + fseek($this->indexHandle, $position); + + // if we reached a newline and put together a non-empty line we are done + if ($newline !== false) break; + } + + return $this->makeRequestFromIndex(str_getcsv($line)); + } + + // Read next line from index + protected function readNextIndex() + { + if (feof($this->indexHandle)) return; + + // File pointer is always at the start of the line, call extra fgets to skip current line + fgets($this->indexHandle); + $line = fgets($this->indexHandle); + + // Check if we read an empty line or reached the end of file + if ($line === false) return; + + // Reset the file pointer to the start of the read line + fseek($this->indexHandle, ftell($this->indexHandle) - strlen($line)); + + return $this->makeRequestFromIndex(str_getcsv($line)); + } + + // Trim index file from beginning to current position (including) + protected function trimIndex() + { + // File pointer is always at the start of the line, call extra fgets to skip current line + fgets($this->indexHandle); + + // Read the rest of the index file + $trimmedLength = filesize("{$this->path}/index") - ftell($this->indexHandle); + $trimmed = $trimmedLength > 0 ? fread($this->indexHandle, $trimmedLength) : ''; + + // Rewrite the index file with a trimmed version + file_put_contents("{$this->path}/index", $trimmed); + } + + // Create an incomplete request from index data + protected function makeRequestFromIndex($record) + { + $type = isset($record[7]) ? $record[7] : 'response'; + + if ($type == 'command') { + $nameField = 'commandName'; + } elseif ($type == 'queue-job') { + $nameField = 'jobName'; + } elseif ($type == 'test') { + $nameField = 'testName'; + } else { + $nameField = 'uri'; + } + + return new Request(array_combine( + [ 'id', 'time', 'method', $nameField, 'controller', 'responseStatus', 'responseDuration', 'type' ], + array_slice($record, 0, 8) + [ null, null, null, null, null, null, null, 'response' ] + )); + } + + // Update index with a new request + protected function updateIndex(Request $request) + { + $handle = fopen("{$this->path}/index", 'a'); + + if (! $handle) return; + + if (! flock($handle, LOCK_EX)) return fclose($handle); + + if ($request->type == 'command') { + $nameField = 'commandName'; + } elseif ($request->type == 'queue-job') { + $nameField = 'jobName'; + } elseif ($request->type == 'test') { + $nameField = 'testName'; + } else { + $nameField = 'uri'; + } + + fputcsv($handle, [ + $request->id, + $request->time, + $request->method, + $request->$nameField, + $request->controller, + $request->responseStatus, + $request->getResponseDuration(), + $request->type + ]); + + flock($handle, LOCK_UN); + fclose($handle); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Storage/Search.php b/vendor/itsgoingd/clockwork/Clockwork/Storage/Search.php new file mode 100644 index 000000000..ebe7833a3 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Storage/Search.php @@ -0,0 +1,166 @@ +$condition = isset($search[$condition]) ? $search[$condition] : []; + } + + foreach ([ 'stopOnFirstMismatch' ] as $option) { + $this->$option = isset($options[$option]) ? $options[$option] : $this->$condition; + } + + $this->method = array_map('strtolower', $this->method); + } + + // Create a new instance from request input + public static function fromRequest($data = []) + { + return new static($data); + } + + // Check whether the request matches current search parameters + public function matches(Request $request) + { + if ($request->type == RequestType::COMMAND) { + return $this->matchesCommand($request); + } elseif ($request->type == RequestType::QUEUE_JOB) { + return $this->matchesQueueJob($request); + } elseif ($request->type == RequestType::TEST) { + return $this->matchesTest($request); + } else { + return $this->matchesRequest($request); + } + } + + // Check whether a request type request matches + protected function matchesRequest(Request $request) + { + return $this->matchesString($this->type, RequestType::REQUEST) + && $this->matchesString($this->uri, $request->uri) + && $this->matchesString($this->controller, $request->controller) + && $this->matchesExact($this->method, strtolower($request->method)) + && $this->matchesNumber($this->status, $request->responseStatus) + && $this->matchesNumber($this->time, $request->responseDuration) + && $this->matchesDate($this->received, $request->time); + } + + // Check whether a command type request matches + protected function matchesCommand(Request $request) + { + return $this->matchesString($this->type, RequestType::COMMAND) + && $this->matchesString($this->name, $request->commandName) + && $this->matchesNumber($this->status, $request->commandExitCode) + && $this->matchesNumber($this->time, $request->responseDuration) + && $this->matchesDate($this->received, $request->time); + } + + // Check whether a queue-job type request matches + protected function matchesQueueJob(Request $request) + { + return $this->matchesString($this->type, RequestType::QUEUE_JOB) + && $this->matchesString($this->name, $request->jobName) + && $this->matchesString($this->status, $request->jobStatus) + && $this->matchesNumber($this->time, $request->responseDuration) + && $this->matchesDate($this->received, $request->time); + } + + // Check whether a test type request matches + protected function matchesTest(Request $request) + { + return $this->matchesString($this->type, RequestType::TEST) + && $this->matchesString($this->name, $request->testName) + && $this->matchesString($this->status, $request->testStatus) + && $this->matchesNumber($this->time, $request->responseDuration) + && $this->matchesDate($this->received, $request->time); + } + + // Check if there are no search parameters specified + public function isEmpty() + { + return ! count($this->uri) && ! count($this->controller) && ! count($this->method) && ! count($this->status) + && ! count($this->time) && ! count($this->received) && ! count($this->name) && ! count($this->type); + } + + // Check if there are some search parameters specified + public function isNotEmpty() + { + return ! $this->isEmpty(); + } + + // Check if the value matches date type search parameter + protected function matchesDate($inputs, $value) + { + if (! count($inputs)) return true; + + foreach ($inputs as $input) { + if (preg_match('/^<(.+)$/', $input, $match)) { + if ($value < strtotime($match[1])) return true; + } elseif (preg_match('/^>(.+)$/', $input, $match)) { + if ($value > strtotime($match[1])) return true; + } + } + + return false; + } + + // Check if the value matches exact type search parameter + protected function matchesExact($inputs, $value) + { + if (! count($inputs)) return true; + + return in_array($value, $inputs); + } + + // Check if the value matches number type search parameter + protected function matchesNumber($inputs, $value) + { + if (! count($inputs)) return true; + + foreach ($inputs as $input) { + if (preg_match('/^<(\d+(?:\.\d+)?)$/', $input, $match)) { + if ($value < $match[1]) return true; + } elseif (preg_match('/^>(\d+(?:\.\d+)?)$/', $input, $match)) { + if ($value > $match[1]) return true; + } elseif (preg_match('/^(\d+(?:\.\d+)?)-(\d+(?:\.\d+)?)$/', $input, $match)) { + if ($match[1] < $value && $value < $match[2]) return true; + } else { + if ($value == $input) return true; + } + } + + return false; + } + + // Check if the value matches string type search parameter + protected function matchesString($inputs, $value) + { + if (! count($inputs)) return true; + + foreach ($inputs as $input) { + if (strpos($value, $input) !== false) return true; + } + + return false; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Storage/SqlSearch.php b/vendor/itsgoingd/clockwork/Clockwork/Storage/SqlSearch.php new file mode 100644 index 000000000..41165e3b4 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Storage/SqlSearch.php @@ -0,0 +1,164 @@ +pdo = $pdo; + + list($this->conditions, $this->bindings) = $this->resolveConditions(); + + $this->buildQuery(); + } + + // Creates a new instance from a base Search class instance + public static function fromBase(Search $search = null, PDO $pdo = null) + { + return new static((array) $search, $pdo); + } + + // Add an additional where condition, takes the SQL condition and array of bindings + public function addCondition($condition, $bindings = []) + { + $this->conditions = array_merge([ $condition ], $this->conditions); + $this->bindings = array_merge($bindings, $this->bindings); + $this->buildQuery(); + + return $this; + } + + // Resolve SQL conditions and bindings based on the search parameters + protected function resolveConditions() + { + if ($this->isEmpty()) return [ [], [] ]; + + $conditions = array_filter([ + $this->resolveStringCondition([ 'type' ], $this->type), + $this->resolveStringCondition([ 'uri', 'commandName', 'jobName', 'testName' ], array_merge($this->uri, $this->name)), + $this->resolveStringCondition([ 'controller' ], $this->controller), + $this->resolveExactCondition([ 'method' ], $this->method), + $this->resolveNumberCondition([ 'responseStatus', 'commandExitCode', 'jobStatus', 'testStatus' ], $this->status), + $this->resolveNumberCondition([ 'responseDuration' ], $this->time), + $this->resolveDateCondition([ 'time' ], $this->received) + ]); + + $sql = array_map(function ($condition) { return $condition[0]; }, $conditions); + $bindings = array_reduce($conditions, function ($bindings, $condition) { + return array_merge($bindings, $condition[1]); + }, []); + + return [ $sql, $bindings ]; + } + + // Resolve a date type condition and bindings + protected function resolveDateCondition($fields, $inputs) + { + if (! count($inputs)) return null; + + $bindings = []; + $conditions = implode(' OR ', array_map(function ($field) use ($inputs, &$bindings) { + return implode(' OR ', array_map(function ($input, $index) use ($field, &$bindings) { + if (preg_match('/^<(.+)$/', $input, $match)) { + $bindings["{$field}{$index}"] = $match[1]; + return $this->quote($field) . " < :{$field}{$index}"; + } elseif (preg_match('/^>(.+)$/', $input, $match)) { + $bindings["{$field}{$index}"] = $match[1]; + return $this->quote($field). " > :{$field}{$index}"; + } + }, $inputs, array_keys($inputs))); + }, $fields)); + + return [ "({$conditions})", $bindings ]; + } + + // Resolve an exact type condition and bindings + protected function resolveExactCondition($fields, $inputs) + { + if (! count($inputs)) return null; + + $bindings = []; + $values = implode(' OR ', array_map(function ($field) use ($inputs, &$bindings) { + return implode(', ', array_map(function ($input, $index) use ($field, &$bindings) { + $bindings["{$field}{$index}"] = $input; + return ":{$field}{$index}"; + }, $inputs, array_keys($inputs))); + }, $fields)); + + return [ $this->quote($field) . " IN ({$values})", $bindings ]; + } + + // Resolve a number type condition and bindings + protected function resolveNumberCondition($fields, $inputs) + { + if (! count($inputs)) return null; + + $bindings = []; + $conditions = implode(' OR ', array_map(function ($field) use ($inputs, &$bindings) { + return implode(' OR ', array_map(function ($input, $index) use ($field, &$bindings) { + if (preg_match('/^<(\d+(?:\.\d+)?)$/', $input, $match)) { + $bindings["{$field}{$index}"] = $match[1]; + return $this->quote($field) . " < :{$field}{$index}"; + } elseif (preg_match('/^>(\d+(?:\.\d+)?)$/', $input, $match)) { + $bindings["{$field}{$index}"] = $match[1]; + return $this->quote($field) . " > :{$field}{$index}"; + } elseif (preg_match('/^(\d+(?:\.\d+)?)-(\d+(?:\.\d+)?)$/', $input, $match)) { + $bindings["{$field}{$index}from"] = $match[1]; + $bindings["{$field}{$index}to"] = $match[2]; + $quotedField = $this->quote($field); + return "({$quotedField} > :{$field}{$index}from AND {$quotedField} < :{$field}{$index}to)"; + } else { + $bindings["{$field}{$index}"] = $input; + return $this->quote($field) . " = :{$field}{$index}"; + } + }, $inputs, array_keys($inputs))); + }, $fields)); + + return [ "({$conditions})", $bindings ]; + } + + // Resolve a string type condition and bindings + protected function resolveStringCondition($fields, $inputs) + { + if (! count($inputs)) return null; + + $bindings = []; + $conditions = implode(' OR ', array_map(function ($field) use ($inputs, &$bindings) { + return implode(' OR ', array_map(function ($input, $index) use ($field, &$bindings) { + $bindings["{$field}{$index}"] = $input; + return $this->quote($field) . " LIKE :{$field}{$index}"; + }, $inputs, array_keys($inputs))); + }, $fields)); + + return [ "({$conditions})", $bindings ]; + } + + // Build the where part of the SQL query + protected function buildQuery() + { + $this->query = count($this->conditions) ? 'WHERE ' . implode(' AND ', $this->conditions) : ''; + } + + // Quotes SQL identifier name properly for the current database + protected function quote($identifier) + { + return $this->pdo && $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql' ? "`{$identifier}`" : "\"{$identifier}\""; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Storage/SqlStorage.php b/vendor/itsgoingd/clockwork/Clockwork/Storage/SqlStorage.php new file mode 100644 index 000000000..4e8a2ccdc --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Storage/SqlStorage.php @@ -0,0 +1,296 @@ + 'VARCHAR(100) PRIMARY KEY', + 'version' => 'INTEGER', + 'type' => 'VARCHAR(100) NULL', + 'time' => 'DOUBLE PRECISION NULL', + 'method' => 'VARCHAR(10) NULL', + 'url' => 'TEXT NULL', + 'uri' => 'TEXT NULL', + 'headers' => 'TEXT NULL', + 'controller' => 'VARCHAR(250) NULL', + 'getData' => 'TEXT NULL', + 'postData' => 'TEXT NULL', + 'requestData' => 'TEXT NULL', + 'sessionData' => 'TEXT NULL', + 'authenticatedUser' => 'TEXT NULL', + 'cookies' => 'TEXT NULL', + 'responseTime' => 'DOUBLE PRECISION NULL', + 'responseStatus' => 'INTEGER NULL', + 'responseDuration' => 'DOUBLE PRECISION NULL', + 'memoryUsage' => 'DOUBLE PRECISION NULL', + 'middleware' => 'TEXT NULL', + 'databaseQueries' => 'TEXT NULL', + 'databaseQueriesCount' => 'INTEGER NULL', + 'databaseSlowQueries' => 'INTEGER NULL', + 'databaseSelects' => 'INTEGER NULL', + 'databaseInserts' => 'INTEGER NULL', + 'databaseUpdates' => 'INTEGER NULL', + 'databaseDeletes' => 'INTEGER NULL', + 'databaseOthers' => 'INTEGER NULL', + 'databaseDuration' => 'DOUBLE PRECISION NULL', + 'cacheQueries' => 'TEXT NULL', + 'cacheReads' => 'INTEGER NULL', + 'cacheHits' => 'INTEGER NULL', + 'cacheWrites' => 'INTEGER NULL', + 'cacheDeletes' => 'INTEGER NULL', + 'cacheTime' => 'DOUBLE PRECISION NULL', + 'modelsActions' => 'TEXT NULL', + 'modelsRetrieved' => 'TEXT NULL', + 'modelsCreated' => 'TEXT NULL', + 'modelsUpdated' => 'TEXT NULL', + 'modelsDeleted' => 'TEXT NULL', + 'redisCommands' => 'TEXT NULL', + 'queueJobs' => 'TEXT NULL', + 'timelineData' => 'TEXT NULL', + 'log' => 'TEXT NULL', + 'events' => 'TEXT NULL', + 'routes' => 'TEXT NULL', + 'notifications' => 'TEXT NULL', + 'emailsData' => 'TEXT NULL', + 'viewsData' => 'TEXT NULL', + 'userData' => 'TEXT NULL', + 'subrequests' => 'TEXT NULL', + 'xdebug' => 'TEXT NULL', + 'commandName' => 'TEXT NULL', + 'commandArguments' => 'TEXT NULL', + 'commandArgumentsDefaults' => 'TEXT NULL', + 'commandOptions' => 'TEXT NULL', + 'commandOptionsDefaults' => 'TEXT NULL', + 'commandExitCode' => 'INTEGER NULL', + 'commandOutput' => 'TEXT NULL', + 'jobName' => 'TEXT NULL', + 'jobDescription' => 'TEXT NULL', + 'jobStatus' => 'TEXT NULL', + 'jobPayload' => 'TEXT NULL', + 'jobQueue' => 'TEXT NULL', + 'jobConnection' => 'TEXT NULL', + 'jobOptions' => 'TEXT NULL', + 'testName' => 'TEXT NULL', + 'testStatus' => 'TEXT NULL', + 'testStatusMessage' => 'TEXT NULL', + 'testAsserts' => 'TEXT NULL', + 'clientMetrics' => 'TEXT NULL', + 'webVitals' => 'TEXT NULL', + 'parent' => 'TEXT NULL', + 'updateToken' => 'VARCHAR(100) NULL' + ]; + + // List of Request keys that need to be serialized before they can be stored in database + protected $needsSerialization = [ + 'headers', 'getData', 'postData', 'requestData', 'sessionData', 'authenticatedUser', 'cookies', 'middleware', + 'databaseQueries', 'cacheQueries', 'modelsActions', 'modelsRetrieved', 'modelsCreated', 'modelsUpdated', + 'modelsDeleted', 'redisCommands', 'queueJobs', 'timelineData', 'log', 'events', 'routes', 'notifications', + 'emailsData', 'viewsData', 'userData', 'subrequests', 'xdebug', 'commandArguments', 'commandArgumentsDefaults', + 'commandOptions', 'commandOptionsDefaults', 'jobPayload', 'jobOptions', 'testAsserts', 'parent', + 'clientMetrics', 'webVitals' + ]; + + // Return a new storage, takes PDO object or DSN and optionally a table name and database credentials as arguments + public function __construct($dsn, $table = 'clockwork', $username = null, $password = null, $expiration = null) + { + $this->pdo = $dsn instanceof PDO ? $dsn : new PDO($dsn, $username, $password); + $this->table = $table; + $this->expiration = $expiration === null ? 60 * 24 * 7 : $expiration; + } + + // Returns all requests + public function all(Search $search = null) + { + $fields = implode(', ', array_map(function ($field) { return $this->quote($field); }, array_keys($this->fields))); + $search = SqlSearch::fromBase($search, $this->pdo); + $result = $this->query("SELECT {$fields} FROM {$this->table} {$search->query}", $search->bindings); + + return $this->resultsToRequests($result); + } + + // Return a single request by id + public function find($id) + { + $fields = implode(', ', array_map(function ($field) { return $this->quote($field); }, array_keys($this->fields))); + $result = $this->query("SELECT {$fields} FROM {$this->table} WHERE id = :id", [ 'id' => $id ]); + + $requests = $this->resultsToRequests($result); + return end($requests); + } + + // Return the latest request + public function latest(Search $search = null) + { + $fields = implode(', ', array_map(function ($field) { return $this->quote($field); }, array_keys($this->fields))); + $search = SqlSearch::fromBase($search, $this->pdo); + $result = $this->query( + "SELECT {$fields} FROM {$this->table} {$search->query} ORDER BY id DESC LIMIT 1", $search->bindings + ); + + $requests = $this->resultsToRequests($result); + return end($requests); + } + + // Return requests received before specified id, optionally limited to specified count + public function previous($id, $count = null, Search $search = null) + { + $count = (int) $count; + + $fields = implode(', ', array_map(function ($field) { return $this->quote($field); }, array_keys($this->fields))); + $search = SqlSearch::fromBase($search, $this->pdo)->addCondition('id < :id', [ 'id' => $id ]); + $limit = $count ? "LIMIT {$count}" : ''; + $result = $this->query( + "SELECT {$fields} FROM {$this->table} {$search->query} ORDER BY id DESC {$limit}", $search->bindings + ); + + return array_reverse($this->resultsToRequests($result)); + } + + // Return requests received after specified id, optionally limited to specified count + public function next($id, $count = null, Search $search = null) + { + $count = (int) $count; + + $fields = implode(', ', array_map(function ($field) { return $this->quote($field); }, array_keys($this->fields))); + $search = SqlSearch::fromBase($search, $this->pdo)->addCondition('id > :id', [ 'id' => $id ]); + $limit = $count ? "LIMIT {$count}" : ''; + $result = $this->query( + "SELECT {$fields} FROM {$this->table} {$search->query} ORDER BY id ASC {$limit}", $search->bindings + ); + + return $this->resultsToRequests($result); + } + + // Store the request in the database + public function store(Request $request) + { + $data = $request->toArray(); + + foreach ($this->needsSerialization as $key) { + $data[$key] = @json_encode($data[$key], \JSON_PARTIAL_OUTPUT_ON_ERROR); + } + + $fields = implode(', ', array_map(function ($field) { return $this->quote($field); }, array_keys($this->fields))); + $bindings = implode(', ', array_map(function ($field) { return ":{$field}"; }, array_keys($this->fields))); + + $this->query("INSERT INTO {$this->table} ($fields) VALUES ($bindings)", $data); + + $this->cleanup(); + } + + // Update an existing request in the database + public function update(Request $request) + { + $data = $request->toArray(); + + foreach ($this->needsSerialization as $key) { + $data[$key] = @json_encode($data[$key], \JSON_PARTIAL_OUTPUT_ON_ERROR); + } + + $values = implode(', ', array_map(function ($field) { + return $this->quote($field) . " = :{$field}"; + }, array_keys($this->fields))); + + $this->query("UPDATE {$this->table} SET {$values} WHERE id = :id", $data); + + $this->cleanup(); + } + + // Cleanup old requests + public function cleanup() + { + if ($this->expiration === false) return; + + $this->query("DELETE FROM {$this->table} WHERE time < :time", [ 'time' => time() - ($this->expiration * 60) ]); + } + + // Create or update the Clockwork metadata table + protected function initialize() + { + // first we get rid of existing table if it exists by renaming it so we won't lose any data + try { + $table = $this->quote($this->table); + $backupTableName = $this->quote("{$this->table}_backup_" . date('Ymd')); + $this->pdo->exec("ALTER TABLE {$table} RENAME TO {$backupTableName};"); + } catch (\PDOException $e) { + // this just means the table doesn't yet exist, nothing to do here + } + + // create the metadata table + $this->pdo->exec($this->buildSchema($table)); + + $indexName = $this->quote("{$this->table}_time_index"); + $this->pdo->exec("CREATE INDEX {$indexName} ON {$table} (". $this->quote('time') .')'); + } + + // Builds the query to create Clockwork database table + protected function buildSchema($table) + { + $textType = $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql' ? 'MEDIUMTEXT' : 'TEXT'; + + $columns = implode(', ', array_map(function ($field, $type) use ($textType) { + return $this->quote($field) . ' ' . str_replace('TEXT', $textType, $type); + }, array_keys($this->fields), array_values($this->fields))); + + return "CREATE TABLE {$table} ({$columns});"; + } + + // Executes an sql query, lazily initiates the clockwork database schema if it's old or doesn't exist yet, returns + // executed statement or false on error + protected function query($query, array $bindings = [], $firstTry = true) + { + try { + if ($stmt = $this->pdo->prepare($query)) { + if ($stmt->execute($bindings)) return $stmt; + throw new \PDOException; + } + } catch (\PDOException $e) { + $stmt = false; + } + + // the query failed to execute, assume it's caused by missing or old schema, try to reinitialize database + if (! $stmt && $firstTry) { + $this->initialize(); + return $this->query($query, $bindings, false); + } + } + + // Quotes SQL identifier name properly for the current database + protected function quote($identifier) + { + return $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql' ? "`{$identifier}`" : "\"{$identifier}\""; + } + + // Returns array of Requests instances from the executed PDO statement + protected function resultsToRequests($stmt) + { + return array_map(function ($data) { + return $this->dataToRequest($data); + }, $stmt->fetchAll(PDO::FETCH_ASSOC)); + } + + // Returns a Request instance from a single database record + protected function dataToRequest($data) + { + foreach ($this->needsSerialization as $key) { + $data[$key] = json_decode($data[$key], true); + } + + return new Request($data); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Storage/Storage.php b/vendor/itsgoingd/clockwork/Clockwork/Storage/Storage.php new file mode 100644 index 000000000..9c2a27f1a --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Storage/Storage.php @@ -0,0 +1,12 @@ +profiler = $profiler; + $this->path = $path; + } + + // Store request, no-op since this is read-only storage implementation + public function store(Request $request, $skipIndex = false) + { + return; + } + + // Cleanup old requests, no-op since this is read-only storage implementation + public function cleanup($force = false) + { + return; + } + + protected function loadRequest($token) + { + return ($profile = $this->profiler->loadProfile($token)) ? (new ProfileTransformer)->transform($profile) : null; + } + + // Open index file, optionally move file pointer to the end + protected function openIndex($position = 'start', $lock = null, $force = null) + { + $this->indexHandle = fopen("{$this->path}/index.csv", 'r'); + + if ($position == 'end') fseek($this->indexHandle, 0, SEEK_END); + } + + protected function makeRequestFromIndex($record) + { + return new Request(array_combine( + [ 'id', 'ip', 'method', 'uri', 'time', 'parent', 'responseStatus' ], $record + )); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkCleanCommand.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkCleanCommand.php new file mode 100644 index 000000000..edad22686 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkCleanCommand.php @@ -0,0 +1,43 @@ +option('all')) { + $this->laravel['config']->set('clockwork.storage_expiration', 0); + } elseif ($expiration = $this->option('expiration')) { + $this->laravel['config']->set('clockwork.storage_expiration', $expiration); + } + + $this->laravel['clockwork.support']->makeStorage()->cleanup($force = true); + + $this->info('Metadata cleaned successfully.'); + } + + // Compatibility for the old Laravel versions + public function fire() + { + return $this->handle(); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkController.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkController.php new file mode 100644 index 000000000..37338c7b1 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkController.php @@ -0,0 +1,91 @@ +middleware(config('clockwork.middlewares')); + } + + // Authantication endpoint + public function authenticate(Clockwork $clockwork, ClockworkSupport $clockworkSupport, Request $request) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + $token = $clockwork->authenticator()->attempt( + $request->only([ 'username', 'password' ]) + ); + + return new JsonResponse([ 'token' => $token ], $token ? 200 : 403); + } + + // Metadata retrieving endpoint + public function getData(ClockworkSupport $clockworkSupport, Request $request, $id = null, $direction = null, $count = null) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + return $clockworkSupport->getData( + $id, $direction, $count, $request->only([ 'only', 'except' ]) + ); + } + + // Extended metadata retrieving endpoint + public function getExtendedData(ClockworkSupport $clockworkSupport, Request $request, $id = null) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + return $clockworkSupport->getExtendedData( + $id, $request->only([ 'only', 'except' ]) + ); + } + + // Metadata updating endpoint + public function updateData(ClockworkSupport $clockworkSupport, Request $request, $id = null) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + return $clockworkSupport->updateData($id, $request->json()->all()); + } + + // App index + public function webIndex(ClockworkSupport $clockworkSupport) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + return $clockworkSupport->getWebAsset('index.html'); + } + + // App assets serving + public function webAsset(ClockworkSupport $clockworkSupport, $path) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + return $clockworkSupport->getWebAsset($path); + } + + // App redirect (/clockwork -> /clockwork/app) + public function webRedirect(ClockworkSupport $clockworkSupport, Request $request) + { + $this->ensureClockworkIsEnabled($clockworkSupport); + + return new RedirectResponse('/' . $request->path() . '/app'); + } + + // Ensure Clockwork is still enabled at this point and stop Telescope recording if present + protected function ensureClockworkIsEnabled(ClockworkSupport $clockworkSupport) + { + if (class_exists(Telescope::class)) Telescope::stopRecording(); + + if (! $clockworkSupport->isEnabled()) abort(404); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkMiddleware.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkMiddleware.php new file mode 100644 index 000000000..56540936b --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkMiddleware.php @@ -0,0 +1,38 @@ +app = $app; + } + + // Handle an incoming request + public function handle($request, \Closure $next) + { + $this->app['clockwork']->event('Controller')->begin(); + + try { + $response = $next($request); + } catch (\Exception $e) { + $this->app[ExceptionHandler::class]->report($e); + $response = $this->app[ExceptionHandler::class]->render($request, $e); + } + + return $this->app['clockwork.support']->processRequest($request, $response); + } + + // Record the current request after a response is sent + public function terminate() + { + $this->app['clockwork.support']->recordRequest(); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkServiceProvider.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkServiceProvider.php new file mode 100644 index 000000000..58dd70aab --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkServiceProvider.php @@ -0,0 +1,274 @@ +app['clockwork.support']->isCollectingData()) { + $this->registerEventListeners(); + $this->registerMiddleware(); + } + + $this->app['clockwork.support']->handleArtisanEvents(); + $this->app['clockwork.support']->handleOctaneEvents(); + + // If Clockwork is disabled, return before registering middleware or routes + if (! $this->app['clockwork.support']->isEnabled()) return; + + $this->registerRoutes(); + + // register the Clockwork Web UI routes + if ($this->app['clockwork.support']->isWebEnabled()) { + $this->registerWebRoutes(); + } + } + + public function register() + { + $this->registerConfiguration(); + $this->registerClockwork(); + $this->registerCommands(); + $this->registerDataSources(); + $this->registerAliases(); + + $this->app->make('clockwork.request'); // instantiate the request to have id and time available as early as possible + + $this->app['clockwork.support'] + ->configureSerializer() + ->configureShouldCollect() + ->configureShouldRecord(); + + if ($this->app['clockwork.support']->getConfig('register_helpers', true)) { + require __DIR__ . '/helpers.php'; + } + } + + // Register the configuration file + protected function registerConfiguration() + { + $this->publishes([ __DIR__ . '/config/clockwork.php' => config_path('clockwork.php') ]); + $this->mergeConfigFrom(__DIR__ . '/config/clockwork.php', 'clockwork'); + } + + // Register core Clockwork components + protected function registerClockwork() + { + $this->app->singleton('clockwork', function ($app) { + return (new Clockwork) + ->authenticator($app['clockwork.authenticator']) + ->request($app['clockwork.request']) + ->storage($app['clockwork.storage']); + }); + + $this->app->singleton('clockwork.authenticator', function ($app) { + return $app['clockwork.support']->makeAuthenticator(); + }); + + $this->app->singleton('clockwork.request', function ($app) { + return new Request; + }); + + $this->app->singleton('clockwork.storage', function ($app) { + return $app['clockwork.support']->makeStorage(); + }); + + $this->app->singleton('clockwork.support', function ($app) { + return new ClockworkSupport($app); + }); + } + + // Register the artisan commands + protected function registerCommands() + { + $this->commands([ + ClockworkCleanCommand::class + ]); + } + + // Register Clockwork data sources + protected function registerDataSources() + { + $this->app->singleton('clockwork.cache', function ($app) { + return (new LaravelCacheDataSource( + $app['events'], + $app['clockwork.support']->getConfig('features.cache.collect_queries'), + $app['clockwork.support']->getConfig('features.cache.collect_values') + )); + }); + + $this->app->singleton('clockwork.eloquent', function ($app) { + $dataSource = (new EloquentDataSource( + $app['db'], + $app['events'], + $app['clockwork.support']->getConfig('features.database.collect_queries'), + $app['clockwork.support']->getConfig('features.database.slow_threshold'), + $app['clockwork.support']->getConfig('features.database.slow_only'), + $app['clockwork.support']->getConfig('features.database.detect_duplicate_queries'), + $app['clockwork.support']->getConfig('features.database.collect_models_actions'), + $app['clockwork.support']->getConfig('features.database.collect_models_retrieved') + )); + + // if we are collecting queue jobs, filter out queries caused by the database queue implementation + if ($app['clockwork.support']->isCollectingQueueJobs()) { + $dataSource->addFilter(function ($query, $trace) { + return ! $trace->first(StackFilter::make()->isClass(\Illuminate\Queue\DatabaseQueue::class)); + }, 'early'); + } + + if ($app->runningUnitTests()) { + $dataSource->addFilter(function ($query, $trace) { + return ! $trace->first(StackFilter::make()->isClass([ + \Illuminate\Database\Migrations\Migrator::class, + \Illuminate\Database\Console\Migrations\MigrateCommand::class + ])); + }); + } + + return $dataSource; + }); + + $this->app->singleton('clockwork.events', function ($app) { + return (new LaravelEventsDataSource( + $app['events'], + $app['clockwork.support']->getConfig('features.events.ignored_events', []) + )); + }); + + $this->app->singleton('clockwork.laravel', function ($app) { + return (new LaravelDataSource( + $app, + $app['clockwork.support']->isFeatureEnabled('log'), + $app['clockwork.support']->isFeatureEnabled('routes'), + $app['clockwork.support']->getConfig('features.routes.only_namespaces', []) + )); + }); + + $this->app->singleton('clockwork.notifications', function ($app) { + return new LaravelNotificationsDataSource($app['events']); + }); + + $this->app->singleton('clockwork.queue', function ($app) { + return (new LaravelQueueDataSource($app['queue']->connection())); + }); + + $this->app->singleton('clockwork.redis', function ($app) { + $dataSource = new LaravelRedisDataSource($app['events']); + + // if we are collecting queue jobs, filter out commands executed by the redis queue implementation + if ($app['clockwork.support']->isCollectingQueueJobs()) { + $dataSource->addFilter(function ($query, $trace) { + return ! $trace->first(StackFilter::make()->isClass([ + \Illuminate\Queue\RedisQueue::class, + \Laravel\Horizon\Repositories\RedisJobRepository::class, + \Laravel\Horizon\Repositories\RedisTagRepository::class, + \Laravel\Horizon\Repositories\RedisMetricsRepository::class + ])); + }); + } + + return $dataSource; + }); + + $this->app->singleton('clockwork.swift', function ($app) { + return new SwiftDataSource($app['mailer']->getSwiftMailer()); + }); + + $this->app->singleton('clockwork.twig', function ($app) { + return new TwigDataSource($app['twig']); + }); + + $this->app->singleton('clockwork.views', function ($app) { + return new LaravelViewsDataSource( + $app['events'], + $app['clockwork.support']->getConfig('features.views.collect_data') + ); + }); + + $this->app->singleton('clockwork.xdebug', function ($app) { + return new XdebugDataSource; + }); + } + + // Set up aliases for all Clockwork parts so they can be resolved by type-hinting + protected function registerAliases() + { + $this->app->alias('clockwork', Clockwork::class); + + $this->app->alias('clockwork.authenticator', AuthenticatorInterface::class); + $this->app->alias('clockwork.storage', StorageInterface::class); + $this->app->alias('clockwork.support', ClockworkSupport::class); + + $this->app->alias('clockwork.cache', LaravelCacheDataSource::class); + $this->app->alias('clockwork.eloquent', EloquentDataSource::class); + $this->app->alias('clockwork.events', LaravelEventsDataSource::class); + $this->app->alias('clockwork.laravel', LaravelDataSource::class); + $this->app->alias('clockwork.notifications', LaravelNotificationsDataSource::class); + $this->app->alias('clockwork.queue', LaravelQueueDataSource::class); + $this->app->alias('clockwork.redis', LaravelRedisDataSource::class); + $this->app->alias('clockwork.swift', SwiftDataSource::class); + $this->app->alias('clockwork.xdebug', XdebugDataSource::class); + } + + // Register event listeners + protected function registerEventListeners() + { + $this->app->booted(function () { + $this->app['clockwork.support']->addDataSources()->listenToEvents(); + }); + } + + // Register middleware + protected function registerMiddleware() + { + $kernel = $this->app[\Illuminate\Contracts\Http\Kernel::class]; + + if (method_exists($kernel, 'hasMiddleware') && $kernel->hasMiddleware(ClockworkMiddleware::class)) return; + + $kernel->prependMiddleware(ClockworkMiddleware::class); + } + + protected function registerRoutes() + { + $this->app['router']->get('/__clockwork/{id}/extended', 'Clockwork\Support\Laravel\ClockworkController@getExtendedData') + ->where('id', '([0-9-]+|latest)'); + $this->app['router']->get('/__clockwork/{id}/{direction?}/{count?}', 'Clockwork\Support\Laravel\ClockworkController@getData') + ->where('id', '([0-9-]+|latest)')->where('direction', '(next|previous)')->where('count', '\d+'); + $this->app['router']->put('/__clockwork/{id}', 'Clockwork\Support\Laravel\ClockworkController@updateData'); + $this->app['router']->post('/__clockwork/auth', 'Clockwork\Support\Laravel\ClockworkController@authenticate'); + } + + protected function registerWebRoutes() + { + $this->app['clockwork.support']->webPaths()->each(function ($path) { + $this->app['router']->get("{$path}", 'Clockwork\Support\Laravel\ClockworkController@webRedirect'); + $this->app['router']->get("{$path}/app", 'Clockwork\Support\Laravel\ClockworkController@webIndex'); + $this->app['router']->get("{$path}/{path}", 'Clockwork\Support\Laravel\ClockworkController@webAsset') + ->where('path', '.+'); + }); + } + + public function provides() + { + return [ 'clockwork' ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkSupport.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkSupport.php new file mode 100644 index 000000000..13c9aec88 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/ClockworkSupport.php @@ -0,0 +1,734 @@ +app = $app; + } + + // Get a value form the Clockwork config + public function getConfig($key, $default = null) + { + return $this->app['config']->get("clockwork.{$key}", $default); + } + + // Retrieve metadata + public function getData($id = null, $direction = null, $count = null, $filter = [], $extended = false) + { + if (isset($this->app['session'])) $this->app['session.store']->reflash(); + + $authenticator = $this->app['clockwork']->authenticator(); + $storage = $this->app['clockwork']->storage(); + + $authenticated = $authenticator->check($this->app['request']->header('X-Clockwork-Auth')); + + if ($authenticated !== true) { + return new JsonResponse([ 'message' => $authenticated, 'requires' => $authenticator->requires() ], 403); + } + + if ($direction == 'previous') { + $data = $storage->previous($id, $count, Search::fromRequest($this->app['request']->all())); + } elseif ($direction == 'next') { + $data = $storage->next($id, $count, Search::fromRequest($this->app['request']->all())); + } elseif ($id == 'latest') { + $data = $storage->latest(Search::fromRequest($this->app['request']->all())); + } else { + $data = $storage->find($id); + } + + if ($extended) { + $this->addDataSources(); + $this->app['clockwork']->extendRequest($data); + } + + $except = isset($filter['except']) ? explode(',', $filter['except']) : []; + $only = isset($filter['only']) ? explode(',', $filter['only']) : null; + + if (is_array($data)) { + $data = array_map(function ($request) use ($except, $only) { + return $only ? $request->only(array_diff($only, [ 'updateToken' ])) : $request->except(array_merge($except, [ 'updateToken' ])); + }, $data); + } elseif ($data) { + $data = $only ? $data->only(array_diff($only, [ 'updateToken' ])) : $data->except(array_merge($except, [ 'updateToken' ])); + } + + return new JsonResponse($data); + } + + // Retrieve extended metadata + public function getExtendedData($id, $filter = []) + { + return $this->getData($id, null, null, $filter, true); + } + + // Update metadata + public function updateData($id, $input = []) + { + if (isset($this->app['session'])) $this->app['session.store']->reflash(); + + if (! $this->isCollectingClientMetrics()) { + throw new NotFoundHttpException; + } + + $storage = $this->app['clockwork']->storage(); + + $request = $storage->find($id); + + if (! $request) { + return new JsonResponse([ 'message' => 'Request not found.' ], 404); + } + + $token = isset($input['_token']) ? $input['_token'] : ''; + + if (! $request->updateToken || ! hash_equals($request->updateToken, $token)) { + return new JsonResponse([ 'message' => 'Invalid update token.' ], 403); + } + + foreach ($input as $key => $value) { + if (in_array($key, [ 'clientMetrics', 'webVitals' ])) { + $request->$key = $value; + } + } + + $storage->update($request); + } + + // Return an asset for web ui based on it's path, resolves correct mime-type and protectes from accessing files + // outside of Clockwork public dir + public function getWebAsset($path) + { + $asset = (new Web)->asset($path); + + if (! $asset) throw new NotFoundHttpException; + + return new BinaryFileResponse($asset['path'], 200, [ 'Content-Type' => $asset['mime'] ]); + } + + // Add enabled data sources + public function addDataSources() + { + $clockwork = $this->app['clockwork']; + + $clockwork + ->addDataSource(new PhpDataSource) + ->addDataSource($this->frameworkDataSource()); + + if ($this->isFeatureEnabled('database')) $clockwork->addDataSource($this->app['clockwork.eloquent']); + if ($this->isFeatureEnabled('cache')) $clockwork->addDataSource($this->app['clockwork.cache']); + if ($this->isFeatureEnabled('redis')) $clockwork->addDataSource($this->app['clockwork.redis']); + if ($this->isFeatureEnabled('queue')) $clockwork->addDataSource($this->app['clockwork.queue']); + if ($this->isFeatureEnabled('events')) $clockwork->addDataSource($this->app['clockwork.events']); + if ($this->isFeatureEnabled('notifications')) { + $clockwork->addDataSource( + $this->isFeatureAvailable('notifications-events') + ? $this->app['clockwork.notifications'] : $this->app['clockwork.swift'] + ); + } + if ($this->isFeatureAvailable('xdebug')) $clockwork->addDataSource($this->app['clockwork.xdebug']); + if ($this->isFeatureEnabled('views')) { + $clockwork->addDataSource( + $this->getConfig('features.views.use_twig_profiler', false) + ? $this->app['clockwork.twig'] : $this->app['clockwork.views'] + ); + } + + return $this; + } + + // Start listening to events + public function listenToEvents() + { + $this->frameworkDataSource()->listenToEvents(); + + if ($this->isFeatureEnabled('cache')) $this->app['clockwork.cache']->listenToEvents(); + if ($this->isFeatureEnabled('database')) $this->app['clockwork.eloquent']->listenToEvents(); + if ($this->isFeatureEnabled('events')) $this->app['clockwork.events']->listenToEvents(); + if ($this->isFeatureEnabled('notifications')) { + $this->isFeatureAvailable('notifications-events') + ? $this->app['clockwork.notifications']->listenToEvents() : $this->app['clockwork.swift']->listenToEvents(); + } + if ($this->isFeatureEnabled('queue')) { + $this->app['clockwork.queue']->listenToEvents(); + $this->app['clockwork.queue']->setCurrentRequestId($this->app['clockwork.request']->id); + } + if ($this->isFeatureEnabled('redis')) { + $this->app[RedisManager::class]->enableEvents(); + $this->app['clockwork.redis']->listenToEvents(); + } + if ($this->isFeatureEnabled('views')) { + $this->getConfig('features.views.use_twig_profiler', false) + ? $this->app['clockwork.twig']->listenToEvents() : $this->app['clockwork.views']->listenToEvents(); + } + + if ($this->isCollectingCommands()) $this->collectCommands(); + if ($this->isCollectingQueueJobs()) $this->collectQueueJobs(); + + return $this; + } + + // Resolves the framework data source from the container + protected function frameworkDataSource() + { + return $this->app['clockwork.laravel']; + } + + public function handleArtisanEvents() + { + if (class_exists(\Illuminate\Console\Events\ArtisanStarting::class)) { + $this->app['events']->listen(\Illuminate\Console\Events\ArtisanStarting::class, function ($event) { + $this->artisan = $event->artisan; + }); + } + } + + public function handleOctaneEvents() + { + $this->app['events']->listen(\Laravel\Octane\Events\RequestReceived::class, function ($event) { + $this->app = $event->sandbox; + $this->incomingRequest = null; + + $this->app->forgetInstance('clockwork.request'); + $request = $this->app->make('clockwork.request')->override('requestTime', microtime(true)); + + $this->app['clockwork']->reset()->request($request); + $this->app['clockwork.laravel']->setApplication($this->app); + }); + } + + // Make a storage instance based on the current configuration + public function makeStorage() + { + $expiration = $this->getConfig('storage_expiration'); + + if ($this->getConfig('storage', 'files') == 'sql') { + $database = $this->getConfig('storage_sql_database', storage_path('clockwork.sqlite')); + $table = $this->getConfig('storage_sql_table', 'clockwork'); + + if ($this->app['config']->get("database.connections.{$database}")) { + $database = $this->app['db']->connection($database)->getPdo(); + } else { + $database = "sqlite:{$database}"; + } + + return new SqlStorage($database, $table, null, null, $expiration); + } else { + return new FileStorage( + $this->getConfig('storage_files_path', storage_path('clockwork')), + 0700, + $expiration, + $this->getConfig('storage_files_compress', false) + ); + } + } + + // Make an authenticator instance based on the current configuration + public function makeAuthenticator() + { + $authenticator = $this->getConfig('authentication'); + + if (is_string($authenticator)) { + return $this->app->make($authenticator); + } elseif ($authenticator) { + return new SimpleAuthenticator($this->getConfig('authentication_password')); + } else { + return new NullAuthenticator; + } + } + + // Set up collecting of executed artisan commands + public function collectCommands() + { + $this->app['events']->listen(\Illuminate\Console\Events\CommandStarting::class, function ($event) { + // only collect commands ran through artisan cli, other commands are recorded as part of respective request + if (basename(StackTrace::get()->last()->file) != 'artisan') return; + + if (! $this->getConfig('artisan.collect_output')) return; + if (! $event->command || $this->isCommandFiltered($event->command)) return; + + $event->output->setFormatter( + version_compare(\Illuminate\Foundation\Application::VERSION, '9.0.0', '<') + ? new Console\CapturingLegacyFormatter($event->output->getFormatter()) + : new Console\CapturingFormatter($event->output->getFormatter()) + ); + }); + + $this->app['events']->listen(\Illuminate\Console\Events\CommandFinished::class, function ($event) { + // only collect commands ran through artisan cli, other commands are recorded as part of respective request + if (basename(StackTrace::get()->last()->file) != 'artisan') return; + + if (! $event->command || $this->isCommandFiltered($event->command)) return; + + $command = $this->artisan->find($event->command); + + $allArguments = $event->input->getArguments(); + $allOptions = $event->input->getOptions(); + + $defaultArguments = $command->getDefinition()->getArgumentDefaults(); + $defaultOptions = $command->getDefinition()->getOptionDefaults(); + + $this->app->make('clockwork') + ->resolveAsCommand( + $event->command, + $event->exitCode, + array_udiff_assoc($allArguments, $defaultArguments, function ($a, $b) { return $a == $b ? 0 : 1; }), + array_udiff_assoc($allOptions, $defaultOptions, function ($a, $b) { return $a == $b ? 0 : 1; }), + $defaultArguments, + $defaultOptions, + $this->getConfig('artisan.collect_output') ? $event->output->getFormatter()->capturedOutput() : null + ) + ->storeRequest(); + }); + } + + // Set up collecting of executed queue jobs + public function collectQueueJobs() + { + $this->app['events']->listen(\Illuminate\Queue\Events\JobProcessing::class, function ($event) { + // sync jobs are recorded as part of the parent request + if ($event->job instanceof \Illuminate\Queue\Jobs\SyncJob) return; + + $payload = $event->job->payload(); + + if (! isset($payload['clockwork_id']) || $this->isQueueJobFiltered($payload['displayName'])) return; + + $request = new Request([ 'id' => $payload['clockwork_id'] ]); + if (isset($payload['clockwork_parent_id'])) $request->setParent($payload['clockwork_parent_id']); + + $this->app->make('clockwork')->reset()->request($request); + + $this->app['clockwork.queue']->setCurrentRequestId($request->id); + }); + + $this->app['events']->listen(\Illuminate\Queue\Events\JobProcessed::class, function ($event) { + $this->processQueueJob($event->job); + }); + + $this->app['events']->listen(\Illuminate\Queue\Events\JobFailed::class, function ($event) { + $this->processQueueJob($event->job, $event->exception); + }); + } + + // Process an executed queue job, resolves and records the current request + protected function processQueueJob($job, $exception = null) + { + // sync jobs are recorded as part of the parent request + if ($job instanceof \Illuminate\Queue\Jobs\SyncJob) return; + + $payload = $job->payload(); + + if (! isset($payload['clockwork_id'])) return; + + $unserialized = isset($payload['data']['command']) ? unserialize($payload['data']['command']) : null; + + if (! $unserialized || $this->isQueueJobFiltered(get_class($unserialized))) return; + + if ($exception) { + $this->app->make('clockwork')->error($exception->getMessage(), [ 'exception' => $exception ]); + } + + $this->app->make('clockwork') + ->resolveAsQueueJob( + get_class($unserialized), + $payload['displayName'], + $job->hasFailed() ? 'failed' : ($job->isReleased() ? 'released' : 'done'), + $unserialized, + $job->getQueue(), + $job->getConnectionName(), + array_filter([ + 'maxTries' => isset($payload['maxTries']) ? $payload['maxTries'] : null, + 'delaySeconds' => isset($payload['delaySeconds']) ? $payload['delaySeconds'] : null, + 'timeout' => isset($payload['timeout']) ? $payload['timeout'] : null, + 'timeoutAt' => isset($payload['timeoutAt']) ? $payload['timeoutAt'] : null + ]) + ) + ->storeRequest(); + } + + // Process an executed http request, resolves the current request, sets Clockwork headers and cookies + public function processRequest($request, $response) + { + if (! $this->isCollectingRequests()) { + return $response; // Clockwork is not collecting data, additional check when the middleware is enabled manually + } + + $clockwork = $this->app['clockwork']; + $clockworkRequest = $clockwork->request(); + + $clockwork->event('Controller')->end(); + + $this->setResponse($response); + + $clockwork->resolveRequest(); + + if (! $this->isEnabled() || ! $this->isRecording($clockworkRequest)) { + return $response; // Clockwork is disabled or we are not recording this request + } + + $response->headers->set('X-Clockwork-Id', $clockworkRequest->id, true); + $response->headers->set('X-Clockwork-Version', Clockwork::VERSION, true); + + if ($request->getBasePath()) { + $response->headers->set('X-Clockwork-Path', $request->getBasePath() . '/__clockwork/', true); + } + + foreach ($this->getConfig('headers', []) as $headerName => $headerValue) { + $response->headers->set("X-Clockwork-Header-{$headerName}", $headerValue); + } + + foreach ($clockwork->request()->subrequests as $subrequest) { + $url = urlencode($subrequest['url']); + $path = urlencode($subrequest['path']); + + $response->headers->set('X-Clockwork-Subrequest', "{$subrequest['id']};{$url};{$path}", false); + } + + $this->appendServerTimingHeader($response, $clockworkRequest); + + if (! ($response instanceof Response)) { + return $response; + } + + if ($this->isCollectingClientMetrics() || $this->isToolbarEnabled()) { + $clockworkBrowser = [ + 'requestId' => $clockworkRequest->id, + 'version' => Clockwork::VERSION, + 'path' => $request->getBasePath() . '/__clockwork/', + 'webPath' => $request->getBasePath() . '/' . $this->webPaths()[0] . '/app', + 'token' => $clockworkRequest->updateToken, + 'metrics' => $this->isCollectingClientMetrics(), + 'toolbar' => $this->isToolbarEnabled() + ]; + + $response->cookie( + new Cookie('x-clockwork', json_encode($clockworkBrowser), time() + 60, null, null, null, false) + ); + } + + return $response; + } + + // Records the current http request + public function recordRequest() + { + if (! $this->isCollectingRequests()) { + return; // Clockwork is not collecting data, additional check when the middleware is enabled manually + } + + $clockwork = $this->app['clockwork']; + + if (! $this->isRecording($clockwork->request())) { + return; // Collecting data is disabled, return immediately + } + + $clockwork->storeRequest(); + } + + // Set current http response on the framework data source + protected function setResponse($response) + { + $this->app['clockwork.laravel']->setResponse($response); + } + + // Configure serializer defaults + public function configureSerializer() + { + Serializer::defaults([ + 'limit' => $this->getConfig('serialization_depth'), + 'blackbox' => $this->getConfig('serialization_blackbox'), + 'traces' => $this->getConfig('stack_traces.enabled', true), + 'tracesSkip' => StackFilter::make() + ->isNotVendor(array_merge( + $this->getConfig('stack_traces.skip_vendors', []), + [ 'itsgoingd', 'laravel', 'illuminate', 'psr' ] + )) + ->isNotNamespace($this->getConfig('stack_traces.skip_namespaces', [])) + ->isNotFunction([ 'call_user_func', 'call_user_func_array' ]) + ->isNotClass($this->getConfig('stack_traces.skip_classes', [])), + 'tracesLimit' => $this->getConfig('stack_traces.limit', 10) + ]); + + return $this; + } + + // Configure should collect rules + public function configureShouldCollect() + { + $this->app['clockwork']->shouldCollect([ + 'onDemand' => $this->getConfig('requests.on_demand', false), + 'sample' => $this->getConfig('requests.sample', false), + 'except' => $this->getConfig('requests.except', []), + 'only' => $this->getConfig('requests.only', []), + 'exceptPreflight' => $this->getConfig('requests.except_preflight', []) + ]); + + // don't collect data for Clockwork requests + $webPath = $this->webPaths()[0]; + $this->app['clockwork']->shouldCollect()->except([ '/__clockwork(?:/.*)?', "/{$webPath}(?:/.*)?" ]); + + return $this; + } + + // Configure should record rules + public function configureShouldRecord() + { + $this->app['clockwork']->shouldRecord([ + 'errorsOnly' => $this->getConfig('requests.errors_only', false), + 'slowOnly' => $this->getConfig('requests.slow_only', false) ? $this->getConfig('requests.slow_threshold') : false + ]); + + return $this; + } + + // Check whether Clockwork is enabled at all + public function isEnabled() + { + return $this->getConfig('enable') + || $this->getConfig('enable') === null && $this->app['config']->get('app.debug'); + } + + // Check whether we are collecting data + public function isCollectingData() + { + return $this->isCollectingCommands() + || $this->isCollectingQueueJobs() + || $this->isCollectingRequests() + || $this->isCollectingTests(); + } + + // Check whether we are collecting artisan commands + public function isCollectingCommands() + { + return ($this->isEnabled() || $this->getConfig('collect_data_always', false)) + && $this->app->runningInConsole() + && $this->getConfig('artisan.collect', false); + } + + // Check whether we are collecting queue jobs + public function isCollectingQueueJobs() + { + return ($this->isEnabled() || $this->getConfig('collect_data_always', false)) + && $this->app->runningInConsole() + && $this->getConfig('queue.collect', false); + } + + // Check whether we are collecting http requests + public function isCollectingRequests() + { + return ($this->isEnabled() || $this->getConfig('collect_data_always', false)) + && ! $this->app->runningInConsole() + && $this->app['clockwork']->shouldCollect()->filter($this->incomingRequest()); + } + + // Check whether we are collecting tests + public function isCollectingTests() + { + return ($this->isEnabled() || $this->getConfig('collect_data_always', false)) + && $this->app->runningInConsole() + && $this->getConfig('tests.collect', false); + } + + // Check whether we are recording the passed request + public function isRecording($incomingRequest) + { + return ($this->isEnabled() || $this->getConfig('collect_data_always', false)) + && $this->app['clockwork']->shouldRecord()->filter($incomingRequest); + } + + // Check whether a feature is enabled + public function isFeatureEnabled($feature) + { + return $this->getConfig("features.{$feature}.enabled") && $this->isFeatureAvailable($feature); + } + + // Check whether a feature is available + public function isFeatureAvailable($feature) + { + if ($feature == 'database') { + return $this->app['config']->get('database.default'); + } elseif ($feature == 'notifications-events') { + return class_exists(\Illuminate\Mail\Events\MessageSent::class) + && class_exists(\Illuminate\Notifications\Events\NotificationSent::class); + } elseif ($feature == 'redis') { + return method_exists(\Illuminate\Redis\RedisManager::class, 'enableEvents'); + } elseif ($feature == 'queue') { + return method_exists(\Illuminate\Queue\Queue::class, 'createPayloadUsing'); + } elseif ($feature == 'xdebug') { + return in_array('xdebug', get_loaded_extensions()); + } + + return true; + } + + // Check whether we are collecting client metrics + public function isCollectingClientMetrics() + { + return $this->getConfig('features.performance.client_metrics', true); + } + + // Check whether the toolbar is enabled + public function isToolbarEnabled() + { + return $this->getConfig('toolbar', false); + } + + // Check whether the web ui is enabled + public function isWebEnabled() + { + return $this->getConfig('web', true); + } + + // Check whether a command should not be collected + protected function isCommandFiltered($command) + { + $only = $this->getConfig('artisan.only', []); + + if (count($only)) return ! in_array($command, $only); + + $except = $this->getConfig('artisan.except', []); + + if ($this->getConfig('artisan.except_laravel_commands', true)) { + $except = array_merge($except, $this->builtinLaravelCommands()); + } + + $except = array_merge($except, $this->builtinClockworkCommands()); + + return in_array($command, $except); + } + + // Check whether a queue job should not be collected + protected function isQueueJobFiltered($queueJob) + { + $only = $this->getConfig('queue.only', []); + + if (count($only)) return ! in_array($queueJob, $only); + + $except = $this->getConfig('queue.except', []); + + return in_array($queueJob, $except); + } + + // Check whether a test should not be collected + public function isTestFiltered($test) + { + $except = $this->getConfig('tests.except', []); + + return in_array($test, $except); + } + + // Append server timing headers from a Clockwork request to a http response + protected function appendServerTimingHeader($response, $request) + { + if (($eventsCount = $this->getConfig('server_timing', 10)) !== false) { + $response->headers->set('Server-Timing', ServerTiming::fromRequest($request, $eventsCount)->value()); + } + } + + // Make an incoming request instance + protected function incomingRequest() + { + if ($this->incomingRequest) return $this->incomingRequest; + + return $this->incomingRequest = new IncomingRequest([ + 'method' => $this->app['request']->getMethod(), + 'uri' => $this->app['request']->getRequestUri(), + 'input' => $this->app['request']->input(), + 'cookies' => $this->app['request']->cookie() + ]); + } + + // Return an array of web ui paths + public function webPaths() + { + $path = $this->getConfig('web', true); + + if (is_string($path)) return collect([ trim($path, '/') ]); + + return collect([ 'clockwork', '__clockwork' ]); + } + + // Return an array of built-in Laravel commands + protected function builtinLaravelCommands() + { + return [ + 'clear-compiled', 'completion', 'db', 'down', 'dump-server', 'env', 'help', 'list', 'migrate', 'optimize', + 'preset', 'serve', 'test', 'tinker', 'up', + 'app:name', + 'auth:clear-resets', + 'cache:clear', 'cache:forget', 'cache:table', + 'config:cache', 'config:clear', + 'db:seed', 'db:wipe', + 'event:cache', 'event:clear', 'event:generate', 'event:list', + 'horizon', 'horizon:clear', 'horizon:continue', 'horizon:continue-supervisor', 'horizon:forget', + 'horizon:install', 'horizon:list', 'horizon:pause', 'horizon:pause-supervisor', 'horizon:publish', + 'horizon:purge', 'horizon:snapshot', 'horizon:status', 'horizon:supervisors', 'horizon:terminate', + 'horizon:work', + 'key:generate', + 'make:auth', 'make:cast', 'make:channel', 'make:command', 'make:component', 'make:controller', 'make:event', + 'make:exception', 'make:factory', 'make:job', 'make:listener', 'make:mail', 'make:middleware', + 'make:migration', 'make:model', 'make:notification', 'make:observer', 'make:policy', 'make:provider', + 'make:request', 'make:resource', 'make:rule', 'make:scope', 'make:seeder', 'make:test', + 'migrate:fresh', 'migrate:install', 'migrate:refresh', 'migrate:reset', 'migrate:rollback', + 'migrate:status', + 'model:prune', + 'notifications:table', + 'octane:install', 'octane:reload', 'octane:start', 'octane:status', 'octane:stop', + 'optimize:clear', + 'package:discover', + 'queue:batches-table', 'queue:clear', 'queue:failed', 'queue:failed-table', 'queue:flush', 'queue:forget', + 'queue:listen', 'queue:monitor', 'queue:prune-batches', 'queue:prune-failed', 'queue:restart', + 'queue:retry', 'queue:retry-batch', 'queue:table', 'queue:work', + 'route:cache', 'route:clear', 'route:list', + 'sail:install', 'sail:publish', + 'schedule:clear-cache', 'schedule:list', 'schedule:run', 'schedule:test', 'schedule:work', + 'schema:dump', + 'session:table', + 'storage:link', + 'stub:publish', + 'vendor:publish', + 'view:cache', 'view:clear' + ]; + } + + // Return an array of built-in Clockwork commands + protected function builtinClockworkCommands() + { + return [ + 'clockwork:clean' + ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Console/CapturingFormatter.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Console/CapturingFormatter.php new file mode 100644 index 000000000..438c316f6 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Console/CapturingFormatter.php @@ -0,0 +1,70 @@ +formatter = $formatter; + } + + public function capturedOutput() + { + $capturedOutput = $this->capturedOutput; + + $this->capturedOutput = null; + + return $capturedOutput; + } + + public function setDecorated(bool $decorated) + { + return $this->formatter->setDecorated($decorated); + } + + public function isDecorated(): bool + { + return $this->formatter->isDecorated(); + } + + public function setStyle(string $name, OutputFormatterStyleInterface $style) + { + return $this->formatter->setStyle($name, $style); + } + + public function hasStyle(string $name): bool + { + return $this->formatter->hasStyle($name); + } + + public function getStyle(string $name): OutputFormatterStyleInterface + { + return $this->formatter->getStyle($name); + } + + public function format(?string $message): ?string + { + $formatted = $this->formatter->format($message); + + $this->capturedOutput .= $formatted; + + return $formatted; + } + + public function __call($method, $args) + { + return $this->formatter->$method(...$args); + } + + public function __clone() + { + $this->formatter = clone $this->formatter; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Console/CapturingLegacyFormatter.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Console/CapturingLegacyFormatter.php new file mode 100644 index 000000000..667776a66 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Console/CapturingLegacyFormatter.php @@ -0,0 +1,70 @@ +formatter = $formatter; + } + + public function capturedOutput() + { + $capturedOutput = $this->capturedOutput; + + $this->capturedOutput = null; + + return $capturedOutput; + } + + public function setDecorated($decorated) + { + return $this->formatter->setDecorated($decorated); + } + + public function isDecorated() + { + return $this->formatter->isDecorated(); + } + + public function setStyle($name, OutputFormatterStyleInterface $style) + { + return $this->formatter->setStyle($name, $style); + } + + public function hasStyle($name) + { + return $this->formatter->hasStyle($name); + } + + public function getStyle($name) + { + return $this->formatter->getStyle($name); + } + + public function format($message) + { + $formatted = $this->formatter->format($message); + + $this->capturedOutput .= $formatted; + + return $formatted; + } + + public function __call($method, $args) + { + return $this->formatter->$method(...$args); + } + + public function __clone() + { + $this->formatter = clone $this->formatter; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Eloquent/ResolveModelLegacyScope.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Eloquent/ResolveModelLegacyScope.php new file mode 100644 index 000000000..19fc061b5 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Eloquent/ResolveModelLegacyScope.php @@ -0,0 +1,27 @@ +dataSource = $dataSource; + } + + public function apply(Builder $builder, Model $model) + { + $this->dataSource->nextQueryModel = get_class($model); + } + + public function remove(Builder $builder, Model $model) + { + // nothing to do here + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Eloquent/ResolveModelScope.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Eloquent/ResolveModelScope.php new file mode 100644 index 000000000..67b9c4e38 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Eloquent/ResolveModelScope.php @@ -0,0 +1,22 @@ +dataSource = $dataSource; + } + + public function apply(Builder $builder, Model $model) + { + $this->dataSource->nextQueryModel = get_class($model); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Facade.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Facade.php new file mode 100644 index 000000000..e58767111 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/Facade.php @@ -0,0 +1,9 @@ + [] + ]; + + // Set up Clockwork in this test case, should be called from the PHPUnit setUp method + protected function setUpClockwork() + { + if (! $this->app->make('clockwork.support')->isCollectingTests()) return; + + $this->beforeApplicationDestroyed(function () { + if ($this->app->make('clockwork.support')->isTestFiltered($this->toString())) return; + + $this->app->make('clockwork') + ->resolveAsTest( + $this->toString(), + $this->resolveClockworkStatus(), + $this->getStatusMessage(), + $this->resolveClockworkAsserts() + ) + ->storeRequest(); + }); + } + + // Resolve Clockwork test status + protected function resolveClockworkStatus() + { + $status = $this->getStatus(); + + $statuses = [ + BaseTestRunner::STATUS_UNKNOWN => 'unknown', + BaseTestRunner::STATUS_PASSED => 'passed', + BaseTestRunner::STATUS_SKIPPED => 'skipped', + BaseTestRunner::STATUS_INCOMPLETE => 'incomplete', + BaseTestRunner::STATUS_FAILURE => 'failed', + BaseTestRunner::STATUS_ERROR => 'error', + BaseTestRunner::STATUS_RISKY => 'passed', + BaseTestRunner::STATUS_WARNING => 'warning' + ]; + + return isset($statuses[$status]) ? $statuses[$status] : null; + } + + // Resolve executed asserts + protected function resolveClockworkAsserts() + { + $asserts = static::$clockwork['asserts']; + + if ($this->getStatus() == BaseTestRunner::STATUS_FAILURE && count($asserts)) { + $asserts[count($asserts) - 1]['passed'] = false; + } + + static::$clockwork['asserts'] = []; + + return $asserts; + } + + // Overload the main PHPUnit assert method to collect executed asserts + public static function assertThat($value, Constraint $constraint, string $message = ''): void + { + $trace = StackTrace::get([ 'arguments' => true, 'limit' => 10 ]); + + $assertFrame = $trace->filter(function ($frame) { return strpos($frame->function, 'assert') === 0; })->last(); + $trace = $trace->skip(StackFilter::make()->isNotVendor([ 'itsgoingd', 'phpunit' ]))->limit(3); + + static::$clockwork['asserts'][] = [ + 'name' => $assertFrame->function, + 'arguments' => $assertFrame->args, + 'trace' => (new Serializer)->trace($trace), + 'passed' => true + ]; + + parent::assertThat($value, $constraint, $message); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/config/clockwork.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/config/clockwork.php new file mode 100644 index 000000000..7635483bd --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/config/clockwork.php @@ -0,0 +1,416 @@ + env('CLOCKWORK_ENABLE', null), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Features + |------------------------------------------------------------------------------------------------------------------ + | + | You can enable or disable various Clockwork features here. Some features have additional settings (eg. slow query + | threshold for database queries). + | + */ + + 'features' => [ + + // Cache usage stats and cache queries including results + 'cache' => [ + 'enabled' => env('CLOCKWORK_CACHE_ENABLED', true), + + // Collect cache queries + 'collect_queries' => env('CLOCKWORK_CACHE_QUERIES', true), + + // Collect values from cache queries (high performance impact with a very high number of queries) + 'collect_values' => env('CLOCKWORK_CACHE_COLLECT_VALUES', false) + ], + + // Database usage stats and queries + 'database' => [ + 'enabled' => env('CLOCKWORK_DATABASE_ENABLED', true), + + // Collect database queries (high performance impact with a very high number of queries) + 'collect_queries' => env('CLOCKWORK_DATABASE_COLLECT_QUERIES', true), + + // Collect details of models updates (high performance impact with a lot of model updates) + 'collect_models_actions' => env('CLOCKWORK_DATABASE_COLLECT_MODELS_ACTIONS', true), + + // Collect details of retrieved models (very high performance impact with a lot of models retrieved) + 'collect_models_retrieved' => env('CLOCKWORK_DATABASE_COLLECT_MODELS_RETRIEVED', false), + + // Query execution time threshold in milliseconds after which the query will be marked as slow + 'slow_threshold' => env('CLOCKWORK_DATABASE_SLOW_THRESHOLD'), + + // Collect only slow database queries + 'slow_only' => env('CLOCKWORK_DATABASE_SLOW_ONLY', false), + + // Detect and report duplicate queries + 'detect_duplicate_queries' => env('CLOCKWORK_DATABASE_DETECT_DUPLICATE_QUERIES', false) + ], + + // Dispatched events + 'events' => [ + 'enabled' => env('CLOCKWORK_EVENTS_ENABLED', true), + + // Ignored events (framework events are ignored by default) + 'ignored_events' => [ + // App\Events\UserRegistered::class, + // 'user.registered' + ], + ], + + // Laravel log (you can still log directly to Clockwork with laravel log disabled) + 'log' => [ + 'enabled' => env('CLOCKWORK_LOG_ENABLED', true) + ], + + // Sent notifications + 'notifications' => [ + 'enabled' => env('CLOCKWORK_NOTIFICATIONS_ENABLED', true), + ], + + // Performance metrics + 'performance' => [ + // Allow collecting of client metrics. Requires separate clockwork-browser npm package. + 'client_metrics' => env('CLOCKWORK_PERFORMANCE_CLIENT_METRICS', true) + ], + + // Dispatched queue jobs + 'queue' => [ + 'enabled' => env('CLOCKWORK_QUEUE_ENABLED', true) + ], + + // Redis commands + 'redis' => [ + 'enabled' => env('CLOCKWORK_REDIS_ENABLED', true) + ], + + // Routes list + 'routes' => [ + 'enabled' => env('CLOCKWORK_ROUTES_ENABLED', false), + + // Collect only routes from particular namespaces (only application routes by default) + 'only_namespaces' => [ 'App' ] + ], + + // Rendered views + 'views' => [ + 'enabled' => env('CLOCKWORK_VIEWS_ENABLED', true), + + // Collect views including view data (high performance impact with a high number of views) + 'collect_data' => env('CLOCKWORK_VIEWS_COLLECT_DATA', false), + + // Use Twig profiler instead of Laravel events for apps using laravel-twigbridge (more precise, but does + // not support collecting view data) + 'use_twig_profiler' => env('CLOCKWORK_VIEWS_USE_TWIG_PROFILER', false) + ] + + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable web UI + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork comes with a web UI accessible via http://your.app/clockwork. Here you can enable or disable this + | feature. You can also set a custom path for the web UI. + | + */ + + 'web' => env('CLOCKWORK_WEB', true), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable toolbar + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can show a toolbar with basic metrics on all responses. Here you can enable or disable this feature. + | Requires a separate clockwork-browser npm library. + | For installation instructions see https://underground.works/clockwork/#docs-viewing-data + | + */ + + 'toolbar' => env('CLOCKWORK_TOOLBAR', true), + + /* + |------------------------------------------------------------------------------------------------------------------ + | HTTP requests collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork collects data about HTTP requests to your app. Here you can choose which requests should be collected. + | + */ + + 'requests' => [ + // With on-demand mode enabled, Clockwork will only profile requests when the browser extension is open or you + // manually pass a "clockwork-profile" cookie or get/post data key. + // Optionally you can specify a "secret" that has to be passed as the value to enable profiling. + 'on_demand' => env('CLOCKWORK_REQUESTS_ON_DEMAND', false), + + // Collect only errors (requests with HTTP 4xx and 5xx responses) + 'errors_only' => env('CLOCKWORK_REQUESTS_ERRORS_ONLY', false), + + // Response time threshold in milliseconds after which the request will be marked as slow + 'slow_threshold' => env('CLOCKWORK_REQUESTS_SLOW_THRESHOLD'), + + // Collect only slow requests + 'slow_only' => env('CLOCKWORK_REQUESTS_SLOW_ONLY', false), + + // Sample the collected requests (e.g. set to 100 to collect only 1 in 100 requests) + 'sample' => env('CLOCKWORK_REQUESTS_SAMPLE', false), + + // List of URIs that should not be collected + 'except' => [ + '/horizon/.*', // Laravel Horizon requests + '/telescope/.*', // Laravel Telescope requests + '/_debugbar/.*', // Laravel DebugBar requests + ], + + // List of URIs that should be collected, any other URI will not be collected if not empty + 'only' => [ + // '/api/.*' + ], + + // Don't collect OPTIONS requests, mostly used in the CSRF pre-flight requests and are rarely of interest + 'except_preflight' => env('CLOCKWORK_REQUESTS_EXCEPT_PREFLIGHT', true) + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Artisan commands collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect data about executed artisan commands. Here you can enable and configure which commands + | should be collected. + | + */ + + 'artisan' => [ + // Enable or disable collection of executed Artisan commands + 'collect' => env('CLOCKWORK_ARTISAN_COLLECT', false), + + // List of commands that should not be collected (built-in commands are not collected by default) + 'except' => [ + // 'inspire' + ], + + // List of commands that should be collected, any other command will not be collected if not empty + 'only' => [ + // 'inspire' + ], + + // Enable or disable collection of command output + 'collect_output' => env('CLOCKWORK_ARTISAN_COLLECT_OUTPUT', false), + + // Enable or disable collection of built-in Laravel commands + 'except_laravel_commands' => env('CLOCKWORK_ARTISAN_EXCEPT_LARAVEL_COMMANDS', true) + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Queue jobs collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect data about executed queue jobs. Here you can enable and configure which queue jobs should + | be collected. + | + */ + + 'queue' => [ + // Enable or disable collection of executed queue jobs + 'collect' => env('CLOCKWORK_QUEUE_COLLECT', false), + + // List of queue jobs that should not be collected + 'except' => [ + // App\Jobs\ExpensiveJob::class + ], + + // List of queue jobs that should be collected, any other queue job will not be collected if not empty + 'only' => [ + // App\Jobs\BuggyJob::class + ] + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Tests collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect data about executed tests. Here you can enable and configure which tests should be + | collected. + | + */ + + 'tests' => [ + // Enable or disable collection of ran tests + 'collect' => env('CLOCKWORK_TESTS_COLLECT', false), + + // List of tests that should not be collected + 'except' => [ + // Tests\Unit\ExampleTest::class + ] + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable data collection when Clockwork is disabled + |------------------------------------------------------------------------------------------------------------------ + | + | You can enable this setting to collect data even when Clockwork is disabled, e.g. for future analysis. + | + */ + + 'collect_data_always' => env('CLOCKWORK_COLLECT_DATA_ALWAYS', false), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Metadata storage + |------------------------------------------------------------------------------------------------------------------ + | + | Configure how is the metadata collected by Clockwork stored. Two options are available: + | - files - A simple fast storage implementation storing data in one-per-request files. + | - sql - Stores requests in a sql database. Supports MySQL, PostgreSQL and SQLite. Requires PDO. + | + */ + + 'storage' => env('CLOCKWORK_STORAGE', 'files'), + + // Path where the Clockwork metadata is stored + 'storage_files_path' => env('CLOCKWORK_STORAGE_FILES_PATH', storage_path('clockwork')), + + // Compress the metadata files using gzip, trading a little bit of performance for lower disk usage + 'storage_files_compress' => env('CLOCKWORK_STORAGE_FILES_COMPRESS', false), + + // SQL database to use, can be a name of database configured in database.php or a path to a SQLite file + 'storage_sql_database' => env('CLOCKWORK_STORAGE_SQL_DATABASE', storage_path('clockwork.sqlite')), + + // SQL table name to use, the table is automatically created and updated when needed + 'storage_sql_table' => env('CLOCKWORK_STORAGE_SQL_TABLE', 'clockwork'), + + // Maximum lifetime of collected metadata in minutes, older requests will automatically be deleted, false to disable + 'storage_expiration' => env('CLOCKWORK_STORAGE_EXPIRATION', 60 * 24 * 7), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Authentication + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can be configured to require authentication before allowing access to the collected data. This might be + | useful when the application is publicly accessible. Setting to true will enable a simple authentication with a + | pre-configured password. You can also pass a class name of a custom implementation. + | + */ + + 'authentication' => env('CLOCKWORK_AUTHENTICATION', false), + + // Password for the simple authentication + 'authentication_password' => env('CLOCKWORK_AUTHENTICATION_PASSWORD', 'VerySecretPassword'), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Stack traces collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect stack traces for log messages and certain data like database queries. Here you can set + | whether to collect stack traces, limit the number of collected frames and set further configuration. Collecting + | long stack traces considerably increases metadata size. + | + */ + + 'stack_traces' => [ + // Enable or disable collecting of stack traces + 'enabled' => env('CLOCKWORK_STACK_TRACES_ENABLED', true), + + // Limit the number of frames to be collected + 'limit' => env('CLOCKWORK_STACK_TRACES_LIMIT', 10), + + // List of vendor names to skip when determining caller, common vendors are automatically added + 'skip_vendors' => [ + // 'phpunit' + ], + + // List of namespaces to skip when determining caller + 'skip_namespaces' => [ + // 'Laravel' + ], + + // List of class names to skip when determining caller + 'skip_classes' => [ + // App\CustomLog::class + ] + + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Serialization + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork serializes the collected data to json for storage and transfer. Here you can configure certain aspects + | of serialization. Serialization has a large effect on the cpu time and memory usage. + | + */ + + // Maximum depth of serialized multi-level arrays and objects + 'serialization_depth' => env('CLOCKWORK_SERIALIZATION_DEPTH', 10), + + // A list of classes that will never be serialized (e.g. a common service container class) + 'serialization_blackbox' => [ + \Illuminate\Container\Container::class, + \Illuminate\Foundation\Application::class, + \Laravel\Lumen\Application::class + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Register helpers + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork comes with a "clock" global helper function. You can use this helper to quickly log something and to + | access the Clockwork instance. + | + */ + + 'register_helpers' => env('CLOCKWORK_REGISTER_HELPERS', true), + + /* + |------------------------------------------------------------------------------------------------------------------ + | Send headers for AJAX request + |------------------------------------------------------------------------------------------------------------------ + | + | When trying to collect data, the AJAX method can sometimes fail if it is missing required headers. For example, an + | API might require a version number using Accept headers to route the HTTP request to the correct codebase. + | + */ + + 'headers' => [ + // 'Accept' => 'application/vnd.com.whatever.v1+json', + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Server timing + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork supports the W3C Server Timing specification, which allows for collecting a simple performance metrics + | in a cross-browser way. E.g. in Chrome, your app, database and timeline event timings will be shown in the Dev + | Tools network tab. This setting specifies the max number of timeline events that will be sent. Setting to false + | will disable the feature. + | + */ + + 'server_timing' => env('CLOCKWORK_SERVER_TIMING', 10) + +]; diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/helpers.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/helpers.php new file mode 100644 index 000000000..405581da5 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Laravel/helpers.php @@ -0,0 +1,17 @@ +debug($argument); + } + + return reset($arguments); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkMiddleware.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkMiddleware.php new file mode 100644 index 000000000..482603287 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkMiddleware.php @@ -0,0 +1,38 @@ +app = $app; + } + + // Handle an incoming request + public function handle($request, \Closure $next) + { + $this->app['clockwork']->event('Controller')->begin(); + + try { + $response = $next($request); + } catch (\Exception $e) { + $this->app[ExceptionHandler::class]->report($e); + $response = $this->app[ExceptionHandler::class]->render($request, $e); + } + + return $this->app['clockwork.support']->processRequest($request, $response); + } + + // Record the current request after a response is sent + public function terminate() + { + $this->app['clockwork.support']->recordRequest(); + } +} \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkServiceProvider.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkServiceProvider.php new file mode 100644 index 000000000..d6524a0e1 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkServiceProvider.php @@ -0,0 +1,95 @@ +app->configure('clockwork'); + $this->mergeConfigFrom(__DIR__ . '/../Laravel/config/clockwork.php', 'clockwork'); + } + + // Register Clockwork components + protected function registerClockwork() + { + parent::registerClockwork(); + + $this->app->singleton('clockwork.support', function ($app) { + return new ClockworkSupport($app); + }); + + if ($this->isRunningWithFacades() && ! class_exists('Clockwork')) { + class_alias(\Clockwork\Support\Laravel\Facade::class, 'Clockwork'); + } + } + + // Register Clockwork data sources + protected function registerDataSources() + { + parent::registerDataSources(); + + $this->app->singleton('clockwork.lumen', function ($app) { + return (new LumenDataSource( + $app, + $app['clockwork.support']->isFeatureEnabled('log'), + $app['clockwork.support']->isFeatureEnabled('views'), + $app['clockwork.support']->isFeatureEnabled('routes') + )); + }); + } + + // Register Clockwork components aliases for type hinting + protected function registerAliases() + { + parent::registerAliases(); + + $this->app->alias('clockwork.lumen', LumenDataSource::class); + } + + // Register event listeners + protected function registerEventListeners() + { + $this->app['clockwork.support']->addDataSources()->listenToEvents(); + } + + // Register Clockwork middleware + public function registerMiddleware() + { + $this->app->middleware([ ClockworkMiddleware::class ]); + } + + // Register Clockwork REST api routes + public function registerRoutes() + { + $router = isset($this->app->router) ? $this->app->router : $this->app; + + $router->get('/__clockwork/{id:(?:[0-9-]+|latest)}/extended', 'Clockwork\Support\Lumen\Controller@getExtendedData'); + $router->get('/__clockwork/{id:(?:[0-9-]+|latest)}[/{direction:(?:next|previous)}[/{count:\d+}]]', 'Clockwork\Support\Lumen\Controller@getData'); + $router->put('/__clockwork/{id}', 'Clockwork\Support\Lumen\Controller@updateData'); + $router->post('/__clockwork/auth', 'Clockwork\Support\Lumen\Controller@authenticate'); + } + + // Register Clockwork app routes + public function registerWebRoutes() + { + $router = isset($this->app->router) ? $this->app->router : $this->app; + + $this->app['clockwork.support']->webPaths()->each(function ($path) use ($router) { + $router->get("{$path}", 'Clockwork\Support\Lumen\Controller@webRedirect'); + $router->get("{$path}/app", 'Clockwork\Support\Lumen\Controller@webIndex'); + $router->get("{$path}/{path:.+}", 'Clockwork\Support\Lumen\Controller@webAsset'); + }); + } + + // Check whether we are running with facades enabled + protected function isRunningWithFacades() + { + return Facade::getFacadeApplication() !== null; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkSupport.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkSupport.php new file mode 100644 index 000000000..f7311c2a9 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/ClockworkSupport.php @@ -0,0 +1,65 @@ +app = $app; + } + + // Resolves the framework data source from the container + protected function frameworkDataSource() + { + return $this->app['clockwork.lumen']; + } + + // Process an http request and response, resolves the request, sets Clockwork headers and cookies + public function process($request, $response) + { + if (! $response instanceof Response) { + $response = new Response((string) $response); + } + + return parent::process($request, $response); + } + + // Set response on the framework data source + protected function setResponse($response) + { + $this->app['clockwork.lumen']->setResponse($response); + } + + // Check whether Clockwork is enabled + public function isEnabled() + { + return $this->getConfig('enable') + || $this->getConfig('enable') === null && env('APP_DEBUG', false); + } + + // Check whether a particular feature is available + public function isFeatureAvailable($feature) + { + if ($feature == 'database') { + return $this->app->bound('db') && $this->app['config']->get('database.default'); + } elseif ($feature == 'emails') { + return $this->app->bound('mailer'); + } elseif ($feature == 'redis') { + return $this->app->bound('redis') && method_exists(\Illuminate\Redis\RedisManager::class, 'enableEvents'); + } elseif ($feature == 'queue') { + return $this->app->bound('queue') && method_exists(\Illuminate\Queue\Queue::class, 'createPayloadUsing'); + } elseif ($feature == 'xdebug') { + return in_array('xdebug', get_loaded_extensions()); + } + + return true; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/Controller.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/Controller.php new file mode 100644 index 000000000..d921867f9 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Lumen/Controller.php @@ -0,0 +1,96 @@ +clockwork = $clockwork; + $this->clockworkSupport = $clockworkSupport; + } + + // Authantication endpoint + public function authenticate(Request $request) + { + $this->ensureClockworkIsEnabled(); + + $token = $this->clockwork->authenticator()->attempt( + $request->only([ 'username', 'password' ]) + ); + + return new JsonResponse([ 'token' => $token ], $token ? 200 : 403); + } + + // Metadata retrieving endpoint + public function getData(Request $request, $id = null, $direction = null, $count = null) + { + $this->ensureClockworkIsEnabled(); + + return $this->clockworkSupport->getData( + $id, $direction, $count, $request->only([ 'only', 'except' ]) + ); + } + + // Extended metadata retrieving endpoint + public function getExtendedData(Request $request, $id = null) + { + $this->ensureClockworkIsEnabled(); + + return $this->clockworkSupport->getExtendedData( + $id, $request->only([ 'only', 'except' ]) + ); + } + + // Metadata updating endpoint + public function updateData(Request $request, $id = null) + { + $this->ensureClockworkIsEnabled(); + + return $this->clockworkSupport->updateData($id, $request->json()->all()); + } + + // App index + public function webIndex(Request $request) + { + $this->ensureClockworkIsEnabled(); + + return $this->clockworkSupport->getWebAsset('index.html'); + } + + // App assets serving + public function webAsset($path) + { + $this->ensureClockworkIsEnabled(); + + return $this->clockworkSupport->getWebAsset($path); + } + + // App redirect (/clockwork -> /clockwork/app) + public function webRedirect(Request $request) + { + $this->ensureClockworkIsEnabled(); + + return new RedirectResponse('/' . $request->path() . '/app'); + } + + // Ensure Clockwork is still enabled at this point and stop Telescope recording if present + protected function ensureClockworkIsEnabled() + { + if (class_exists(Telescope::class)) Telescope::stopRecording(); + + if (! $this->clockworkSupport->isEnabled()) abort(404); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Handler/ClockworkHandler.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Handler/ClockworkHandler.php new file mode 100644 index 000000000..ee478e5c2 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Handler/ClockworkHandler.php @@ -0,0 +1,25 @@ +clockworkLog = $clockworkLog; + } + + protected function write(array $record) + { + $this->clockworkLog->log($record['level'], $record['message']); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Monolog/ClockworkHandler.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Monolog/ClockworkHandler.php new file mode 100644 index 000000000..85a823328 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Monolog/ClockworkHandler.php @@ -0,0 +1,24 @@ +clockworkLog = $clockworkLog; + } + + protected function write(array $record) + { + $this->clockworkLog->log($record['level'], $record['message']); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Monolog2/ClockworkHandler.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Monolog2/ClockworkHandler.php new file mode 100644 index 000000000..ad7bb9de7 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Monolog/Monolog2/ClockworkHandler.php @@ -0,0 +1,24 @@ +clockworkLog = $clockworkLog; + } + + protected function write(array $record): void + { + $this->clockworkLog->log($record['level'], $record['message']); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/ClockworkMiddleware.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/ClockworkMiddleware.php new file mode 100644 index 000000000..a14dbbfe4 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/ClockworkMiddleware.php @@ -0,0 +1,122 @@ +app = $app; + $this->clockwork = $storagePathOrClockwork instanceof Clockwork + ? $storagePathOrClockwork : $this->createDefaultClockwork($storagePathOrClockwork); + $this->startTime = $startTime ?: microtime(true); + } + + public function __invoke(Request $request, RequestHandler $handler) + { + return $this->process($request, $handler); + } + + public function process(Request $request, RequestHandler $handler) + { + $authUri = '#/__clockwork/auth#'; + if (preg_match($authUri, $request->getUri()->getPath(), $matches)) { + return $this->authenticate($request); + } + + $clockworkDataUri = '#/__clockwork(?:/(?[0-9-]+))?(?:/(?(?:previous|next)))?(?:/(?\d+))?#'; + if (preg_match($clockworkDataUri, $request->getUri()->getPath(), $matches)) { + $matches = array_merge([ 'id' => null, 'direction' => null, 'count' => null ], $matches); + return $this->retrieveRequest($request, $matches['id'], $matches['direction'], $matches['count']); + } + + $response = $handler->handle($request); + + return $this->logRequest($request, $response); + } + + protected function authenticate(Request $request) + { + $token = $this->clockwork->authenticator()->attempt($request->getParsedBody()); + + return $this->jsonResponse([ 'token' => $token ], $token ? 200 : 403); + } + + protected function retrieveRequest(Request $request, $id, $direction, $count) + { + $authenticator = $this->clockwork->authenticator(); + $storage = $this->clockwork->storage(); + + $authenticated = $authenticator->check(current($request->getHeader('X-Clockwork-Auth'))); + + if ($authenticated !== true) { + return $this->jsonResponse([ 'message' => $authenticated, 'requires' => $authenticator->requires() ], 403); + } + + if ($direction == 'previous') { + $data = $storage->previous($id, $count); + } elseif ($direction == 'next') { + $data = $storage->next($id, $count); + } elseif ($id == 'latest') { + $data = $storage->latest(); + } else { + $data = $storage->find($id); + } + + return $this->jsonResponse($data); + } + + protected function logRequest(Request $request, $response) + { + $this->clockwork->timeline()->finalize($this->startTime); + $this->clockwork->addDataSource(new PsrMessageDataSource($request, $response)); + + $this->clockwork->resolveRequest(); + $this->clockwork->storeRequest(); + + $clockworkRequest = $this->clockwork->request(); + + $response = $response + ->withHeader('X-Clockwork-Id', $clockworkRequest->id) + ->withHeader('X-Clockwork-Version', Clockwork::VERSION); + + if ($basePath = $this->app->getBasePath()) { + $response = $response->withHeader('X-Clockwork-Path', $basePath); + } + + return $response->withHeader('Server-Timing', ServerTiming::fromRequest($clockworkRequest)->value()); + } + + protected function createDefaultClockwork($storagePath) + { + $clockwork = new Clockwork(); + + $clockwork->storage(new FileStorage($storagePath)); + $clockwork->authenticator(new NullAuthenticator); + + return $clockwork; + } + + protected function jsonResponse($data, $status = 200) + { + $response = $this->app->getResponseFactory() + ->createResponse($status) + ->withHeader('Content-Type', 'application/json'); + + $response->getBody()->write(json_encode($data)); + + return $response; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Legacy/ClockworkMiddleware.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Legacy/ClockworkMiddleware.php new file mode 100644 index 000000000..5199396a8 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Legacy/ClockworkMiddleware.php @@ -0,0 +1,113 @@ +clockwork = $storagePathOrClockwork instanceof Clockwork + ? $storagePathOrClockwork : $this->createDefaultClockwork($storagePathOrClockwork); + $this->startTime = $startTime ?: microtime(true); + } + + public function __invoke(Request $request, Response $response, callable $next) + { + return $this->process($request, $response, $next); + } + + public function process(Request $request, Response $response, callable $next) + { + $authUri = '#/__clockwork/auth#'; + if (preg_match($authUri, $request->getUri()->getPath(), $matches)) { + return $this->authenticate($response, $request); + } + + $clockworkDataUri = '#/__clockwork(?:/(?[0-9-]+))?(?:/(?(?:previous|next)))?(?:/(?\d+))?#'; + if (preg_match($clockworkDataUri, $request->getUri()->getPath(), $matches)) { + $matches = array_merge([ 'id' => null, 'direction' => null, 'count' => null ], $matches); + return $this->retrieveRequest($response, $request, $matches['id'], $matches['direction'], $matches['count']); + } + + $response = $next($request, $response); + + return $this->logRequest($request, $response); + } + + protected function authenticate(Response $response, Request $request) + { + $token = $this->clockwork->authenticator()->attempt($request->getParsedBody()); + + return $response->withJson([ 'token' => $token ])->withStatus($token ? 200 : 403); + } + + protected function retrieveRequest(Response $response, Request $request, $id, $direction, $count) + { + $authenticator = $this->clockwork->authenticator(); + $storage = $this->clockwork->storage(); + + $authenticated = $authenticator->check(current($request->getHeader('X-Clockwork-Auth'))); + + if ($authenticated !== true) { + return $response + ->withJson([ 'message' => $authenticated, 'requires' => $authenticator->requires() ]) + ->withStatus(403); + } + + if ($direction == 'previous') { + $data = $storage->previous($id, $count); + } elseif ($direction == 'next') { + $data = $storage->next($id, $count); + } elseif ($id == 'latest') { + $data = $storage->latest(); + } else { + $data = $storage->find($id); + } + + return $response + ->withHeader('Content-Type', 'application/json') + ->withJson($data); + } + + protected function logRequest(Request $request, Response $response) + { + $this->clockwork->timeline()->finalize($this->startTime); + $this->clockwork->addDataSource(new PsrMessageDataSource($request, $response)); + + $this->clockwork->resolveRequest(); + $this->clockwork->storeRequest(); + + $clockworkRequest = $this->clockwork->request(); + + $response = $response + ->withHeader('X-Clockwork-Id', $clockworkRequest->id) + ->withHeader('X-Clockwork-Version', Clockwork::VERSION); + + if ($basePath = $request->getUri()->getBasePath()) { + $response = $response->withHeader('X-Clockwork-Path', $basePath); + } + + return $response->withHeader('Server-Timing', ServerTiming::fromRequest($clockworkRequest)->value()); + } + + protected function createDefaultClockwork($storagePath) + { + $clockwork = new Clockwork(); + + $clockwork->storage(new FileStorage($storagePath)); + $clockwork->authenticator(new NullAuthenticator); + + return $clockwork; + } +} \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Old/ClockworkLogWriter.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Old/ClockworkLogWriter.php new file mode 100644 index 000000000..aa194cade --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Old/ClockworkLogWriter.php @@ -0,0 +1,42 @@ + 'emergency', + 2 => 'alert', + 3 => 'critical', + 4 => 'error', + 5 => 'warning', + 6 => 'notice', + 7 => 'info', + 8 => 'debug' + ]; + + public function __construct(Clockwork $clockwork, $originalLogWriter) + { + $this->clockwork = $clockwork; + $this->originalLogWriter = $originalLogWriter; + } + + public function write($message, $level = null) + { + $this->clockwork->log($this->getPsrLevel($level), $message); + + if ($this->originalLogWriter) { + return $this->originalLogWriter->write($message, $level); + } + } + + protected function getPsrLevel($level) + { + return isset($this->logLevels[$level]) ? $this->logLevels[$level] : $level; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Old/ClockworkMiddleware.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Old/ClockworkMiddleware.php new file mode 100644 index 000000000..880bd79c8 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Slim/Old/ClockworkMiddleware.php @@ -0,0 +1,92 @@ +storagePathOrClockwork = $storagePathOrClockwork; + } + + public function call() + { + $this->app->container->singleton('clockwork', function () { + if ($this->storagePathOrClockwork instanceof Clockwork) { + return $this->storagePathOrClockwork; + } + + $clockwork = new Clockwork(); + + $clockwork->addDataSource(new PhpDataSource()) + ->addDataSource(new SlimDataSource($this->app)) + ->storage(new FileStorage($this->storagePathOrClockwork)); + + return $clockwork; + }); + + $originalLogWriter = $this->app->getLog()->getWriter(); + $clockworkLogWriter = new ClockworkLogWriter($this->app->clockwork, $originalLogWriter); + + $this->app->getLog()->setWriter($clockworkLogWriter); + + $clockworkDataUri = '#/__clockwork(?:/(?[0-9-]+))?(?:/(?(?:previous|next)))?(?:/(?\d+))?#'; + if ($this->app->config('debug') && preg_match($clockworkDataUri, $this->app->request()->getPathInfo(), $matches)) { + $matches = array_merge([ 'direction' => null, 'count' => null ], $matches); + return $this->retrieveRequest($matches['id'], $matches['direction'], $matches['count']); + } + + try { + $this->next->call(); + $this->logRequest(); + } catch (Exception $e) { + $this->logRequest(); + throw $e; + } + } + + public function retrieveRequest($id = null, $direction = null, $count = null) + { + $storage = $this->app->clockwork->storage(); + + if ($direction == 'previous') { + $data = $storage->previous($id, $count); + } elseif ($direction == 'next') { + $data = $storage->next($id, $count); + } elseif ($id == 'latest') { + $data = $storage->latest(); + } else { + $data = $storage->find($id); + } + + echo json_encode($data, \JSON_PARTIAL_OUTPUT_ON_ERROR); + } + + protected function logRequest() + { + $this->app->clockwork->resolveRequest(); + $this->app->clockwork->storeRequest(); + + if ($this->app->config('debug')) { + $this->app->response()->header('X-Clockwork-Id', $this->app->clockwork->request()->id); + $this->app->response()->header('X-Clockwork-Version', Clockwork::VERSION); + + $env = $this->app->environment(); + if ($env['SCRIPT_NAME']) { + $this->app->response()->header('X-Clockwork-Path', $env['SCRIPT_NAME'] . '/__clockwork/'); + } + + $request = $this->app->clockwork->request(); + $this->app->response()->header('Server-Timing', ServerTiming::fromRequest($request)->value()); + } + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Swift/SwiftPluginClockworkTimeline.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Swift/SwiftPluginClockworkTimeline.php new file mode 100644 index 000000000..5ae239e05 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Swift/SwiftPluginClockworkTimeline.php @@ -0,0 +1,59 @@ +timeline = $timeline; + } + + // Invoked immediately before a message is sent + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + + $headers = []; + foreach ($message->getHeaders()->getAll() as $header) { + $headers[$header->getFieldName()] = $header->getFieldBody(); + } + + $this->timeline->event('Sending an email message', [ + 'name' => 'email ' . $message->getId(), + 'start' => $time = microtime(true), + 'data' => [ + 'from' => $this->addressToString($message->getFrom()), + 'to' => $this->addressToString($message->getTo()), + 'subject' => $message->getSubject(), + 'headers' => $headers + ] + ]); + } + + // Invoked immediately after a message is sent + public function sendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + + $this->timeline->event('email ' . $message->getId())->end(); + } + + protected function addressToString($address) + { + if (! $address) return; + + foreach ($address as $email => $name) { + $address[$email] = $name ? "$name <$email>" : $email; + } + + return implode(', ', $address); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkBundle.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkBundle.php new file mode 100644 index 000000000..8b0969aa8 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkBundle.php @@ -0,0 +1,11 @@ +debug = $debug; + } + + public function getConfigTreeBuilder() + { + return $this->getConfigRoot() + ->children() + ->booleanNode('enable')->defaultValue($this->debug)->end() + ->variableNode('web')->defaultValue(true)->end() + ->booleanNode('authentication')->defaultValue(false)->end() + ->scalarNode('authentication_password')->defaultValue('VerySecretPassword')->end() + ->end() + ->end(); + } + + protected function getConfigRoot() + { + if (Kernel::VERSION_ID < 40300) { + return (new TreeBuilder)->root('clockwork'); + } + + return (new TreeBuilder('clockwork'))->getRootNode(); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkController.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkController.php new file mode 100644 index 000000000..a34c316be --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkController.php @@ -0,0 +1,69 @@ +clockwork = $clockwork; + $this->support = $support; + } + + public function authenticate(Request $request) + { + $this->ensureClockworkIsEnabled(); + + $token = $this->clockwork->authenticator()->attempt($request->request->all()); + + return new JsonResponse([ 'token' => $token ], $token ? 200 : 403); + } + + public function getData(Request $request, $id = null, $direction = null, $count = null) + { + $this->ensureClockworkIsEnabled(); + + return $this->support->getData($request, $id, $direction, $count); + } + + public function webIndex(Request $request) + { + $this->ensureClockworkIsEnabled(); + $this->ensureClockworkWebIsEnabled(); + + return $this->support->getWebAsset('index.html'); + } + + public function webAsset($path) + { + $this->ensureClockworkIsEnabled(); + $this->ensureClockworkWebIsEnabled(); + + return $this->support->getWebAsset($path); + } + + public function webRedirect(Request $request) + { + $this->ensureClockworkIsEnabled(); + $this->ensureClockworkWebIsEnabled(); + + return $this->redirect('/' . $request->getPathInfo() . '/app'); + } + + protected function ensureClockworkIsEnabled() + { + if (! $this->support->isEnabled()) throw $this->createNotFoundException(); + } + + protected function ensureClockworkWebIsEnabled() + { + if (! $this->support->isWebEnabled()) throw $this->createNotFoundException(); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkExtension.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkExtension.php new file mode 100644 index 000000000..ad7a1158e --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkExtension.php @@ -0,0 +1,22 @@ +load('clockwork.php'); + + $container->getDefinition(ClockworkSupport::class)->replaceArgument('$config', $config); + } + + public function getConfiguration(array $config, ContainerBuilder $container) + { + return new ClockworkConfiguration($container->getParameter('kernel.debug')); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkFactory.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkFactory.php new file mode 100644 index 000000000..2c6f2ed70 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkFactory.php @@ -0,0 +1,38 @@ +container = $container; + } + + public function clockwork() + { + return (new Clockwork) + ->authenticator($this->container->get('clockwork.authenticator')) + ->storage($this->container->get('clockwork.storage')); + } + + public function clockworkAuthenticator() + { + return $this->container->get('clockwork.support')->makeAuthenticator(); + } + + public function clockworkStorage() + { + return new SymfonyStorage( + $this->container->get('profiler'), substr($this->container->getParameter('profiler.storage.dsn'), 5) + ); + } + + public function clockworkSupport($config) + { + return new ClockworkSupport($this->container, $config); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkListener.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkListener.php new file mode 100644 index 000000000..bd2011103 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkListener.php @@ -0,0 +1,47 @@ +clockwork = $clockwork; + $this->profiler = $profiler; + } + + public function onKernelRequest(KernelEvent $event) + { + if (preg_match('#/__clockwork(.*)#', $event->getRequest()->getPathInfo())) { + $this->profiler->disable(); + } + } + + public function onKernelResponse(KernelEvent $event) + { + if (! $this->clockwork->isEnabled()) return; + + $response = $event->getResponse(); + + if (! $response->headers->has('X-Debug-Token')) return; + + $response->headers->set('X-Clockwork-Id', $response->headers->get('X-Debug-Token')); + $response->headers->set('X-Clockwork-Version', Clockwork::VERSION); + } + + public static function getSubscribedEvents() + { + return [ + KernelEvents::REQUEST => [ 'onKernelRequest', 512 ], + KernelEvents::RESPONSE => [ 'onKernelResponse', -128 ] + ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkLoader.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkLoader.php new file mode 100644 index 000000000..36ce9450c --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkLoader.php @@ -0,0 +1,53 @@ +support = $support; + } + + public function load($resource, $type = null) + { + $routes = new RouteCollection(); + + $routes->add('clockwork', new Route('/__clockwork/{id}/{direction}/{count}', [ + '_controller' => [ ClockworkController::class, 'getData' ], + 'direction' => null, + 'count' => null + ], [ 'id' => '(?!(app|auth))([a-z0-9-]+|latest)', 'direction' => '(next|previous)', 'count' => '\d+' ])); + + $routes->add('clockwork.auth', new Route('/__clockwork/auth', [ + '_controller' => [ ClockworkController::class, 'authenticate' ] + ])); + + if (! $this->support->isWebEnabled()) return $routes; + + foreach ($this->support->webPaths() as $path) { + $routes->add("clockwork.webRedirect.{$path}", new Route("{$path}", [ + '_controller' => [ ClockworkController::class, 'webRedirect' ] + ])); + + $routes->add("clockwork.webIndex.{$path}", new Route("{$path}/app", [ + '_controller' => [ ClockworkController::class, 'webIndex' ] + ])); + + $routes->add("clockwork.webAsset.{$path}", new Route("{$path}/{path}", [ + '_controller' => [ ClockworkController::class, 'webAsset' ] + ], [ 'path' => '.+' ])); + } + + return $routes; + } + + public function supports($resource, $type = null) + { + return $type == 'clockwork'; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkSupport.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkSupport.php new file mode 100644 index 000000000..034750f6d --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ClockworkSupport.php @@ -0,0 +1,100 @@ +container = $container; + $this->config = $config; + } + + public function getConfig($key, $default = null) + { + return isset($this->config[$key]) ? $this->config[$key] : $default; + } + + public function getData(Request $request, $id = null, $direction = null, $count = null) + { + $authenticator = $this->container->get('clockwork')->authenticator(); + $storage = $this->container->get('clockwork')->storage(); + + $authenticated = $authenticator->check($request->headers->get('X-Clockwork-Auth')); + + if ($authenticated !== true) { + return new JsonResponse([ 'message' => $authenticated, 'requires' => $authenticator->requires() ], 403); + } + + if ($direction == 'previous') { + $data = $storage->previous($id, $count, Search::fromRequest($request->query->all())); + } elseif ($direction == 'next') { + $data = $storage->next($id, $count, Search::fromRequest($request->query->all())); + } elseif ($id == 'latest') { + $data = $storage->latest(Search::fromRequest($request->query->all())); + } else { + $data = $storage->find($id); + } + + $data = is_array($data) + ? array_map(function ($request) { return $request->toArray(); }, $data) + : $data->toArray(); + + return new JsonResponse($data); + } + + public function getWebAsset($path) + { + $web = new Web; + + if ($asset = $web->asset($path)) { + return new BinaryFileResponse($asset['path'], 200, [ 'Content-Type' => $asset['mime'] ]); + } else { + throw new NotFoundHttpException; + } + } + + public function makeAuthenticator() + { + $authenticator = $this->getConfig('authentication'); + + if (is_string($authenticator)) { + return $this->container->get($authenticator); + } elseif ($authenticator) { + return new SimpleAuthenticator($this->getConfig('authentication_password')); + } else { + return new NullAuthenticator; + } + } + + public function isEnabled() + { + return $this->getConfig('enable', false); + } + + public function isWebEnabled() + { + return $this->getConfig('web', true); + } + + public function webPaths() + { + $path = $this->getConfig('web', true); + + if (is_string($path)) return [ trim($path, '/') ]; + + return [ 'clockwork', '__clockwork' ]; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ProfileTransformer.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ProfileTransformer.php new file mode 100644 index 000000000..b3c9c0eef --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/ProfileTransformer.php @@ -0,0 +1,303 @@ + $profile->getToken() ]); + + $this->transformCacheData($profile, $request); + $this->transformDoctrineData($profile, $request); + $this->transformEventsData($profile, $request); + $this->transformLoggerData($profile, $request); + $this->transformRequestData($profile, $request); + $this->transformTimeData($profile, $request); + $this->transformTwigData($profile, $request); + + $request->subrequests = $this->getSubrequests($profile); + + return $request; + } + + // Cache collector + + protected function transformCacheData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('cache')) return; + + $data = $profile->getCollector('cache'); + + $request->cacheQueries = $this->getCacheQueries($data); + $request->cacheReads = $data->getTotals()['reads']; + $request->cacheHits = $data->getTotals()['hits']; + $request->cacheWrites = $data->getTotals()['writes']; + $request->cacheDeletes = $data->getTotals()['deletes']; + } + + protected function getCacheQueries($data) + { + return array_reduce(array_map(function ($queries, $connection) { + return array_filter(array_map(function ($query) use ($connection) { + $value = $query['result']; + + if (! is_array($value) || ! count($value)) return; + + return [ + 'connection' => $connection, + 'time' => $query['start'], + 'type' => array_values($value)[0] ? 'hit' : 'miss', + 'key' => array_keys($value)[0], + 'value' => '', + 'duration' => $query['end'] - $query['start'] + ]; + }, $queries)); + }, $this->unwrap($data->getCalls()), array_keys($this->unwrap($data->getCalls()))), function ($all, $queries) { + return array_merge($all, $queries); + }, []); + } + + // Doctrine collector + + protected function transformDoctrineData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('db')) return; + + $data = $profile->getCollector('db'); + + $request->databaseDuration = $data->getTime(); + $request->databaseQueries = $this->getQueries($data); + } + + protected function getQueries($data) + { + return array_reduce(array_map(function ($queries, $connection) { + return array_filter(array_map(function ($query) use ($connection) { + return [ + 'query' => $this->createRunnableQuery($query['sql'], $this->unwrap($query['params'])), + 'duration' => $query['executionMS'] * 1000, + 'connection' => $connection + ]; + }, $queries)); + }, $data->getQueries(), array_keys($data->getQueries())), function ($all, $queries) { + return array_merge($all, $queries); + }, []); + } + + protected function createRunnableQuery($query, $bindings) + { + foreach ($bindings as $binding) { + $binding = \Doctrine\Bundle\DoctrineBundle\Twig\DoctrineExtension::escapeFunction($binding); + + // escape backslashes in the binding (preg_replace requires to do so) + $binding = str_replace('\\', '\\\\', $binding); + + $query = preg_replace('/\?/', $binding, $query, 1); + } + + // highlight keywords + $keywords = [ + 'select', 'insert', 'update', 'delete', 'where', 'from', 'limit', 'is', 'null', 'having', 'group by', + 'order by', 'asc', 'desc' + ]; + $regexp = '/\b' . implode('\b|\b', $keywords) . '\b/i'; + + $query = preg_replace_callback($regexp, function ($match) { return strtoupper($match[0]); }, $query); + + return $query; + } + + // Events collector + + protected function transformEventsData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('events')) return; + + $data = $profile->getCollector('events'); + + $request->events = $this->getEvents($data); + } + + protected function getEvents($data) + { + $handledEvents = array_values(array_reduce($this->unwrap($data->getCalledListeners()), function ($events, $listener) { + if (! isset($events[$listener['event']])) { + $events[$listener['event']] = [ 'event' => $listener['event'], 'listeners' => [] ]; + } + + $events[$listener['event']]['listeners'][] = $listener['stub']; + + return $events; + }, [])); + + $orphanedEvents = array_map(function ($event) { + return [ 'event' => $event ]; + }, $this->unwrap($data->getOrphanedEvents())); + + return array_merge($handledEvents, $orphanedEvents); + } + + // Log collector + + protected function transformLoggerData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('logger')) return; + + $data = $profile->getCollector('logger'); + + $request->log()->merge($this->getLog($data)); + } + + protected function getLog($data) + { + $messages = array_map(function ($log) { + $context = isset($log['context']) ? $log['context'] : []; + $replacements = array_filter($context, function ($v) { return ! is_array($v) && ! is_object($v) && ! is_resource($v); }); + + return [ + 'message' => str_replace( + array_map(function ($v) { return "{{$v}}"; }, array_keys($replacements)), + array_values($replacements), + $log['message'] + ), + 'context' => (new Serializer)->normalize($log['context']), + 'level' => strtolower($log['priorityName']), + 'time' => $log['timestamp'] + ]; + }, $this->unwrap($data->getLogs())); + + return new Log($messages); + } + + // Request collector + + protected function transformRequestData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('request')) return; + + $data = $profile->getCollector('request'); + + $request->method = $data->getMethod(); + $request->uri = $data->getPathInfo(); + $request->controller = $this->getController($data); + $request->responseStatus = $data->getStatusCode(); + $request->headers = $this->unwrap($data->getRequestHeaders()); + $request->getData = $this->unwrap($data->getRequestQuery()); + $request->postData = $this->unwrap($data->getRequestRequest()); + $request->cookies = $this->unwrap($data->getRequestCookies()); + $request->sessionData = (new Serializer)->normalizeEach($this->unwrap($data->getSessionAttributes())); + } + + protected function getController($data) + { + $controller = $this->unwrap($data->getController()); + + if (! is_array($controller)) return $controller; + + return isset($controller['method']) + ? "{$controller['class']}@{$controller['method']}" + : $controller['class']; + } + + // Time collector + + protected function transformTimeData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('time')) return; + + $data = $profile->getCollector('time'); + + $request->time = $data->getStartTime() / 1000; + $request->responseTime = $this->getResponseTime($data); + + $request->timeline()->merge($this->getTimeline($data)); + } + + protected function getResponseTime($data) + { + $lastEvent = $data->getEvents()['__section__']; + + return ($lastEvent->getOrigin() + $lastEvent->getDuration()) / 1000; + } + + protected function getTimeline($data) + { + $events = array_map(function ($event, $name) { + if ($name == '__section__') { + $name = 'Application runtime'; + } elseif ($name == '__section__.child') { + $name = 'Subrequest'; + } + + return [ + 'start' => ($event->getOrigin() + $event->getStartTime()) / 1000, + 'end' => ($event->getOrigin() + $event->getEndTime()) / 1000, + 'duration' => $event->getDuration(), + 'description' => $name, + 'data' => [] + ]; + }, $data->getEvents(), array_keys($data->getEvents())); + + $topEvent = $data->getEvents()['__section__']; + array_unshift($events, [ + 'start' => $start = $data->getStartTime() / 1000, + 'end' => $end = ($topEvent->getOrigin() + $topEvent->getStartTime()) / 1000, + 'duration' => ($end - $start) * 1000, + 'description' => 'Symfony initialization', + 'data' => [] + ]); + + return new Timeline($events); + } + + // Twig collector + + protected function transformTwigData(Profile $profile, Request $request) + { + if (! $profile->hasCollector('twig')) return; + + $data = $profile->getCollector('twig'); + + $request->viewsData = $this->getViews($data); + } + + protected function getViews($data) + { + return array_map(function ($template) { + return [ + 'description' => 'Rendering a view', + 'data' => [ 'name' => $template, 'data' => [] ] + ]; + }, array_keys($data->getTemplates())); + } + + protected function getSubrequests($profile) + { + return array_map(function ($child) { + return [ + 'url' => urlencode($child->getCollector('request')->getPathInfo()), + 'id' => $child->getToken(), + 'path' => null + ]; + }, $profile->getChildren()); + } + + protected function unwrap($data) + { + if ($data instanceof \Symfony\Component\VarDumper\Cloner\Data) { + return $data->getValue(true); + } elseif ($data instanceof \Symfony\Component\HttpFoundation\ParameterBag) { + return array_map(function ($val) { return $val->getValue(); }, $data->all()); + } elseif (is_array($data)) { + return array_map(function ($item) { return $this->unwrap($item); }, $data); + } + + return $data; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/Resources/config/clockwork.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/Resources/config/clockwork.php new file mode 100644 index 000000000..e9e2b37b1 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/Resources/config/clockwork.php @@ -0,0 +1,39 @@ +autowire(Clockwork\Support\Symfony\ClockworkFactory::class); + +$container->register(Clockwork\Clockwork::class) + ->setFactory([ new Reference(ClockworkFactory::class), 'clockwork' ]) + ->setPublic(true); + +$container->register(Clockwork\Authentication\AuthenticatorInterface::class) + ->setFactory([ new Reference(ClockworkFactory::class), 'clockworkAuthenticator' ]) + ->setPublic(true); + +$container->register(Clockwork\Storage\StorageInterface::class) + ->setFactory([ new Reference(ClockworkFactory::class), 'clockworkStorage' ]) + ->setPublic(true); + +$container->register(Clockwork\Support\Symfony\ClockworkSupport::class) + ->setArgument('$config', []) + ->setFactory([ new Reference(ClockworkFactory::class), 'clockworkSupport' ]) + ->setPublic(true); + +$container->autowire(Clockwork\Support\Symfony\ClockworkController::class) + ->setAutoconfigured(true); + +$container->autowire(Clockwork\Support\Symfony\ClockworkListener::class) + ->setArgument('$profiler', new Reference('profiler')) + ->addTag('kernel.event_subscriber'); + +$container->autowire(Clockwork\Support\Symfony\ClockworkLoader::class) + ->addTag('routing.loader'); + +$container->setAlias('clockwork', Clockwork\Clockwork::class)->setPublic('true'); +$container->setAlias('clockwork.authenticator', Clockwork\Authentication\AuthenticatorInterface::class)->setPublic('true'); +$container->setAlias('clockwork.storage', Clockwork\Storage\StorageInterface::class)->setPublic('true'); +$container->setAlias('clockwork.support', Clockwork\Support\Symfony\ClockworkSupport::class)->setPublic('true'); diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/Resources/config/routing/clockwork.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/Resources/config/routing/clockwork.php new file mode 100644 index 000000000..2367fbddc --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Symfony/Resources/config/routing/clockwork.php @@ -0,0 +1,7 @@ +import('.', 'clockwork'); +}; diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Twig/ProfilerClockworkDumper.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Twig/ProfilerClockworkDumper.php new file mode 100644 index 000000000..e1b2cbf5a --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Twig/ProfilerClockworkDumper.php @@ -0,0 +1,51 @@ +dumpProfile($profile, $timeline); + + return $timeline; + } + + public function dumpProfile(Profile $profile, Timeline $timeline, $parent = null) + { + $id = $this->lastId++; + + if ($profile->isRoot()) { + $name = $profile->getName(); + } elseif ($profile->isTemplate()) { + $name = basename($profile->getTemplate()); + } else { + $name = basename($profile->getTemplate()) . '::' . $profile->getType() . '(' . $profile->getName() . ')'; + } + + foreach ($profile as $p) { + $this->dumpProfile($p, $timeline, $id); + } + + $data = $profile->__serialize(); + + $timeline->event($name, [ + 'name' => $id, + 'start' => isset($data[3]['wt']) ? $data[3]['wt'] : null, + 'end' => isset($data[4]['wt']) ? $data[4]['wt'] : null, + 'data' => [ + 'data' => [], + 'memoryUsage' => isset($data[4]['mu']) ? $data[4]['mu'] : null, + 'parent' => $parent + ] + ]); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/Clockwork.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/Clockwork.php new file mode 100644 index 000000000..7aff7c13f --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/Clockwork.php @@ -0,0 +1,478 @@ +config = array_merge(include __DIR__ . '/config.php', $config); + + $this->clockwork = new BaseClockwork; + + $this->clockwork->addDataSource(new PhpDataSource); + $this->clockwork->storage($this->makeStorage()); + $this->clockwork->authenticator($this->makeAuthenticator()); + + $this->configureSerializer(); + $this->configureShouldCollect(); + $this->configureShouldRecord(); + + if ($this->config['register_helpers']) include __DIR__ . '/helpers.php'; + } + + // Initialize a singleton instance, takes an additional config + public static function init($config = []) + { + return static::$defaultInstance = new static($config); + } + + // Return the singleton instance + public static function instance() + { + return static::$defaultInstance; + } + + // Resolves and records the current request and sends Clockwork headers, should be called at the end of app + // execution, return PSR-7 response if one was set + public function requestProcessed() + { + if (! $this->config['enable'] && ! $this->config['collect_data_always']) return $this->psrResponse; + + if (! $this->clockwork->shouldCollect()->filter($this->incomingRequest())) return $this->psrResponse; + if (! $this->clockwork->shouldRecord()->filter($this->clockwork->request())) return $this->psrResponse; + + $this->clockwork->resolveRequest()->storeRequest(); + + if (! $this->config['enable']) return $this->psrResponse; + + $this->sendHeaders(); + + if (($eventsCount = $this->config['server_timing']) !== false) { + $this->setHeader('Server-Timing', ServerTiming::fromRequest($this->clockwork->request(), $eventsCount)->value()); + } + + return $this->psrResponse; + } + + // Resolves and records the current request as a command, should be called at the end of app execution + public function commandExecuted($name, $exitCode = null, $arguments = [], $options = [], $argumentsDefaults = [], $optionsDefaults = [], $output = null) + { + if (! $this->config['enable'] && ! $this->config['collect_data_always']) return; + + if (! $this->clockwork->shouldRecord()->filter($this->clockwork->request())) return; + + $this->clockwork + ->resolveAsCommand($name, $exitCode, $arguments, $options, $argumentsDefaults, $optionsDefaults, $output) + ->storeRequest(); + } + + // Resolves and records the current request as a queue job, should be called at the end of app execution + public function queueJobExecuted($name, $description = null, $status = 'processed', $payload = [], $queue = null, $connection = null, $options = []) + { + if (! $this->config['enable'] && ! $this->config['collect_data_always']) return; + + if (! $this->clockwork->shouldRecord()->filter($this->clockwork->request())) return; + + $this->clockwork + ->resolveAsQueueJob($name, $description, $status, $payload, $queue, $connection, $options) + ->storeRequest(); + } + + // Manually send the Clockwork headers, this should be manually called only when the headers need to be sent early + // in the request processing + public function sendHeaders() + { + if (! $this->config['enable'] || $this->headersSent) return; + + $this->headersSent = true; + + $clockworkRequest = $this->request(); + + $this->setHeader('X-Clockwork-Id', $clockworkRequest->id); + $this->setHeader('X-Clockwork-Version', BaseClockwork::VERSION); + + if ($this->config['api'] != '/__clockwork/') { + $this->setHeader('X-Clockwork-Path', $this->config['api']); + } + + foreach ($this->config['headers'] as $headerName => $headerValue) { + $this->setHeader("X-Clockwork-Header-{$headerName}", $headerValue); + } + + if ($this->config['features']['performance']['client_metrics'] || $this->config['toolbar']) { + $this->setCookie('x-clockwork', $this->getCookiePayload(), time() + 60); + } + } + + // Returns the x-clockwork cookie payload in case you need to set the cookie yourself (cookie can't be http only, + // expiration time should be 60 seconds) + public function getCookiePayload() + { + $clockworkRequest = $this->request(); + + return json_encode([ + 'requestId' => $clockworkRequest->id, + 'version' => BaseClockwork::VERSION, + 'path' => $this->config['api'], + 'webPath' => $this->config['web']['enable'], + 'token' => $clockworkRequest->updateToken, + 'metrics' => $this->config['features']['performance']['client_metrics'], + 'toolbar' => $this->config['toolbar'] + ]); + } + + // Handle Clockwork REST api request, retrieves or updates Clockwork metadata + public function handleMetadata($request = null, $method = null) + { + if (! $request) $request = isset($_GET['request']) ? $_GET['request'] : ''; + if (! $method) $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; + + if ($method == 'POST' && $request == 'auth') return $this->authenticate(); + + return $method == 'POST' ? $this->updateMetadata($request) : $this->returnMetadata($request); + } + + // Retrieve metadata based on the passed Clockwork REST api request and send HTTP response + public function returnMetadata($request = null) + { + if (! $this->config['enable']) return $this->response(null, 404); + + $authenticator = $this->clockwork->authenticator(); + $authenticated = $authenticator->check(isset($_SERVER['HTTP_X_CLOCKWORK_AUTH']) ? $_SERVER['HTTP_X_CLOCKWORK_AUTH'] : ''); + + if ($authenticated !== true) { + return $this->response([ 'message' => $authenticated, 'requires' => $authenticator->requires() ], 403); + } + + return $this->response($this->getMetadata($request)); + } + + // Returns metadata based on the passed Clockwork REST api request + public function getMetadata($request = null) + { + if (! $this->config['enable']) return; + + $authenticator = $this->clockwork->authenticator(); + $authenticated = $authenticator->check(isset($_SERVER['HTTP_X_CLOCKWORK_AUTH']) ? $_SERVER['HTTP_X_CLOCKWORK_AUTH'] : ''); + + if ($authenticated !== true) return; + + if (! $request) $request = isset($_GET['request']) ? $_GET['request'] : ''; + + preg_match('#(?[0-9-]+|latest)(?:/(?next|previous))?(?:/(?\d+))?#', $request, $matches); + + $id = isset($matches['id']) ? $matches['id'] : null; + $direction = isset($matches['direction']) ? $matches['direction'] : null; + $count = isset($matches['count']) ? $matches['count'] : null; + + if ($direction == 'previous') { + $data = $this->clockwork->storage()->previous($id, $count, Search::fromRequest($_GET)); + } elseif ($direction == 'next') { + $data = $this->clockwork->storage()->next($id, $count, Search::fromRequest($_GET)); + } elseif ($id == 'latest') { + $data = $this->clockwork->storage()->latest(Search::fromRequest($_GET)); + } else { + $data = $this->clockwork->storage()->find($id); + } + + if (preg_match('#(?[0-9-]+|latest)/extended#', $request)) { + $this->clockwork->extendRequest($data); + } + + if ($data) { + $data = is_array($data) ? array_map(function ($item) { return $item->toArray(); }, $data) : $data->toArray(); + } + + return $data; + } + + // Update metadata based on the passed Clockwork REST api request and send HTTP response + public function updateMetadata($request = null) + { + if (! $this->config['enable'] || ! $this->config['features']['performance']['client_metrics']) { + return $this->response(null, 404); + } + + if (! $request) $request = isset($_GET['request']) ? $_GET['request'] : ''; + + $storage = $this->clockwork->storage(); + + $request = $storage->find($request); + + if (! $request) { + return $this->response([ 'message' => 'Request not found.' ], 404); + } + + $input = json_decode(file_get_contents('php://input'), true); + + $token = isset($input['_token']) ? $input['_token'] : ''; + + if (! $request->updateToken || ! hash_equals($request->updateToken, $token)) { + return $this->response([ 'message' => 'Invalid update token.' ], 403); + } + + foreach ($input as $key => $value) { + if (in_array($key, [ 'clientMetrics', 'webVitals' ])) { + $request->$key = $value; + } + } + + $storage->update($request); + + return $this->response(); + } + + // Authanticates access to Clockwork REST api + public function authenticate($request = null) + { + if (! $this->config['enable']) return; + + if (! $request) $request = isset($_GET['request']) ? $_GET['request'] : ''; + + $token = $this->clockwork->authenticator()->attempt([ + 'username' => isset($_POST['username']) ? $_POST['username'] : '', + 'password' => isset($_POST['password']) ? $_POST['password'] : '' + ]); + + return $this->response([ 'token' => $token ], $token ? 200 : 403); + } + + // Returns the Clockwork Web UI as a HTTP response, installs the Web UI on the first run + public function returnWeb() + { + if (! $this->config['web']['enable']) return; + + $this->installWeb(); + + $asset = function ($uri) { return "{$this->config['web']['uri']}/{$uri}"; }; + $metadataPath = $this->config['api']; + $url = $this->config['web']['uri']; + + if (! preg_match('#/index.html$#', $url)) { + $url = rtrim($url, '/') . '/index.html'; + } + + ob_start(); + + include __DIR__ . '/iframe.html.php'; + + $html = ob_get_clean(); + + return $this->response($html, null, false); + } + + // Installs the Web UI by copying the assets to the public directory, no-op if already installed + public function installWeb() + { + $path = $this->config['web']['path']; + $source = __DIR__ . '/../../Web/public'; + + if (file_exists("{$path}/index.html")) return; + + @mkdir($path, 0755, true); + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::SELF_FIRST + ); + + foreach ($iterator as $item) { + if ($item->isDir()) { + mkdir("{$path}/" . $iterator->getSubPathName()); + } else { + copy($item, "{$path}/" . $iterator->getSubPathName()); + } + } + } + + // Use a PSR-7 request and response instances instead of vanilla php HTTP apis + public function usePsrMessage(PsrRequest $request, PsrResponse $response = null) + { + $this->psrRequest = $request; + $this->psrResponse = $response; + + $this->clockwork->addDataSource(new PsrMessageDataSource($request, $response)); + + return $this; + } + + // Make a storage implementation based on user configuration + protected function makeStorage() + { + if ($this->config['storage'] == 'sql') { + $database = $this->config['storage_sql_database']; + $table = $this->config['storage_sql_table']; + + $storage = new SqlStorage( + $this->config['storage_sql_database'], + $this->config['storage_sql_table'], + $this->config['storage_sql_username'], + $this->config['storage_sql_password'], + $this->config['storage_expiration'] + ); + } else { + $storage = new FileStorage( + $this->config['storage_files_path'], + 0700, + $this->config['storage_expiration'], + $this->config['storage_files_compress'] + ); + } + + return $storage; + } + + // Make an authenticator implementation based on user configuration + protected function makeAuthenticator() + { + $authenticator = $this->config['authentication']; + + if (is_string($authenticator)) { + return new $authenticator; + } elseif ($authenticator) { + return new SimpleAuthenticator($this->config['authentication_password']); + } else { + return new NullAuthenticator; + } + } + + // Configure serializer defaults based on user configuration + protected function configureSerializer() + { + Serializer::defaults([ + 'limit' => $this->config['serialization_depth'], + 'blackbox' => $this->config['serialization_blackbox'], + 'traces' => $this->config['stack_traces']['enabled'], + 'tracesSkip' => StackFilter::make() + ->isNotVendor(array_merge( + $this->config['stack_traces']['skip_vendors'], + [ 'itsgoingd', 'laravel', 'illuminate' ] + )) + ->isNotNamespace($this->config['stack_traces']['skip_namespaces']) + ->isNotFunction([ 'call_user_func', 'call_user_func_array' ]) + ->isNotClass($this->config['stack_traces']['skip_classes']), + 'tracesLimit' => $this->config['stack_traces']['limit'] + ]); + } + + // Configure should collect rules based on user configuration + public function configureShouldCollect() + { + $this->clockwork->shouldCollect([ + 'onDemand' => $this->config['requests']['on_demand'], + 'sample' => $this->config['requests']['sample'], + 'except' => $this->config['requests']['except'], + 'only' => $this->config['requests']['only'], + 'exceptPreflight' => $this->config['requests']['except_preflight'] + ]); + + // don't collect data for Clockwork requests + $this->clockwork->shouldCollect()->except(preg_quote(rtrim($this->config['api'], '/'), '#')); + } + + // Configure should record rules based on user configuration + public function configureShouldRecord() + { + $this->clockwork->shouldRecord([ + 'errorsOnly' => $this->config['requests']['errors_only'], + 'slowOnly' => $this->config['requests']['slow_only'] ? $this->config['requests']['slow_threshold'] : false + ]); + } + + // Set a cookie on PSR-7 response or using vanilla php + protected function setCookie($name, $value, $expires) { + if ($this->psrResponse) { + $this->psrResponse = $this->psrResponse->withAddedHeader( + 'Set-Cookie', "{$name}=" . urlencode($value) . '; expires=' . gmdate('D, d M Y H:i:s T', $expires) + ); + } else { + setcookie($name, $value, $expires); + } + } + + // Set a header on PSR-7 response or using vanilla php + protected function setHeader($header, $value) + { + if ($this->psrResponse) { + $this->psrResponse = $this->psrResponse->withHeader($header, $value); + } else { + header("{$header}: {$value}"); + } + } + + // Send a json response, uses the PSR-7 response if set + protected function response($data = null, $status = null, $json = true) + { + if ($json) $this->setHeader('Content-Type', 'application/json'); + + if ($this->psrResponse) { + if ($status) $this->psrResponse = $this->psrResponse->withStatus($status); + $this->psrResponse->getBody()->write($json ? json_encode($data, \JSON_PARTIAL_OUTPUT_ON_ERROR) : $data); + return $this->psrResponse; + } else { + if ($status) http_response_code($status); + echo $json ? json_encode($data, \JSON_PARTIAL_OUTPUT_ON_ERROR) : $data; + } + } + + // Make a Clockwork incoming request instance + protected function incomingRequest() + { + return new IncomingRequest([ + 'method' => $_SERVER['REQUEST_METHOD'], + 'uri' => $_SERVER['REQUEST_URI'], + 'input' => $_REQUEST, + 'cookies' => $_COOKIE + ]); + } + + // Return the underlying Clockwork instance + public function getClockwork() + { + return $this->clockwork; + } + + // Pass any method calls to the underlying Clockwork instance + public function __call($method, $args = []) + { + return $this->clockwork->$method(...$args); + } + + // Pass any static method calls to the underlying Clockwork instance + public static function __callStatic($method, $args = []) + { + return static::instance()->$method(...$args); + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/config.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/config.php new file mode 100644 index 000000000..78c217780 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/config.php @@ -0,0 +1,274 @@ + isset($_ENV['CLOCKWORK_ENABLE']) ? $_ENV['CLOCKWORK_ENABLE'] : true, + + /* + |------------------------------------------------------------------------------------------------------------------ + | Features + |------------------------------------------------------------------------------------------------------------------ + | + | You can enable or disable various Clockwork features here. Some features have additional settings (eg. slow query + | threshold for database queries). + | + */ + + 'features' => [ + + // Performance metrics + 'performance' => [ + // Allow collecting of client metrics. Requires separate clockwork-browser npm package. + 'client_metrics' => isset($_ENV['CLOCKWORK_PERFORMANCE_CLIENT_METRICS']) ? $_ENV['CLOCKWORK_PERFORMANCE_CLIENT_METRICS'] : true + ] + + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable toolbar + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can show a toolbar with basic metrics on all responses. Here you can enable or disable this feature. + | Requires a separate clockwork-browser npm library. + | + */ + + 'toolbar' => isset($_ENV['CLOCKWORK_TOOLBAR']) ? $_ENV['CLOCKWORK_TOOLBAR'] : true, + + /* + |------------------------------------------------------------------------------------------------------------------ + | HTTP requests collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork collects data about HTTP requests to your app. Here you can choose which requests should be collected. + | + */ + + 'requests' => [ + // With on-demand mode enabled, Clockwork will only profile requests when the browser extension is open or you + // manually pass a "clockwork-profile" cookie or get/post data key. + // Optionally you can specify a "secret" that has to be passed as the value to enable profiling. + 'on_demand' => isset($_ENV['CLOCKWORK_REQUESTS_ON_DEMAND']) ? $_ENV['CLOCKWORK_REQUESTS_ON_DEMAND'] : false, + + // Collect only errors (requests with HTTP 4xx and 5xx responses) + 'errors_only' => isset($_ENV['CLOCKWORK_REQUESTS_ERRORS_ONLY']) ? $_ENV['CLOCKWORK_REQUESTS_ERRORS_ONLY'] : false, + + // Response time threshold in milliseconds after which the request will be marked as slow + 'slow_threshold' => isset($_ENV['CLOCKWORK_REQUESTS_SLOW_THRESHOLD']) ? $_ENV['CLOCKWORK_REQUESTS_SLOW_THRESHOLD'] : null, + + // Collect only slow requests + 'slow_only' => isset($_ENV['CLOCKWORK_REQUESTS_SLOW_ONLY']) ? $_ENV['CLOCKWORK_REQUESTS_SLOW_ONLY'] : false, + + // Sample the collected requests (eg. set to 100 to collect only 1 in 100 requests) + 'sample' => isset($_ENV['CLOCKWORK_REQUESTS_SAMPLE']) ? $_ENV['CLOCKWORK_REQUESTS_SAMPLE'] : false, + + // List of URIs that should not be collected + 'except' => [ + // '/api/.*' + ], + + // List of URIs that should be collected, any other URI will not be collected if not empty + 'only' => [ + // '/api/.*' + ], + + // Don't collect OPTIONS requests, mostly used in the CSRF pre-flight requests and are rarely of interest + 'except_preflight' => isset($_ENV['CLOCKWORK_REQUESTS_EXCEPT_PREFLIGHT']) ? $_ENV['CLOCKWORK_REQUESTS_EXCEPT_PREFLIGHT'] : true + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Enable data collection when Clockwork is disabled + |------------------------------------------------------------------------------------------------------------------ + | + | You can enable this setting to collect data even when Clockwork is disabled. Eg. for future analysis. + | + */ + + 'collect_data_always' => isset($_ENV['CLOCKWORK_COLLECT_DATA_ALWAYS']) ? $_ENV['CLOCKWORK_COLLECT_DATA_ALWAYS'] : false, + + /* + |------------------------------------------------------------------------------------------------------------------ + | Clockwork API URI + |------------------------------------------------------------------------------------------------------------------ + | + | Path of the script calling returnRequest to return Clockwork metadata to the client app. See installation + | instructions for details. + | + */ + + 'api' => isset($_ENV['CLOCKWORK_API']) ? $_ENV['CLOCKWORK_API'] : '/__clockwork/', + + /* + |------------------------------------------------------------------------------------------------------------------ + | Clockwork web UI + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork comes bundled with a full Clockwork App accessible as a Web UI. Here you can enable and configure this + | feature. + | Clockwork::returnWeb api is used to expose the Web UI in your vanilla app, see the installation instructions for + | details. + | + */ + + 'web' => [ + // Enable or disable the Web UI, set to the public uri where Clockwork Web UI is accessible + 'enable' => isset($_ENV['CLOCKWORK_WEB_ENABLE']) ? $_ENV['CLOCKWORK_WEB_ENABLE'] : true, + + // Path where to install the Web UI assets, should be publicly accessible + 'path' => isset($_ENV['CLOCKWORK_WEB_PATH']) ? $_ENV['CLOCKWORK_WEB_PATH'] : __DIR__ . '/../../../../../public/vendor/clockwork', + + // Public URI where the installed Web UI assets will be accessible + 'uri' => isset($_ENV['CLOCKWORK_WEB_URI']) ? $_ENV['CLOCKWORK_WEB_URI'] : '/vendor/clockwork' + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Metadata storage + |------------------------------------------------------------------------------------------------------------------ + | + | Configure how is the metadata collected by Clockwork stored. Two options are available: + | - files - A simple fast storage implementation storing data in one-per-request files. + | - sql - Stores requests in a sql database. Supports MySQL, Postgresql, Sqlite and requires PDO. + | + */ + + 'storage' => isset($_ENV['CLOCKWORK_STORAGE']) ? $_ENV['CLOCKWORK_STORAGE'] : 'files', + + // Path where the Clockwork metadata is stored + 'storage_files_path' => isset($_ENV['CLOCKWORK_STORAGE_FILES_PATH']) ? $_ENV['CLOCKWORK_STORAGE_FILES_PATH'] : __DIR__ . '/../../../../../../clockwork', + + // Compress the metadata files using gzip, trading a little bit of performance for lower disk usage + 'storage_files_compress' => isset($_ENV['CLOCKWORK_STORAGE_FILES_COMPRESS']) ? $_ENV['CLOCKWORK_STORAGE_FILES_COMPRESS'] : false, + + // SQL database to use, can be a PDO connection string or a path to a sqlite file + 'storage_sql_database' => isset($_ENV['CLOCKWORK_STORAGE_SQL_DATABASE']) ? $_ENV['CLOCKWORK_STORAGE_SQL_DATABASE'] : 'sqlite:' . __DIR__ . '/../../../../../clockwork.sqlite', + 'storage_sql_username' => isset($_ENV['CLOCKWORK_STORAGE_SQL_USERNAME']) ? $_ENV['CLOCKWORK_STORAGE_SQL_USERNAME'] : null, + 'storage_sql_password' => isset($_ENV['CLOCKWORK_STORAGE_SQL_PASSWORD']) ? $_ENV['CLOCKWORK_STORAGE_SQL_PASSWORD'] : null, + + // SQL table name to use, the table is automatically created and updated when needed + 'storage_sql_table' => isset($_ENV['CLOCKWORK_STORAGE_SQL_TABLE']) ? $_ENV['CLOCKWORK_STORAGE_SQL_TABLE'] : 'clockwork', + + // Maximum lifetime of collected metadata in minutes, older requests will automatically be deleted, false to disable + 'storage_expiration' => isset($_ENV['CLOCKWORK_STORAGE_EXPIRATION']) ? $_ENV['CLOCKWORK_STORAGE_EXPIRATION'] : 60 * 24 * 7, + + /* + |------------------------------------------------------------------------------------------------------------------ + | Authentication + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can be configured to require authentication before allowing access to the collected data. This might be + | useful when the application is publicly accessible. Setting to true will enable a simple authentication with a + | pre-configured password. You can also pass a class name of a custom implementation. + | + */ + + 'authentication' => isset($_ENV['CLOCKWORK_AUTHENTICATION']) ? $_ENV['CLOCKWORK_AUTHENTICATION'] : false, + + // Password for the simple authentication + 'authentication_password' => isset($_ENV['CLOCKWORK_AUTHENTICATION_PASSWORD']) ? $_ENV['CLOCKWORK_AUTHENTICATION_PASSWORD'] : 'VerySecretPassword', + + /* + |------------------------------------------------------------------------------------------------------------------ + | Stack traces collection + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork can collect stack traces for log messages and certain data like database queries. Here you can set + | whether to collect stack traces, limit the number of collected frames and set further configuration. Collecting + | long stack traces considerably increases metadata size. + | + */ + + 'stack_traces' => [ + // Enable or disable collecting of stack traces + 'enabled' => isset($_ENV['CLOCKWORK_STACK_TRACES_ENABLED']) ? $_ENV['CLOCKWORK_STACK_TRACES_ENABLED'] : true, + + // Limit the number of frames to be collected + 'limit' => isset($_ENV['CLOCKWORK_STACK_TRACES_LIMIT']) ? $_ENV['CLOCKWORK_STACK_TRACES_LIMIT'] : 10, + + // List of vendor names to skip when determining caller, common vendor are automatically added + 'skip_vendors' => [ + // 'phpunit' + ], + + // List of namespaces to skip when determining caller + 'skip_namespaces' => [ + // 'Vendor' + ], + + // List of class names to skip when determining caller + 'skip_classes' => [ + // App\CustomLog::class + ] + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Serialization + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork serializes the collected data to json for storage and transfer. Here you can configure certain aspects + | of serialization. Serialization has a large effect on the cpu time and memory usage. + | + */ + + // Maximum depth of serialized multi-level arrays and objects + 'serialization_depth' => isset($_ENV['CLOCKWORK_SERIALIZATION_DEPTH']) ? $_ENV['CLOCKWORK_SERIALIZATION_DEPTH'] : 10, + + // A list of classes that will never be serialized (eg. a common service container class) + 'serialization_blackbox' => [ + // \App\ServiceContainer::class + ], + + /* + |------------------------------------------------------------------------------------------------------------------ + | Register helpers + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork comes with a "clock" global helper function. You can use this helper to quickly log something and to + | access the Clockwork instance. + | + */ + + 'register_helpers' => isset($_ENV['CLOCKWORK_REGISTER_HELPERS']) ? $_ENV['CLOCKWORK_REGISTER_HELPERS'] : false, + + /* + |------------------------------------------------------------------------------------------------------------------ + | Send Headers for AJAX request + |------------------------------------------------------------------------------------------------------------------ + | + | When trying to collect data the AJAX method can sometimes fail if it is missing required headers. For example, an + | API might require a version number using Accept headers to route the HTTP request to the correct codebase. + | + */ + + 'headers' => [ + // 'Accept' => 'application/vnd.com.whatever.v1+json', + ], + /* + |------------------------------------------------------------------------------------------------------------------ + | Server-Timing + |------------------------------------------------------------------------------------------------------------------ + | + | Clockwork supports the W3C Server Timing specification, which allows for collecting a simple performance metrics + | in a cross-browser way. Eg. in Chrome, your app, database and timeline event timings will be shown in the Dev + | Tools network tab. This setting specifies the max number of timeline events that will be sent. Setting to false + | will disable the feature. + | + */ + + 'server_timing' => isset($_ENV['CLOCKWORK_SERVER_TIMING']) ? $_ENV['CLOCKWORK_SERVER_TIMING'] : 10 + +]; diff --git a/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/helpers.php b/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/helpers.php new file mode 100644 index 000000000..bc98e2c94 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Support/Vanilla/helpers.php @@ -0,0 +1,19 @@ + + + + + + Clockwork + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/Web.php b/vendor/itsgoingd/clockwork/Clockwork/Web/Web.php new file mode 100644 index 000000000..159f59ca0 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/Web.php @@ -0,0 +1,36 @@ +resolveAssetPath($path); + + if (! $path) return; + + switch (pathinfo($path, PATHINFO_EXTENSION)) { + case 'css': $mime = 'text/css'; break; + case 'js': $mime = 'application/javascript'; break; + case 'json': $mime = 'application/json'; break; + case 'png': $mime = 'image/png'; break; + default: $mime = 'text/html'; break; + } + + return [ + 'path' => $path, + 'mime' => $mime + ]; + } + + // Resolves absolute path of the asset, protects from accessing files outside Clockwork public dir + protected function resolveAssetPath($path) + { + $publicPath = realpath(__DIR__ . '/public'); + + $path = realpath("$publicPath/{$path}"); + + return strpos($path, $publicPath) === 0 ? $path : false; + } +} diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/css/app.515e4027.css b/vendor/itsgoingd/clockwork/Clockwork/Web/public/css/app.515e4027.css new file mode 100644 index 000000000..35aca72c1 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/public/css/app.515e4027.css @@ -0,0 +1 @@ +.modal-backdrop{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:rgba(224,224,235,.6);display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;opacity:1;position:fixed;top:0;-webkit-transition:opacity .2s;transition:opacity .2s;width:100%;z-index:666}.application.dark .modal-backdrop{background:rgba(41,41,61,.6)}.modal{background:#fcfcfd;border-radius:8px;-webkit-box-shadow:0 0 1px 1px #e0e0eb,0 2px 4px 0 #e0e0eb;box-shadow:0 0 1px 1px #e0e0eb,0 2px 4px 0 #e0e0eb;max-height:calc(100vh - 20px);overflow:auto;padding:25px}.application.dark .modal{background:#1f1f1f;-webkit-box-shadow:0 0 1px 1px #131315,0 2px 4px 0 #131315;box-shadow:0 0 1px 1px #131315,0 2px 4px 0 #131315}.modal .modal-header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;font-weight:600}.modal .modal-header .header-title{-webkit-box-flex:1;-ms-flex:1;flex:1}.modal .modal-header .header-title .ui-icon{color:#111;margin-right:5px}.application.dark .modal .modal-header .header-title .ui-icon{color:#b2b2b2}.modal .modal-header .header-close{font-size:110%}.modal .modal-header .header-close:hover{color:#258cdb}.application.dark .modal .modal-header .header-close:hover{color:#f27e02}.modal-enter,.modal-leave-to{opacity:0}.credits-modal{font-size:13px;max-height:450px;max-width:600px;padding-top:10px;width:90vw}.credits-modal .credits-section{margin-bottom:35px}.credits-modal h1{font-size:180%;font-weight:600;margin-bottom:0;text-align:center}.credits-modal h2{font-size:120%;font-weight:600;margin-bottom:10px;margin-left:56px;margin-top:30px}.credits-modal .credits-version{font-size:85%;margin-top:2px;text-align:center}.credits-modal .credits-authors,.credits-modal .credits-contributors,.credits-modal .credits-sponsors{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:10px}.credits-modal .credits-authors .authors-author,.credits-modal .credits-contributors .authors-author,.credits-modal .credits-sponsors .authors-author{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%}.credits-modal .credits-authors .authors-author .author-avatar,.credits-modal .credits-contributors .authors-author .author-avatar,.credits-modal .credits-sponsors .authors-author .author-avatar{margin-right:12px}.credits-modal .credits-authors .authors-author .author-name,.credits-modal .credits-contributors .authors-author .author-name,.credits-modal .credits-sponsors .authors-author .author-name{font-size:110%;font-weight:500;margin-bottom:4px}.credits-modal .credits-authors .authors-author .author-links,.credits-modal .credits-contributors .authors-author .author-links,.credits-modal .credits-sponsors .authors-author .author-links{font-size:110%}.credits-modal .credits-authors .authors-author .author-links a,.credits-modal .credits-contributors .authors-author .author-links a,.credits-modal .credits-sponsors .authors-author .author-links a{margin-right:6px}.credits-modal .credits-authors .author-avatar,.credits-modal .credits-authors .contributor-avatar,.credits-modal .credits-authors .sponsor-avatar,.credits-modal .credits-contributors .author-avatar,.credits-modal .credits-contributors .contributor-avatar,.credits-modal .credits-contributors .sponsor-avatar,.credits-modal .credits-sponsors .author-avatar,.credits-modal .credits-sponsors .contributor-avatar,.credits-modal .credits-sponsors .sponsor-avatar{background-color:#fff;background-size:cover;border-radius:50%;height:38px;margin:6px;width:38px}.credits-modal .credits-dependencies{padding-bottom:40px;text-align:center}.credits-modal .credits-dependencies h3{font-size:100%;margin-top:20px}.credits-modal .credits-dependencies a{text-decoration:none}.credits-modal .credits-dependencies .dependencies-dependency{margin-bottom:10px}.content-request{font-size:130%;margin-top:-46px;padding:15px 15px 61px}.content-request .counters-row{margin-bottom:0!important;margin-top:10px}.content-request .request-details,.content-request .request-main{overflow:hidden;text-overflow:ellipsis}.content-request .request-alerts.alert-errors{color:#b3492e}.application.dark .content-request .request-alerts.alert-errors{color:#ed797a}.content-request .request-alerts.alert-warnings{color:#f4bd00}.application.dark .content-request .request-alerts.alert-warnings{color:#fad89f}.content-request .type-text{background:#cbdeec;border-radius:3px;color:#365063;font-size:90%;padding:2px 4px}.application.dark .content-request .type-text{background:#002e52;color:#6ebef7}.content-request .status-text{background:#e3eccb;border-radius:8px;color:#586336;font-size:90%;padding:2px 6px;text-transform:uppercase}.application.dark .content-request .status-text{background:#293800;color:#e3fa9e}.content-request .status-text.client-error{background:#fffae2;color:#a85919}.application.dark .content-request .status-text.client-error{background:#382f00;color:#fad89f}.content-request .status-text.server-error{background:#ffebeb;color:#c51f24}.application.dark .content-request .status-text.server-error{background:#380000;color:#ed797a}.content-request .method-text{color:#696969;font-size:90%;margin-right:8px}.application.dark .content-request .method-text{color:#767676}.popover-container{position:relative}.popover{left:calc(50% - 200px);padding-top:17px;position:absolute;top:100%;width:400px;z-index:666}.popover.left-aligned{left:0;right:auto}.popover.left-aligned .popover-content:before{left:15px;right:auto}.popover.left-aligned .popover-content:after{left:14px;right:auto}.popover.right-aligned{left:auto;right:0}.popover.right-aligned .popover-content:before{left:auto;right:8px}.popover.right-aligned .popover-content:after{left:auto;right:7px}.popover .popover-content{background:#fcfcfd;border-radius:8px;-webkit-box-shadow:0 0 1px 1px #e0e0eb,0 2px 4px 0 #e0e0eb;box-shadow:0 0 1px 1px #e0e0eb,0 2px 4px 0 #e0e0eb;max-height:400px;overflow:auto;padding:5px 0;text-align:center;width:100%}.application.dark .popover .popover-content{background:#252527;-webkit-box-shadow:0 0 1px 1px #131315,0 2px 4px 0 #131315;box-shadow:0 0 1px 1px #131315,0 2px 4px 0 #131315}.popover .popover-content:after,.popover .popover-content:before{border-style:solid;content:"";height:0;position:absolute;width:0}.popover .popover-content:before{border-color:transparent transparent #fcfcfd transparent;border-width:0 11px 11px 11px;left:calc(50% - 10px);top:7px;z-index:500}.application.dark .popover .popover-content:before{border-color:transparent transparent #252527 transparent}.popover .popover-content:after{border-color:transparent transparent rgba(51,51,51,.06) transparent;border-width:0 12px 12px 12px;left:calc(50% - 11px);top:5px}.application.dark .popover .popover-content:after{border-color:transparent transparent rgba(19,19,21,.5) transparent}.exception-section{border-bottom:1px solid #e7e7ef}.application.dark .exception-section{border-bottom:1px solid #343436}.exception-section.compact .exception-info{background:rgba(255,235,235,.9)}.application.dark .exception-section.compact .exception-info{background:rgba(56,0,0,.9)}.exception-section.compact .exception-message{font-size:13px!important}.exception-section.compact .exception-message h3{display:inline;font-size:13px;padding-right:4px}.exception-section.compact .exception-message .ui-icon{margin-right:5px}.exception-section .exception-info{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#ffebeb;color:#c51f24;display:-webkit-box;display:-ms-flexbox;display:flex;padding:6px 10px}.exception-section .exception-info:nth-child(2n){background:#ffe0e0}.exception-section .exception-info:first-child{padding-top:12px}.exception-section .exception-info:last-child{padding-bottom:12px}.application.dark .exception-section .exception-info{background:#380000;color:#ed797a}.application.dark .exception-section .exception-info:nth-child(2n){background:#2e0000}.exception-section .exception-info h3{border-bottom:0;font-size:14px;margin:0 0 5px;word-break:break-all}.exception-section .exception-info .exception-message{-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:12px;line-height:1.33}.exception-section .exception-info .exception-previous,.exception-section .exception-info .exception-trace>a{color:#c51f24;font-size:12px;margin:0 4px}.application.dark .exception-section .exception-info .exception-previous,.application.dark .exception-section .exception-info .exception-trace>a{color:#ed797a}.exception-section .exception-info .exception-previous{margin-right:4px;text-decoration:none}.exception-section .exception-info .exception-trace{display:inline-block}.parent-request{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e7e7ef;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:600;padding:8px 10px}.application.dark .parent-request{border-bottom:1px solid #343436}.parent-request.compact{background:hsla(0,0%,100%,.9)}.application.dark .parent-request.compact{background:rgba(30,30,30,.9)}.parent-request.compact .parent-title{padding-right:4px}.parent-request.compact .parent-name,.parent-request.compact .parent-title{display:inline}.parent-request .parent-title{font-size:10px;margin-bottom:2px}.parent-request .parent-method{color:grey;font-size:90%;font-weight:400;margin-right:2px}.application.dark .parent-request .parent-method{color:#767676}.parent-request .parent-uri{font-weight:400}.parent-request .type-text{background:#cbdeec;border-radius:3px;color:#365063;font-size:80%;margin-right:2px;padding:1px 3px;vertical-align:1px}.application.dark .parent-request .type-text{background:#002e52;color:#6ebef7}.parent-request a{color:#258cdb;font-size:11px;font-weight:400;padding:0 6px;text-decoration:none;text-transform:uppercase}.application.dark .parent-request a{color:#f27e02}.parent-request .parent-close{margin-left:auto}.messages-overlay{border-top:1px solid #d1d1e0;bottom:0;position:absolute;width:100%}.application.dark .messages-overlay{border-top:1px solid #2a2a3c}.messages-overlay .update-notification{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:rgba(227,236,203,.9);color:#586336;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;padding:12px 10px}.application.dark .messages-overlay .update-notification{background:rgba(41,56,0,.9);color:#e3fa9e}.messages-overlay .update-notification .notification-text{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.messages-overlay .update-notification .ui-icon{margin-right:5px}.messages-overlay .update-notification a{color:#586336;font-size:80%;padding:0 6px;text-decoration:none;text-transform:uppercase}.application.dark .messages-overlay .update-notification a{color:#f27e02}.messages-overlay .update-notification strong{font-weight:500}.messages-overlay .update-notification .updateNotification-close{margin-left:auto}.settings-modal{font-size:13px;max-width:600px;padding-top:10px;width:90%}.settings-modal a{padding:0}.settings-modal .controls-group{display:-webkit-box;display:-ms-flexbox;display:flex;margin:22px 0}.settings-modal .controls-group .controls{-webkit-box-flex:1;-ms-flex:1;flex:1}.settings-modal .help-text{font-size:90%;margin-top:8px}.settings-modal label{margin-right:10px;margin-top:5px;text-align:right;width:25%}.settings-modal input,.settings-modal select{border:1px solid #ccc;border-radius:4px;font-size:13px;height:26px;padding:4px 8px;width:100%}.application.dark .settings-modal input,.application.dark .settings-modal select{background:#3f3e3d;border-color:#5d5c5b;color:#e9e9e9}.application.dark .settings-modal input::-webkit-input-placeholder,.application.dark .settings-modal select::-webkit-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .settings-modal input::-moz-placeholder,.application.dark .settings-modal select::-moz-placeholder{color:#a7a6a5;opacity:1}.application.dark .settings-modal input:-ms-input-placeholder,.application.dark .settings-modal select:-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .settings-modal input::-ms-input-placeholder,.application.dark .settings-modal select::-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .settings-modal input::placeholder,.application.dark .settings-modal select::placeholder{color:#a7a6a5;opacity:1}.settings-modal input[type=checkbox],.settings-modal select[type=checkbox]{height:auto;margin:0 3px 0 0;vertical-align:middle;width:auto}.application.dark .settings-modal select{background:#3f3e3d;border:1px solid #5d5c5b;border-radius:5px}.settings-modal .controls-input-vgroup input:first-child{border-radius:4px 4px 0 0}.settings-modal .controls-input-vgroup input:last-child{border-radius:0 0 4px 4px;margin-top:-2px}.settings-modal .controls-checkbox{display:inline-block;margin-bottom:10px;margin-top:0;text-align:left;width:100%}.settings-modal .controls-checkbox:last-child{margin:0}.settings-modal .appearance-controls{display:-webkit-box;display:-ms-flexbox;display:flex}.settings-modal .appearance-controls .option{-webkit-box-flex:0;-ms-flex:0;flex:0;margin-right:12px;text-align:center}.settings-modal .appearance-controls .option.selected img{border:2px solid #258cdb;-webkit-box-shadow:0 0 2px #258cdb;box-shadow:0 0 2px #258cdb}.application.dark .settings-modal .appearance-controls .option.selected img{border:2px solid #f27e02;-webkit-box-shadow:0 0 2px #f27e02;box-shadow:0 0 2px #f27e02}.settings-modal .appearance-controls .option img{border:1px solid #ccc;border-radius:4px;height:50px;width:75px}.application.dark .settings-modal .appearance-controls .option img{border:1px solid #363636}.settings-modal .settings-warning{background:#ffebeb;color:#c51f24;margin-left:-35px;padding:10px 15px;width:calc(100% + 70px)}.settings-modal .settings-warning .warning-text{display:-webkit-box;display:-ms-flexbox;display:flex}.settings-modal .settings-warning .warning-details{font-size:90%;margin-top:5px}.settings-modal .settings-warning .warning-label{border:1px solid #dd888b;border-radius:6px;color:#dd888b;font-size:90%;font-weight:500;margin-right:5px;text-transform:uppercase;padding:1px 3px}.settings-modal .settings-warning a{color:#dd888b;margin-left:auto}.application.dark .settings-modal .settings-warning{background:#380000;color:#ed797a}.application.dark .settings-modal .settings-warning .warning-label{border:1px solid #c3797b;color:#c3797b}.application.dark .settings-modal .settings-warning a{color:#c3797b}.settings-modal .settings-footer{font-size:80%;margin:10px 0;text-align:right;margin-right:-20px}.settings-modal .settings-footer a{text-decoration:none}.sharing-modal{font-size:13px;max-width:320px;padding-top:10px}.sharing-modal .sharing-content{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-8px;margin-top:10px;width:calc(100% + 16px)}.sharing-modal .sharing-content .content-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#f2f2f2;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin:8px 8px;max-width:152px;padding:5px 10px;width:100%}.application.dark .sharing-modal .sharing-content .content-item{background:#252527}.sharing-modal .sharing-content .content-item:hover{color:#258cdb}.application.dark .sharing-modal .sharing-content .content-item:hover{color:#d46f02}.sharing-modal .sharing-content .content-item.active{background:#2786f3;color:#f5f5f5}.application.dark .sharing-modal .sharing-content .content-item.active{background:#d46f02;color:#fff}.sharing-modal .sharing-content .content-item.unavailable{opacity:.33}.sharing-modal .sharing-content .content-item.item-all{font-size:14px;margin:8px 22%;max-width:60%;text-align:center}.sharing-modal .sharing-content .content-item .ui-icon{margin-right:5px}.sharing-modal .sharing-content .content-item .item-text{-webkit-box-flex:1;-ms-flex:1;flex:1}.sharing-modal .sharing-content .content-item input{display:none}.sharing-modal .error-message{text-align:center}.sharing-modal .button{margin:30px auto 10px;max-width:60%}.sharing-modal .button .sk-spinner{margin-right:6px}.sharing-modal .sharing-terms h1{font-size:200%;margin:0;text-align:center}.sharing-modal .sharing-terms h2{font-size:110%;margin-top:25px}.sharing-modal .sharing-terms ul{margin-bottom:25px;padding-left:20px}.sharing-modal .sharing-terms ul li{font-size:95%;margin-bottom:8px}.sharing-modal .sharing-terms .button{margin-top:35px}.delete-shared-modal{font-size:13px;max-width:320px;padding-top:10px}.delete-shared-modal h1{font-size:200%;text-align:center}.delete-shared-modal .button{margin:30px auto 10px;max-width:60%}.delete-shared-modal .button .sk-spinner{margin-right:6px}.details-header-tab{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #d1d1e0;border-left:1px solid transparent;border-right:1px solid #d1d1e0;color:#404040;cursor:default;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:12px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:0 12px;text-align:center;text-decoration:none;-webkit-transition:all .1s;transition:all .1s}.application.dark .details-header-tab{border-bottom:1px solid #2a2a3c;border-right:1px solid #2a2a3c;color:#9e9e9e}.details-header-tab:first-child{border-left:1px solid #d1d1e0}.application.dark .details-header-tab:first-child{border-left:1px solid #2a2a3c}.details-header-tab:hover{background:#e3e3ed;color:#258cdb}.application.dark .details-header-tab:hover{background:#191924}.details-header-tab.active{background:#f6f6f9;border-bottom:0;border-right:1px solid #d1d1e0;color:#258cdb;margin-bottom:-1px;padding-bottom:1px}.application.dark .details-header-tab.active{background:#252527;color:#f27e02}.details-header-tab.active .tab-badge{background:transparent;border:1px solid #258cdb;color:#258cdb}.details-header-tab.full{min-width:40px}.details-header-tab.short{-webkit-box-flex:0;-ms-flex:0;flex:0;width:40px}.details-header-tab.short .ui-icon{margin-right:0}.details-header-tab .ui-icon{-ms-flex-negative:0;flex-shrink:0;margin-right:5px}.details-header-tab .tab-title{overflow:hidden;text-overflow:ellipsis}.details-header-tab .tab-badge{background:#9d9daf;border:1px solid #9d9daf;border-radius:6px;color:#f5f5f5;font-size:90%;margin-left:5px;margin-top:1px;padding:0 4px}.details-table{background:#fcfcfd;border-radius:8px;-webkit-box-shadow:0 0 0 1px #e0e0eb,0 2px 2px 0 #e0e0eb;box-shadow:0 0 0 1px #e0e0eb,0 2px 2px 0 #e0e0eb;margin-bottom:20px;padding-bottom:10px}.application.dark .details-table{background:#252527;-webkit-box-shadow:0 0 0 1px #15151e,0 2px 2px 0 #15151e;box-shadow:0 0 0 1px #15151e,0 2px 2px 0 #15151e}.details-table .table-header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:8px 8px 0 0;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:8px 8px 8px 12px}.application.dark .details-table .table-header{background:#252527}.details-table .table-header .header-title{-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:13px;font-weight:600;margin-right:10px;white-space:nowrap}.details-table .table-header .header-title .ui-icon{color:#111;margin-right:5px}.application.dark .details-table .table-header .header-title .ui-icon{color:#b2b2b2}.details-table .table-header .header-title .title-badge{background:#2786f3;color:#f5f5f5;border-radius:8px;margin-left:4px;padding:1px 8px}.application.dark .details-table .table-header .header-title .title-badge{background:#d46f02;color:#fff}.details-table .table-header .header-group{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;margin-right:12px}.details-table .table-header .header-group:last-child{margin-right:0}.details-table .table-header .header-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;height:24px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:4px;text-decoration:none;width:24px}.application.dark .details-table .table-header .header-item{color:#9e9e9e}.details-table .table-header .header-item:hover{color:#258cdb}.application.dark .details-table .table-header .header-item:hover{color:#d46f02}.details-table .table-header .header-item:last-child{margin-right:0}.details-table .table-header .header-item.active{background:#2786f3;color:#f5f5f5}.application.dark .details-table .table-header .header-item.active{background:#d46f02;color:#fff}.details-table .table-header .header-item.item-text{font-size:12px;min-width:24px;padding:0 4px;width:auto}.details-table .table-header .header-toggle{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#eee;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:95%;height:24px;padding:0 8px}.application.dark .details-table .table-header .header-toggle{background:#3f3e3d}.details-table .table-header .header-toggle input{margin:0 5px 0 0}.details-table .table-header .header-search{position:relative}.details-table .table-header .header-search input{background:#eee;border:0;border-radius:4px;font-size:13px;height:24px;max-width:180px;padding-left:28px;width:100%}.application.dark .details-table .table-header .header-search input{background:#3f3e3d;color:#e9e9e9}.application.dark .details-table .table-header .header-search input::-webkit-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .details-table .table-header .header-search input::-moz-placeholder{color:#a7a6a5;opacity:1}.application.dark .details-table .table-header .header-search input:-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .details-table .table-header .header-search input::-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .details-table .table-header .header-search input::placeholder{color:#a7a6a5;opacity:1}.details-table .table-header .header-search .ui-icon{left:7px;position:absolute;top:5px}.details-table table{font-size:12px}.details-table table thead .ui-icon{font-size:110%}.details-table table tr:nth-child(2n){background:#f3f3f7}.application.dark .details-table table tr:nth-child(2n){background:#202022}.details-table table th{color:#333;font-size:90%;font-weight:600;padding:8px 6px;text-align:center;white-space:nowrap}.application.dark .details-table table th{color:#b2b2b2}.details-table table th:first-child{padding-left:12px}.details-table table th:last-child{padding-right:12px}.details-table table td{padding:8px 10px;vertical-align:top}.details-table table td:first-child{padding-left:12px}.details-table table td:last-child{padding-right:12px}.details-table table td.key{font-size:12px;white-space:nowrap}.details-table table td.value{word-break:break-all}.details-table .pagination-controls{background:transparent}.details-table .pagination-controls td{text-align:center}.details-table .pagination-controls a{color:#258cdb;text-decoration:none}.application.dark .details-table .pagination-controls a{color:#f27e02}.highlighted-code{line-height:1.4;margin:0;white-space:pre-wrap}.highlighted-code .language-sql .keyword{font-weight:600;text-transform:uppercase}.highlighted-code .language-sql .function{color:#881280}.highlighted-code .language-sql .number{color:#1c00cf}.highlighted-code .language-sql .string{color:#c41a16}.highlighted-code .language-sql .punctuation{color:grey}.highlighted-code .language-sql .boolean,.highlighted-code .language-sql .operator{color:#132ba2}.application.dark .highlighted-code .language-sql .function{color:#e36eec}.application.dark .highlighted-code .language-sql .number{color:#997fff}.application.dark .highlighted-code .language-sql .string{color:#e33e3a}.application.dark .highlighted-code .language-sql .punctuation{color:#7f7f7f}.application.dark .highlighted-code .language-sql .boolean,.application.dark .highlighted-code .language-sql .operator{color:#8296ff}.counter.database-slow-query .has-mark:before{background-color:#d7a175}.application.dark .counter.database-slow-query .has-mark:before{background-color:#8a6c38}.details-table table tr.database-slow-query{background:#fffae2;color:#a85919}.details-table table tr.database-slow-query:nth-child(2n){background:#fff5c2!important}.details-table table tr.database-slow-query .database-query-path>a{color:#d7a175!important}.application.dark .details-table table tr.database-slow-query{background:#382f00;color:#fad89f}.application.dark .details-table table tr.database-slow-query:nth-child(2n){background:#2e2600!important}.application.dark .details-table table tr.database-slow-query .database-query-path>a{color:#ae8847!important}.details-table table .database-query-bindings{margin-top:2px}.details-table .log-row.error{background:#ffebeb;color:#c51f24}.details-table .log-row.error:nth-child(2n){background:#ffe0e0}.details-table .log-row.error .log-message-path{color:#dd888b}.application.dark .details-table .log-row.error{background:#380000;color:#ed797a}.application.dark .details-table .log-row.error:nth-child(2n){background:#2e0000}.application.dark .details-table .log-row.error .log-message-path{color:#c3797b}.details-table .log-row.warning{background:#fffae2;color:#a85919}.details-table .log-row.warning:nth-child(2n){background:#fff5c2}.details-table .log-row.warning .log-message-path{color:#d7a175}.application.dark .details-table .log-row.warning{background:#382f00;color:#fad89f}.application.dark .details-table .log-row.warning:nth-child(2n){background:#2e2600}.application.dark .details-table .log-row.warning .log-message-path{color:#d0b78b}.details-table .log-date,.details-table .log-level{width:70px}.details-table .log-message{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.details-table .log-message .log-message-content{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:100%}.details-table .log-message .log-message-content .linkified{text-decoration:none}.details-table .log-message .log-message-exception{-webkit-box-flex:0;-ms-flex:0;flex:0;font-size:90%;margin:3px 5px 0 0;white-space:nowrap}.details-table .log-message .log-message-exception .exception-previous{border:1px solid #aaa;border-radius:4px;text-decoration:none;padding:2px 4px;margin-right:5px}.application.dark .details-table .log-message .log-message-exception .exception-previous{border-color:grey}.details-table .log-message .log-message-context{margin-top:4px}.details-table .log-message .log-message-path{color:#aaa;-webkit-box-flex:0;-ms-flex:0;flex:0;font-size:90%;margin-top:3px}.application.dark .details-table .log-message .log-message-path{color:#777}.models-counters .counter-retrieved .has-mark:before{background:#78b1de}.application.dark .models-counters .counter-retrieved .has-mark:before{background:#649dca}.models-counters .counter-created .has-mark:before{background:#b1ca6d}.application.dark .models-counters .counter-created .has-mark:before{background:#9db659}.models-counters .counter-updated .has-mark:before{background:#d4c163}.application.dark .models-counters .counter-updated .has-mark:before{background:#b68258}.models-counters .counter-deleted .has-mark:before{background:#e79697}.application.dark .models-counters .counter-deleted .has-mark:before{background:#d38283}.models-tabs{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:10px;margin-top:30px}.models-tabs,.models-tabs .models-tab{display:-webkit-box;display:-ms-flexbox;display:flex}.models-tabs .models-tab{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:12px;color:#404040;cursor:default;font-size:12px;line-height:26px;padding:0 26px;text-align:center;text-decoration:none}.application.dark .models-tabs .models-tab{color:#9e9e9e}.models-tabs .models-tab:hover{color:#258cdb}.application.dark .models-tabs .models-tab:hover{color:#f27e02}.models-tabs .models-tab.active{background:#2786f3;color:#f5f5f5}.application.dark .models-tabs .models-tab.active{background:#d46f02;color:#fff}.models-tabs .models-tab .ui-icon{margin-right:5px}.models-actions .actions-action .action-model{width:100%}.models-actions .actions-action .action-model .model-content{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.models-actions .actions-action .action-model .model-content .content-trace{margin-left:auto}.models-actions .actions-action .action-key{color:grey;font-size:11px}.application.dark .models-actions .actions-action .action-key{color:#767676}.models-actions .actions-action .action-key .key-hash{margin:0 1px 0 2px}.models-actions .actions-action .action-action{background:#cbdeec;border-radius:8px;color:#365063;font-size:10px;padding:3px 8px;text-transform:uppercase}.application.dark .models-actions .actions-action .action-action{background:#002e52;color:#6ebef7}.models-actions .actions-action .action-action.action-created{background:#e3eccb;color:#586336}.application.dark .models-actions .actions-action .action-action.action-created{background:#293800;color:#e3fa9e}.models-actions .actions-action .action-action.action-updated{background:#fffae2;color:#a85919}.application.dark .models-actions .actions-action .action-action.action-updated{background:#382f00;color:#fad89f}.models-actions .actions-action .action-action.action-deleted{background:#ffebeb;color:#c51f24}.application.dark .models-actions .actions-action .action-action.action-deleted{background:#380000;color:#ed797a}.models-actions .actions-details td{padding:0 20px 10px!important}.models-actions .actions-details h4{color:#333;font-size:90%;font-weight:600;margin:0 0 3px}.application.dark .models-actions .actions-details h4{color:#b2b2b2}.models-actions .actions-details .details-row{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:12px}.models-actions .actions-details .details-row:first-child{margin-top:6px}.models-actions .actions-details .details-row .row-group{margin-right:15px}.models-actions .actions-details .details-row .row-group:last-child{margin-right:0}.models-actions .actions-details .details-row .row-group.group-query{-webkit-box-flex:1;-ms-flex:1;flex:1}.models-actions tr{background:#fcfcfd!important}.application.dark .models-actions tr{background:#252527!important}.models-actions tr:nth-child(4n),.models-actions tr:nth-child(4n-1){background:#f3f3f7!important}.application.dark .models-actions tr:nth-child(4n),.application.dark .models-actions tr:nth-child(4n-1){background:#202022!important}.models-counts .counts-model{width:100%}.models-counts .counts-count{text-align:center}.models-counts .count-text{background:#cbdeec;border-radius:8px;color:#365063;font-size:11px;padding:3px 8px;text-transform:uppercase}.application.dark .models-counts .count-text{background:#002e52;color:#6ebef7}.models-counts .count-text.count-created{background:#e3eccb;color:#586336}.application.dark .models-counts .count-text.count-created{background:#293800;color:#e3fa9e}.models-counts .count-text.count-updated{background:#fffae2;color:#a85919}.application.dark .models-counts .count-text.count-updated{background:#382f00;color:#fad89f}.models-counts .count-text.count-deleted{background:#ffebeb;color:#c51f24}.application.dark .models-counts .count-text.count-deleted{background:#380000;color:#ed797a}.email-message{font-size:13px;margin:0 auto;max-width:820px;width:100vw}.email-message .message-info{margin:15px 0}.email-message .message-info .info-row{margin-bottom:5px}.email-message .message-info .info-row .row-label{color:#333;font-size:90%;font-weight:600;padding-right:2px}.application.dark .email-message .message-info .info-row .row-label{color:#b2b2b2}.email-message .message-content{border-bottom:1px solid #e7e7ef;border-top:1px solid #e7e7ef;margin-left:-25px;width:calc(100% + 50px)}.application.dark .email-message .message-content{border-bottom:1px solid #343436;border-top:1px solid #343436}.email-message .message-content iframe{border:0;min-height:70vh;width:100%}.notifications-notifications .notification-subject{width:100%}.notifications-notifications .notification-subject .subject-content{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.notifications-notifications .notification-subject .subject-content .content-trace{margin-left:auto}.notifications-notifications .notification-actions{white-space:nowrap}.notifications-notifications .notification-actions a{margin-left:5px}.notifications-notifications .notifications-details td{padding:0 20px 10px!important}.notifications-notifications .notifications-details h4{color:#333;font-size:90%;font-weight:600;margin:0 0 3px}.application.dark .notifications-notifications .notifications-details h4{color:#b2b2b2}.notifications-notifications .notifications-details .details-row{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:12px}.notifications-notifications .notifications-details .details-row:first-child{margin-top:6px}.notifications-notifications .notifications-details .details-row .row-group{margin-right:15px}.notifications-notifications .notifications-details .details-row .row-group:last-child{margin-right:0}.notifications-notifications .notifications-details .details-row .row-group.group-query{-webkit-box-flex:1;-ms-flex:1;flex:1}.notifications-notifications tr{background:#fcfcfd!important}.application.dark .notifications-notifications tr{background:#252527!important}.notifications-notifications tr:nth-child(4n),.notifications-notifications tr:nth-child(4n-1){background:#f3f3f7!important}.application.dark .notifications-notifications tr:nth-child(4n),.application.dark .notifications-notifications tr:nth-child(4n-1){background:#202022!important}.command-output{background:#333;border-radius:6px;font-family:Menlo,monospace;overflow:auto;padding:16px 12px;white-space:pre}.application.dark .command-output{background:#111}.performance-chart{background:#414148;border-radius:3px;-webkit-box-shadow:0 2px 5px rgba(162,172,180,.25),0 0 2px rgba(162,172,180,.5);box-shadow:0 2px 5px rgba(162,172,180,.25),0 0 2px rgba(162,172,180,.5);display:-webkit-box;display:-ms-flexbox;display:flex;height:6px;margin:0 auto 20px;width:calc(100% - 2px)}.application.dark .performance-chart{background:#7e7e8b;-webkit-box-shadow:0 0 1px 1px #131315,0 2px 4px 0 #131315;box-shadow:0 0 1px 1px #131315,0 2px 4px 0 #131315}.performance-chart .chart-section{height:100%}.performance-chart .chart-section:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.performance-chart .chart-section:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.performance-chart .chart-section.section-blue{background:-webkit-gradient(linear,left top,left bottom,from(#6faef6),to(#2685f2));background:linear-gradient(180deg,#6faef6,#2685f2)}.performance-chart .chart-section.section-red{background:-webkit-gradient(linear,left top,left bottom,from(#de8788),to(#ce4b4d));background:linear-gradient(180deg,#de8788,#ce4b4d)}.performance-chart .chart-section.section-green{background:-webkit-gradient(linear,left top,left bottom,from(#77ce64),to(#4dae37));background:linear-gradient(180deg,#77ce64,#4dae37)}.performance-chart .chart-section.section-purple{background:-webkit-gradient(linear,left top,left bottom,from(#b787de),to(#934bce));background:linear-gradient(180deg,#b787de,#934bce)}.performance-chart .chart-section.section-grey{background:-webkit-gradient(linear,left top,left bottom,from(#9999a3),to(#414148));background:linear-gradient(180deg,#9999a3,#414148)}.application.dark .performance-chart .chart-section.section-blue{background:-webkit-gradient(linear,left top,left bottom,from(#4b94e7),to(#1d79e2));background:linear-gradient(180deg,#4b94e7,#1d79e2)}.application.dark .performance-chart .chart-section.section-red{background:-webkit-gradient(linear,left top,left bottom,from(#c76b6d),to(#b94648));background:linear-gradient(180deg,#c76b6d,#b94648)}.application.dark .performance-chart .chart-section.section-green{background:-webkit-gradient(linear,left top,left bottom,from(#5fb34d),to(#4c8f3d));background:linear-gradient(180deg,#5fb34d,#4c8f3d)}.application.dark .performance-chart .chart-section.section-purple{background:-webkit-gradient(linear,left top,left bottom,from(#9e6bc7),to(#8546b9));background:linear-gradient(180deg,#9e6bc7,#8546b9)}.application.dark .performance-chart .chart-section.section-grey{background:-webkit-gradient(linear,left top,left bottom,from(#94949e),to(#61616b));background:linear-gradient(180deg,#94949e,#61616b)}.performance-vitals tbody tr:first-child .vitals-row{margin-top:10px}.performance-vitals .vitals-row{margin:0 auto;max-width:600px}.performance-vitals .vitals-metric,.performance-vitals .vitals-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.performance-vitals .vitals-metric{-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:500;padding:12px 24px;width:50%}.performance-vitals .vitals-metric:first-child{border-right:1px solid #e7e7ef}.application.dark .performance-vitals .vitals-metric:first-child{border-right:1px solid #343436}.performance-vitals .vitals-metric .metric-value{border-radius:8px;font-size:95%;margin-left:auto;padding:2px 6px}.performance-vitals .vitals-metric .metric-value.value-fast{background:#e3eccb;color:#586336}.application.dark .performance-vitals .vitals-metric .metric-value.value-fast{background:#293800;color:#e3fa9e}.performance-vitals .vitals-metric .metric-value.value-moderate{background:#fff6cc;color:#a85919}.application.dark .performance-vitals .vitals-metric .metric-value.value-moderate{background:#382f00;color:#fad89f}.performance-vitals .vitals-metric .metric-value.value-slow{background:#ffebeb;color:#c51f24}.application.dark .performance-vitals .vitals-metric .metric-value.value-slow{background:#380000;color:#ed797a}.performance-vitals .vitals-metric .metric-info{color:grey;font-weight:400;margin-top:10px;width:100%}.performance-vitals .vitals-metric .metric-info a{color:grey;display:block;margin-top:5px}.profiler .profiler-metric{white-space:nowrap}.profiler .profiler-function{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.profiler .profiler-function .profiler-function-name{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;word-break:break-all}.profiler .profiler-function .profiler-path{color:#aaa;-webkit-box-flex:0;-ms-flex:0;flex:0;font-size:90%;margin-top:3px}.profiler .profiler-content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:14px;padding:80px 0;text-align:center;width:100%}.profiler .profiler-content h1{font-size:110%}.timeline .table-header{padding-bottom:10px}.timeline table{table-layout:fixed}.timeline .timeline-description,.timeline .timeline-timing{display:none}.timeline .timeline-description .description-content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;word-break:break-word}.timeline .timeline-description .description-tags{font-size:95%;margin-right:5px;opacity:.7}.timeline .timeline-timing{padding-right:10px!important;text-align:right;width:80px}.timeline .timeline-timing.timing-total{font-weight:600}.timeline .timeline-size-monitor td{padding-bottom:0;padding-top:0}.timeline .timeline-chart{padding:8px!important}.timeline .timeline-chart .chart-event-group{cursor:pointer;height:16px;position:relative}.timeline .timeline-chart .chart-event-group .group-label{color:#365063;font-size:12px;line-height:16px;overflow:hidden;padding:0 6px;position:absolute;text-overflow:ellipsis;white-space:nowrap;z-index:100}.timeline .timeline-chart .chart-event-group .group-label .label-tags{font-size:95%;opacity:.8}.timeline .timeline-chart .chart-event-group .group-label.inside{color:#fff!important;text-align:center;width:100%!important}.timeline .timeline-chart .chart-event-group .group-label.before{right:100%;text-align:right}.timeline .timeline-chart .chart-event-group .group-label.after{left:100%}.timeline .timeline-chart .chart-event-group .group-label.blue{color:#2685f2}.timeline .timeline-chart .chart-event-group .group-label.red{color:#ce4b4d}.timeline .timeline-chart .chart-event-group .group-label.green{color:#4dae37}.timeline .timeline-chart .chart-event-group .group-label.purple{color:#934bce}.timeline .timeline-chart .chart-event-group .group-label.grey{color:#494950}.application.dark .timeline .timeline-chart .chart-event-group .group-label.blue{color:#4493ee}.application.dark .timeline .timeline-chart .chart-event-group .group-label.red{color:#ce6466}.application.dark .timeline .timeline-chart .chart-event-group .group-label.green{color:#5abb44}.application.dark .timeline .timeline-chart .chart-event-group .group-label.purple{color:#9e64ce}.application.dark .timeline .timeline-chart .chart-event-group .group-label.grey{color:#797986}.timeline .timeline-chart .group-event{height:100%;position:absolute}.timeline .timeline-chart .group-event .event-bar{background:#4295c5;border-radius:3px;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.application.dark .timeline .timeline-chart .group-event .event-bar{background:#649dca}.timeline .timeline-chart .group-event .event-bar .bar-light{height:100%;position:absolute}.timeline .timeline-chart .group-event.blue .event-bar{background:#2685f2}.timeline .timeline-chart .group-event.blue .event-bar .bar-light{background:#6faef6}.timeline .timeline-chart .group-event.red .event-bar{background:#ce4b4d}.timeline .timeline-chart .group-event.red .event-bar .bar-light{background:#de8788}.timeline .timeline-chart .group-event.green .event-bar{background:#4dae37}.timeline .timeline-chart .group-event.green .event-bar .bar-light{background:#77ce64}.timeline .timeline-chart .group-event.purple .event-bar{background:#934bce}.timeline .timeline-chart .group-event.purple .event-bar .bar-light{background:#b787de}.timeline .timeline-chart .group-event.grey .event-bar{background:#494950}.timeline .timeline-chart .group-event.grey .event-bar .bar-light{background:#a1a1aa}.application.dark .timeline .timeline-chart .group-event.blue .event-bar{background:#4493ee}.application.dark .timeline .timeline-chart .group-event.blue .event-bar .bar-light{background:#126cd3}.application.dark .timeline .timeline-chart .group-event.red .event-bar{background:#ce6466}.application.dark .timeline .timeline-chart .group-event.red .event-bar .bar-light{background:#ae3739}.application.dark .timeline .timeline-chart .group-event.green .event-bar{background:#5abb44}.application.dark .timeline .timeline-chart .group-event.green .event-bar .bar-light{background:#3f832f}.application.dark .timeline .timeline-chart .group-event.purple .event-bar{background:#9e64ce}.application.dark .timeline .timeline-chart .group-event.purple .event-bar .bar-light{background:#7937ae}.application.dark .timeline .timeline-chart .group-event.grey .event-bar{background:#797986}.application.dark .timeline .timeline-chart .group-event.grey .event-bar .bar-light{background:#494950}.timeline .timeline-popover .popover-content{padding-bottom:0}.timeline .timeline-popover .popover-event{border-bottom:1px solid rgba(51,51,51,.1);margin-bottom:5px}.application.dark .timeline .timeline-popover .popover-event{border-color:hsla(0,0%,93.3%,.1)}.timeline .timeline-popover .popover-event:last-child{border-bottom:0;margin-bottom:0}.timeline .timeline-popover .popover-event .event-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:12px 12px 14px}.timeline .timeline-popover .popover-event .event-header h1{-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:110%;margin:0;text-align:left}.timeline .timeline-popover .popover-event .event-header .header-tags{color:#777}.timeline .timeline-popover .popover-event .event-description{background:rgba(51,51,51,.03);border-top:1px solid rgba(51,51,51,.1);padding:12px;text-align:left}.application.dark .timeline .timeline-popover .popover-event .event-description{background:hsla(0,0%,86.7%,.03);border-color:hsla(0,0%,93.3%,.1)}.timeline .timeline-popover .popover-event .event-timings{border-top:1px solid rgba(51,51,51,.1);display:-webkit-box;display:-ms-flexbox;display:flex}.application.dark .timeline .timeline-popover .popover-event .event-timings{border-color:hsla(0,0%,93.3%,.1)}.timeline .timeline-popover .popover-event .event-timings .timings-timing{border-right:1px solid rgba(51,51,51,.1);-webkit-box-flex:1;-ms-flex:1;flex:1;padding:10px 0}.application.dark .timeline .timeline-popover .popover-event .event-timings .timings-timing{border-color:hsla(0,0%,93.3%,.1)}.timeline .timeline-popover .popover-event .event-timings .timings-timing:last-child{border-right:0}.timeline .timeline-popover .popover-event .event-timings .timings-timing .timing-value{font-size:110%}.timeline .timeline-popover .popover-event .event-timings .timings-timing .timing-label{color:#777;margin-top:5px;font-size:95%}.timeline .timeline-popover .popover-event .event-timings .timings-timing .timing-label:before{content:"";display:inline-block;border-radius:5px;background:#4295c5;width:14px;height:8px;vertical-align:0}.application.dark .timeline .timeline-popover .popover-event .event-timings .timings-timing .timing-label:before{background:#649dca}.timeline .timeline-popover .popover-event .event-timings .timings-timing.timing-total .timing-value{font-weight:600}.timeline .timeline-popover .popover-event .event-timings .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#4295c5),color-stop(50%,#78b1de));background:linear-gradient(90deg,#4295c5 50%,#78b1de 0)}.application.dark .timeline .timeline-popover .popover-event .event-timings .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#649dca),color-stop(50%,#2e81b1));background:linear-gradient(90deg,#649dca 50%,#2e81b1 0)}.timeline .timeline-popover .popover-event .event-timings .timings-timing.timing-children .timing-label:before{background:#78b1de}.application.dark .timeline .timeline-popover .popover-event .event-timings .timings-timing.timing-children .timing-label:before{background:#2e81b1}.timeline .timeline-popover .popover-event.blue .timings-timing .timing-label:before{background:#2685f2}.timeline .timeline-popover .popover-event.blue .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#2685f2),color-stop(50%,#6faef6));background:linear-gradient(90deg,#2685f2 50%,#6faef6 0)}.timeline .timeline-popover .popover-event.blue .timings-timing.timing-children .timing-label:before{background:#6faef6}.timeline .timeline-popover .popover-event.red .timings-timing .timing-label:before{background:#ce4b4d}.timeline .timeline-popover .popover-event.red .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#ce4b4d),color-stop(50%,#de8788));background:linear-gradient(90deg,#ce4b4d 50%,#de8788 0)}.timeline .timeline-popover .popover-event.red .timings-timing.timing-children .timing-label:before{background:#de8788}.timeline .timeline-popover .popover-event.green .timings-timing .timing-label:before{background:#4dae37}.timeline .timeline-popover .popover-event.green .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#4dae37),color-stop(50%,#77ce64));background:linear-gradient(90deg,#4dae37 50%,#77ce64 0)}.timeline .timeline-popover .popover-event.green .timings-timing.timing-children .timing-label:before{background:#77ce64}.timeline .timeline-popover .popover-event.purple .timings-timing .timing-label:before{background:#934bce}.timeline .timeline-popover .popover-event.purple .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#934bce),color-stop(50%,#b787de));background:linear-gradient(90deg,#934bce 50%,#b787de 0)}.timeline .timeline-popover .popover-event.purple .timings-timing.timing-children .timing-label:before{background:#b787de}.timeline .timeline-popover .popover-event.grey .timings-timing .timing-label:before{background:#494950}.timeline .timeline-popover .popover-event.grey .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#494950),color-stop(50%,#a1a1aa));background:linear-gradient(90deg,#494950 50%,#a1a1aa 0)}.timeline .timeline-popover .popover-event.grey .timings-timing.timing-children .timing-label:before{background:#a1a1aa}.application.dark .timeline .timeline-popover .popover-event.blue .timings-timing .timing-label:before{background:#4493ee}.application.dark .timeline .timeline-popover .popover-event.blue .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#4493ee),color-stop(50%,#126cd3));background:linear-gradient(90deg,#4493ee 50%,#126cd3 0)}.application.dark .timeline .timeline-popover .popover-event.blue .timings-timing.timing-children .timing-label:before{background:#126cd3}.application.dark .timeline .timeline-popover .popover-event.red .timings-timing .timing-label:before{background:#ce6466}.application.dark .timeline .timeline-popover .popover-event.red .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#ce6466),color-stop(50%,#ae3739));background:linear-gradient(90deg,#ce6466 50%,#ae3739 0)}.application.dark .timeline .timeline-popover .popover-event.red .timings-timing.timing-children .timing-label:before{background:#ae3739}.application.dark .timeline .timeline-popover .popover-event.green .timings-timing .timing-label:before{background:#5abb44}.application.dark .timeline .timeline-popover .popover-event.green .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#5abb44),color-stop(50%,#3f832f));background:linear-gradient(90deg,#5abb44 50%,#3f832f 0)}.application.dark .timeline .timeline-popover .popover-event.green .timings-timing.timing-children .timing-label:before{background:#3f832f}.application.dark .timeline .timeline-popover .popover-event.purple .timings-timing .timing-label:before{background:#9e64ce}.application.dark .timeline .timeline-popover .popover-event.purple .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#9e64ce),color-stop(50%,#7937ae));background:linear-gradient(90deg,#9e64ce 50%,#7937ae 0)}.application.dark .timeline .timeline-popover .popover-event.purple .timings-timing.timing-children .timing-label:before{background:#7937ae}.application.dark .timeline .timeline-popover .popover-event.grey .timings-timing .timing-label:before{background:#797986}.application.dark .timeline .timeline-popover .popover-event.grey .timings-timing.timing-total .timing-label:before{background:-webkit-gradient(linear,left top,right top,color-stop(50%,#797986),color-stop(50%,#494950));background:linear-gradient(90deg,#797986 50%,#494950 0)}.application.dark .timeline .timeline-popover .popover-event.grey .timings-timing.timing-children .timing-label:before{background:#494950}.timeline.show-details .timeline-description,.timeline.show-details .timeline-timing{display:table-cell}.timeline.show-details .timeline-chart{width:20%}.timeline.show-details .timeline-chart .chart-event-group .group-label{display:none}.performance-metrics{margin-bottom:15px!important}.performance-chart-legend .mark-blue:before{background:#2685f2}.performance-chart-legend .mark-red:before{background:#ce4b4d}.performance-chart-legend .mark-green:before{background:#4dae37}.performance-chart-legend .mark-purple:before{background:#934bce}.performance-chart-legend .mark-grey:before{background:#414148}.application.dark .performance-chart-legend .mark-blue:before{background:#4b94e7}.application.dark .performance-chart-legend .mark-red:before{background:#c76b6d}.application.dark .performance-chart-legend .mark-green:before{background:#5fb34d}.application.dark .performance-chart-legend .mark-purple:before{background:#9e6bc7}.application.dark .performance-chart-legend .mark-grey:before{background:#94949e}.performance-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:10px;margin-top:30px}.performance-tabs .performance-tab{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:12px;color:#404040;cursor:default;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;line-height:26px;padding:0 26px;text-align:center;text-decoration:none}.application.dark .performance-tabs .performance-tab{color:#9e9e9e}.performance-tabs .performance-tab:hover{color:#258cdb}.application.dark .performance-tabs .performance-tab:hover{color:#f27e02}.performance-tabs .performance-tab.active{background:#2786f3;color:#f5f5f5}.application.dark .performance-tabs .performance-tab.active{background:#d46f02;color:#fff}.performance-tabs .performance-tab .ui-icon{margin-right:5px}.job-options[data-v-51ab4b8e]{margin:2px 0;width:100%}.job-options span[data-v-51ab4b8e]{display:block;white-space:nowrap}.job-status-text[data-v-51ab4b8e]{background:#fffae2;border-radius:8px;color:#a85919;font-size:11px;padding:2px 8px;text-transform:uppercase}.application.dark .job-status-text[data-v-51ab4b8e]{background:#382f00;color:#fad89f}.job-status-text.is-success[data-v-51ab4b8e]{background:#e3eccb;color:#586336}.application.dark .job-status-text.is-success[data-v-51ab4b8e]{background:#293800;color:#e3fa9e}.job-status-text.is-error[data-v-51ab4b8e]{background:#ffebeb;color:#c51f24}.application.dark .job-status-text.is-error[data-v-51ab4b8e]{background:#380000;color:#ed797a}.views-view-name{margin-bottom:3px}.split-view-details{overflow:hidden}.sidebar-section{border-bottom:1px solid #e7e7ef}.application.dark .sidebar-section{border-bottom:1px solid #323234}.sidebar-section .section-header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#fcfcfd;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:8px 8px 8px 12px}.application.dark .sidebar-section .section-header{background:#252527}.sidebar-section .section-header .header-title{cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:13px;font-weight:600;margin-right:10px}.sidebar-section .section-header .header-title .ui-icon{color:#111;margin-right:2px}.application.dark .sidebar-section .section-header .header-title .ui-icon{color:#b2b2b2}.sidebar-section .section-header .header-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;height:24px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:4px;text-decoration:none;width:24px}.application.dark .sidebar-section .section-header .header-item{color:#9e9e9e}.sidebar-section .section-header .header-item:hover{color:#258cdb}.application.dark .sidebar-section .section-header .header-item:hover{color:#d46f02}.sidebar-section .section-header .header-item.active{background:#258cdb;color:#f5f5f5}.application.dark .sidebar-section .section-header .header-item.active{background:#d46f02;color:#fff}.sidebar-section .section-header .header-item:last-child{margin-right:0}.sidebar-section .section-header .header-search{position:relative}.sidebar-section .section-header .header-search input{background:#eee;border:0;border-radius:4px;font-size:13px;height:24px;padding-left:28px;width:180px}.application.dark .sidebar-section .section-header .header-search input{background:#3f3e3d;color:#e9e9e9}.application.dark .sidebar-section .section-header .header-search input::-webkit-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .sidebar-section .section-header .header-search input::-moz-placeholder{color:#a7a6a5;opacity:1}.application.dark .sidebar-section .section-header .header-search input:-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .sidebar-section .section-header .header-search input::-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .sidebar-section .section-header .header-search input::placeholder{color:#a7a6a5;opacity:1}.sidebar-section .section-header .header-search .ui-icon{left:7px;position:absolute;top:5px}.sidebar-section .details-table{border-radius:0;margin-bottom:0;padding-bottom:0}.application.dark .sidebar-section .details-table,.sidebar-section .details-table{-webkit-box-shadow:none;box-shadow:none}.sidebar-section .details-table td{vertical-align:top}.sidebar-section .details-table td .key{font-size:11px;font-weight:600;margin-bottom:3px;white-space:nowrap}.sidebar-section .details-table td .value{word-break:break-all}.command-tab{background:#fff}.application.dark .command-tab{background:#1f1f1f}.queue-job-tab{background:#fff}.application.dark .queue-job-tab{background:#1f1f1f}.queue-job-tab .data-value{border-bottom:1px solid #d1d1d1;padding:8px 10px}.application.dark .queue-job-tab .data-value{border-bottom:1px solid #363636}.request-tab{background:#fff}.application.dark .request-tab{background:#1f1f1f}.request-tab .data-raw{overflow:auto;padding:8px 12px;white-space:pre}.request-tab .session-user{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid rgba(0,0,0,.06);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:110%;padding:8px 10px}.application.dark .request-tab .session-user{border-bottom:1px solid #363636}.request-tab .session-user .ui-icon{color:#666;font-size:120%;margin-right:5px}.request-tab .session-user .name{margin-right:6px}.request-tab .session-user .dimmed{color:grey;font-size:90%}.application.dark .request-tab .session-user .dimmed{color:#767676}.request-tab .session-user .session-user-details{margin-left:auto}.test-tab .test-status-message{border-bottom:1px solid #d1d1d1;padding:12px 10px;font-size:13px}.application.dark .test-tab .test-status-message{border-bottom:1px solid #363636}.test-tab .test-status-message.error{background:#ffebeb;color:#c51f24}.application.dark .test-tab .test-status-message.error{background:#380000;color:#ed797a}.test-tab .test-status-message.warning{background:#fffae2;color:#a85919}.application.dark .test-tab .test-status-message.warning{background:#382f00;color:#fad89f}.test-tab .test-assert .assert-name{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.test-tab .test-assert .assert-name .assert-name-content{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;font-size:12px;margin-bottom:3px;max-width:100%;white-space:nowrap;margin-bottom:5px}.test-tab .test-assert .assert-name .assert-name-content.assert-failed .assert-name-text{background:#ffebeb;color:#c51f24}.application.dark .test-tab .test-assert .assert-name .assert-name-content.assert-failed .assert-name-text{background:#380000;color:#ed797a}.test-tab .test-assert .assert-name .assert-name-content .assert-name-text{background:#e3eccb;border-radius:8px;color:#586336;padding:2px 6px}.application.dark .test-tab .test-assert .assert-name .assert-name-content .assert-name-text{background:#293800;color:#e3fa9e}.test-tab .test-assert .assert-name .assert-name-trace{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:5px}.test-tab .test-assert .pretty-jason{font-size:11px}.request-sidebar{background:#f9f9fb;border-top:1px solid #d1d1d1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;height:25%}.application.dark .request-sidebar{background:#1b1b1b;border-top:1px solid #2a2a3c}.request-sidebar.large{height:33%}@media screen and (min-width:900px){.request-sidebar{border-left:1px solid #d1d1e0;border-top:0;height:100%;width:300px}.application.dark .request-sidebar{border-left:1px solid #2a2a3c;border-top:0}.request-sidebar.large{height:100%;width:400px}}@media screen and (min-width:1280px){.request-sidebar{width:360px}.request-sidebar.large{width:420px}}.request-sidebar .sidebar-header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e7e7ef;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;font-size:13px;padding:14px 12px;width:100%}.application.dark .request-sidebar .sidebar-header{border-bottom:1px solid #323234}.request-sidebar .sidebar-header .header-info{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-right:5px;overflow:hidden}.request-sidebar .sidebar-header .header-info:hover .info-copy{display:inline-block}.request-sidebar .sidebar-header .header-info .info-main{font-size:110%;overflow:hidden;text-overflow:ellipsis}.request-sidebar .sidebar-header .header-info .info-details{color:#696969;font-size:95%;margin-top:4px;overflow:hidden;text-overflow:ellipsis}.request-sidebar .sidebar-header .header-info .info-copy{display:none;font-size:90%;margin-left:2px}.request-sidebar .sidebar-header .header-alert{margin-right:5px}.request-sidebar .sidebar-header .header-alert.alert-errors{color:#b3492e}.application.dark .request-sidebar .sidebar-header .header-alert.alert-errors{color:#ed797a}.request-sidebar .sidebar-header .header-alert.alert-warnings{color:#f4bd00}.application.dark .request-sidebar .sidebar-header .header-alert.alert-warnings{color:#fad89f}.request-sidebar .sidebar-header .type-text{background:#cbdeec;border-radius:3px;color:#365063;font-size:75%;margin-right:5px;padding:2px 4px;vertical-align:1px}.application.dark .request-sidebar .sidebar-header .type-text{background:#002e52;color:#6ebef7}.request-sidebar .sidebar-header .method-text{color:#696969;font-size:80%}.application.dark .request-sidebar .sidebar-header .method-text{color:#767676}.request-sidebar .sidebar-header .status-text{background:#e3eccb;border-radius:8px;color:#586336;padding:2px 6px;text-transform:uppercase}.application.dark .request-sidebar .sidebar-header .status-text{background:#293800;color:#e3fa9e}.request-sidebar .sidebar-header .status-text.client-error{background:#fffae2;color:#a85919}.application.dark .request-sidebar .sidebar-header .status-text.client-error{background:#382f00;color:#fad89f}.request-sidebar .sidebar-header .status-text.server-error{background:#ffebeb;color:#c51f24}.application.dark .request-sidebar .sidebar-header .status-text.server-error{background:#380000;color:#ed797a}.request-sidebar .sidebar-header .status-text.status-text-small{font-size:9px}.request-sidebar .sidebar-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:auto}.request-sidebar .sidebar-content .content-actions{padding:14px 12px}.request-sidebar .sidebar-content .content-actions .button{font-size:13px;margin-bottom:10px}.request-sidebar .sidebar-content .content-meta{margin-top:auto;padding:10px 12px;text-align:center}.request-sidebar .sidebar-content .content-meta .meta-id{margin-top:5px}.request-sidebar .sidebar-content .content-meta .meta-id a{color:grey;text-decoration:none}.application.dark .request-sidebar .sidebar-content .content-meta .meta-id a{color:#767676}.split-view-requests{background:#f9f9fb;border-bottom:1px solid #d1d1d1;cursor:default;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;height:25%;width:100%}.application.dark .split-view-requests{background:#1b1b1b;border-bottom:1px solid #2a2a3c}@media screen and (min-width:900px){.split-view-requests{border-bottom:0;border-right:1px solid #d1d1e0;height:100%;width:300px}.application.dark .split-view-requests{border-right:1px solid #2a2a3c}.split-view-requests.large{width:380px}}@media screen and (min-width:1280px){.split-view-requests{width:320px}}.split-view-requests table{line-height:1.4;table-layout:fixed}.application.dark .split-view-requests tr:first-child td,.split-view-requests tr:first-child td{border-top:1px solid transparent}.split-view-requests tr.selected td{background:#2786f3!important;border-top:1px solid transparent;color:#fff}.application.dark .split-view-requests tr.selected td{background:#d46f02!important}.split-view-requests tr.selected+tr td{border-top:1px solid transparent}.application.dark .split-view-requests tr.selected .method-text,.application.dark .split-view-requests tr.selected small,.split-view-requests tr.selected .method-text,.split-view-requests tr.selected small{color:#fff}.application.dark .split-view-requests tr.selected .status-text,.application.dark .split-view-requests tr.selected .type-text,.split-view-requests tr.selected .status-text,.split-view-requests tr.selected .type-text{background:transparent;color:#fff}.application.dark .split-view-requests tr.selected .request-alert,.split-view-requests tr.selected .request-alert{color:#fff}.split-view-requests tr td{border-top:1px solid #f0f0f0}.application.dark .split-view-requests tr td{border-top:1px solid #242424}.split-view-requests tr td:first-child{border-radius:6px 0 0 6px}.split-view-requests tr td:last-child{border-radius:0 6px 6px 0}.split-view-requests th{color:#333;font-size:90%;font-weight:600;height:30px;line-height:1.1;padding:8px;white-space:nowrap}.application.dark .split-view-requests th{color:#b2b2b2}.split-view-requests td{overflow:hidden;padding:7px 6px 8px;vertical-align:middle;white-space:nowrap}.split-view-requests small{color:grey;font-size:100%}.application.dark .split-view-requests small{color:#767676}.split-view-requests big{font-size:115%}.split-view-requests .status{text-align:center;width:52px}.split-view-requests .duration{text-align:right;width:68px}.split-view-requests .type-text{background:#cbdeec;border-radius:3px;color:#365063;font-size:80%;margin-right:2px;padding:1px 3px;vertical-align:1px}.application.dark .split-view-requests .type-text{background:#002e52;color:#6ebef7}.split-view-requests .method-text{color:grey;font-size:90%}.application.dark .split-view-requests .method-text{color:#767676}.split-view-requests .status-text{background:#e3eccb;border-radius:8px;color:#586336;padding:2px 6px;text-transform:uppercase}.application.dark .split-view-requests .status-text{background:#293800;color:#e3fa9e}.split-view-requests .status-text.client-error{background:#fffae2;color:#a85919}.application.dark .split-view-requests .status-text.client-error{background:#382f00;color:#fad89f}.split-view-requests .status-text.server-error{background:#ffebeb;color:#c51f24}.application.dark .split-view-requests .status-text.server-error{background:#380000;color:#ed797a}.split-view-requests .status-text.status-text-small{font-size:9px}.split-view-requests .request-alert{font-size:90%;margin-right:4px}.split-view-requests .request-alert.alert-errors{color:#b3492e}.application.dark .split-view-requests .request-alert.alert-errors{color:#ed797a}.split-view-requests .request-alert.alert-warnings{color:#f4bd00}.application.dark .split-view-requests .request-alert.alert-warnings{color:#fad89f}.split-view-requests .requests-header{padding:2px 4px}.split-view-requests .requests-search{font-size:14px;margin-bottom:10px;position:relative}.split-view-requests .requests-search input{background:#eee;border:0;border-radius:4px;font-size:13px;height:24px;padding-left:28px;width:100%}.application.dark .split-view-requests .requests-search input{background:#3f3e3d;color:#e9e9e9}.application.dark .split-view-requests .requests-search input::-webkit-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .split-view-requests .requests-search input::-moz-placeholder{color:#a7a6a5;opacity:1}.application.dark .split-view-requests .requests-search input:-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .split-view-requests .requests-search input::-ms-input-placeholder{color:#a7a6a5;opacity:1}.application.dark .split-view-requests .requests-search input::placeholder{color:#a7a6a5;opacity:1}.split-view-requests .requests-search .ui-icon{left:7px;position:absolute;top:5px}.split-view-requests .requests-container{height:calc(100% - 31px);overflow:auto;padding:5px}.split-view-requests .requests-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:calc(100% + 69px)}.split-view-requests .requests-content .content-above{padding-top:2px}.split-view-requests .requests-content .content-above .button{font-size:13px}.split-view-requests .requests-table{margin-bottom:auto;margin-top:10px}.split-view-requests .requests-clear{font-size:13px;margin-bottom:5px;margin-top:5px}.whats-new{font-size:14px;width:100%}.application.dark .whats-new{background:#1f1f1f}.whats-new .whats-new-content{margin:0 auto;max-width:820px;padding:4px 16px 20px}.whats-new h1{font-size:18px;font-weight:400;margin:50px 0;text-align:center;width:100%}.whats-new h2{font-size:16px;font-weight:500}.whats-new .whats-new-section{margin-bottom:50px}.whats-new .whats-new-section.image-left,.whats-new .whats-new-section.image-right{padding-top:20px}.whats-new .whats-new-section.image-left:after,.whats-new .whats-new-section.image-right:after{clear:both;content:"";display:block}.whats-new .whats-new-section.image-left img,.whats-new .whats-new-section.image-right img{border-bottom:0;float:left;margin-left:-40px;margin-top:-20px;max-width:65%}.application.dark .whats-new .whats-new-section.image-left img,.application.dark .whats-new .whats-new-section.image-right img{border-bottom:0}.whats-new .whats-new-section.image-right img{float:right;margin-left:0;margin-right:-40px}.whats-new .whats-new-section.image-top img{border-bottom:0;border-top:1px solid #eee;margin-top:0}.application.dark .whats-new .whats-new-section.image-top img{border-bottom:0;border-top:1px solid #444}.whats-new .whats-new-section.image-top h2{margin-top:0}.whats-new .whats-new-section img{border-bottom:1px solid #eee;margin-top:10px;max-width:100%}.application.dark .whats-new .whats-new-section img{border-bottom:1px solid #444}.whats-new .whats-new-actions{padding-top:25px;text-align:center;width:100%}.whats-new .whats-new-actions a{color:#258cdb;font-size:15px;margin:0 15px;text-decoration:none}.application.dark .whats-new .whats-new-actions a{color:#f27e02}.whats-new .whats-new-actions a.actions-show-more{border:1px solid #258cdb;border-radius:4px;padding:6px 12px}.application.dark .whats-new .whats-new-actions a.actions-show-more{border-color:#f27e02}.whats-new .whats-new-actions p{margin-top:45px}.pretty-jason{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;padding:0;margin:0;list-style:none;color:#222}.pretty-jason ul{list-style:none;padding-left:12px}.pretty-jason li{padding:1px 0}.pretty-jason-key{color:#881280}.pretty-jason-value-number{color:#1c00cf}.pretty-jason-value-string{color:#c41a16}.pretty-jason-value-null,.pretty-jason-value-undefined{color:grey}.pretty-jason-value-anonymous-function,.pretty-jason-value-boolean,.pretty-jason-value-resource{color:#132ba2}.pretty-jason-icon,.pretty-jason-icon-closed,.pretty-jason-icon-open{display:inline-block;width:0;height:0}.pretty-jason-icon{width:12px}.pretty-jason-icon-closed{border-style:solid;border-width:4.5px 0 4.5px 7.8px;border-color:transparent transparent transparent #7f7f80}.pretty-jason-icon-open{border-style:solid;border-width:7.8px 4.5px 0 4.5px;border-color:#7f7f80 transparent transparent transparent}.pretty-jason-preview{font-style:italic}.pretty-jason-preview:before{content:"{"}.pretty-jason-preview:after{content:"}"}.pretty-jason-preview-item:after{content:", "}.pretty-jason-preview .pretty-jason-preview-item:last-child:after{content:""}*{-webkit-box-sizing:border-box;box-sizing:border-box}html{background:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:11px;overflow:hidden}body,html{height:100%}body{font-size:100%;margin:0}.application.dark,body.dark{background:#1e1e1e;color:#b2b2b2}table{border-collapse:collapse;font-size:100%;width:100%}table td,table th{text-align:left}a{color:#696969;cursor:default}a:hover{color:#3b3b3b}.application.dark a:hover{color:#f27e02}.application.dark a{color:grey}.button{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#ebebea;border-radius:4px;color:#696969;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:6px 12px;text-decoration:none}.application.dark .button{background:#2e2e2d}.button:hover{color:#3b3b3b}.button .ui-icon{margin-right:5px}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.split-view{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}@media screen and (min-width:900px){.split-view{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.split-view-details{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}@media screen and (min-width:900px){.split-view-details{height:100%}}.split-view-details{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.details-header,.split-view-details{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.details-header{background:#e0e0eb;-ms-flex-negative:0;flex-shrink:0;height:34px;z-index:500}.application.dark .details-header{background:#15151e}.details-header .details-header-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.details-header .icons{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #d1d1e0;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:15px;padding:0 5px}.application.dark .details-header .icons{border-bottom:1px solid #2a2a3c}.details-header .icons a{padding:0 5px}.details-header .icons a.active,.details-header .icons a:hover{color:#258cdb}.application.dark .details-header .icons a.active,.application.dark .details-header .icons a:hover{color:#f27e02}.details-content{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.details-content .content-header{background:#f6f6f9;display:-webkit-box;display:-ms-flexbox;display: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;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:1;-ms-flex:1;flex:1;height:46px;width:100%}.application.dark .details-content .content-header{background:#252527}.details-content .content-content{margin-top:-46px;padding:15px}.details-content h3{border-bottom:1px solid #d1d1d1;font-size:13px;font-weight:600;margin:0;padding:4px 10px}.details-content .counters-row{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:8px;background:#fcfcfd;-webkit-box-shadow:0 0 0 1px #e0e0eb,0 2px 2px 0 #e0e0eb;box-shadow:0 0 0 1px #e0e0eb,0 2px 2px 0 #e0e0eb;margin-bottom:20px}.application.dark .details-content .counters-row{background:#252527;-webkit-box-shadow:0 0 0 1px #15151e,0 2px 2px 0 #15151e;box-shadow:0 0 0 1px #15151e,0 2px 2px 0 #15151e}.details-content .counters-row .counters-group{display:-webkit-box;display:-ms-flexbox;display:flex}.details-content .counters-row .counters-group.right-aligned{margin-left:auto}.details-content .counters-row .counters-group.right-aligned .counter{border-left:1px solid #e7e7ef;border-right:0}.application.dark .details-content .counters-row .counters-group.right-aligned .counter{border-left:1px solid #1b1b27;border-right:0}.details-content .counters-row .counter{border-right:1px solid #e7e7ef;cursor:default;padding:12px 24px 13px}.application.dark .details-content .counters-row .counter{border-right:1px solid #1b1b27}.details-content .counters-row .counter .counter-value{color:#258cdb;font-size:170%;margin-bottom:3px;white-space:nowrap}.application.dark .details-content .counters-row .counter .counter-value{color:#f27e02}.details-content .counters-row .counter .counter-title{color:#777;font-size:95%;text-transform:uppercase;white-space:nowrap}.details-content .counters-row .counter .counter-title.has-mark:before{border-radius:50%;content:"";display:inline-block;height:9px;margin-right:4px;vertical-align:-1px;width:9px}.details-content .request-tab-info{display:-webkit-box;display:-ms-flexbox;display:flex;margin:4px 0 8px}.details-content .request-tab-info .field{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 5px;padding:0 20px}.details-content .request-tab-info .field:first-child{margin-left:0}.details-content .request-tab-info .field:last-child{margin-right:0}.details-content .request-tab-info .field .field-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:130%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.details-content .request-tab-info .field .field-value .small{color:#888;font-size:75%;padding-top:2px}.details-content .request-tab-info .field .field-title{font-size:120%;font-variant:small-caps;padding-bottom:5px;text-transform:lowercase}.details-content .request-tab-info .field.action{-webkit-box-flex:1;-ms-flex:1;flex:1}.details-content .request-tab-info .field.link{font-size:90%;padding:0}.details-content .fired-event{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.details-content .fired-event .fired-event-content{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:100%}.details-content .fired-event .fired-event-path{color:#aaa;-webkit-box-flex:0;-ms-flex:0;flex:0;font-size:90%;margin-top:3px}.application.dark .details-content .fired-event .fired-event-path{color:#777}.details-content .fired-event-details h4{margin:6px 0 3px}.details-content .fired-event-actions{padding-left:5px;width:10px}.details-content .database-query{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.details-content .database-query .database-query-content{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:100%;word-break:break-word}.details-content .database-query .database-query-path{color:#aaa;-webkit-box-flex:0;-ms-flex:0;flex:0;font-size:90%;margin-top:3px;word-break:normal;text-align:right}.application.dark .details-content .database-query .database-query-path{color:#777}.details-content .database-duration{text-align:right;white-space:nowrap}.details-content .cache-query-type{font-size:125%;font-variant:small-caps}.details-authentication-overlay,.details-error-overlay,.details-loading-overlay{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:16px;height:calc(100% - 31px);-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;position:absolute;top:31px;width:100%;z-index:500}.application.dark .details-authentication-overlay,.application.dark .details-error-overlay,.application.dark .details-loading-overlay{background:#1f1f1f}.details-authentication-overlay .ui-icon,.details-error-overlay .ui-icon,.details-loading-overlay .ui-icon{color:#696969;font-size:46px}.details-authentication-overlay .title,.details-error-overlay .title,.details-loading-overlay .title{margin:10px 0 0 0}.details-authentication-overlay .message,.details-error-overlay .message,.details-loading-overlay .message{color:#aaa;font-size:75%;margin:5px 0 0 0}.details-authentication-overlay{text-align:center}.details-authentication-overlay .message,.details-authentication-overlay .title{font-size:80%}.details-authentication-overlay .title.failed{display:none}.details-authentication-overlay p{margin:1.3em 0}.details-authentication-overlay input{background:#eee;border:1px solid #eee;border-radius:4px;font-size:14px;height:30px;padding:0 10px}.application.dark .details-authentication-overlay input{background:#2e2e2e;border:1px solid #2e2e2e;color:#ccc}.details-authentication-overlay button{background:transparent;border:none;color:#258cdb;font-size:90%}.application.dark .details-authentication-overlay button{color:#f27e02}.details-authentication-overlay.failed .title{display:none}.details-authentication-overlay.failed .title.failed{display:block}.details-authentication-overlay.failed .ui-icon{-webkit-animation:shake .77s linear;animation:shake .77s linear}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate(-2px);transform:translate(-2px)}20%,80%{-webkit-transform:translate(3px);transform:translate(3px)}30%,50%,70%{-webkit-transform:translate(-5px);transform:translate(-5px)}40%,60%{-webkit-transform:translate(5px);transform:translate(5px)}}@keyframes shake{10%,90%{-webkit-transform:translate(-2px);transform:translate(-2px)}20%,80%{-webkit-transform:translate(3px);transform:translate(3px)}30%,50%,70%{-webkit-transform:translate(-5px);transform:translate(-5px)}40%,60%{-webkit-transform:translate(5px);transform:translate(5px)}}.stack-trace{cursor:pointer}.stack-trace .popover{cursor:default}.stack-trace a{color:#a6a6a6;text-decoration:none}.stack-trace a:hover{color:#969696}.application.dark .stack-trace a{color:#595959}.application.dark .stack-trace a:hover{color:#696969}.stack-trace .stack-frame{color:#000;padding:6px 10px;text-align:left;word-break:break-word}.application.dark .stack-trace .stack-frame{color:#b2b2b2}.stack-trace .stack-frame:nth-child(2n){background:#f6f6f9}.application.dark .stack-trace .stack-frame:nth-child(2n){background:#202022}.stack-trace .stack-frame .stack-frame-call{font-size:12px;padding-bottom:3px}.stack-trace .stack-frame .stack-frame-file{color:#aaa;font-size:11px}.stack-trace .stack-frame.is-vendor .stack-frame-call,.stack-trace .stack-frame.is-vendor .stack-frame-file{font-size:10px}.hidden{display:none}[stupid-table] th{cursor:default}[tab-content]{display:none}.application.dark .pretty-jason{color:#d5d5d5}.application.dark .pretty-jason-key{color:#e36eec}.application.dark .pretty-jason-value-number{color:#997fff}.application.dark .pretty-jason-value-string{color:#e33e3a}.application.dark .pretty-jason-value-null,.application.dark .pretty-jason-value-undefined{color:#7f7f7f}.application.dark .pretty-jason-value-anonymous-function,.application.dark .pretty-jason-value-boolean,.application.dark .pretty-jason-value-resource{color:#8296ff}.application.dark .pretty-jason-icon-closed{border-color:transparent transparent transparent #919191}.application.dark .pretty-jason-icon-open{border-color:#919191 transparent transparent transparent}.ui-icon{display:inline-block;height:1em;width:1em;vertical-align:-.125em}.ui-icon svg{display:block;height:100%;width:100%} \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-auto-icon.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-auto-icon.png new file mode 100644 index 000000000..5cb21ee06 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-auto-icon.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-dark-icon.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-dark-icon.png new file mode 100644 index 000000000..f7d4285e1 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-dark-icon.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-light-icon.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-light-icon.png new file mode 100644 index 000000000..7341c0204 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/appearance-light-icon.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-120x120.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-120x120.png new file mode 100644 index 000000000..72982ec1b Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-120x120.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-152x152.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-152x152.png new file mode 100644 index 000000000..c868b9954 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-152x152.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-180x180.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-180x180.png new file mode 100644 index 000000000..dcb82bc99 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-180x180.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-60x60.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-60x60.png new file mode 100644 index 000000000..fb20164bc Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-60x60.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-76x76.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-76x76.png new file mode 100644 index 000000000..dba45cc9b Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon-76x76.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon.png new file mode 100644 index 000000000..dcb82bc99 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/apple-touch-icon.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/favicon-16x16.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/favicon-16x16.png new file mode 100644 index 000000000..6562f9cb0 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/favicon-16x16.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/favicon-32x32.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/favicon-32x32.png new file mode 100644 index 000000000..e38d7f599 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/icons/favicon-32x32.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/client-metrics.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/client-metrics.png new file mode 100644 index 000000000..bd473b291 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/client-metrics.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/clockwork-5.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/clockwork-5.png new file mode 100644 index 000000000..e91ba9383 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/clockwork-5.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/models-tab.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/models-tab.png new file mode 100644 index 000000000..f2f2e476d Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/models-tab.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/notifications-tab.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/notifications-tab.png new file mode 100644 index 000000000..091491ad6 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/notifications-tab.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/timeline.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/timeline.png new file mode 100644 index 000000000..e1af12080 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/timeline.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/toolbar.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/toolbar.png new file mode 100644 index 000000000..c391b3eb6 Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.0/toolbar.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.1/database-queries.png b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.1/database-queries.png new file mode 100644 index 000000000..88559071f Binary files /dev/null and b/vendor/itsgoingd/clockwork/Clockwork/Web/public/img/whats-new/5.1/database-queries.png differ diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/index.html b/vendor/itsgoingd/clockwork/Clockwork/Web/public/index.html new file mode 100644 index 000000000..5b549559f --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/public/index.html @@ -0,0 +1 @@ +Clockwork
\ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/js/app.1b17e5e6.js b/vendor/itsgoingd/clockwork/Clockwork/Web/public/js/app.1b17e5e6.js new file mode 100644 index 000000000..7302e4092 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/public/js/app.1b17e5e6.js @@ -0,0 +1,2 @@ +(function(e){function t(t){for(var a,r,o=t[0],l=t[1],c=t[2],d=0,h=[];da.left+a.width/2-200?this.classList=["left-aligned"]:t.right-1:e.$settings.global.showIncomingRequests},on:{change:[function(t){var s=e.$settings.global.showIncomingRequests,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&e.$set(e.$settings.global,"showIncomingRequests",s.concat([n])):r>-1&&e.$set(e.$settings.global,"showIncomingRequests",s.slice(0,r).concat(s.slice(r+1)))}else e.$set(e.$settings.global,"showIncomingRequests",i)},e.save]}}),e._v(" Show incoming requests ")]),s("label",{staticClass:"controls-checkbox"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.$settings.global.preserveLog,expression:"$settings.global.preserveLog"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.$settings.global.preserveLog)?e._i(e.$settings.global.preserveLog,null)>-1:e.$settings.global.preserveLog},on:{change:[function(t){var s=e.$settings.global.preserveLog,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&e.$set(e.$settings.global,"preserveLog",s.concat([n])):r>-1&&e.$set(e.$settings.global,"preserveLog",s.slice(0,r).concat(s.slice(r+1)))}else e.$set(e.$settings.global,"preserveLog",i)},e.save]}}),e._v(" Keep requests log ")])])]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.$platform.hasFeature("requests-list"),expression:"$platform.hasFeature('requests-list')"}],staticClass:"controls-group"},[s("label"),s("div",{staticClass:"controls"},[s("label",{staticClass:"controls-checkbox"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.$settings.global.hideCommandTypeRequests,expression:"$settings.global.hideCommandTypeRequests"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.$settings.global.hideCommandTypeRequests)?e._i(e.$settings.global.hideCommandTypeRequests,null)>-1:e.$settings.global.hideCommandTypeRequests},on:{change:[function(t){var s=e.$settings.global.hideCommandTypeRequests,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&e.$set(e.$settings.global,"hideCommandTypeRequests",s.concat([n])):r>-1&&e.$set(e.$settings.global,"hideCommandTypeRequests",s.slice(0,r).concat(s.slice(r+1)))}else e.$set(e.$settings.global,"hideCommandTypeRequests",i)},e.save]}}),e._v(" Hide commands in requests list ")]),s("label",{staticClass:"controls-checkbox"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.$settings.global.hideQueueJobTypeRequests,expression:"$settings.global.hideQueueJobTypeRequests"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.$settings.global.hideQueueJobTypeRequests)?e._i(e.$settings.global.hideQueueJobTypeRequests,null)>-1:e.$settings.global.hideQueueJobTypeRequests},on:{change:[function(t){var s=e.$settings.global.hideQueueJobTypeRequests,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&e.$set(e.$settings.global,"hideQueueJobTypeRequests",s.concat([n])):r>-1&&e.$set(e.$settings.global,"hideQueueJobTypeRequests",s.slice(0,r).concat(s.slice(r+1)))}else e.$set(e.$settings.global,"hideQueueJobTypeRequests",i)},e.save]}}),e._v(" Hide queue jobs in requests list ")]),s("label",{staticClass:"controls-checkbox"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.$settings.global.hideTestTypeRequests,expression:"$settings.global.hideTestTypeRequests"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.$settings.global.hideTestTypeRequests)?e._i(e.$settings.global.hideTestTypeRequests,null)>-1:e.$settings.global.hideTestTypeRequests},on:{change:[function(t){var s=e.$settings.global.hideTestTypeRequests,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&e.$set(e.$settings.global,"hideTestTypeRequests",s.concat([n])):r>-1&&e.$set(e.$settings.global,"hideTestTypeRequests",s.slice(0,r).concat(s.slice(r+1)))}else e.$set(e.$settings.global,"hideTestTypeRequests",i)},e.save]}}),e._v(" Hide tests in requests list ")])])]),s("div",{staticClass:"settings-footer"},[e._v(" Version "+e._s(e.$credits.version)+" • "),s("a",{attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.showCredits.apply(null,arguments)}}},[e._v("Credits")])])])])},de=[],he={name:"SettingsModal",components:{Modal:p},data:function(){return{showPersistWarning:!1}},methods:{setAppearance:function(e){this.$settings.global.appearance=e,this.save()},save:function(){this.$settings.save(),this.$onDemand.enableProfiling()},showCredits:function(){this.$settings.toggle(),this.$credits.toggle()}}},ve=he,fe=(s("28e9"),Object(f["a"])(ve,ue,de,!1,null,null,null)),me=fe.exports,pe=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("modal",{attrs:{icon:"share",title:"Share",shown:e.$sharing.shown},on:{"update:shown":function(t){return e.$set(e.$sharing,"shown",t)}}},[s("div",{staticClass:"sharing-modal"},[e.$sharing.termsAccepted?[s("div",{staticClass:"sharing-content"},[s("label",{staticClass:"content-item item-all",class:{active:e.filterAll}},[s("span",{staticClass:"item-text"},[e._v("All")]),s("input",{directives:[{name:"model",rawName:"v-model",value:e.filterAll,expression:"filterAll"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.filterAll)?e._i(e.filterAll,null)>-1:e.filterAll},on:{change:function(t){var s=e.filterAll,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&(e.filterAll=s.concat([n])):r>-1&&(e.filterAll=s.slice(0,r).concat(s.slice(r+1)))}else e.filterAll=i}}})]),e._l(e.sections,(function(t){return s("label",{staticClass:"content-item",class:{active:e.filter[t.name]&&t.available,unavailable:!t.available}},[s("icon",{attrs:{name:t.icon}}),s("span",{staticClass:"item-text"},[e._v(e._s(t.text))]),s("input",{directives:[{name:"model",rawName:"v-model",value:e.filter[t.name],expression:"filter[section.name]"}],attrs:{type:"checkbox",disabled:t.readonly||!t.available},domProps:{checked:Array.isArray(e.filter[t.name])?e._i(e.filter[t.name],null)>-1:e.filter[t.name]},on:{change:function(s){var a=e.filter[t.name],i=s.target,n=!!i.checked;if(Array.isArray(a)){var r=null,o=e._i(a,r);i.checked?o<0&&e.$set(e.filter,t.name,a.concat([r])):o>-1&&e.$set(e.filter,t.name,a.slice(0,o).concat(a.slice(o+1)))}else e.$set(e.filter,t.name,n)}}})],1)}))],2),e.error?s("p",{staticClass:"error-message"},[e._v(e._s(e.errorMessage))]):e._e(),s("a",{staticClass:"button",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.share.apply(null,arguments)}}},[e.isCopied?[e._v(" Copied to clipboard! ")]:e.$sharing.inProgress?[s("spinner",{attrs:{name:"fading-circle",width:"18",height:"18","no-fade-in":!0,color:"dark"==e.$settings.appearance?"#f27e02":"#258cdb"}}),e._v(" Sharing... ")]:[e._v(" Share ")]],2)]:[s("div",{staticClass:"sharing-terms"},[s("h1",[s("icon",{attrs:{name:"users"}})],1),s("p",[e._v("Request will be uploaded to the Clockwork Cloud servers and a unique public link generated for you.")]),s("h2",[e._v("Deleting")]),s("ul",[s("li",[e._v("You can delete the request anytime via the shared link.")]),s("li",[e._v("Shared links might expire after a few weeks.")])]),s("h2",[e._v("Privacy")]),s("ul",[s("li",[e._v("Shared requests are hosted on DigitalOcean servers.")]),s("li",[e._v("Collected data is never shared with third-parties.")])]),s("a",{staticClass:"button",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.$sharing.acceptTerms()}}},[e._v("Continue")])])]],2)])},ge=[],be=(s("b0c0"),s("159b"),{name:"SharingModal",components:{Modal:p},data:function(){return{filter:{performance:!0,log:!0,events:!0,models:!0,database:!0,cache:!0,redis:!0,queue:!0,views:!0,notifications:!0,routes:!0,output:!0,userData:!0},isCopied:!1,error:!1}},computed:{sections:function(){var e,t;return[{text:"Performance",name:"performance",icon:"activity",available:!0,readonly:!0},{text:"Log",name:"log",icon:"edit-2",available:this.shownSections.log},{text:"Events",name:"events",icon:"zap",available:this.shownSections.events},{text:"Models",name:"models",icon:"disc",available:this.shownSections.models},{text:"Database",name:"database",icon:"database",available:this.shownSections.database},{text:"Cache",name:"cache",icon:"paperclip",available:this.shownSections.cache},{text:"Redis",name:"redis",icon:"layers",available:this.shownSections.redis},{text:"Queue",name:"queue",icon:"clock",available:this.shownSections.queue},{text:"Views",name:"views",icon:"image",available:this.shownSections.views},{text:"Notifications",name:"notifications",icon:"mail",available:this.shownSections.notifications},{text:"Routes",name:"routes",icon:"map",available:this.shownSections.routes},{text:"Output",name:"output",icon:"terminal",available:this.shownSections.output},{text:"Custom tabs",name:"userData",icon:"menu",available:null===(e=this.$request)||void 0===e||null===(t=e.userData)||void 0===t?void 0:t.length}]},shownSections:function(){var e,t,s,a,i,n,r,o,l,c,u,d,h,v,f,m,p,g,b,w,_,y=this;return{log:(null===(e=this.$request)||void 0===e||null===(t=e.log)||void 0===t?void 0:t.length)>0,models:["modelsRetrieved","modelsCreated","modelsUpdated","modelsDeleted"].some((function(e){var t;return null===(t=y.$request)||void 0===t?void 0:t[e]}))||(null===(s=this.$request)||void 0===s?void 0:s.modelsActions.length)>0,database:(null===(a=this.$request)||void 0===a?void 0:a.databaseQueriesCount)>0||(null===(i=this.$request)||void 0===i||null===(n=i.databaseQueries)||void 0===n?void 0:n.length)>0,cache:["cacheReads","cacheHits","cacheWrites","cacheDeletes","cacheTime"].some((function(e){var t;return null===(t=y.$request)||void 0===t?void 0:t[e]}))||(null===(r=this.$request)||void 0===r?void 0:r.cacheQueries.length)>0,redis:(null===(o=this.$request)||void 0===o||null===(l=o.redisCommands)||void 0===l?void 0:l.length)>0,queue:(null===(c=this.$request)||void 0===c||null===(u=c.queueJobs)||void 0===u?void 0:u.length)>0,events:(null===(d=this.$request)||void 0===d||null===(h=d.events)||void 0===h?void 0:h.length)>0,views:(null===(v=this.$request)||void 0===v||null===(f=v.viewsData)||void 0===f?void 0:f.events.length)>0,notifications:(null===(m=this.$request)||void 0===m||null===(p=m.notifications)||void 0===p?void 0:p.length)>0,routes:(null===(g=this.$request)||void 0===g||null===(b=g.routes)||void 0===b?void 0:b.length)>0,output:(null===(w=this.$request)||void 0===w||null===(_=w.commandOutput)||void 0===_?void 0:_.length)>0}},filterAll:{get:function(){var e=this;return this.sections.every((function(t){return!t.available||e.filter[t.name]}))},set:function(e){var t=this;this.sections.filter((function(e){return e.available&&!e.readonly})).forEach((function(s){return t.filter[s.name]=e}))}},errorMessage:function(){return"metadata-too-large"==this.error?"Shared request metadata is too large, please try selecting fewer sections.":"temporarily-unavailable"==this.error?"Share service is temporarily unavailable, please try again later.":"Unexpected error, please try again later."}},methods:{share:function(){var e=this;this.$sharing.share(this.$request,this.filter).then((function(t){if(t&&t.error)return e.error=t.error;e.$copyText(e.$request.shareUrl).then((function(){return e.isCopied=!0}))}))}},watch:{filter:{handler:function(){this.$sharing.clear(this.$request),this.isCopied=!1},deep:!0},$request:function(){this.isCopied=!1},"$sharing.shown":function(){this.isCopied=this.error=!1}}}),we=be,_e=(s("d901"),Object(f["a"])(we,pe,ge,!1,null,null,null)),ye=_e.exports,Ce=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("modal",{attrs:{icon:"trash-2",title:"Delete",shown:e.$sharing.shownDelete},on:{"update:shown":function(t){return e.$set(e.$sharing,"shownDelete",t)}}},[s("div",{staticClass:"delete-shared-modal"},[s("h1",[e.deleted?[s("icon",{attrs:{name:"check-circle"}})]:[s("icon",{attrs:{name:"trash-2"}})]],2),s("p",[e.deleted?[e._v(" Shared request was successfully deleted. ")]:[e._v(" Are you sure you want to delete this shared request? ")]],2),s("a",{staticClass:"button",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.deleteShared.apply(null,arguments)}}},[e.deleted?[e._v(" Deleted! ")]:e.deleting?[s("spinner",{attrs:{name:"fading-circle",width:"18",height:"18","no-fade-in":!0,color:"dark"==e.$settings.appearance?"#f27e02":"#258cdb"}}),e._v(" Deleting... ")]:[e._v(" Delete ")]],2)])])},qe=[],$e={name:"SharingDeleteModal",components:{Modal:p},data:function(){return{deleting:!1,deleted:!1}},methods:{deleteShared:function(){var e=this;this.deleting=!0,this.$sharing.deleteShared().then((function(){return e.deleted=!0}))}}},ke=$e,xe=(s("7e04"),Object(f["a"])(ke,Ce,qe,!1,null,null,null)),Te=xe.exports,Se=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"details-header-tabs"},e._l(e.tabs,(function(t){return t.shown?s("tab-handle",{key:t.name,attrs:{text:t.text,name:t.name,icon:t.icon,active:t.name==e.activeTab,short:e.shortTabs.includes(t),full:e.fullTabs.includes(t)},on:{"tab-selected":function(t){return e.$emit("tab-selected",t)}}},[e._v(e._s(t.text))]):e._e()})),1)},je=[],Oe=(s("7db0"),s("4e82"),s("fb6a"),s("caad"),s("2532"),function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("a",{staticClass:"details-header-tab",class:{active:e.active,short:e.short,full:e.full},attrs:{href:"#"},on:{click:e.selectTab}},[e.icon?s("icon",{attrs:{name:e.icon,title:e.text}}):e._e(),s("div",{directives:[{name:"show",rawName:"v-show",value:!e.short,expression:"! short"}],staticClass:"tab-title"},[e._v(e._s(e.text))]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.badge&&!e.short,expression:"badge && ! short"}],staticClass:"tab-badge"},[e._v(e._s(e.badge))])],1)}),Pe=[],De={name:"TabHandle",props:["text","name","icon","badge","active","short","full"],methods:{selectTab:function(){this.$emit("tab-selected",this.name)}}},Re=De,Ee=(s("0877"),Object(f["a"])(Re,Oe,Pe,!1,null,null,null)),Ne=Ee.exports,Ae=s("2fd4"),Ie=s.n(Ae),Me={name:"TabBar",components:{TabHandle:Ne},props:{tabs:{default:function(){return[]}},activeTab:{}},data:function(){return{shortTabs:[],fullTabs:[]}},methods:{hideOverflowingTabs:function(){var e=this;this.shortTabs=[],this.fullTabs=[],this.$nextTick((function(){return e.hideNextOverflowingTab()}))},hideNextOverflowingTab:function(){var e=this;if(!(this.$el.scrollWidth<=this.$el.clientWidth)){var t=this.tabs.indexOf(this.tabs.find((function(t){return t.name==e.activeTab}))),s=this.tabs.slice().sort((function(s,a){return Math.abs(t-e.tabs.indexOf(a))-Math.abs(t-e.tabs.indexOf(s))})).find((function(t){return!e.shortTabs.includes(t)}));if(!s||s.name==this.activeTab)return this.fullTabs=this.tabs.filter((function(t){return!e.shortTabs.includes(t)}));this.shortTabs.push(s),this.$nextTick((function(){return e.hideNextOverflowingTab()}))}}},watch:{tabs:function(){this.hideOverflowingTabs()},activeTab:function(){this.hideOverflowingTabs()}},mounted:function(){var e=this;this.resizeObserver=new ResizeObserver(Ie()((function(){return e.hideOverflowingTabs()}),10)),this.resizeObserver.observe(this.$el)}},Le=Me,Qe=Object(f["a"])(Le,Se,je,!1,null,null,null),Ue=Qe.exports,Fe=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("div",{staticClass:"counters-row"},[s("div",{directives:[{name:"show",rawName:"v-show",value:e.$request.cacheQueries.length,expression:"$request.cacheQueries.length"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheQueries.length))]),s("div",{staticClass:"counter-title"},[e._v("queries")])]),s("div",{directives:[{name:"show",rawName:"v-show",value:null!==e.$request.cacheReads,expression:"$request.cacheReads !== null"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheReads))]),s("div",{staticClass:"counter-title"},[e._v("reads")])]),s("div",{directives:[{name:"show",rawName:"v-show",value:null!==e.$request.cacheHits,expression:"$request.cacheHits !== null"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheHits))]),s("div",{staticClass:"counter-title"},[e._v("hits")])]),s("div",{directives:[{name:"show",rawName:"v-show",value:null!==e.$request.cacheMisses,expression:"$request.cacheMisses !== null"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheMisses))]),s("div",{staticClass:"counter-title"},[e._v("misses")])]),s("div",{directives:[{name:"show",rawName:"v-show",value:null!==e.$request.cacheWrites,expression:"$request.cacheWrites !== null"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheWrites))]),s("div",{staticClass:"counter-title"},[e._v("writes")])]),s("div",{directives:[{name:"show",rawName:"v-show",value:null!==e.$request.cacheDeletes,expression:"$request.cacheDeletes !== null"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheDeletes))]),s("div",{staticClass:"counter-title"},[e._v("deletes")])]),s("div",{directives:[{name:"show",rawName:"v-show",value:null!==e.$request.cacheTime,expression:"$request.cacheTime !== null"}],staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.cacheTime))]),s("div",{staticClass:"counter-title"},[e._v("time")])])]),e.$request.cacheQueries.length?s("details-table",{attrs:{title:"Queries",icon:"paperclip",columns:e.columns,items:e.$request.cacheQueries,filter:e.filter,"filter-example":"info@underground.works action:miss key:lastRequest file:Controller.php"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[e.columns.includes("Connection")?s("td",[e._v(e._s(t.connection))]):e._e(),s("td",{staticClass:"cache-query-type"},[e._v(e._s(t.type))]),s("td",[e._v(e._s(t.key))]),s("td",[s("div",{staticClass:"database-query"},[s("div",{staticClass:"database-query-content"},[s("pretty-print",{attrs:{data:t.value}})],1),s("stack-trace",{staticClass:"database-query-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",[t.expiration?s("span",[e._v(e._s(t.expiration))]):e._e()]),e.columns.includes("Duration")?s("td",[e._v(e._s(e._f("round")(t.duration,3))+" ms")]):e._e()])}))}}],null,!1,1651104168)}):e._e()],1)},Je=[],He=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"details-table"},[e.noHeader?e._e():s("div",{staticClass:"table-header"},[s("div",{staticClass:"header-title"},[s("icon",{attrs:{name:e.icon}}),e._v(" "+e._s(e.title)+" "),e.badge?s("span",{staticClass:"title-badge"},[e._v(e._s(e.badge))]):e._e()],1),e._t("toolbar",(function(){return[s("div",{staticClass:"header-group"},[e.filter?s("div",{staticClass:"header-search"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.filter.input,expression:"filter.input"}],attrs:{type:"search",placeholder:"Search..."},domProps:{value:e.filter.input},on:{input:function(t){t.target.composing||e.$set(e.filter,"input",t.target.value)}}}),s("icon",{attrs:{name:"search"}})],1):e._e()])]}),{filter:e.filter})],2),s("div",{staticClass:"table-content"},[s("table",[s("thead",[e.noTableHead?e._e():s("tr",[e._t("header",(function(){return e._l(e.columns,(function(t,a){return s("th",{class:t.class,on:{click:function(s){e.filter.sortBy(t.sortBy||t.toLowerCase())}}},[e._v(" "+e._s(t.name||t)+" "),s("icon",{directives:[{name:"show",rawName:"v-show",value:e.filter.sortedBy==(t.sortBy||t.toLowerCase()),expression:"filter.sortedBy == (column.sortBy || column.toLowerCase())"}],attrs:{name:e.filter.sortedDesc?"chevron-down":"chevron-up"}})],1)}))}),{filter:e.filter})],2)]),s("tbody",[e.hasPreviousItems?s("tr",{staticClass:"pagination-controls"},[s("td",{attrs:{colspan:e.columns.length}},[s("a",{attrs:{href:"#"},on:{click:e.showPreviousItems}},[e._v("Show "+e._s(e.previousItemsCount)+" previous")])])]):e._e(),e._t("body",null,{items:e.shownItems}),e.hasNextItems?s("tr",{staticClass:"pagination-controls"},[s("td",{attrs:{colspan:e.columns.length}},[s("a",{attrs:{href:"#"},on:{click:e.showNextItems}},[e._v("Show "+e._s(e.nextItemsCount)+" more")])])]):e._e()],2)])])])},Ve=[],We=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("a",{staticClass:"toggle-filter",attrs:{href:"#"},on:{click:function(t){return t.stopPropagation(),e.filter.toggle(t)}}},[s("icon",{attrs:{name:"search"}})],1)},Be=[],ze={name:"DetailsTableFilterToggle",props:["filter"]},Ge=ze,Ke=Object(f["a"])(Ge,We,Be,!1,null,null,null),Xe=Ke.exports,Ze=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div")},Ye=[],et=s("53ca"),tt=s("d4ec"),st=s("bee2"),at=(s("b64b"),s("07ac"),s("5319"),s("d3b7"),s("25f0"),function(){function e(t){if(Object(tt["a"])(this,e),t instanceof Object||(t=this.parseJson(t)),!(t instanceof Object))throw new it("Input does not contain serialized object.");this.data=t}return Object(st["a"])(e,[{key:"parseJson",value:function(e){try{return JSON.parse(e)}catch(t){throw new it("Input is not a valid JSON string.",t)}}},{key:"print",value:function(e){e.innerHTML=this.generateHtml()}},{key:"generateHtml",value:function(){var e=this,t=this.resolveValueAndType(this.data),s=Object(a["a"])(t,2),i=s[0];s[1];return this.createElement("ul",{class:"pretty-jason"},[this.createElement("li",{},[this.createElement("span",{data:{rendered:!0},click:function(t){return e.objectNodeClickedCallback(t)}},[this.createElement("span",{class:"pretty-jason-icon",html:''}),this.createElement("span",{text:"".concat(i," ")})]),this.generateHtmlPreview(this.data),this.generateHtmlNode(this.data)])])}},{key:"generateHtmlNode",value:function(e){var t=this;return this.createElement("ul",{style:{display:"none"}},Object.keys(e).filter((function(e){return!["__class__","__type__","__hash__"].includes(e)})).map((function(s){var i=t.resolveValueAndType(e[s]),n=Object(a["a"])(i,2),r=n[0],o=n[1];return t.createElement("li",{data:{key:s}},[t.createElement("span",{click:"object"==o?function(e){return t.objectNodeClickedCallback(e)}:void 0},[t.createElement("span",{class:"pretty-jason-icon",html:"object"==o?'':void 0}),t.createElement("span",{class:"pretty-jason-key",text:"".concat(s,": ")}),t.createElement("span",{class:"pretty-jason-value-".concat(o),text:r})])])})))}},{key:"generateHtmlPreview",value:function(e){var t=this;return this.createElement("span",{class:"pretty-jason-preview"},Object.keys(e).filter((function(e){return!["__class__","__type__","__hash__"].includes(e)})).slice(0,3).map((function(s){var i=t.resolveValueAndType(e[s]),n=Object(a["a"])(i,2),r=n[0],o=n[1];return t.createElement("span",{class:"pretty-jason-preview-item"},[t.createElement("span",{class:"pretty-jason-key",text:"".concat(s,": ")}),t.createElement("span",{class:"pretty-jason-value-".concat(o),text:r})])})).concat(Object.keys(e).length>3?[this.createElement("span",{class:"pretty-jason-preview-item",text:"..."})]:[]))}},{key:"resolveValueAndType",value:function(e){return null===e?["null","null"]:void 0===e?["undefined","undefined"]:"boolean"==typeof e?[e?"true":"false","boolean"]:"string"==typeof e?['"'.concat(e,'"'),"string"]:"object"==Object(et["a"])(e)?"array"==e.__type__?["Array(".concat(Object.values(e).length-1,")"),"object"]:e.__type__&&"object"!=e.__type__?[e.__type__,e.__type__.replace(" ","-")]:[e.__class__||"Object","object"]:[e.toString(),Object(et["a"])(e)]}},{key:"objectNodeClickedCallback",value:function(e){var t=e.currentTarget;this.isNodeExpanded(t)?this.collapseNode(t,e.ctrlKey||e.metaKey):this.expandNode(t,e.ctrlKey||e.metaKey)}},{key:"isNodeExpanded",value:function(e){var t=e.parentNode.querySelector("ul");return t&&"none"!=t.style.display}},{key:"expandNode",value:function(e,t){var s=this;this.renderObjectNode(e);var a=e.parentNode.querySelector("ul"),i=e.querySelector("i");i.classList.remove("pretty-jason-icon-closed","pretty-jason-icon-open"),a.style.display="block",i.classList.add("pretty-jason-icon-open"),t&&a.querySelectorAll(".pretty-jason-icon-closed").forEach((function(e){s.expandNode(e.parentNode.parentNode,t)}))}},{key:"collapseNode",value:function(e,t){var s=this,a=e.parentNode.querySelector("ul"),i=e.querySelector("i");i.classList.remove("pretty-jason-icon-closed","pretty-jason-icon-open"),a.style.display="none",i.classList.add("pretty-jason-icon-closed"),t&&a.querySelectorAll(".pretty-jason-icon-open").forEach((function(e){s.collapseNode(e.parentNode.parentNode,t)}))}},{key:"renderObjectNode",value:function(e){if(!e.dataset.rendered){var t=[],s=e;while(s=s.parentNode)if("LI"==s.tagName&&"key"in s.dataset){if(s.classList.contains("pretty-jason"))break;var a=s.dataset.key;t.unshift(isNaN(parseInt(a,10))?a:parseInt(a,10))}e.parentNode.append(this.generateHtmlNode(this.getDataFromPath(t))),e.dataset.rendered=!0}}},{key:"getDataFromPath",value:function(e){var t,s=this.data;while(void 0!==(t=e.shift()))s=s[t];return s}},{key:"createElement",value:function(e,t,s){var a=document.createElement(e);return t.html&&(a.innerHTML=t.html),t.text&&(a.innerText=t.text),t.class&&a.classList.add(t.class),t.style instanceof Object&&Object.keys(t.style).forEach((function(e){return a.style[e]=t.style[e]})),t.data instanceof Object&&Object.keys(t.data).forEach((function(e){return a.dataset[e]=t.data[e]})),t.click&&a.addEventListener("click",t.click),s instanceof Array&&s.forEach((function(e){return a.append(e)})),a}}]),e}()),it=function e(t,s){Object(tt["a"])(this,e),this.message=t,this.exception=s},nt=s("1901"),rt=s.n(nt),ot={name:"PrettyPrint",props:["data","expanded","linkify"],methods:{render:function(){var e=this.data,t=document.createElement("div");if(!0===e)t.innerHTML="true";else if(!1===e)t.innerHTML="false";else if(void 0===e)t.innerHTML="undefined";else if(null===e)t.innerHTML="null";else if("number"===typeof e)t.innerText=e;else try{t.append(new at(e).generateHtml())}catch(s){t.innerText=e,this.linkify&&(t.innerHTML=rt()(t.innerHTML))}this.$el.firstChild&&this.$el.firstChild.remove(),this.$el.append(t),this.expanded&&this.$el.querySelector(".pretty-jason > li > span").click()}},mounted:function(){this.render()},watch:{data:function(){this.render()}}},lt=ot,ct=Object(f["a"])(lt,Ze,Ye,!1,null,null,null),ut=ct.exports,dt={name:"DetailsTable",components:{DetailsTableFilterToggle:Xe,PrettyPrint:ut},props:{badge:{},columns:{},filter:{},filterExample:{},icon:{default:"menu"},items:{},noHeader:{},noTableHead:{},perPage:{default:30},title:{}},data:function(){return{firstShown:0}},computed:{filteredItems:function(){return this.filter?this.filter.filter(this.items):this.items},shownItems:function(){return this.firstShown>this.filteredItems.length&&(this.firstShown=Math.max(this.filteredItems.length-this.perPage,0)),this.filteredItems.slice(this.firstShown,this.firstShown+this.perPage)},hasPreviousItems:function(){return this.firstShown>0},previousItemsCount:function(){return this.firstShown},hasNextItems:function(){return this.firstShown+this.perPaget&&(e.scrollTop=t)}},watch:{filteredItems:function(){this.firstShown=0}}},ht=dt,vt=(s("2958"),Object(f["a"])(ht,He,Ve,!1,null,null,null)),ft=vt.exports,mt=(s("466d"),s("7677")),pt=s("460c"),gt=s("e3ee"),bt=s("b166"),wt=s("1212"),_t=s("cc73"),yt=s("2b0e"),Ct=function(){function e(t,s){Object(tt["a"])(this,e),this.tags=t,this.map=s,this.shown=!1,this.sortedBy=void 0,this.sortedDesc=!1,this.input=""}return Object(st["a"])(e,[{key:"toggle",value:function(e){this.shown=!this.shown,this.shown&&yt["a"].nextTick((function(){var t=e.target;while(t=t.parentNode)if("TABLE"==t.tagName)break;t.querySelector(".filter input").focus()}))}},{key:"sortBy",value:function(e){this.sortedBy==e?this.sortedDesc=!this.sortedDesc:(this.sortedBy=e,this.sortedDesc=!0)}},{key:"filter",value:function(e){var t=this,s=this.tokenize(this.input),a=s.terms,i=s.tags;if(e=e.filter((function(e){var s=t.map?t.map(e):e;return t.matchesTerms(s,a)&&t.matchesTags(e,i)})),this.sortedBy){var n=this.tags.find((function(e){return e.tag==t.sortedBy}));e.sort((function(e,s){var a,i;return n&&"number"==n.type?e[t.sortedBy]-s[t.sortedBy]:null===(a=e[t.sortedBy])||void 0===a?void 0:a.toString().localeCompare(null===(i=s[t.sortedBy])||void 0===i?void 0:i.toString())}))}return this.sortedDesc&&(e=e.reverse()),e}},{key:"matchesTerms",value:function(e,t){var s=this;return!t.length||("object"==Object(et["a"])(e)&&null!==e?Object.values(e).find((function(e){return s.matchesTerms(e,t)})):"string"==typeof e&&t.find((function(t){return e.toLowerCase().includes(t.toLowerCase())})))}},{key:"matchesTags",value:function(e,t){var s=this;return!Object.keys(t).length||Object.keys(t).every((function(a){return a=s.tags.find((function(e){return e.tag==a})),!!a&&("number"==a.type||"date"==a.type?t[a.tag].every((function(t){return s.isTagApplicable(a,e,t)})):t[a.tag].find((function(t){return s.isTagApplicable(a,e,t)})))}))}},{key:"isTagApplicable",value:function(e,t,s){return e.apply?e.apply(t,s):(t=e.map?e.map(t):t[e.tag],"number"==e.type?(a=s.match(/^<(\d+(?:\.\d+)?)$/))?t(\d+(?:\.\d+)?)$/))?parseFloat(a[1])(.+)$/))?Object(wt["a"])(Object(pt["a"])(new Date(t),0),Object(gt["a"])(i[1].match(/^\d+:\d+(:\d+)?$/)?Object(bt["a"])(new Date,"yyyy-MM-dd ")+i[1]:i[1])):Object(_t["a"])(Object(pt["a"])(new Date(t),0),Object(gt["a"])(s.match(/^\d+:\d+(:\d+)?$/)?Object(bt["a"])(new Date,"yyyy-MM-dd ")+s:s)):"string"==typeof t&&t.toLowerCase().includes(s.toLowerCase()));var a,i}},{key:"tokenize",value:function(e){var t,s=[],a={},i=/(\w+:)?("[^"]*"|[^\s]+)/g;while(t=i.exec(e)){var n=t[1]?t[1].substr(0,t[1].length-1):void 0,r=t[2];(t=r.match(/^"(.+?)"$/))&&(r=t[1]),n?(a[n]||(a[n]=[]),a[n].push(r)):s.push(r)}return{terms:s,tags:a}}}]),e}(),qt={name:"CacheTab",components:{DetailsTable:ft,PrettyPrint:ut,StackTrace:z},props:["active"],data:function(){return{filter:new Ct([{tag:"action",apply:function(e,t){if(["read","write","delete","miss"].includes(t.toLowerCase()))return e.type.toLowerCase()==t.toLowerCase()}},{tag:"key"},{tag:"file",map:function(e){return e.shortPath}}])}},computed:{columns:function(){var e=[{name:"Action",sortBy:"type"},"Key","Value","Expires"];return this.$request.cacheQueries.some((function(e){return e.connection}))&&e.unshift("Connection"),this.$request.cacheQueries.some((function(e){return e.duration}))&&e.push("Duration"),e}}},$t=qt,kt=Object(f["a"])($t,Fe,Je,!1,null,null,null),xt=kt.exports,Tt=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("div",{staticClass:"counters-row"},[s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseQueriesCount))]),s("div",{staticClass:"counter-title"},[e._v("queries")])]),e.$request.databaseSlowQueries?s("div",{staticClass:"counter database-slow-query"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseSlowQueries))]),s("div",{staticClass:"counter-title has-mark"},[e._v("slow")])]):e._e(),e.$request.databaseSelects?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseSelects))]),s("div",{staticClass:"counter-title"},[e._v("selects")])]):e._e(),e.$request.databaseInserts?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseInserts))]),s("div",{staticClass:"counter-title"},[e._v("inserts")])]):e._e(),e.$request.databaseUpdates?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseUpdates))]),s("div",{staticClass:"counter-title"},[e._v("updates")])]):e._e(),e.$request.databaseDeletes?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseDeletes))]),s("div",{staticClass:"counter-title"},[e._v("deletes")])]):e._e(),e.$request.databaseOthers?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseOthers))]),s("div",{staticClass:"counter-title"},[e._v("other")])]):e._e(),s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.databaseDurationRounded)+" ms")]),s("div",{staticClass:"counter-title"},[e._v("time")])])]),e.$request.databaseQueries.length?s("details-table",{attrs:{title:"Queries",icon:"database",columns:e.columns,items:e.$request.databaseQueries,filter:e.filter,"filter-example":"where request_id model:request type:select file:Controller.php duration:>100"},scopedSlots:e._u([{key:"toolbar",fn:function(t){var a=t.filter;return[s("div",{staticClass:"header-group"},[s("label",{staticClass:"header-toggle"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.prettify,expression:"prettify"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.prettify)?e._i(e.prettify,null)>-1:e.prettify},on:{change:function(t){var s=e.prettify,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&(e.prettify=s.concat([n])):r>-1&&(e.prettify=s.slice(0,r).concat(s.slice(r+1)))}else e.prettify=i}}}),e._v(" Prettify ")])]),s("div",{staticClass:"header-group"},[s("div",{staticClass:"header-search"},[s("input",{directives:[{name:"model",rawName:"v-model",value:a.input,expression:"filter.input"}],attrs:{type:"search",placeholder:"Search..."},domProps:{value:a.input},on:{input:function(t){t.target.composing||e.$set(a,"input",t.target.value)}}}),s("icon",{attrs:{name:"search"}})],1)])]}},{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a,class:{"database-slow-query":t.tags.includes("slow")}},[s("td",[s("shortened-text",{attrs:{full:t.model}},[e._v(e._s(t.shortModel))])],1),e.columns.includes("Connection")?s("td",[e._v(e._s(t.connection))]):e._e(),s("td",[s("div",{staticClass:"database-query"},[s("div",{staticClass:"database-query-content"},[s("highlighted-code",{attrs:{language:"sql",code:e.prettify?t.prettifiedQuery:t.query}}),t.bindings?s("div",{staticClass:"database-query-bindings"},[s("pretty-print",{attrs:{data:t.bindings}})],1):e._e()],1),s("stack-trace",{staticClass:"database-query-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",{staticClass:"database-duration"},[t.duration?s("span",[e._v(e._s(e._f("round")(t.duration,3))+" ms")]):e._e()])])}))}}],null,!1,475677615)}):e._e()],1)},St=[],jt=(s("4d63"),s("6062"),s("3ca3"),s("ddb0"),s("a434"),function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("pre",{staticClass:"highlighted-code"},[s("code",{class:e.languageClass,domProps:{innerHTML:e._s(e.html)}})])}),Ot=[],Pt=s("8c7a"),Dt=s.n(Pt),Rt=(s("af8a"),{name:"HighlightedCode",props:["code","language"],computed:{languageClass:function(){return"language-".concat(this.language)},html:function(){return Dt.a.highlight(this.code,Dt.a.languages.sql,"sql")}}}),Et=Rt,Nt=(s("0774"),Object(f["a"])(Et,jt,Ot,!1,null,null,null)),At=Nt.exports,It={name:"DatabaseTab",components:{DetailsTable:ft,HighlightedCode:At,PrettyPrint:ut,ShortenedText:H,StackTrace:z},props:["active"],data:function(){return{prettify:!1,filter:new Ct([{tag:"model"},{tag:"type",apply:function(e,t){if(["select","update","insert","delete"].includes(t.toLowerCase()))return e.query.match(new RegExp("^".concat(t.toLowerCase()),"i"))}},{tag:"file",map:function(e){return e.shortPath}},{tag:"duration",type:"number"}])}},computed:{columns:function(){var e=["Model","Query","Duration"],t=new Set(this.$request.databaseQueries.map((function(e){return e.connection}))).size>1;return t&&e.splice(1,0,"Connection"),e}},watch:{prettify:function(e,t){void 0!==t&&(this.$settings.global.databasePrettified=this.prettify,this.$settings.save())}},mounted:function(){this.prettify=this.$settings.global.databasePrettified||!1}},Mt=It,Lt=(s("c563"),Object(f["a"])(Mt,Tt,St,!1,null,null,null)),Qt=Lt.exports,Ut=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("details-table",{attrs:{title:"Events",icon:"zap",columns:["Time","Event",""],items:e.$request.events,filter:e.filter,"filter-example":'"user registered" file:Controller.php time:<13:08:30'},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[s("td",[e._v(e._s(e._f("date")(t.time,"HH:mm:ss")))]),s("td",[s("div",{staticClass:"fired-event"},[s("div",{staticClass:"fired-event-content"},[t.objectEvent?s("div",[s("pretty-print",{attrs:{data:t.data}})],1):e._e(),t.objectEvent?e._e():s("div",[e._v(" "+e._s(t.event)+" ")])]),s("stack-trace",{staticClass:"fired-query-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1),s("div",{directives:[{name:"show",rawName:"v-show",value:e.isEventExpanded(t),expression:"isEventExpanded(event)"}],staticClass:"fired-event-details"},[t.objectEvent?e._e():s("div",{staticClass:"fired-event-parameters"},[s("h4",[e._v("Parameters")]),s("pretty-print",{attrs:{data:t.data}})],1),s("div",{staticClass:"fired-event-listeners"},[s("h4",[e._v("Listeners")]),e._l(t.listeners,(function(t,a){return s("shortened-text",{key:e.$request.id+"-"+a,attrs:{full:t.name}},[e._v(" "+e._s(t.shortName)+" ")])}))],2)])]),s("td",{staticClass:"fired-event-actions"},[s("a",{attrs:{href:"#"},on:{click:function(s){return s.preventDefault(),e.toggleEvent(t)}}},[s("icon",{attrs:{name:e.isEventExpanded(t)?"chevron-up":"chevron-down"}})],1)])])}))}}])})],1)},Ft=[],Jt={name:"EventsTab",components:{DetailsTable:ft,PrettyPrint:ut,ShortenedText:H,StackTrace:z},props:["active"],data:function(){return{filter:new Ct([{tag:"time",type:"date"},{tag:"file",map:function(e){return e.shortPath}}]),expandedEvents:[]}},methods:{toggleEvent:function(e){this.isEventExpanded(e)?this.expandedEvents=this.expandedEvents.filter((function(t){return t!=e})):this.expandedEvents.push(e)},isEventExpanded:function(e){return-1!==this.expandedEvents.indexOf(e)}}},Ht=Jt,Vt=Object(f["a"])(Ht,Ut,Ft,!1,null,null,null),Wt=Vt.exports,Bt=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("details-table",{attrs:{title:"Messages",icon:"edit-2",columns:["Time","Level","Message"],items:e.log,filter:e.filter,"filter-example":"query failed level:error file:Controller.php time:>13:08:29"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a,class:{"log-row":!0,error:["emergency","alert","critical","error"].includes(t.level),warning:"warning"==t.level}},[s("td",{staticClass:"log-date"},[e._v(e._s(e._f("date")(t.time,"HH:mm:ss")))]),s("td",{staticClass:"log-level"},[e._v(e._s(t.level))]),s("td",[s("div",{staticClass:"log-message"},[s("div",{staticClass:"log-message-content"},[s("pretty-print",{attrs:{data:t.message,linkify:!0}}),s("div",{directives:[{name:"show",rawName:"v-show",value:t.context,expression:"message.context"}],staticClass:"log-message-context"},[s("pretty-print",{attrs:{data:t.context}})],1)],1),t.exception?s("div",{staticClass:"log-message-exception"},[t.exception.previous?s("a",{staticClass:"exception-previous",attrs:{href:"#"},on:{click:function(s){return s.preventDefault(),e.showPreviousException(t)}}},[e._v("Show previous")]):e._e(),s("span",{staticClass:"exception-type"},[e._v(e._s(t.exception.type))]),t.exception.code?s("span",{staticClass:"exception-code"},[e._v("#"+e._s(t.exception.code))]):e._e()]):e._e(),s("stack-trace",{staticClass:"log-message-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)])])}))}}])})],1)},zt=[],Gt={name:"LogTab",components:{DetailsTable:ft,PrettyPrint:ut,StackTrace:z},props:["active"],data:function(){return{filter:new Ct([{tag:"time",type:"date"},{tag:"level"},{tag:"file",map:function(e){return e.shortPath}}],(function(e){return e.message}))}},computed:{log:function(){return this.$request.log.filter((function(e){var t;return!(null!==(t=e.context)&&void 0!==t&&t.performance)}))}},methods:{showPreviousException:function(e){var t=this.$request.log.indexOf(e);this.$request.log.splice(t+1,0,{time:e.time,message:e.exception.previous.message,exception:e.exception.previous,level:"error",shortPath:"".concat(e.exception.previous.file.split(/[\/\\]/).pop(),":").concat(e.exception.previous.line),trace:e.exception.previous.trace}),e.exception.previous=void 0}}},Kt=Gt,Xt=(s("f16e"),Object(f["a"])(Kt,Bt,zt,!1,null,null,null)),Zt=Xt.exports,Yt=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("div",{staticClass:"counters-row models-counters"},[e.totals.retrieved?s("div",{staticClass:"counter counter-retrieved"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.totals.retrieved))]),s("div",{staticClass:"counter-title has-mark"},[e._v("retrieved")])]):e._e(),e.totals.created?s("div",{staticClass:"counter counter-created"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.totals.created))]),s("div",{staticClass:"counter-title has-mark"},[e._v("created")])]):e._e(),e.totals.updated?s("div",{staticClass:"counter counter-updated"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.totals.updated))]),s("div",{staticClass:"counter-title has-mark"},[e._v("updated")])]):e._e(),e.totals.deleted?s("div",{staticClass:"counter counter-deleted"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.totals.deleted))]),s("div",{staticClass:"counter-title has-mark"},[e._v("deleted")])]):e._e()]),e.$request.modelsActions.length?s("div",{staticClass:"models-tabs"},[s("a",{staticClass:"models-tab",class:{active:"actions"==e.activeModelsTab},attrs:{href:"#"},on:{click:function(t){t.preventDefault(),e.selectedModelsTab="actions"}}},[s("icon",{attrs:{name:"activity"}}),e._v(" Actions ")],1),s("a",{staticClass:"models-tab",class:{active:"models"==e.activeModelsTab},attrs:{href:"#"},on:{click:function(t){t.preventDefault(),e.selectedModelsTab="models"}}},[s("icon",{attrs:{name:"hash"}}),e._v(" Models ")],1)]):e._e(),"actions"==e.activeModelsTab?s("details-table",{staticClass:"models-actions",attrs:{title:"Actions",icon:"activity",columns:["Model","",""],items:e.$request.modelsActions,filter:e.actionsFilter,"filter-example":"App\\User action:updated"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return[e._l(a,(function(t,a){return[s("tr",{key:e.$request.id+"-models-actions-"+a,staticClass:"actions-action"},[s("td",{staticClass:"action-model"},[s("div",{staticClass:"model-content"},[s("div",{staticClass:"content-text"},[s("shortened-text",{attrs:{full:t.model}},[e._v(e._s(t.shortModel))]),t.key?s("span",{staticClass:"action-key"},[s("span",{staticClass:"key-hash"},[e._v("#")]),e._v(e._s(t.key)+" ")]):e._e()],1),s("stack-trace",{staticClass:"content-trace",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",{staticClass:"database-duration"},[s("span",{staticClass:"action-action",class:"action-"+t.action},[e._v(e._s(t.action))])]),s("td",[t.attributes||t.changes?s("a",{attrs:{href:"#",title:"Show details"},on:{click:function(e){e.preventDefault(),t.isShowingDetails=!t.isShowingDetails}}},[s("icon",{attrs:{name:t.isShowingDetails?"chevron-up":"chevron-down"}})],1):e._e()])]),s("tr",{directives:[{name:"show",rawName:"v-show",value:t.isShowingDetails,expression:"action.isShowingDetails"}],key:e.$request.id+"-models-actions-details-"+a,staticClass:"actions-details"},[s("td",{attrs:{colspan:"3"}},[t.attributes?s("div",{staticClass:"details-row"},[s("div",{staticClass:"row-group"},[s("h4",[e._v("Attributes")]),s("pretty-print",{attrs:{data:t.attributes}})],1)]):e._e(),t.changes?s("div",{staticClass:"details-row"},[s("div",{staticClass:"row-group"},[s("h4",[e._v("Changes")]),s("pretty-print",{attrs:{data:t.changes}})],1)]):e._e(),t.query?s("div",{staticClass:"details-row"},[t.query?s("div",{staticClass:"row-group group-query"},[s("h4",[e._v("Query")]),s("highlighted-code",{attrs:{language:"sql",code:t.query}})],1):e._e(),t.duration?s("div",{staticClass:"row-group"},[s("h4",[e._v("Duration")]),s("span",[e._v(e._s(e._f("round")(t.duration,3))+" ms")])]):e._e(),t.connection?s("div",{staticClass:"row-group"},[s("h4",[e._v("Connection")]),s("span",[e._v(e._s(t.connection))])]):e._e()]):e._e()])])]}))]}}],null,!1,1918269834)}):e._e(),"models"==e.activeModelsTab?s("details-table",{staticClass:"models-counts",attrs:{title:"Models",icon:"hash",columns:["Model","Retrieved","Created","Updated","Deleted"],items:e.modelsCounts,filter:e.countsFilter,"filter-example":"App\\User retrieved:>10"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return[e._l(a,(function(t,a){return[s("tr",{key:e.$request.id+"-models-counts-"+a},[s("td",{staticClass:"counts-model"},[s("shortened-text",{attrs:{full:t.model}},[e._v(e._s(t.shortModel))])],1),s("td",{staticClass:"counts-count"},[t.retrieved?s("span",{staticClass:"count-text count-retrieved"},[e._v(e._s(t.retrieved))]):s("span",[e._v("-")])]),s("td",{staticClass:"counts-count"},[t.created?s("span",{staticClass:"count-text count-created"},[e._v(e._s(t.created))]):s("span",[e._v("-")])]),s("td",{staticClass:"counts-count"},[t.updated?s("span",{staticClass:"count-text count-updated"},[e._v(e._s(t.updated))]):s("span",[e._v("-")])]),s("td",{staticClass:"counts-count"},[t.deleted?s("span",{staticClass:"count-text count-deleted"},[e._v(e._s(t.deleted))]):s("span",[e._v("-")])])])]}))]}}],null,!1,639342335)}):e._e()],1)},es=[],ts=s("2909"),ss=(s("a630"),{name:"ModelsTab",components:{DetailsTable:ft,HighlightedCode:At,PrettyPrint:ut,ShortenedText:H,StackTrace:z},props:["active"],data:function(){return{selectedModelsTab:"actions",actionsFilter:new Ct([{tag:"model"},{tag:"action"},{tag:"file",map:function(e){return e.shortPath}}]),countsFilter:new Ct([{tag:"model"},{tag:"retrieved",type:"number"},{tag:"created",type:"number"},{tag:"updated",type:"number"},{tag:"deleted",type:"number"}])}},computed:{totals:function(){return{retrieved:Object.values(this.$request.modelsRetrieved).reduce((function(e,t){return e+t}),0),created:Object.values(this.$request.modelsCreated).reduce((function(e,t){return e+t}),0),updated:Object.values(this.$request.modelsUpdated).reduce((function(e,t){return e+t}),0),deleted:Object.values(this.$request.modelsDeleted).reduce((function(e,t){return e+t}),0)}},activeModelsTab:function(){return"actions"!=this.selectedModelsTab||this.$request.modelsActions.length?this.selectedModelsTab:"models"},modelsCounts:function(){var e=this,t=new Set([].concat(Object(ts["a"])(Object.keys(this.$request.modelsRetrieved)),Object(ts["a"])(Object.keys(this.$request.modelsCreated)),Object(ts["a"])(Object.keys(this.$request.modelsUpdated)),Object(ts["a"])(Object.keys(this.$request.modelsDeleted))));return Array.from(t).map((function(t){return{model:t,shortModel:t.split("\\").pop(),retrieved:e.$request.modelsRetrieved[t],created:e.$request.modelsCreated[t],updated:e.$request.modelsUpdated[t],deleted:e.$request.modelsDeleted[t]}}))}},methods:{isTabActive:function(e){if(""==e)return this.selectedModelsTab==e},showTab:function(e){this.selectedModelsTab=e}}}),as=ss,is=(s("d3ec"),Object(f["a"])(as,Yt,es,!1,null,null,null)),ns=is.exports,rs=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("details-table",{staticClass:"notifications-notifications",attrs:{title:"Notifications",icon:"mail",columns:e.columns,items:e.$request.notifications,filter:e.filter,"filter-example":'"User Registration" to:its@underground.works'},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return[e._l(a,(function(t,a){return[s("tr",{key:e.$request.id+"-notifications-"+a},[e.columns.includes("Type")?s("td",[e._v(e._s(e._f("title")(t.type)))]):e._e(),s("td",[e._v(e._s(e._f("join")(t.to,", ")))]),s("td",{staticClass:"notification-subject"},[s("div",{staticClass:"subject-content"},[s("div",{staticClass:"content-text"},[e._v(" "+e._s(t.subject)+" ")]),s("stack-trace",{staticClass:"content-trace",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",{staticClass:"notification-actions"},[t.content?s("a",{attrs:{href:"#",title:"Show message"},on:{click:function(s){s.preventDefault(),e.showNotification=t}}},[s("icon",{attrs:{name:"search"}})],1):e._e(),s("a",{attrs:{href:"#",title:"Show details"},on:{click:function(e){e.preventDefault(),t.isShowingDetails=!t.isShowingDetails}}},[s("icon",{attrs:{name:t.isShowingDetails?"chevron-up":"chevron-down"}})],1)])]),s("tr",{directives:[{name:"show",rawName:"v-show",value:t.isShowingDetails,expression:"notification.isShowingDetails"}],key:e.$request.id+"-notifications-details-"+a,staticClass:"notifications-details"},[s("td",{attrs:{colspan:e.columns.length}},[s("div",{staticClass:"details-row"},[t.to?s("div",{staticClass:"row-group"},[s("h4",[e._v("To")]),s("span",[e._v(e._s(e._f("join")(t.to,", ")))])]):e._e(),t.data.cc?s("div",{staticClass:"row-group"},[s("h4",[e._v("CC")]),s("span",[e._v(e._s(e._f("join")(t.data.cc,", ")))])]):e._e(),t.data.bcc?s("div",{staticClass:"row-group"},[s("h4",[e._v("BCC")]),s("span",[e._v(e._s(e._f("join")(t.data.bcc,", ")))])]):e._e(),t.from?s("div",{staticClass:"row-group"},[s("h4",[e._v("From")]),s("span",[e._v(e._s(e._f("join")(t.from,", ")))])]):e._e(),t.data.replyTo?s("div",{staticClass:"row-group"},[s("h4",[e._v("Reply To")]),s("span",[e._v(e._s(e._f("join")(t.data.replyTo,", ")))])]):e._e()]),s("div",{staticClass:"details-row"},[s("div",{staticClass:"row-group"},[s("h4",[e._v("Subject")]),s("pretty-print",{attrs:{data:t.subject}})],1)]),e._l(e.additionalData(t.data),(function(t,a){return t?s("div",{staticClass:"details-row"},[s("div",{staticClass:"row-group"},[s("h4",[e._v(e._s(e._f("title")(a)))]),s("pretty-print",{attrs:{data:t}})],1)]):e._e()}))],2)])]}))]}}])}),s("message-modal",{attrs:{message:e.showNotification},on:{"update:message":function(t){e.showNotification=t}}})],1)},os=[],ls=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("modal",{attrs:{icon:"mail",title:"Message",shown:e.messageLocal},on:{"update:shown":function(t){e.messageLocal=t}}},[s("div",{staticClass:"email-message"},[s("div",{staticClass:"message-info"},[e.message?s("div",{staticClass:"info-row"},[s("span",{staticClass:"row-label"},[e._v("To: ")]),s("span",{staticClass:"row-value"},[e._v(e._s(e.message.to.join(", ")))])]):e._e(),e.message?s("div",{staticClass:"info-row"},[s("span",{staticClass:"row-label"},[e._v("Subject: ")]),s("span",{staticClass:"row-value"},[e._v(e._s(e.message.subject))])]):e._e()]),s("div",{staticClass:"message-content"},[s("iframe",{ref:"content"})])])])},cs=[],us={name:"EmailMessageModal",components:{Modal:p},props:["message"],computed:{messageLocal:{get:function(){return this.message},set:function(e){this.$emit("update:message",e)}}},watch:{message:function(e){if(e){var t=this.$refs.content.contentWindow.document;t.open(),t.write(this.message.content),t.close()}}}},ds=us,hs=(s("337f"),Object(f["a"])(ds,ls,cs,!1,null,null,null)),vs=hs.exports,fs=s("57b8"),ms=s.n(fs),ps={name:"notificationsTab",components:{DetailsTable:ft,DetailsTableFilterToggle:Xe,MessageModal:vs,PrettyPrint:ut,StackTrace:z},props:["active"],data:function(){return{filter:new Ct([{tag:"to"}]),showNotification:null}},computed:{columns:function(){var e=["To","Subject",""],t=new Set(this.$request.notifications.map((function(e){return e.type}))).size>1;return t&&e.splice(1,0,"Type"),e}},methods:{additionalData:function(e){return ms()(e,["cc","bcc","replyTo"])}}},gs=ps,bs=(s("5518"),Object(f["a"])(gs,rs,os,!1,null,null,null)),ws=bs.exports,_s=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("div",{staticClass:"command-output",domProps:{innerHTML:e._s(e.formattedOutput)}})])},ys=[],Cs=s("61ab"),qs=s.n(Cs),$s={name:"OutputTab",props:["active"],computed:{formattedOutput:function(){return this.ansiToHtml.toHtml(this.$request.commandOutput||"")}},created:function(){this.ansiToHtml=new qs.a({fg:"#c7c7c7",bg:"#000000",escapeXML:!0,colors:{0:"#000000",1:"#c91b00",2:"#00c200",3:"#c7c400",4:"#0225c7",5:"#c930c7",6:"#00c5c7",7:"#c7c7c7",8:"#676767",9:"#ff6d67",10:"#5ff967",11:"#fefb67",12:"#6871ff",13:"#ff76ff",14:"#5ffdff",15:"#feffff"}})}},ks=$s,xs=(s("288a"),Object(f["a"])(ks,_s,ys,!1,null,null,null)),Ts=xs.exports,Ss=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("div",{staticClass:"counters-row performance-metrics"},[e.$request.responseDurationRounded?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.responseDurationRounded)+" ms")]),s("div",{staticClass:"counter-title"},[e._v("Response time")])]):e._e(),e.$request.memoryUsage?s("div",{staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(e.$request.memoryUsageFormatted))]),s("div",{staticClass:"counter-title"},[e._v("Memory")])]):e._e(),s("div",{staticClass:"counters-group right-aligned"},e._l(e.$request.performanceMetrics,(function(t,a){return s("div",{key:e.$request.id+"-"+a,staticClass:"counter performance-chart-legend"},[s("div",{staticClass:"counter-value"},[e._v(e._s(t.value)+" ms")]),s("div",{staticClass:"counter-title has-mark",class:"mark-"+t.color},[e._v(e._s(t.name))])])})),0)]),s("performance-chart",{attrs:{metrics:e.$request.performanceMetrics}}),s("div",{attrs:{tabs:"performance"}},[s("div",{staticClass:"performance-tabs"},[e.databaseSlowQueries.length||e.performanceIssues.length?s("a",{staticClass:"performance-tab",class:{active:e.isTabActive("issues")},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.showTab("issues")}}},[s("icon",{attrs:{name:"alert-triangle"}}),e._v(" Issues ")],1):e._e(),s("a",{staticClass:"performance-tab",class:{active:e.isTabActive("timeline")},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.showTab("timeline")}}},[s("icon",{attrs:{name:"pie-chart"}}),e._v(" Timeline ")],1),e.isClientSideTabAvailable?s("a",{staticClass:"performance-tab",class:{active:e.isTabActive("client-side")},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.showTab("client-side")}}},[s("icon",{attrs:{name:"smile"}}),e._v(" Client-side ")],1):e._e(),s("a",{directives:[{name:"show",rawName:"v-show",value:e.$platform.hasFeature("profiler"),expression:"$platform.hasFeature('profiler')"}],staticClass:"performance-tab",class:{active:e.isTabActive("profiler")},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.showTab("profiler")}}},[s("icon",{attrs:{name:"clock"}}),e._v(" Profiler ")],1)]),s("performance-log",{directives:[{name:"show",rawName:"v-show",value:e.isTabActive("issues"),expression:"isTabActive('issues')"}],attrs:{issues:e.performanceIssues,"slow-queries":e.databaseSlowQueries}}),s("timeline",{directives:[{name:"show",rawName:"v-show",value:e.isTabActive("timeline"),expression:"isTabActive('timeline')"}],attrs:{name:"performance",timeline:e.$request.timeline,tags:e.timelineTags}}),s("performance-client-side",{directives:[{name:"show",rawName:"v-show",value:e.isTabActive("client-side"),expression:"isTabActive('client-side')"}],attrs:{metrics:e.$request.clientMetrics,vitals:e.$request.webVitals}}),s("profiler",{directives:[{name:"show",rawName:"v-show",value:e.isTabActive("profiler"),expression:"isTabActive('profiler')"}]})],1)],1)},js=[],Os=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"performance-chart"},e._l(e.sections,(function(e){return s("div",{staticClass:"chart-section",class:e.class,style:e.style})})),0)},Ps=[],Ds={name:"PerformanceChart",props:{metrics:{default:function(){return[]}}},data:function(){return{sections:[]}},methods:{refreshSections:function(){var e=this.$el.offsetWidth,t=this.metrics.reduce((function(e,t){return e+t.value}),0);this.sections=this.metrics.map((function(s){return{class:"section-".concat(s.color),style:"width: ".concat(e*s.value/t,"px")}}))}},mounted:function(){var e=this;this.refreshSections(),this.resizeObserver=new ResizeObserver(Ie()((function(t){return e.refreshSections()}),10)),this.resizeObserver.observe(this.$el)},watch:{metrics:function(){this.refreshSections()}}},Rs=Ds,Es=(s("6ff6"),Object(f["a"])(Rs,Os,Ps,!1,null,null,null)),Ns=Es.exports,As=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"performance-client-side"},[e.metrics.filter((function(e){return e.value})).length?s("div",{staticClass:"counters-row performance-metrics"},[e._l(e.metrics.filter((function(e){return!e.dom})),(function(t){return t.value?s("div",{staticClass:"counter performance-chart-legend"},[s("div",{staticClass:"counter-value"},[e._v(e._s(t.value)+" ms")]),s("div",{staticClass:"counter-title",class:t.color?"has-mark mark-"+t.color:""},[e._v(e._s(t.name))])]):e._e()})),s("div",{staticClass:"counters-group right-aligned"},e._l(e.metrics.filter((function(e){return e.dom})),(function(t){return t.value?s("div",{staticClass:"counter performance-chart-legend"},[s("div",{staticClass:"counter-value"},[e._v(e._s(t.value)+" ms")]),s("div",{staticClass:"counter-title",class:t.color?"has-mark mark-"+t.color:""},[e._v(e._s(t.name))])]):e._e()})),0)],2):e._e(),e.metrics.filter((function(e){return e.value&&e.onChart})).length?s("performance-chart",{attrs:{metrics:e.metrics.filter((function(e){return e.onChart}))}}):e._e(),Object.values(e.vitals).filter((function(e){return e.value})).length?s("details-table",{staticClass:"performance-vitals",attrs:{title:"Vitals",icon:"activity",items:[]}},[s("template",{slot:"toolbar"},[s("div",{staticClass:"header-group"},[s("a",{staticClass:"header-item",class:{active:e.showVitalsInfo},attrs:{href:"#",title:"Show info"},on:{click:function(t){return t.preventDefault(),e.toggleVitalsInfo.apply(null,arguments)}}},[s("icon",{attrs:{name:"help-circle"}})],1)])]),s("template",{slot:"body"},[s("tr",[s("td",[s("div",{staticClass:"vitals-row"},[s("div",{staticClass:"vitals-metric"},[s("div",{staticClass:"metric-name"},[e._v("Time To First Byte")]),e.vitals.ttfb.available?s("div",{staticClass:"metric-value",class:"value-"+e.vitals.ttfb.score},[e._v(" "+e._s(e._f("round")(e.vitals.ttfb.value))+" ms ")]):s("div",{staticClass:"metric-value value-unavailable"},[e._v("—")]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.showVitalsInfo,expression:"showVitalsInfo"}],staticClass:"metric-info"},[e._v(" Time at which your server sends a response. "),s("a",{attrs:{href:"https://web.dev/time-to-first-byte/",target:"_blank"}},[e._v("Learn more")])])]),s("div",{staticClass:"vitals-metric"},[s("div",{staticClass:"metric-name"},[e._v("First Input Delay")]),e.vitals.fid.available?s("div",{staticClass:"metric-value",class:"value-"+e.vitals.fid.score},[e._v(" "+e._s(e._f("round")(e.vitals.fid.value))+" ms ")]):s("div",{staticClass:"metric-value value-unavailable"},[e._v("—")]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.showVitalsInfo,expression:"showVitalsInfo"}],staticClass:"metric-info"},[e._v(" Time from when a user first interacts with a page to the time when the browser is actually able to respond to that interaction. "),s("a",{attrs:{href:"https://web.dev/fid/",target:"_blank"}},[e._v("Learn more")])])])])])]),s("tr",[s("td",[s("div",{staticClass:"vitals-row"},[s("div",{staticClass:"vitals-metric"},[s("div",{staticClass:"metric-name"},[e._v("First Contentful Paint")]),e.vitals.fcp.available?s("div",{staticClass:"metric-value",class:"value-"+e.vitals.fcp.score},[e._v(" "+e._s(e._f("round")(e.vitals.fcp.value))+" ms ")]):s("div",{staticClass:"metric-value value-unavailable"},[e._v("—")]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.showVitalsInfo,expression:"showVitalsInfo"}],staticClass:"metric-info"},[e._v(" First Contentful Paint marks the time at which the first text or image is painted. "),s("a",{attrs:{href:"https://web.dev/first-contentful-paint/",target:"_blank"}},[e._v("Learn more")])])]),s("div",{staticClass:"vitals-metric"},[s("div",{staticClass:"metric-name"},[e._v("Largest Contentful Paint")]),e.vitals.lcp.available?s("div",{staticClass:"metric-value",class:"value-"+e.vitals.lcp.score},[e._v(" "+e._s(e._f("round")(e.vitals.lcp.value))+" ms ")]):s("div",{staticClass:"metric-value value-unavailable"},[e._v("—")]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.showVitalsInfo,expression:"showVitalsInfo"}],staticClass:"metric-info"},[e._v(" Largest Contentful Paint marks the time at which the largest text or image is painted. "),s("a",{attrs:{href:"https://web.dev/lighthouse-largest-contentful-paint/",target:"_blank"}},[e._v("Learn more")])])])])])]),s("tr",[s("td",[s("div",{staticClass:"vitals-row"},[s("div",{staticClass:"vitals-metric"},[s("div",{staticClass:"metric-name"},[e._v("Cumulative Layout Shift")]),e.vitals.cls.available?s("div",{staticClass:"metric-value",class:"value-"+e.vitals.cls.score},[e._v(" "+e._s(e._f("round")(e.vitals.cls.value))+" ms ")]):s("div",{staticClass:"metric-value value-unavailable"},[e._v("—")]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.showVitalsInfo,expression:"showVitalsInfo"}],staticClass:"metric-info"},[e._v(" Cumulative Layout Shift measures the movement of visible elements within the viewport. "),s("a",{attrs:{href:"https://web.dev/cls/",target:"_blank"}},[e._v("Learn more")])])]),s("div",{staticClass:"vitals-metric"},[s("div",{staticClass:"metric-name"},[e._v("Speed Index")]),e.vitals.si.available?s("div",{staticClass:"metric-value",class:"value-"+e.vitals.si.score},[e._v(" "+e._s(e._f("round")(e.vitals.si.value))+" ms ")]):s("div",{staticClass:"metric-value value-unavailable"},[e._v("—")]),s("div",{directives:[{name:"show",rawName:"v-show",value:e.showVitalsInfo,expression:"showVitalsInfo"}],staticClass:"metric-info"},[e._v(" Speed Index shows how quickly the contents of a page are visibly populated. "),s("a",{attrs:{href:"https://web.dev/speed-index/",target:"_blank"}},[e._v("Learn more")])])])])])])])],2):e._e()],1)},Is=[],Ms={name:"PerformanceClientSide",components:{DetailsTable:ft,PerformanceChart:Ns},props:["metrics","vitals"],computed:{showVitalsInfo:function(){return this.$settings.global.performanceVitalsInfoShown}},methods:{toggleVitalsInfo:function(){this.$settings.global.performanceVitalsInfoShown=!this.$settings.global.performanceVitalsInfoShown,this.$settings.save()}}},Ls=Ms,Qs=(s("5a57"),Object(f["a"])(Ls,As,Is,!1,null,null,null)),Us=Qs.exports,Fs=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"performance-log"},[e.issues.length?s("details-table",{attrs:{title:"Performance issues",icon:"alert-triangle",badge:e.issues.length,columns:["Message"],items:e.issues,filter:e.performanceLogFilter,"filter-example":"query failed file:Controller.php time:>13:08:29","no-table-head":!0},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a,staticClass:"log-row"},[s("td",[s("div",{staticClass:"log-message"},[s("div",{staticClass:"log-message-content"},[s("pretty-print",{attrs:{data:t.message}}),s("div",{directives:[{name:"show",rawName:"v-show",value:t.context&&t.context.length,expression:"message.context && message.context.length"}]},[s("pretty-print",{attrs:{data:t.context}})],1)],1),s("stack-trace",{staticClass:"log-message-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)])])}))}}],null,!1,938518525)}):e._e(),e.slowQueries.length?s("details-table",{attrs:{title:"Slow database queries",icon:"database",badge:e.slowQueries.length,columns:e.databaseSlowQueriesColumns,items:e.slowQueries,filter:e.databaseSlowQueriesFilter,"filter-example":"where request_id model:request type:select file:Controller.php duration:>100"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[s("td",[s("shortened-text",{attrs:{full:t.model}},[e._v(e._s(t.shortModel))])],1),e.databaseSlowQueriesColumns.includes("Connection")?s("td",[e._v(e._s(t.connection))]):e._e(),s("td",[s("div",{staticClass:"database-query"},[s("div",{staticClass:"database-query-content"},[s("highlighted-code",{attrs:{language:"sql",code:t.query}})],1),s("stack-trace",{staticClass:"database-query-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",{staticClass:"database-duration"},[e._v(e._s(t.duration)+" ms")])])}))}}],null,!1,453533967)}):e._e()],1)},Js=[],Hs={name:"PerformanceLog",components:{DetailsTable:ft,DetailsTableFilterToggle:Xe,HighlightedCode:At,PrettyPrint:ut,ShortenedText:H,StackTrace:z},props:["issues","slowQueries"],data:function(){return{databaseSlowQueriesFilter:new Ct([{tag:"model"},{tag:"type",apply:function(e,t){if(["select","update","insert","delete"].includes(t.toLowerCase()))return e.query.match(new RegExp("^".concat(t.toLowerCase()),"i"))}},{tag:"file",map:function(e){return e.shortPath}},{tag:"duration",type:"number"}]),performanceLogFilter:new Ct([{tag:"time",type:"date"},{tag:"file",map:function(e){return e.shortPath}}],(function(e){return e.message}))}},computed:{databaseSlowQueriesColumns:function(){var e=["Model","Query","Duration"],t=new Set(this.slowQueries.map((function(e){return e.connection}))).size>1;return t&&e.splice(1,0,"Connection"),e}}},Vs=Hs,Ws=Object(f["a"])(Vs,Fs,Js,!1,null,null,null),Bs=Ws.exports,zs=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",[s("details-table",{staticClass:"profiler",attrs:{title:"Profiler",icon:"clock",columns:["Self","Inclusive","Function"],items:e.$profiler.functions,filter:e.filter,"per-page":100},scopedSlots:e._u([{key:"toolbar",fn:function(t){var a=t.filter;return[s("div",{staticClass:"header-group"},[s("label",{staticClass:"header-toggle"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.enabled,expression:"enabled"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.enabled)?e._i(e.enabled,null)>-1:e.enabled},on:{change:function(t){var s=e.enabled,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&(e.enabled=s.concat([n])):r>-1&&(e.enabled=s.slice(0,r).concat(s.slice(r+1)))}else e.enabled=i}}}),e._v(" Enabled ")])]),s("div",{staticClass:"header-group"},[s("a",{staticClass:"header-item item-text",class:{active:!e.$profiler.percentual},attrs:{href:"#",title:"Exact"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.$profiler.showPercentual(!1)}}},[0==e.$profiler.metric?s("span",[e._v("ms")]):e._e(),1==e.$profiler.metric?s("span",[e._v("kB")]):e._e()]),s("a",{staticClass:"header-item",class:{active:e.$profiler.percentual},attrs:{href:"#",title:"Percentual"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.$profiler.showPercentual()}}},[s("icon",{attrs:{name:"percent"}})],1)]),s("div",{staticClass:"header-group"},[s("a",{staticClass:"header-item item-text",class:{active:.5==e.$profiler.shownFraction},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.$profiler.setShownFraction(.5)}}},[e._v(" 50% ")]),s("a",{staticClass:"header-item item-text",class:{active:.9==e.$profiler.shownFraction},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.$profiler.setShownFraction(.9)}}},[e._v(" 90% ")]),s("a",{staticClass:"header-item item-text",class:{active:1==e.$profiler.shownFraction},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.$profiler.setShownFraction(1)}}},[e._v(" 100% ")])]),s("div",{staticClass:"header-group"},[s("div",{staticClass:"header-search"},[s("input",{directives:[{name:"model",rawName:"v-model",value:a.input,expression:"filter.input"}],attrs:{type:"search",placeholder:"Search..."},domProps:{value:a.input},on:{input:function(t){t.target.composing||e.$set(a,"input",t.target.value)}}}),s("icon",{attrs:{name:"search"}})],1)])]}},{key:"body",fn:function(t){var a=t.items;return[e._l(e.filterXdebug(a),(function(t,a){return e.$profiler.ready?s("tr",{key:e.$request.id+"-"+a},[s("td",{staticClass:"profiler-metric"},[e._v(e._s(e.$profiler.formatMetric(t.self)))]),s("td",{staticClass:"profiler-metric"},[e._v(e._s(e.$profiler.formatMetric(t.inclusive)))]),s("td",{staticClass:"profiler-function"},[s("div",{staticClass:"profiler-function-name"},[e._v(" "+e._s(t.name)+" ")]),s("div",{staticClass:"profiler-path"},[s("shortened-text",{attrs:{full:t.fullPath}},[e._v(e._s(t.shortPath))])],1)])]):e._e()})),e.$profiler.loading||e.$profiler.parsing?s("tr",[s("td",{attrs:{colspan:"3"}},[s("div",{staticClass:"profiler-content"},[s("spinner",{attrs:{name:"fading-circle","no-fade-in":!0,color:"dark"==e.$settings.appearance?"#f27e02":"#258cdb"}}),s("p",[e._v(" "+e._s(e.$profiler.loading?"Loading profile...":"Processing profile...")+" ")])],1)])]):e._e(),e.$profiler.available?e._e():s("tr",[s("td",{attrs:{colspan:"3"}},[s("div",{staticClass:"profiler-content"},[s("h1",[e._v(" Profile is not present for current request. ")]),s("p",[e._v(" Profiling requires the Xdebug php extension."),s("br"),s("a",{attrs:{href:"https://underground.works/clockwork/#docs-xdebug-profiler",target:"_blank"}},[e._v("Read more about how to set up Xdebug")])]),s("p",{staticClass:"content-actions"},[s("a",{directives:[{name:"show",rawName:"v-show",value:!e.$profiler.isProfiling,expression:"! $profiler.isProfiling"}],staticClass:"button",attrs:{href:"#"},on:{click:function(t){return e.$profiler.enableProfiling()}}},[e._v(" Enable profiler ")]),s("a",{directives:[{name:"show",rawName:"v-show",value:e.$profiler.isProfiling,expression:"$profiler.isProfiling"}],staticClass:"button",attrs:{href:"#"},on:{click:function(t){return e.$profiler.disableProfiling()}}},[e._v(" Disable profiler ")])])])])])]}}])})],1)},Gs=[],Ks={name:"Profiler",components:{DetailsTable:ft,ShortenedText:H},data:function(){return{filter:function(){var e=new Ct([{tag:"model"},{tag:"file",map:function(e){return e.shortPath}},{tag:"self",type:"number"},{tag:"inclusive",type:"number"}],(function(e){return e.name}));return e.sortedBy="self",e.sortedDesc=!0,e}()}},computed:{enabled:{get:function(){return this.$profiler.isProfiling},set:function(e){e?this.$profiler.enableProfiling():this.$profiler.disableProfiling()}}},methods:{filterXdebug:function(e){return e?this.filter.filter(e):[]}}},Xs=Ks,Zs=(s("2081"),Object(f["a"])(Xs,zs,Gs,!1,null,null,null)),Ys=Zs.exports,ea=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{ref:"timeline",staticClass:"timeline",class:{"show-details":e.showDetails}},[s("details-table",{attrs:{title:"Timeline",icon:"pie-chart",columns:e.columns,items:e.presentedEvents,filter:e.filter,"no-table-head":!e.showDetails,"filter-example":"database query duration:>50","per-page":100},scopedSlots:e._u([{key:"toolbar",fn:function(t){var a=t.filter;return[s("div",{staticClass:"header-group"},[s("label",{staticClass:"header-toggle"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.condense,expression:"condense"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.condense)?e._i(e.condense,null)>-1:e.condense},on:{change:function(t){var s=e.condense,a=t.target,i=!!a.checked;if(Array.isArray(s)){var n=null,r=e._i(s,n);a.checked?r<0&&(e.condense=s.concat([n])):r>-1&&(e.condense=s.slice(0,r).concat(s.slice(r+1)))}else e.condense=i}}}),e._v(" Condense ")])]),e.availableTags.length?s("div",{staticClass:"header-group"},e._l(e.availableTags,(function(t){return s("a",{staticClass:"header-item",class:{active:e.hiddenTags&&!e.hiddenTags.includes(t.tag)},attrs:{href:"#",title:t.title},on:{click:function(s){return e.toggleTag(t.tag)}}},[s("icon",{attrs:{name:t.icon}})],1)})),0):e._e(),s("div",{staticClass:"header-group"},[s("div",{staticClass:"header-search"},[s("input",{directives:[{name:"model",rawName:"v-model",value:a.input,expression:"filter.input"}],attrs:{type:"search",placeholder:"Search..."},domProps:{value:a.input},on:{input:function(t){t.target.composing||e.$set(a,"input",t.target.value)}}}),s("icon",{attrs:{name:"search"}})],1)]),s("div",{staticClass:"header-group"},[s("a",{staticClass:"header-item",class:{active:e.showDetails},attrs:{href:"#",title:"Toggle details"},on:{click:function(t){return t.preventDefault(),e.toggleDetails.apply(null,arguments)}}},[s("icon",{attrs:{name:"list"}})],1)])]}},{key:"body",fn:function(t){var a=t.items;return[e._l(a,(function(t,a){return s("tr",[s("td",{staticClass:"timeline-chart"},[s("div",{staticClass:"chart-event-group popover-container",style:t.groupStyle,on:{click:function(t){return e.showPopover(a)}}},[s("div",{staticClass:"group-label",class:t.labelClass,style:t.labelStyle},[t.tags?s("span",{staticClass:"label-tags"},e._l(e.resolveTags(t.tags),(function(e){return s("span",[s("icon",{attrs:{name:e.icon,title:e.title}})],1)})),0):e._e(),e._v(" "+e._s(t.name)+" "),t.condensed?e._e():s("span",[e._v(e._s(e._f("formatTiming")(t.duration)))])]),e._l(t.events,(function(t,a){return s("div",{staticClass:"group-event",class:t.eventClass,style:t.eventStyle},[s("div",{staticClass:"event-bar"},e._l(t.childrenSections,(function(e){return s("div",{staticClass:"bar-light",style:e.style})})),0)])})),s("popover",{ref:"popovers",refInFor:!0,staticClass:"timeline-popover"},e._l(t.events,(function(t){return s("div",{staticClass:"popover-event",class:t.eventClass},[s("div",{staticClass:"event-header"},[s("h1",[e._v(e._s(t.name))]),s("div",{staticClass:"header-tags"},e._l(e.resolveTags(t.tags),(function(e){return s("span",[s("icon",{attrs:{name:e.icon,title:e.title}})],1)})),0)]),t.description!=t.name?s("div",{staticClass:"event-description"},[t.tags&&t.tags.indexOf("databaseQueries")>-1?s("highlighted-code",{attrs:{language:"sql",code:t.description}}):s("div",[e._v(e._s(t.description))])],1):e._e(),s("div",{staticClass:"event-timings"},[s("div",{staticClass:"timings-timing timing-total"},[s("div",{staticClass:"timing-value"},[e._v(" "+e._s(e._f("formatTiming")(t.duration))+" ")]),s("div",{staticClass:"timing-label"},[e._v(" Total ")])]),s("div",{staticClass:"timings-timing timing-self"},[s("div",{staticClass:"timing-value"},[e._v(" "+e._s(e._f("formatTiming")(t.durationSelf))+" ")]),s("div",{staticClass:"timing-label"},[e._v(" Self ")])]),s("div",{staticClass:"timings-timing timing-children"},[s("div",{staticClass:"timing-value"},[e._v(" "+e._s(e._f("formatTiming")(t.durationChildren,"ms","–"))+" ")]),s("div",{staticClass:"timing-label"},[e._v(" Children ")])])])])})),0)],2)]),s("td",{staticClass:"timeline-description"},[e._t("table-description",(function(){return[s("div",{staticClass:"description-content"},[t.tags&&t.tags.length?s("span",{staticClass:"description-tags"},e._l(e.resolveTags(t.tags),(function(e){return s("span",[s("icon",{attrs:{name:e.icon,title:e.title}})],1)})),0):e._e(),t.tags&&t.tags.indexOf("databaseQueries")>-1?s("highlighted-code",{attrs:{language:"sql",code:t.description}}):s("div",[e._v(e._s(t.description))])],1)]}),{item:t})],2),s("td",{staticClass:"timeline-timing timing-total"},[e._v(e._s(e._f("formatTiming")(t.duration)))]),s("td",{staticClass:"timeline-timing"},[e._v(e._s(e._f("formatTiming")(t.durationSelf)))]),s("td",{staticClass:"timeline-timing"},[e._v(e._s(e._f("formatTiming")(t.durationChildren,"ms",t.condensed?"":"–")))])])})),s("tr",{staticClass:"timeline-size-monitor"},[s("td",{ref:"timelineChart",staticClass:"timeline-graph"}),s("td",{staticClass:"timeline-description"}),s("td",{staticClass:"timeline-timing"}),s("td",{staticClass:"timeline-timing"}),s("td",{staticClass:"timeline-timing"})])]}}],null,!0)})],1)},ta=[],sa=(s("a4d3"),s("e01a"),{name:"Timeline",components:{DetailsTable:ft,HighlightedCode:At,Popover:M},props:{name:{},timeline:{},tags:{default:function(){return[]}}},data:function(){return{condense:void 0,showDetails:!1,hiddenTags:void 0,presentedEvents:[],filter:new Ct([{tag:"duration",type:"number"}],(function(e){return e.description}))}},computed:{availableTags:function(){var e=this;return this.tags.filter((function(t){return e.timeline.events.find((function(e){return e.tags&&e.tags.includes(t.tag)}))}))},columns:function(){return this.showDetails?[{name:" ",sortBy:"start",class:"timeline-chart"},{name:"Event",sortBy:"name",class:"timeline-description"},{name:"Total",sortBy:"duration",class:"timeline-timing"},{name:"Self",sortBy:"durationSelf",class:"timeline-timing"},{name:"Child",sortBy:"durationChild",class:"timeline-timing"}]:[]}},methods:{toggleTag:function(e){this.hiddenTags.includes(e)?this.hiddenTags=this.hiddenTags.filter((function(t){return t!=e})):this.hiddenTags.push(e)},resolveTags:function(e){var t=this;return e.map((function(e){return t.tags.find((function(t){return t.tag==e}))})).filter((function(e){return e}))},toggleDetails:function(){this.showDetails=!this.showDetails},showPopover:function(e){this.$refs.popovers[e].toggle()},refreshEvents:function(e){var t=this;return Object(te["a"])(regeneratorRuntime.mark((function e(){var s,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(t.timeline&&t.$refs.timelineChart){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,t.$nextTick();case 4:if(s=t.$refs.timelineChart.offsetWidth-16,!(s<=0)){e.next=7;break}return e.abrupt("return");case 7:a=t.timeline.filter(t.filter,t.hiddenTags),t.condense&&(a=a.condense()),t.presentedEvents=a.present(s);case 10:case"end":return e.stop()}}),e)})))()},observeResizing:function(){var e=this,t=this.$refs.timeline.offsetWidth;this.resizeObserver=new ResizeObserver(Ie()((function(s){var i=Object(a["a"])(s,1),n=i[0];t!=n.contentRect.width&&(t=n.contentRect.width,e.refreshEvents(n))}),10)),this.resizeObserver.observe(this.$refs.timeline)}},filters:{formatTiming:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"ms",s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return null===e||void 0===e?s:e<=0||e>1?"".concat(Math.round(e)," ").concat(t):"<1 ".concat(t)}},watch:{condense:function(e,t){void 0!==t&&(this.refreshEvents(),this.$settings.global.timelineCondensed[this.name]=this.condense,this.$settings.save())},hiddenTags:function(e,t){void 0!==t&&(this.refreshEvents(),this.$settings.global.timelineHiddenTags[this.name]=this.hiddenTags,this.$settings.save())},showDetails:function(){this.refreshEvents()},timeline:function(){this.refreshEvents()}},mounted:function(){var e=this;return Object(te["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.condense=e.$settings.global.timelineCondensed[e.name]||!1,e.hiddenTags=e.$settings.global.timelineHiddenTags[e.name]||[],t.next=4,e.refreshEvents();case 4:e.observeResizing();case 5:case"end":return t.stop()}}),t)})))()}}),aa=sa,ia=(s("8161"),Object(f["a"])(aa,ea,ta,!1,null,null,null)),na=ia.exports,ra=s("e0e5"),oa=s.n(ra),la={name:"PerformanceTab",components:{PerformanceChart:Ns,PerformanceClientSide:Us,PerformanceLog:Bs,Profiler:Ys,Timeline:na},props:["active"],data:function(){return{selectedPerformanceTab:null,timelineTags:[{tag:"events",icon:"zap",title:"Events"},{tag:"databaseQueries",icon:"database",title:"Database"},{tag:"cacheQueries",icon:"paperclip",title:"Cache"},{tag:"redisCommands",icon:"layers",title:"Redis"},{tag:"queueJobs",icon:"clock",title:"Queue"},{tag:"views",icon:"image",title:"Views"},{tag:"notifications",icon:"mail",title:"Notifications"}]}},computed:{activePerformanceTab:function(){var e=this.selectedPerformanceTab||"issues";return("issues"!=e||this.databaseSlowQueries.length||this.performanceIssues.length)&&("client-side"!=e||this.isClientSideTabAvailable)?e:"timeline"},databaseSlowQueries:function(){return this.$request.databaseQueries.filter((function(e){return e.tags.includes("slow")}))},isClientSideTabAvailable:function(){return this.$request.clientMetrics.filter((function(e){return e.value})).length||Object.values(this.$request.webVitals).filter((function(e){return e.value})).length},performanceIssues:function(){return this.$request.log.filter((function(e){var t;return null===(t=e.context)||void 0===t?void 0:t.performance})).map((function(e){return oa()({},e,{context:ms()(e.context,["performance","trace"])})}))}},methods:{isTabActive:function(e){return this.activePerformanceTab==e},showTab:function(e){this.selectedPerformanceTab=e,"profiler"==e&&this.$profiler.loadRequest(this.$request)},refreshRequest:function(){this.active&&this.$request&&(this.$platform.hasFeature("load-client-metrics")&&this.$request.loadClientMetrics(this.$requests),"profiler"==this.activePerformanceTab&&this.$profiler.loadRequest(this.$request))}},watch:{active:function(){this.refreshRequest()},$request:function(){this.refreshRequest()}}},ca=la,ua=(s("8e9b"),Object(f["a"])(ca,Ss,js,!1,null,null,null)),da=ua.exports,ha=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("details-table",{attrs:{title:"Commands",icon:"layers",columns:e.columns,items:e.$request.redisCommands,filter:e.filter,"filter-example":"command:zrange connection:eshop file:StatsController.php duration:>50"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[e.columns.includes("Connection")?s("td",[e._v(e._s(t.connection))]):e._e(),s("td",[e._v(e._s(t.command))]),s("td",[s("div",{staticClass:"database-query"},[s("div",{staticClass:"database-query-content"},[s("pretty-print",{attrs:{data:t.parameters}})],1),s("stack-trace",{staticClass:"database-query-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",{staticClass:"database-duration"},[e._v(e._s(t.duration)+" ms")])])}))}}])})],1)},va=[],fa={name:"RedisTab",components:{DetailsTable:ft,PrettyPrint:ut,StackTrace:z},props:["active"],data:function(){return{filter:new Ct([{tag:"connection"},{tag:"command"},{tag:"file",map:function(e){return e.shortPath}},{tag:"duration",type:"number"}])}},computed:{columns:function(){var e=["Command","Parameters","Duration"],t=new Set(this.$request.redisCommands.map((function(e){return e.connection}))).size>1;return t&&e.splice(0,0,"Connection"),e}}},ma=fa,pa=Object(f["a"])(ma,ha,va,!1,null,null,null),ga=pa.exports,ba=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("details-table",{attrs:{title:"Jobs",icon:"clock",columns:e.columns,items:e.queueJobs,filter:e.filter,"filter-example":"Underground.works name:GenerateInvoice queue:priority"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[e.columns.includes("Queue")?s("td",[e._v(e._s(t.queue))]):e._e(),e.columns.includes("Connection")?s("td",[e._v(e._s(t.connection))]):e._e(),s("td",[s("shortened-text",{attrs:{full:t.name}},[e._v(e._s(t.shortName))])],1),s("td",[s("div",{staticClass:"database-query"},[s("div",{staticClass:"database-query-content"},[s("pretty-print",{attrs:{data:t.data}})],1),t.maxTries||t.timeout?s("div",{staticClass:"job-options"},[t.maxTries?s("span",[e._v(e._s(t.maxTries)+" tries")]):e._e(),t.timeout?s("span",[e._v(e._s(t.timeout)+"s timeout")]):e._e()]):e._e(),s("stack-trace",{staticClass:"database-query-path",attrs:{trace:t.trace,file:t.file,line:t.line}})],1)]),s("td",[s("span",{class:{"job-status-text":!0,"is-success":t.request&&"done"==t.request.jobStatus,"is-error":t.request&&"failed"==t.request.jobStatus}},[e._v(" "+e._s(t.request?t.request.jobStatus:"waiting")+" ")])]),s("td",[t.request?s("a",{attrs:{href:"#",title:"Show details"},on:{click:function(s){return s.preventDefault(),e.showJob(t)}}},[s("icon",{attrs:{name:"search"}})],1):e._e()])])}))}}])})],1)},wa=[],_a={name:"QueueTab",components:{DetailsTable:ft,PrettyPrint:ut,ShortenedText:H,StackTrace:z},props:["active"],data:function(){return{filter:new Ct([{tag:"connection"},{tag:"queue"},{tag:"name"}]),jobRequests:{}}},computed:{columns:function(){var e=["Name","Data"],t=new Set(this.$request.queueJobs.map((function(e){return e.queue}))).size>1,s=new Set(this.$request.queueJobs.map((function(e){return e.connection}))).size>1;return t&&e.splice(0,0,"Queue"),s&&e.splice(0,0,"Connection"),e.concat(["Status",""])},queueJobs:function(){var e=this;return this.$request?this.$request.queueJobs.map((function(t){return oa()({request:e.jobRequests[t.id]},t)})):[]}},methods:{showJob:function(e){this.global.$request=this.$requests.findId(e.id)},loadQueueJobRequest:function(e){var t=arguments,s=this;return Object(te["a"])(regeneratorRuntime.mark((function a(){var i,n;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:if(i=t.length>1&&void 0!==t[1]?t[1]:0,12!=i){a.next=3;break}return a.abrupt("return");case 3:if(!e.loadRequestTimeout){a.next=5;break}return a.abrupt("return");case 5:if(a.t0=s.$requests.findId(e.id),a.t0){a.next=10;break}return a.next=9,s.$requests.loadId(e.id,null,!1);case 9:a.t0=a.sent;case 10:if(n=a.t0,n){a.next=13;break}return a.abrupt("return",e.loadRequestTimeout=setTimeout((function(){e.loadRequestTimeout=null,s.loadQueueJobRequest(e,i+1)}),5e3));case 13:s.$set(s.jobRequests,e.id,n);case 14:case"end":return a.stop()}}),a)})))()}},watch:{active:function(e){var t=this;e&&this.$request.queueJobs.forEach((function(e){e.id&&t.loadQueueJobRequest(e)}))}}},ya=_a,Ca=(s("70b4"),Object(f["a"])(ya,ba,wa,!1,null,"51ab4b8e",null)),qa=Ca.exports,$a=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("details-table",{attrs:{title:"Routes",icon:"map",columns:e.columns,items:e.$request.routes,filter:e.filter,"filter-example":"OrderController method:post uri:order"},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[s("td",[e._v(e._s(t.method))]),s("td",[e._v(e._s(t.uri))]),s("td",[e._v(e._s(t.action))]),e.columns.includes("Name")?s("td",[e._v(e._s(t.name))]):e._e(),e.columns.includes("Middleware")?s("td",e._l(t.middleware,(function(a,i){return s("span",[e._v(" "+e._s(a)+e._s(i==t.middleware.length-1?"":", ")+" ")])})),0):e._e(),e.columns.includes("Before")?s("td",[e._v(e._s(t.before))]):e._e(),e.columns.includes("After")?s("td",[e._v(e._s(t.after))]):e._e()])}))}}])})],1)},ka=[],xa={name:"RoutesTab",components:{DetailsTable:ft},props:["active"],data:function(){return{filter:new Ct([{tag:"method",apply:function(e,t){if(["get","post","put","delete","head","patch"].includes(t.toLowerCase()))return e.method.toLowerCase()==t.toLowerCase()}},{tag:"uri"}])}},computed:{columns:function(){var e=["Methods","URI","Action"];return this.$request.routes.some((function(e){return e.name}))&&e.push("Name"),this.$request.routes.some((function(e){return e.middleware}))&&e.push("Middleware"),this.$request.routes.some((function(e){return e.before}))&&e.push("Before"),this.$request.routes.some((function(e){return e.after}))&&e.push("After"),e}}},Ta=xa,Sa=Object(f["a"])(Ta,$a,ka,!1,null,null,null),ja=Sa.exports,Oa=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},e._l(e.userTab.sections,(function(t,a){return s("div",{key:e.$request.id+"-"+a},["counters"==t.showAs?s("div",{staticClass:"counters-row"},e._l(t.data,(function(t,a){return s("div",{key:e.$request.id+"-"+a,staticClass:"counter"},[s("div",{staticClass:"counter-value"},[e._v(e._s(t.value))]),s("div",{staticClass:"counter-title"},[e._v(e._s(t.key))])])})),0):e._e(),"table"==t.showAs?s("details-table",{attrs:{title:t.title,columns:t.data[0].map((function(e){return e.key})),items:t.data,filter:e.filters[a]},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t){return s("tr",e._l(t,(function(e){return s("td",[s("pretty-print",{attrs:{data:e.value}})],1)})),0)}))}}],null,!0)}):e._e()],1)})),0)},Pa=[],Da={name:"UserTab",components:{DetailsTable:ft,PrettyPrint:ut},props:["active","userTab"],data:function(){return{filters:[]}},watch:{userTab:{handler:function(e){this.filters=e.sections.map((function(e){if("table"==e.showAs)return new Ct(e.data[0].map((function(e){return{tag:e.key}})))}))},immediate:!0}}},Ra=Da,Ea=Object(f["a"])(Ra,Oa,Pa,!1,null,null,null),Na=Ea.exports,Aa=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{directives:[{name:"show",rawName:"v-show",value:e.active,expression:"active"}]},[s("timeline",{attrs:{name:"views",icon:"image",timeline:e.$request.viewsData},scopedSlots:e._u([{key:"table-description",fn:function(t){var a=t.item;return[s("div",{staticClass:"views-view-name"},[e._v(e._s(a.description))]),a.data?s("pretty-print",{attrs:{data:a.data}}):e._e()]}}])})],1)},Ia=[],Ma={name:"ViewsTab",components:{PrettyPrint:ut,Timeline:na},props:["active"]},La=Ma,Qa=(s("a5d3"),Object(f["a"])(La,Aa,Ia,!1,null,null,null)),Ua=Qa.exports,Fa=s("5817"),Ja=s.n(Fa),Ha={name:"RequestDetails",components:{CreditsModal:_,DetailsRequest:x,MessagesOverlay:ce,SettingsModal:me,SharingModal:ye,SharingDeleteModal:Te,TabBar:Ue,CacheTab:xt,DatabaseTab:Qt,EventsTab:Wt,LogTab:Zt,ModelsTab:ns,NotificationsTab:ws,OutputTab:Ts,PerformanceTab:da,RedisTab:ga,QueueTab:qa,RoutesTab:ja,UserTab:Na,ViewsTab:Ua},computed:{tabs:function(){var e,t;return[{text:"Performance",name:"performance",icon:"activity",shown:!0},{text:"Log",name:"log",icon:"edit-2",shown:this.shownTabs.log},{text:"Events",name:"events",icon:"zap",shown:this.shownTabs.events},{text:"Models",name:"models",icon:"disc",shown:this.shownTabs.models},{text:"Database",name:"database",icon:"database",shown:this.shownTabs.database},{text:"Cache",name:"cache",icon:"paperclip",shown:this.shownTabs.cache},{text:"Redis",name:"redis",icon:"layers",shown:this.shownTabs.redis},{text:"Queue",name:"queue",icon:"clock",shown:this.shownTabs.queue},{text:"Views",name:"views",icon:"image",shown:this.shownTabs.views},{text:"Notifications",name:"notifications",icon:"mail",shown:this.shownTabs.notifications},{text:"Routes",name:"routes",icon:"map",shown:this.shownTabs.routes}].concat(null===(e=this.$request)||void 0===e||null===(t=e.userData)||void 0===t?void 0:t.map((function(e){return{text:e.title,name:"user-".concat(e.key),icon:"menu",shown:!0}}))).concat([{text:"Output",name:"output",icon:"terminal",shown:this.shownTabs.output}]).filter(Boolean)},activeTab:function(){if(this.$request)return!1===this.shownTabs[this.global.activeDetailsTab]?"performance":this.global.activeDetailsTab},shownTabs:function(){var e,t,s,a,i,n,r,o,l,c,u,d,h,v,f,m,p,g,b,w,_,y=this;return{log:(null===(e=this.$request)||void 0===e||null===(t=e.log)||void 0===t?void 0:t.length)>0,models:["modelsRetrieved","modelsCreated","modelsUpdated","modelsDeleted"].some((function(e){var t;return!Ja()(null===(t=y.$request)||void 0===t?void 0:t[e])}))||(null===(s=this.$request)||void 0===s?void 0:s.modelsActions.length)>0,database:(null===(a=this.$request)||void 0===a?void 0:a.databaseQueriesCount)>0||(null===(i=this.$request)||void 0===i||null===(n=i.databaseQueries)||void 0===n?void 0:n.length)>0,cache:["cacheReads","cacheHits","cacheWrites","cacheDeletes","cacheTime"].some((function(e){var t;return null===(t=y.$request)||void 0===t?void 0:t[e]}))||(null===(r=this.$request)||void 0===r?void 0:r.cacheQueries.length)>0,redis:(null===(o=this.$request)||void 0===o||null===(l=o.redisCommands)||void 0===l?void 0:l.length)>0,queue:(null===(c=this.$request)||void 0===c||null===(u=c.queueJobs)||void 0===u?void 0:u.length)>0,events:(null===(d=this.$request)||void 0===d||null===(h=d.events)||void 0===h?void 0:h.length)>0,views:(null===(v=this.$request)||void 0===v||null===(f=v.viewsData)||void 0===f?void 0:f.events.length)>0,notifications:(null===(m=this.$request)||void 0===m||null===(p=m.notifications)||void 0===p?void 0:p.length)>0,routes:(null===(g=this.$request)||void 0===g||null===(b=g.routes)||void 0===b?void 0:b.length)>0,output:(null===(w=this.$request)||void 0===w||null===(_=w.commandOutput)||void 0===_?void 0:_.length)>0}}},methods:{showTab:function(e){this.global.activeDetailsTab=e,this.global.showIncomingRequests=!1},toggleRequestsList:function(){this.$settings.global.requestsListCollapsed=!this.$settings.global.requestsListCollapsed,this.$settings.save()},toggleRequestSidebar:function(){this.$settings.global.requestSidebarCollapsed=!this.$settings.global.requestSidebarCollapsed,this.$settings.save()},toggleSettingsModal:function(){this.$settings.toggle()}}},Va=Ha,Wa=(s("0f8a"),Object(f["a"])(Va,r,o,!1,null,null,null)),Ba=Wa.exports,za=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"popover-viewport",class:{"request-sidebar":!0,large:e.$settings.global.requestsListCollapsed}},[s("parent-request"),e.$request?s("div",{staticClass:"sidebar-header"},[s("div",{staticClass:"header-info",attrs:{title:e.$request.tooltip}},[s("div",{staticClass:"info-main"},[e.$request.isCommand()?[s("span",{staticClass:"type-text"},[e._v("CMD")]),e._v(" "+e._s(e.$request.commandName)+" ")]:e.$request.isQueueJob()?[s("span",{staticClass:"type-text"},[e._v("QUEUE")]),e._v(" "+e._s(e.$request.jobName)+" ")]:e.$request.isTest()?[s("span",{staticClass:"type-text"},[e._v("TEST")]),e._v(" "+e._s(e.$request.testGroup)+" ")]:[e.$request.isAjax()?s("span",{staticClass:"type-text"},[e._v("AJAX")]):e._e(),s("span",{staticClass:"method-text"},[e._v(e._s(e.$request.method))]),e._v(" "+e._s(e.$request.uri)+" ")],e.$request&&e.$request.url?s("a",{directives:[{name:"clipboard",rawName:"v-clipboard:copy",value:e.$request.url,expression:"$request.url",arg:"copy"}],staticClass:"info-copy",attrs:{href:"#",title:"Copy url"}},[s("icon",{attrs:{name:"link"}})],1):e._e()],2),s("div",{staticClass:"info-details"},[e.$request.isCommand()?[e._v(" "+e._s(e.$request.commandLine)+" ")]:e.$request.isQueueJob()?[e._v(" "+e._s(e.$request.jobDescription)+" ")]:e.$request.isTest()?[e._v(" "+e._s(e.$request.testName)+" ")]:[e._v(" "+e._s(e.$request.controller)+" ")]],2)]),e.$request.errorsCount?s("icon",{staticClass:"header-alert alert-errors",attrs:{name:"alert-circle"}}):e.$request.warningsCount?s("icon",{staticClass:"header-alert alert-warnings",attrs:{name:"alert-triangle"}}):e._e(),s("div",{staticClass:"header-status"},[e.$request.isCommand()?[s("span",{class:{"status-text":!0,"client-error":e.$request.isCommandWarning(),"server-error":e.$request.isCommandError()},attrs:{title:e.$request.commandExitCode}},[e._v(e._s(e.$request.commandExitCode))])]:e.$request.isQueueJob()?[s("span",{class:{"status-text":!0,"status-text-small":!0,"client-error":e.$request.isQueueJobWarning(),"server-error":e.$request.isQueueJobError()},attrs:{title:e.$request.jobStatus}},[e._v(e._s(e.$request.jobStatus))])]:e.$request.isTest()?[s("span",{class:{"status-text":!0,"status-text-small":!0,"client-error":e.$request.isTestWarning(),"server-error":e.$request.isTestError()},attrs:{title:e.$request.testStatus}},[e._v(e._s(e.$request.testStatus))])]:[s("span",{class:{"status-text":!0,"client-error":e.$request.isClientError(),"server-error":e.$request.isServerError()},attrs:{title:e.$request.responseStatus}},[e._v(e._s(e.$request.responseStatus))])]],2)],1):e._e(),s("exception-section"),s("div",{staticClass:"sidebar-content"},[e.$request&&e.$request.isCommand()?s("command-tab"):e._e(),e.$request&&e.$request.isQueueJob()?s("queue-job-tab"):e._e(),e.$request&&e.$request.isTest()?s("test-tab"):e.$request?s("request-tab"):e._e(),s("div",{staticClass:"content-actions"},[s("a",{directives:[{name:"show",rawName:"v-show",value:e.$platform.hasFeature("sharing"),expression:"$platform.hasFeature('sharing')"}],staticClass:"button",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.$sharing.toggle()}}},[s("icon",{attrs:{name:"share"}}),e._v(" Share ")],1),s("a",{directives:[{name:"show",rawName:"v-show",value:e.$platform.hasFeature("delete-shared"),expression:"$platform.hasFeature('delete-shared')"}],staticClass:"button",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.$sharing.toggleDelete()}}},[s("icon",{attrs:{name:"trash-2"}}),e._v(" Delete ")],1)]),s("div",{staticClass:"content-meta"},[e.$request&&e.$request.time?s("div",{staticClass:"meta-date"},[e._v(" "+e._s(e._f("date")(1e3*e.$request.time,"Y-MM-dd HH:mm:ss"))+" ")]):e._e(),e.$request?s("div",{staticClass:"meta-id"},[s("a",{attrs:{href:e.shareUrl}},[e._v(e._s(e.$request.id))])]):e._e()])],1)],1)},Ga=[],Ka=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"command-tab"},[s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.commandArgumentsMerged.length,expression:"$request.commandArgumentsMerged.length"}],attrs:{title:"Arguments",name:"arguments",items:e.$request.commandArgumentsMerged,"filter-example":'"Mike Jones" name:name'}}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.commandOptionsMerged.length,expression:"$request.commandOptionsMerged.length"}],attrs:{title:"Options",name:"options",items:e.$request.commandOptionsMerged,"filter-example":'"Mike Jones" name:name'}})],1)},Xa=[],Za=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"sidebar-section"},[s("div",{staticClass:"section-header"},[s("div",{staticClass:"header-title",on:{click:e.toggle}},[s("icon",{attrs:{name:e.expanded?"chevron-down":"chevron-up"}}),e._v(" "+e._s(e.title)+" ")],1),s("div",{staticClass:"header-group"},[e.expandedSearch?s("div",{staticClass:"header-search"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.filter.input,expression:"filter.input"}],ref:"searchInput",attrs:{type:"search",placeholder:"Search..."},domProps:{value:e.filter.input},on:{input:function(t){t.target.composing||e.$set(e.filter,"input",t.target.value)}}}),s("icon",{attrs:{name:"search"}})],1):s("a",{staticClass:"header-item",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.expandSearch.apply(null,arguments)}}},[s("icon",{attrs:{name:"search"}})],1)])]),e._t("content",(function(){return[s("div",{directives:[{name:"show",rawName:"v-show",value:e.expanded,expression:"expanded"}]},[e._t("above-table")],2),e._t("table",(function(){return[s("details-table",{directives:[{name:"show",rawName:"v-show",value:e.expanded,expression:"expanded"}],attrs:{columns:["Key","Value"],items:e.items,filter:e.filter,"filter-example":e.filterExample,"no-header":!0,"no-table-head":!0},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[s("td",{attrs:{colspan:"2"}},[s("div",{staticClass:"key"},[e._v(e._s(t.name))]),s("div",{staticClass:"value"},[s("pretty-print",{attrs:{data:t.value}})],1)])])}))}}])})]}),{items:e.items,filter:e.filter,filterExample:e.filterExample,expanded:e.expanded})]}),{expanded:e.expanded})],2)},Ya=[],ei={name:"SidebarSection",components:{DetailsTable:ft,PrettyPrint:ut},props:["title","name","filterExample","items"],data:function(){return{filter:new Ct([{tag:"name"}]),expandedSearch:!1}},computed:{expanded:function(){return!1!==this.$settings.global.requestSidebarCollapsedSections[this.name]}},methods:{toggle:function(){this.$settings.global.requestSidebarCollapsedSections[this.name]=!this.expanded,this.$settings.save()},expandSearch:function(){var e=this;this.expandedSearch=!0,this.$nextTick((function(){return e.$refs.searchInput.focus()}))}}},ti=ei,si=(s("101e"),Object(f["a"])(ti,Za,Ya,!1,null,null,null)),ai=si.exports,ii={name:"CommandTab",components:{SidebarSection:ai}},ni=ii,ri=(s("ef62"),Object(f["a"])(ni,Ka,Xa,!1,null,null,null)),oi=ri.exports,li=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"queue-job-tab"},[e.$request.jobPayload?s("sidebar-section",{attrs:{title:"Payload",name:"payload"},scopedSlots:e._u([{key:"content",fn:function(t){var a=t.expanded;return[s("div",{directives:[{name:"show",rawName:"v-show",value:a,expression:"expanded"}],staticClass:"data-value"},[s("pretty-print",{attrs:{data:e.$request.jobPayload,expanded:!0}})],1)]}}],null,!1,1651862303)}):e._e(),e.$request.jobQueue?s("sidebar-section",{attrs:{title:"Queue",name:"queue"},scopedSlots:e._u([{key:"content",fn:function(t){var a=t.expanded;return[s("div",{directives:[{name:"show",rawName:"v-show",value:a,expression:"expanded"}],staticClass:"data-value"},[e._v(" "+e._s(e.$request.jobQueue)+" ")])]}}],null,!1,3453129276)}):e._e(),e.$request.jobConnection?s("sidebar-section",{attrs:{title:"Connection",name:"connection"},scopedSlots:e._u([{key:"content",fn:function(t){var a=t.expanded;return[s("div",{directives:[{name:"show",rawName:"v-show",value:a,expression:"expanded"}],staticClass:"data-value"},[e._v(" "+e._s(e.$request.jobConnection)+" ")])]}}],null,!1,2188469499)}):e._e(),e.$request.jobOptions.length?s("sidebar-section",{attrs:{title:"Options",name:"options",items:e.$request.jobOptions,"filter-example":'"Mike Jones" name:name'}}):e._e()],1)},ci=[],ui={name:"QueueJobTab",components:{PrettyPrint:ut,SidebarSection:ai}},di=ui,hi=(s("6b0a"),Object(f["a"])(di,li,ci,!1,null,null,null)),vi=hi.exports,fi=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"request-tab"},[s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.headers.length,expression:"headers.length"}],attrs:{title:"Headers",name:"headers",items:e.headers,"filter-example":"text/html name:Accept"}}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.requestData,expression:"$request.requestData"}],attrs:{title:"Data",name:"data",items:e.$request.requestData,"filter-example":"420 name:price"},scopedSlots:e._u([e.$request.requestData instanceof Object?null:{key:"content",fn:function(t){var a=t.expanded;return[s("div",{directives:[{name:"show",rawName:"v-show",value:a,expression:"expanded"}],staticClass:"data-raw"},[e._v(" "+e._s(e.$request.requestData)+" ")])]}}],null,!0)}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.getData.length,expression:"$request.getData.length"}],attrs:{title:"GET data",name:"getData",items:e.$request.getData,"filter-example":"created_at name:orderBy"}}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.postData.length,expression:"$request.postData.length"}],attrs:{title:"POST data",name:"postData",items:e.$request.postData,"filter-example":'"Mike Jones" name:name'}}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.cookies.length,expression:"$request.cookies.length"}],attrs:{title:"Cookies",name:"cookies",items:e.$request.cookies,"filter-example":'"Mike Jones" name:name'}}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.middleware.length,expression:"$request.middleware.length"}],attrs:{title:"Middleware",name:"middleware",items:e.$request.middleware,"filter-example":"auth:admin"},scopedSlots:e._u([{key:"table",fn:function(t){var a=t.items,i=t.filter,n=t.filterExample,r=t.expanded;return[s("details-table",{directives:[{name:"show",rawName:"v-show",value:r,expression:"expanded"}],attrs:{columns:["Value"],items:a,filter:i,"filter-example":n,"no-header":!0,"no-table-head":!0},scopedSlots:e._u([{key:"header",fn:function(e){e.filter}},{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[s("td",{staticClass:"value"},[e._v(e._s(t))])])}))}}],null,!0)})]}}])}),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.$request.sessionData.length||e.$request.authenticatedUser,expression:"$request.sessionData.length || $request.authenticatedUser"}],attrs:{title:"Session",name:"session",items:e.$request.sessionData,"filter-example":"registration successful name:_token"}},[s("template",{slot:"above-table"},[e.$request.authenticatedUser?s("div",{staticClass:"session-user"},[s("icon",{attrs:{name:"user"}}),s("div",[e.$request.authenticatedUser.name&&e.$request.authenticatedUser.name.trim()?s("span",{staticClass:"name"},[e._v(e._s(e.$request.authenticatedUser.name))]):e._e(),s("span",{class:e.$request.authenticatedUser.name&&e.$request.authenticatedUser.name.trim()?"dimmed":""},[e._v(e._s(e.$request.authenticatedUser.username))])]),e.$request.authenticatedUser.email||e.$request.authenticatedUser.id?s("span",{staticClass:"session-user-details"},[e.$request.authenticatedUser.id?s("span",{staticClass:"dimmed"},[e._v("#"+e._s(e.$request.authenticatedUser.id))]):e._e()]):e._e()],1):e._e()])],2)],1)},mi=[],pi={name:"RequestTab",components:{DetailsTable:ft,SidebarSection:ai},computed:{headers:function(){return this.$request.cookies.length?this.$request.headers.filter((function(e){return"Cookie"!=e.name})):this.$request.headers}}},gi=pi,bi=(s("9a64"),Object(f["a"])(gi,fi,mi,!1,null,null,null)),wi=bi.exports,_i=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"request-tab test-tab"},[e.$request.testStatusMessage?s("div",{staticClass:"test-status-message",class:{error:e.$request.isTestError(),warning:e.$request.isTestWarning()}},[e._v(" "+e._s(e.$request.testStatusMessage)+" ")]):e._e(),s("sidebar-section",{directives:[{name:"show",rawName:"v-show",value:e.asserts.length,expression:"asserts.length"}],attrs:{title:"Asserts",name:"asserts",items:e.asserts,"filter-example":"text/html name:Accept"},scopedSlots:e._u([{key:"table",fn:function(t){var a=t.items,i=t.filter,n=t.filterExample,r=t.expanded;return[s("details-table",{directives:[{name:"show",rawName:"v-show",value:r,expression:"expanded"}],attrs:{columns:["Assert"],items:a,filter:i,"filter-example":n,"no-header":!0,"no-table-head":!0},scopedSlots:e._u([{key:"body",fn:function(t){var a=t.items;return e._l(a,(function(t,a){return s("tr",{key:e.$request.id+"-"+a},[s("td",{staticClass:"value test-assert"},[s("div",{staticClass:"assert-name"},[s("div",{staticClass:"assert-name-content",class:{"assert-failed":!t.passed}},[s("span",{staticClass:"assert-name-text"},[e._v(e._s(t.name))])]),s("div",{staticClass:"assert-name-trace"},[s("stack-trace",{attrs:{trace:t.trace}})],1)]),s("pretty-print",{attrs:{data:t.arguments}})],1)])}))}}],null,!0)})]}}])})],1)},yi=[],Ci={name:"TestTab",components:{DetailsTable:ft,PrettyPrint:ut,SidebarSection:ai,StackTrace:z},computed:{asserts:function(){return this.$request.testAsserts.reverse()}}},qi=Ci,$i=(s("86a4"),Object(f["a"])(qi,_i,yi,!1,null,null,null)),ki=$i.exports,xi={name:"RequestSidebar",components:{CommandTab:oi,ExceptionSection:Z,ParentRequest:ne,QueueJobTab:vi,RequestTab:wi,TestTab:ki},computed:{shareUrl:function(){return this.$request?"".concat(window.location.origin,"#").concat(this.$request.id):"#"}}},Ti=xi,Si=(s("313b"),Object(f["a"])(Ti,za,Ga,!1,null,null,null)),ji=Si.exports,Oi=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"popover-viewport",class:{"split-view-pane split-view-requests":!0,large:e.$settings.global.requestSidebarCollapsed}},[s("div",{staticClass:"requests-header",attrs:{id:"requests-header"}},[s("table",[s("thead",[s("tr",[e._m(0),s("th",{staticClass:"status"},[e._v(" Status ")]),s("th",{staticClass:"duration"},[e._v(" Time"),s("br"),e.showDatabaseTime?s("small",[e._v("Database")]):e._e()])])])])]),s("div",{ref:"requestsContainer",staticClass:"requests-container"},[s("div",{staticClass:"requests-content"},[s("div",{ref:"contentAbove",staticClass:"content-above"},[s("div",{staticClass:"requests-search"},[s("input",{directives:[{name:"model",rawName:"v-model",value:e.$requestsSearch.input,expression:"$requestsSearch.input"}],attrs:{type:"search",placeholder:"Search..."},domProps:{value:e.$requestsSearch.input},on:{input:[function(t){t.target.composing||e.$set(e.$requestsSearch,"input",t.target.value)},e.$requestsSearch.searchDebounced]}}),s("icon",{attrs:{name:"search"}})],1),s("a",{staticClass:"button",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.loadMoreRequests.apply(null,arguments)}}},[e._v(" "+e._s(e.loadingMoreRequests?"Loading...":"Load more")+" ")])]),s("div",{ref:"requestsTable",staticClass:"requests-table"},[s("table",{attrs:{id:"requests"}},e._l(e.requests,(function(t){return s("tr",{key:t.id,class:{selected:e.isActive(t.id)},on:{click:function(s){return e.showRequest(t)}}},[s("td",{staticClass:"controller",attrs:{title:t.tooltip}},[s("big",[t.errorsCount?s("icon",{staticClass:"request-alert alert-errors",attrs:{name:"alert-circle"}}):t.warningsCount?s("icon",{staticClass:"request-alert alert-warnings",attrs:{name:"alert-triangle"}}):e._e(),t.isCommand()?[s("span",{staticClass:"type-text"},[e._v("CMD")]),e._v(" "+e._s(t.commandName)+" ")]:t.isQueueJob()?[s("span",{staticClass:"type-text"},[e._v("QUEUE")]),e._v(" "+e._s(t.jobName)+" ")]:t.isTest()?[s("span",{staticClass:"type-text"},[e._v("TEST")]),e._v(" "+e._s(t.testGroup)+" ")]:[t.isAjax()?s("span",{staticClass:"type-text"},[e._v("AJAX")]):e._e(),s("span",{staticClass:"method-text"},[e._v(e._s(t.method))]),e._v(" "+e._s(t.uri)+" ")]],2),s("br"),t.isCommand()?[s("small",[e._v(e._s(t.commandLine))])]:t.isQueueJob()?[s("small",[e._v(e._s(t.jobDescription))])]:t.isTest()?[s("small",[e._v(e._s(t.testName))])]:[e.$settings.global.requestSidebarCollapsed?s("small",[e._v(e._s(t.controller))]):s("small",[e._v(e._s(e._f("shortClass")(t.controller)))])]],2),t.isCommand()?[s("td",{staticClass:"status",attrs:{title:t.commandExitCode}},[s("span",{class:{"status-text":!0,"client-error":t.isCommandWarning(),"server-error":t.isCommandError()}},[e._v(e._s(t.commandExitCode))])])]:t.isQueueJob()?[s("td",{staticClass:"status",attrs:{title:t.jobStatus}},[s("span",{class:{"status-text":!0,"status-text-small":!0,"client-error":t.isQueueJobWarning(),"server-error":t.isQueueJobError()}},[e._v(e._s(t.jobStatus))])])]:t.isTest()?[s("td",{staticClass:"status",attrs:{title:t.testStatus}},[s("span",{class:{"status-text":!0,"status-text-small":!0,"client-error":t.isTestWarning(),"server-error":t.isTestError()}},[e._v(e._s(t.testStatus))])])]:[s("td",{staticClass:"status",attrs:{title:t.responseStatus}},[s("span",{class:{"status-text":!0,"client-error":t.isClientError(),"server-error":t.isServerError()}},[e._v(e._s(t.responseStatus))])])],s("td",{staticClass:"duration",attrs:{title:t.responseDurationRounded+" ms ("+t.databaseDurationRounded+" ms)"}},[e._v(" "+e._s(t.responseDurationRounded)+" ms"),s("br"),e.showDatabaseTime?s("small",[e._v(e._s(t.databaseDurationRounded)+" ms")]):e._e()])],2)})),0)]),s("a",{staticClass:"button requests-clear",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.clear.apply(null,arguments)}}},[s("icon",{attrs:{name:"slash"}}),e._v(" Clear ")],1)])])])},Pi=[function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("th",{staticClass:"controller"},[e._v(" Path"),s("br"),s("small",[e._v("Controller")])])}],Di={name:"RequestsList",components:{},data:function(){return{loadingMoreRequests:!1}},computed:{requests:function(){var e=this.$requests.items;return this.$settings.global.hideCommandTypeRequests&&(e=e.filter((function(e){return"command"!=e.type}))),this.$settings.global.hideQueueJobTypeRequests&&(e=e.filter((function(e){return"queue-job"!=e.type}))),this.$settings.global.hideTestTypeRequests&&(e=e.filter((function(e){return"test"!=e.type}))),e},showDatabaseTime:function(){return this.requests.find((function(e){return e.databaseDuration>0}))}},mounted:function(){this.$refs.requestsContainer.scrollTop=this.$refs.requestsTable.offsetTop},methods:{isActive:function(e){var t;return(null===(t=this.$request)||void 0===t?void 0:t.id)==e},showRequest:function(e){this.global.$request=e},loadMoreRequests:function(){var e=this;this.loadingMoreRequests=!0,this.$requests.loadPrevious(10).then((function(){e.loadingMoreRequests=!1}))},shouldShowFirstRequest:function(){return!this.$settings.global.preserveLog&&(!this.$request||!this.$requests.findId(this.$request.id))},shouldShowIncomingRequest:function(){return this.$settings.global.preserveLog&&(!this.$request||this.$settings.global.showIncomingRequests&&this.global.showIncomingRequests)},clear:function(){this.$requests.clear()}},watch:{requests:function(e){this.shouldShowFirstRequest()?this.showRequest(this.$requests.first()):this.shouldShowIncomingRequest()&&(this.showRequest(this.$requests.last((function(e){return!e.isAjax()}))||this.$requests.last()),this.$refs.requestsContainer.scrollTop=this.$refs.requestsTable.offsetHeight+this.$refs.requestsTable.offsetTop)},$request:{handler:function(e){var t,s;"requires-authentication"==(null===(t=this.$request)||void 0===t||null===(s=t.error)||void 0===s?void 0:s.error)&&this.$authentication.request(this.$request.error.message,this.$request.error.requires);var a=this.$requests.last((function(e){return!e.isAjax()}))||this.$requests.last(),i=this.$requests.all().indexOf(a);this.global.showIncomingRequests=this.$requests.all().slice(i).includes(e)}},"$request.loading":{handler:function(e){var t,s;e||"requires-authentication"==(null===(t=this.$request)||void 0===t||null===(s=t.error)||void 0===s?void 0:s.error)&&this.$authentication.request(this.$request.error.message,this.$request.error.requires)}}}},Ri=Di,Ei=(s("d852"),Object(f["a"])(Ri,Oi,Pi,!1,null,null,null)),Ni=Ei.exports,Ai=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("modal",{attrs:{icon:"star",title:"What's new",shown:e.$whatsNew.show,"on-close":e.close}},[s("div",{staticClass:"whats-new"},[s("div",{staticClass:"whats-new-content"},[s("h1",[e._v("Clockwork has just been updated!")]),e._l(e.release.notes,(function(t){return[s("div",{staticClass:"whats-new-section",class:"image-"+(t.imagePlacement||"bottom")},[t.image&&"bottom"!=(t.imagePlacement||"bottom")?s("img",{attrs:{src:"img/whats-new/"+e.release.version+"/"+t.image}}):e._e(),s("h2",[e._v(e._s(t.title))]),e._l(t.text,(function(t){return s("p",[e._v(e._s(t))])})),t.image&&"bottom"==(t.imagePlacement||"bottom")?s("img",{attrs:{src:"img/whats-new/"+e.release.version+"/"+t.image}}):e._e()],2)]})),s("div",{staticClass:"whats-new-actions"},[s("a",{staticClass:"actions-show-more",attrs:{href:e.release.url,target:"_blank"}},[e._v("Learn more")]),s("a",{staticClass:"actions-close",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),e.close.apply(null,arguments)}}},[e._v("Close")]),s("p",[s("small",[e._v("Some of the new features might require server-side Clockwork library update.")])])])],2)])])},Ii=[],Mi=function(){function e(t,s){Object(tt["a"])(this,e),this.platform=t,this.settings=s}return Object(st["a"])(e,[{key:"show",get:function(){return this.settings.global.seenReleaseNotesVersion!=e.latestRelease.version&&this.settings.persistent&&this.settings.loaded&&this.platform.hasFeature("whats-new")}},{key:"seen",value:function(){this.settings.global.seenReleaseNotesVersion=e.latestRelease.version,this.settings.save()}}],[{key:"latestRelease",get:function(){return e.releases[0]}},{key:"releases",get:function(){return[{version:"5.1",url:"https://underground.works/blog/clockwork-5.1-released-with-database-queries-highlighting-and-more",notes:[{title:"Database Queries Highlighting",text:["Database queries are now easier to read with SQL syntax highlighting. You can also enable the prettify mode to reformat the queries for even more readibility."],image:"database-queries.png",imagePlacement:"top"},{title:"Server-side Library Updated",text:["The server-side library was also updated with support for Laravel Octane, collecting cache values and more.",'For the full list of improvements, changes, and fixes click on the "learn more" button.']}]},{version:"5.0",url:"https://underground.works/blog/clockwork-5.0-released-with-client-side-metrics-toolbar-and-more",notes:[{title:"UI refinements",text:["Almost every part of the Clockwork UI was touched up and improved. From simplified requests list, new tab bar, counters and tables to reworked dark theme colors.",'You will also find a new "credits" link in the settings modal. This opens a credits modal with a little shout-out to all contributors, sponsors and used third-party dependencies.'],image:"clockwork-5.png",imagePlacement:"top"},{title:"Timeline",text:["Timeline was rebuilt from the ground up in this release.","The new timeline makes it easier than ever before to figure out what's happening in your application.","The condense option makes the timeline more compact and clicking on an event now reveals a popover with more details."],image:"timeline.png",imagePlacement:"right"},{title:"Client-side metrics and Web Vitals",text:["Clockwork helps you to keep your server-side performance in check. Optimizing the backend is just half of the battle though.","Clockwork can now collect client-side performance metrics. Supported are both navigation timings and Web Vitals","Collecting these metrics requires installing a tiny javascript library from npm or via cdn. Check the docs for more details."],image:"client-metrics.png",imagePlacement:"left"},{title:"Models",text:["Models tab is a new tool in your toolbelt for dealing with database issues.","Models actions give you a different point of view at your database usage.","Models counts will show you how many of each model you've retrieved, created, updated and deleted."],image:"models-tab.png",imagePlacement:"right"},{title:"Notifications",text:["Notifications tab is a new tab replacing the emails tab.","This time we support not only emails, but all kinds of notifications, like SMS or Slack messages.","With details like subject, recipient, sender, but also notifiable, notified and mailable objects in Larvel."],image:"notifications-tab.png",imagePlacement:"left"},{title:"Sharing",text:["Have you ever wanted to share a Clockwork profile with someone else? Maybe you'd like to share details of a crash from a local environment with a co-worker. Or before and after optimisation metrics with your boss.","Sharing a request uploads the metadata to a Clockwork share service and gives you a public link to share with others. On this link you will find a fully working Clockwork app showing the request you shared.","The share service is free to use, click on the share button in the sidebar to start."]},{title:"Toolbar",text:["Clockwork now gives you an option to show basic request information in the form of a toolbar in your app.","A tiny browser component has to be installed from npm or via cdn. See the docs for full installation instructions."],image:"toolbar.png",imagePlacement:"top"}]}]}}]),e}(),Li={name:"WhatsNew",components:{Modal:p},computed:{release:function(){return Mi.latestRelease}},methods:{close:function(){this.$whatsNew.seen()}}},Qi=Li,Ui=(s("f407"),Object(f["a"])(Qi,Ai,Ii,!1,null,null,null)),Fi=Ui.exports,Ji={name:"App",components:{RequestDetails:Ba,RequestSidebar:ji,RequestsList:Ni,WhatsNew:Fi},computed:{appearance:function(){return this.$settings.appearance},showRequestsList:function(){return!this.$settings.global.requestsListCollapsed&&this.$platform.hasFeature("requests-list")},showRequestSidebar:function(){return!this.$settings.global.requestSidebarCollapsed&&this.$platform.hasFeature("request-sidebar")}}},Hi=Ji,Vi=(s("5c0b"),Object(f["a"])(Hi,i,n,!1,null,null,null)),Wi=Vi.exports,Bi=s("4eb5"),zi=s.n(Bi),Gi=s("f035"),Ki=s.n(Gi),Xi=s("c28b"),Zi=s.n(Xi),Yi=s("9b02"),en=s.n(Yi);yt["a"].config.devtools=!0,yt["a"].config.performance=!0,yt["a"].config.productionTip=!1,yt["a"].use(zi.a),yt["a"].use(Zi.a),yt["a"].component("spinner",Ki.a),yt["a"].mixin({methods:{$get:en.a}});s("498a"),s("a15b"),s("5db7"),s("73d9");var tn,sn=s("1160"),an=s.n(sn),nn=s("a501"),rn=s.n(nn),on=function(){function e(t,s,a){var i=this;Object(tt["a"])(this,e),this.startTime=s,this.endTime=a,this.events=[],t.map((function(e){return i.append(e)}))}return Object(st["a"])(e,[{key:"append",value:function(e){e.start=e.start||this.startTime,e.startthis.endTime&&(e.end=this.endTime),this.events.push(new ln(e)),this.sort()}},{key:"appendTotalEvent",value:function(){this.append({description:"Total time",start:this.startTime,duration:this.endTime-this.startTime,color:"grey"})}},{key:"merge",value:function(e){this.events=this.events.concat(e.events),this.sort()}},{key:"copy",value:function(){return new e(an()(this.events),this.startTime,this.endTime)}},{key:"sort",value:function(){return this.events=this.events.sort((function(e,t){return e.start-t.start})),this}},{key:"filter",value:function(e,t){var s=this.copy();return s.events=e.filter(s.events),s.events=s.events.filter((function(e){return!rn()(e.tags,t).length})),s}},{key:"condense",value:function(){var e=this.copy(),t=(e.endTime-e.startTime)/64;return e.events=e.events.reduce((function(e,s){if(s.duration>=t)return[].concat(Object(ts["a"])(e),[s]);var a=e[e.length-1];return a instanceof cn&&a.end<=s.start?(a.push(s),e):[].concat(Object(ts["a"])(e),[new cn(s)])}),[]),e}},{key:"present",value:function(e){var t=this;return this.events.map((function(s){return s instanceof cn||(s=new cn(s)),s.present(t,e)}))}},{key:"findChildren",value:function(e){return this.events.flatMap((function(e){return e instanceof cn?e.events:e})).reduce((function(t,s){return s!==e&&e.contains(s)&&t.every((function(e){return!e.contains(s)}))&&t.push(s),t}),[])}}]),e}(),ln=function(){function e(t){Object(tt["a"])(this,e),this.name=t.name||t.description,this.description=t.description||"",this.start=t.start instanceof Date?t.start.getTime()/1e3:t.start,this.duration=t.duration||0,this.color=t.color||"blue",this.end=this.start+this.duration/1e3,this.tags=t.tags||[],this.data=t.data}return Object(st["a"])(e,[{key:"present",value:function(e,t){var s=this;if(this.presented)return this;this.startRelative=1e3*(this.start-e.startTime)/(e.endTime-e.startTime),this.durationRelative=this.duration/(e.endTime-e.startTime),this.offset=this.startRelative*t,this.width=this.durationRelative*t,this.width<3&&(this.width=3),this.width>t&&(this.width=t),this.width+this.offset>t&&(this.offset=t-this.width),this.eventClass=this.color,this.eventStyle={left:"0px",width:"".concat(this.width,"px")},this.labelWidth=this.startRelative>.5?this.offset:t-this.width-this.offset,this.labelClass=this.startRelative>.5?["before",this.color]:["after",this.color],this.labelStyle={width:"".concat(this.labelWidth,"px")},this.width>200&&(this.labelClass=["inside",this.color]);var a=e.findChildren(this).map((function(s){return s.present(e,t)}));return this.childrenSections=a.map((function(e){return{style:{left:"".concat(e.offset-s.offset,"px"),width:"".concat(e.width,"px")}}})),this.durationChildren=a.length?a.reduce((function(e,t){return e+t.duration}),0):null,this.durationSelf=this.duration-this.durationChildren,this.presented=!0,this}},{key:"contains",value:function(e){return this.start1}},{key:"firstEvent",get:function(){return this.events[0]}},{key:"lastEvent",get:function(){return this.events[this.events.length-1]}},{key:"push",value:function(e){this.events.push(e),this.name=this.description="".concat(this.events.length," events"),this.duration=this.lastEvent.end-this.firstEvent.start,this.end=this.lastEvent.end}},{key:"present",value:function(e,t){var s=this;return this.events.forEach((function(a){a.present(e,t),a.eventStyle.left="".concat(a.offset-s.events[0].offset,"px")})),this.duration=this.condensed?null:this.firstEvent.duration,this.durationSelf=this.condensed?null:this.firstEvent.durationSelf,this.durationChildren=this.condensed?null:this.firstEvent.durationChildren,this.offset=this.firstEvent.offset,this.width=this.lastEvent.width+this.lastEvent.offset-this.firstEvent.offset,this.color=this.offset>t/2?this.firstEvent.color:this.lastEvent.color,this.labelWidth=this.offset>t/2?this.offset:t-this.width-this.offset,this.labelClass=this.offset>t/2?["before",this.color]:["after",this.color],this.labelStyle={width:"".concat(this.labelWidth,"px")},this.width>200&&!this.condensed&&(this.labelClass=["inside",this.color]),this.groupStyle={"margin-left":"".concat(this.offset,"px"),width:"".concat(this.width,"px")},this.tags=this.condensed?[]:this.firstEvent.tags,this.data=this.condensed?void 0:this.firstEvent.data,this}}]),e}(),un=s("f7c2"),dn=s.n(un),hn=s("e4c9"),vn=s.n(hn),fn=s("c909"),mn=s.n(fn),pn=function(){function e(t){Object(tt["a"])(this,e),Object.assign(this,t),this.original=t,this.time=parseFloat(this.time),this.responseDuration=parseFloat(this.responseDuration),this.responseDurationRounded=this.responseDuration?Math.round(this.responseDuration):0,this.databaseDurationRounded=this.databaseDuration?Math.round(this.databaseDuration):0,this.memoryUsageFormatted=this.memoryUsage?this.formatBytes(this.memoryUsage):void 0,this.processCacheStats(),this.cacheQueries=this.processCacheQueries(this.cacheQueries),this.cookies=this.createKeypairs(this.cookies),this.middleware=this.middleware instanceof Array?this.middleware:[],this.processDatabase(),this.processModels(),this.notifications=this.processNotifications(this.notifications,this.emailsData),this.events=this.processEvents(this.events),this.getData=this.createKeypairs(this.getData),this.requestData=this.requestData instanceof Object?this.createKeypairs(this.requestData,!1):this.requestData,this.headers=this.processHeaders(this.headers),this.log=this.processLog(this.log),this.postData=this.createKeypairs(this.postData),this.queueJobs=this.processQueueJobs(this.queueJobs),this.redisCommands=this.processRedisCommands(this.redisCommands),this.sessionData=this.createKeypairs(this.sessionData),this.performanceMetrics=this.processPerformanceMetrics(this.performanceMetrics),this.viewsData=this.processViews(this.viewsData),this.userData=this.processUserData(this.userData),this.timeline=this.processTimeline(this.timelineData),this.clientMetrics=this.processClientMetrics(this.clientMetrics),this.webVitals=this.processWebVitals(this.webVitals),this.processCommand(),this.processQueueJob(),this.processTest(),this.errorsCount=this.getErrorsCount(),this.warningsCount=this.getWarningsCount(),this.exceptions=this.processExceptions(),this.loadClientMetricsAttempts=0}return Object(st["a"])(e,[{key:"resolve",value:function(e,t){return Object.assign(this,t?dn()(e,t):e,{loading:!1,error:void 0,original:Object.assign(this.original,e.original)})}},{key:"resolveWithError",value:function(e){return Object.assign(this,{loading:!1,error:e})}},{key:"loadClientMetrics",value:function(e){var t=this;this.isRequest()&&(this.clientMetrics.some((function(e){return e.value}))&&Object.values(this.webVitals).some((function(e){return e.value}))||this.loadClientMetricsTimeout||++this.loadClientMetricsAttempts>4||(this.loadClientMetricsTimeout=setTimeout((function(){e.findId(t.id)&&e.loadId(t.id,["clientMetrics","webVitals"]).then((function(){t.loadClientMetricsTimeout=void 0,t.loadClientMetrics(e)}))}),2500)))}},{key:"isClientError",value:function(){return this.responseStatus>=400&&this.responseStatus<500}},{key:"isServerError",value:function(){return this.responseStatus>=500&&this.responseStatus<600}},{key:"isAjax",value:function(){return this.headers.find((function(e){return"X-Requested-With"==e.name&&"XMLHttpRequest"==e.value}))}},{key:"isRequest",value:function(){return"request"==this.type||!this.type}},{key:"isCommand",value:function(){return"command"==this.type}},{key:"isCommandError",value:function(){return 1==this.commandExitCode}},{key:"isCommandWarning",value:function(){return this.commandExitCode>1}},{key:"isQueueJob",value:function(){return"queue-job"==this.type}},{key:"isQueueJobError",value:function(){return"failed"==this.jobStatus}},{key:"isQueueJobWarning",value:function(){return"released"==this.jobStatus}},{key:"isTest",value:function(){return"test"==this.type}},{key:"isTestError",value:function(){return["failed","error"].includes(this.testStatus)}},{key:"isTestWarning",value:function(){return["warning"].includes(this.testStatus)}},{key:"tooltip",get:function(){return this.isCommand()?"[CMD] ".concat(this.commandName," (").concat(this.commandLine,")"):this.isQueueJob()?"[QUEUE] ".concat(this.jobName," (").concat(this.jobDescription,")"):this.isTest()?"[TEST] ".concat(this.testGroup," (").concat(this.testName,")"):"".concat(this.method," ").concat(this.uri," (").concat(this.controller,")")}},{key:"createKeypairs",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!(e instanceof Object))return[];var s=Object.keys(e).map((function(t){return{name:t,value:e[t]}}));return t&&(s=s.sort((function(e,t){return e.name.localeCompare(t.name)}))),s}},{key:"processCacheStats",value:function(){this.cacheDeletes&&(this.cacheDeletes=parseInt(this.cacheDeletes)),this.cacheHits&&(this.cacheHits=parseInt(this.cacheHits)),this.cacheReads&&(this.cacheReads=parseInt(this.cacheReads)),this.cacheWrites&&(this.cacheWrites=parseInt(this.cacheWrites)),this.cacheMisses=this.cacheReads&&this.cacheHits?this.cacheReads-this.cacheHits:null}},{key:"processCacheQueries",value:function(e){var t=this;return e instanceof Array?e.map((function(e){return e.expiration=e.expiration?t.formatTime(e.expiration):void 0,e.value=void 0!==e.value?e.value:"",e})):[]}},{key:"processClientMetrics",value:function(e){return e=this.enforceObject(e),[{name:"Redirect",value:e.redirect},{name:"DNS",value:e.dns,color:"purple",onChart:!0},{name:"Connection",value:e.connection,color:"blue",onChart:!0},{name:"Waiting",value:e.waiting,color:"red",onChart:!0},{name:"Receiving",value:e.receiving,color:"green",onChart:!0},{name:"To interactive",value:e.domInteractive,color:"blue",onChart:!0,dom:!0},{name:"To complete",value:e.domComplete,color:"purple",onChart:!0,dom:!0}]}},{key:"processDatabase",value:function(){this.databaseQueries=this.processDatabaseQueries(this.databaseQueries),this.databaseQueriesCount=parseInt(this.databaseQueriesCount)||this.databaseQueries.length,this.databaseSlowQueries=parseInt(this.databaseSlowQueries)||this.databaseQueries.filter((function(e){return e.tags.includes("slow")})).length,this.databaseSelects=parseInt(this.databaseSelects)||this.databaseQueries.filter((function(e){return e.query.match(/^select /i)})).length,this.databaseInserts=parseInt(this.databaseInserts)||this.databaseQueries.filter((function(e){return e.query.match(/^insert /i)})).length,this.databaseUpdates=parseInt(this.databaseUpdates)||this.databaseQueries.filter((function(e){return e.query.match(/^update /i)})).length,this.databaseDeletes=parseInt(this.databaseDeletes)||this.databaseQueries.filter((function(e){return e.query.match(/^delete /i)})).length,this.databaseOthers=parseInt(this.databaseOthers)||this.databaseQueries.filter((function(e){return!e.query.match(/^(select|insert|update|delete) /i)})).length}},{key:"processDatabaseQueries",value:function(e){var t=this;return e instanceof Array?e.map((function(e){e.model=e.model||"-",e.shortModel=e.model?e.model.split("\\").pop():"-",e.tags=e.tags instanceof Array?e.tags:[],e.bindings=t.optionalNonEmptyObject(e.bindings),e.prettifiedQuery=vn.a.format(e.query);var s,a=e.query.trim();return(s=a.match(/^SELECT\s[\s\S]*?\sFROM\s[^A-Za-z-_]?([A-Za-z-_]+)/i))?e.shortQuery="SELECT FROM ".concat(s[1]):(s=a.match(/^INSERT\s+INTO\s+[^A-Za-z-_]?([A-Za-z-_]+)/i))?e.shortQuery="INSERT INTO ".concat(s[1]):(s=a.match(/^UPDATE\s+[^A-Za-z-_]?([A-Za-z-_]+)/i))?e.shortQuery="UPDATE ".concat(s[1]):(s=a.match(/^DELETE\s+FROM\s+[^A-Za-z-_]?([A-Za-z-_]+)/i))?e.shortQuery="DELETE FROM ".concat(s[1]):e.shortQuery=a,e})):[]}},{key:"processNotifications",value:function(e,t){return t=Object.values(this.optionalNonEmptyObject(t,{})).filter((function(e){return e.data instanceof Object})).map((function(e){return{subject:e.data.subject,to:[e.data.to],from:[e.data.from],time:e.start,duration:e.duration,type:"mail",data:[]}})),this.enforceArray(e).concat(t).map((function(e){return e.isShowingDetails=!1,e}))}},{key:"processEvents",value:function(e){return e instanceof Array?e.map((function(e){return e.objectEvent=e.data instanceof Object&&e.event==e.data.__class__,e.time=e.time?new Date(1e3*e.time):void 0,e.listeners=e.listeners instanceof Array?e.listeners:[],e.listeners=e.listeners.map((function(e){var t,s;return t=(s=e.match(/Closure \(.*[\/\\](.+?:\d+)-\d+\)/))?"Closure ("+s[1]+")":e.split(/[\/\\]/).pop(),{name:e,shortName:t}})),e})):[]}},{key:"processExceptions",value:function(){var e=this.log.length?this.log[this.log.length-1].exception:null;if(this.isRequest()&&!this.isServerError()||!e)return[];e=an()(e);var t=e;do{t.trace=[{call:"".concat(t.type,"()"),file:t.file,line:t.line,isVendor:!1}].concat(Object(ts["a"])(t.trace))}while(t=t.previous);return[e]}},{key:"processHeaders",value:function(e){return e instanceof Object?Object.keys(e).map((function(t){var s=e[t];return t=t.split("-").map((function(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()})).join("-"),{name:t,value:s}})).reduce((function(e,t){return t=t.value instanceof Array?t.value.map((function(e){return{name:t.name,value:e}})):[t],e.concat(t)}),[]).sort((function(e,t){return e.name.localeCompare(t.name)})):[]}},{key:"processLog",value:function(e){return e instanceof Array?e.map((function(e){return e.exception&&(e.file=e.exception.file,e.line=e.exception.line,e.trace=e.exception.trace),e.time=new Date(1e3*e.time),e.context=e.context instanceof Object&&Object.keys(e.context).filter((function(e){return"__type__"!=e})).length?e.context:void 0,e})):[]}},{key:"processModels",value:function(){this.modelsActions=this.processModelsActions(this.modelsActions)}},{key:"processModelsActions",value:function(e){var t=this;return this.enforceArray(e).map((function(e){return e.shortModel=e.model?e.model.split("\\").pop():"",e.attributes=t.optionalNonEmptyObject(e.attributes),e.changes=t.optionalNonEmptyObject(e.changes),e.tags=t.enforceArray(e.tags),e.bindings=t.optionalNonEmptyObject(e.bindings),e.isShowingDetails=!1,e}))}},{key:"processPerformanceMetrics",value:function(e){if(!e)return[{name:"App",value:(this.responseDurationRounded||0)-(this.databaseDurationRounded||0)-(this.cacheTime||0),color:"blue"},{name:"DB",value:this.databaseDurationRounded,color:"red"},{name:"Cache",value:this.cacheTime,color:"green"}].filter((function(e){return e.value>0}));e=e.filter((function(e){return e instanceof Object})).map((function(e,t){return e.color=e.color||"purple",e}));var t=e.reduce((function(e,t){return e+t.value}),0);return e.push({name:"Other",value:this.responseDurationRounded-t,color:"purple"}),e}},{key:"processQueueJobs",value:function(e){return e instanceof Array?e.map((function(e){return e.shortName=e.name.split("\\").pop(),e})):[]}},{key:"processRedisCommands",value:function(e){return e instanceof Array?e:[]}},{key:"processTest",value:function(){if(this.testName){var e=this.testName.includes("::")?this.testName.split("::"):[this.testName,""],t=Object(a["a"])(e,2);this.testGroup=t[0],this.testName=t[1]}}},{key:"processTimeline",value:function(e){var t=new on(Object.values(this.optionalNonEmptyObject(e,{})),this.time,this.time+this.responseDuration);return e&&!e.total&&t.appendTotalEvent(),this.databaseQueries.forEach((function(e){return t.append({start:e.time,duration:e.duration,name:e.shortQuery,description:e.query,color:"red",tags:["databaseQueries"]})})),this.events.forEach((function(e){return t.append({start:e.time,duration:e.duration,description:e.event,color:"purple",tags:["events"]})})),this.cacheQueries.forEach((function(e){return t.append({start:e.time,duration:e.duration,description:"".concat(e.type.toUpperCase()," ").concat(e.key),color:"green",tags:["cacheQueries"]})})),this.redisCommands.forEach((function(e){return t.append({start:e.time,duration:e.duration,description:"".concat(e.command," ").concat(Object.values(e.parameters).join(" ")),color:"green",tags:["redisCommands"]})})),this.queueJobs.forEach((function(e){return t.append({start:e.time,duration:e.duration,description:e.name,color:"purple",tags:["queueJobs"]})})),this.notifications.forEach((function(e){return t.append({start:e.time,duration:e.duration,description:"".concat(e.to," - ").concat(e.subject),color:"purple",tags:["notifications"]})})),t.merge(this.viewsData),t}},{key:"processViews",value:function(e){var t=this,s=Object.values(this.optionalNonEmptyObject(e,{})).map((function(e){var s,a,i,n;return{start:e.start,duration:e.duration,name:(null===(s=e.data)||void 0===s?void 0:s.name)||e.description,description:((null===(a=e.data)||void 0===a?void 0:a.name)||e.description)+(null!==(i=e.data)&&void 0!==i&&i.memoryUsage?" (".concat(t.formatBytes(e.data.memoryUsage),")"):""),data:t.optionalNonEmptyObject(null===(n=e.data)||void 0===n?void 0:n.data),color:"purple",tags:["views"]}}));return new on(s,this.time,this.time+this.responseDuration)}},{key:"processUserData",value:function(e){if(!(e instanceof Object))return[];var t=function(e){var t=Object(a["a"])(e,2),s=t[0];t[1];return"__meta"!=s},s=function(e){return function(t){var s=Object(a["a"])(t,2),i=s[0],n=s[1];return{key:e[i]||i,value:n}}};return Object.entries(e).filter((function(e){var t=Object(a["a"])(e,2),s=(t[0],t[1]);return s instanceof Object||s.__meta||s.__meta.title})).map((function(e){var i=Object(a["a"])(e,2),n=i[0],r=i[1];return{key:n,title:r.__meta.title,sections:Object.entries(r).filter(t).map((function(e){var i=Object(a["a"])(e,2),n=(i[0],i[1]),r=n.__meta.labels||{},o="counters"==n.__meta.showAs?Object.entries(n).filter(t).map(s(r)):Object.entries(n).filter(t).map((function(e){var t=Object(a["a"])(e,2),i=(t[0],t[1]);return Object.entries(i).map(s(r))}));return{data:o,showAs:n.__meta.showAs,title:n.__meta.title}}))}}))}},{key:"processWebVitals",value:function(e){e=this.enforceObject(e);var t={cls:{slow:7300,moderate:3800},fid:{slow:300,moderate:100},lcp:{slow:4e3,moderate:2e3},fcp:{slow:4e3,moderate:2e3},ttfb:{slow:600,moderate:600},si:{slow:5800,moderate:4300}};return Object.keys(t).forEach((function(s){var a=e[s],i="fast",n=!isNaN(parseFloat(a));a>t[s].slow?i="slow":a>t[s].moderate&&(i="moderate"),e[s]={value:a,score:i,available:n}})),e}},{key:"processCommand",value:function(){this.commandLine="",this.commandLine+=Object.values(this.commandArguments||{}).filter((function(e){return e})).join(" "),this.commandLine+=Object.entries(this.commandOptions||{}).reduce((function(e,t){var s=Object(a["a"])(t,2),i=s[0],n=s[1];return e+(!0===n?" --".concat(i):" --".concat(i,"=").concat(n))}),""),this.commandArgumentsMerged=this.createKeypairs(Object.assign({},this.commandArgumentsDefaults||{},this.commandArguments||{}),!1),this.commandOptionsMerged=this.createKeypairs(Object.assign({},this.commandOptionsDefaults||{},this.commandOptions||{}),!1)}},{key:"processQueueJob",value:function(){this.jobOptions=this.createKeypairs(this.jobOptions)}},{key:"getErrorsCount",value:function(){return this.log.reduce((function(e,t){return"error"==t.level?e+1:e}),0)}},{key:"getWarningsCount",value:function(){return this.log.filter((function(e){return"warning"==e.level})).length+this.databaseSlowQueries}},{key:"formatTime",value:function(e){var t=Math.floor(e/60),s=Math.floor(t/60);e%=60,t%=60;var a=[];return s&&a.push(s+"h"),t&&a.push(t+"min"),e&&a.push(e+"sec"),a.join(" ")}},{key:"formatBytes",value:function(e){var t=["B","kB","MB","GB","TB","PB"],s=Math.floor(Math.log(e)/Math.log(1024));return"".concat(Math.round(e/Math.round(Math.pow(1024,s)))," ").concat(t[s])}},{key:"enforceArray",value:function(e){return e instanceof Array?e:[]}},{key:"enforceObject",value:function(e){return e instanceof Object&&Object.keys(e).filter((function(e){return"__type__"!=e})).length?e:{}}},{key:"optionalNonEmptyObject",value:function(e,t){return e instanceof Object&&Object.keys(e).filter((function(e){return"__type__"!=e})).length?e:t}}],[{key:"placeholder",value:function(t,s,a){return Object.assign(new e({loading:!0,id:t,uri:s?new mn.a(s.url).pathname():"/",controller:"Waiting...",method:s?s.method:"GET",responseStatus:"?",parent:a}),{responseDurationRounded:"?",databaseDurationRounded:"?"})}}]),e}(),gn=function(){function e(){Object(tt["a"])(this,e)}return Object(st["a"])(e,[{key:"api",get:function(){return chrome||browser}},{key:"init",value:function(e){this.global=e,this.requests=e.$requests,this.profiler=e.$profiler,this.settings=e.$settings,this.updateNotification=e.$updateNotification,this.lastPolledId=null,this.useProperTheme(),this.setMetadataUrl(),this.setMetadataClient(),this.listenToRequests(),this.throttlePolling(),this.loadLastRequest()}},{key:"useProperTheme",value:function(){"dark"===this.api.devtools.panels.themeName&&(this.settings.defaultAppearance="dark")}},{key:"setMetadataUrl",value:function(){var e=this;this.resolveTabUrl().then((function(t){return e.requests.setRemote(t)}))}},{key:"setMetadataClient",value:function(){var e=this;this.requests.setClient((function(t,s,a,i){return e.profiler.withoutProfiling((function(){return e.fetch(t,s,a,i).then((function(e){var t=e.response,s=e.data;if(403==t.status)throw{error:"requires-authentication",message:s.message,requires:s.requires};if(200!=t.status)throw{error:"error-response",message:"Server returned an error response."};if(!(s instanceof Array)&&(!(s instanceof Object)||!Object.keys(s).length))throw{error:"empty-response",message:"Server returned an empty metadata."};return s}))}))}))}},{key:"fetch",value:function(e,t){var s=this,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return new Promise((function(n,r){s.api.runtime.sendMessage({action:"fetch",method:e,url:t,data:a,headers:i},(function(e){return n(e)}))}))}},{key:"setCookie",value:function(e,t,s){var a=this;return this.resolveTabUrl().then((function(i){a.api.runtime.sendMessage({action:"setCookie",url:i,name:e,value:t,path:"/",expirationDate:Math.floor(Date.now()/1e3)+s})}))}},{key:"getCookie",value:function(e){var t=this;return this.resolveTabUrl().then((function(s){return new Promise((function(a,i){t.api.runtime.sendMessage({action:"setCookie",url:s,name:e},(function(e){return a(e)}))}))}))}},{key:"resolveTabUrl",value:function(){var e=this;return new Promise((function(t,s){e.api.runtime.sendMessage({action:"getTabUrl",tabId:e.api.devtools.inspectedWindow.tabId},(function(e){return t(e)}))}))}},{key:"listenToRequests",value:function(){var e=this;this.api.runtime.onMessage.addListener((function(t){if("requestCompleted"===t.action&&(-1!==navigator.userAgent.toLowerCase().indexOf("firefox/57.0")||t.request.tabId==e.api.devtools.inspectedWindow.tabId)){var s=e.parseHeaders(t.request.responseHeaders);if(s){e.updateNotification.serverVersion=s.version,e.requests.setRemote(t.request.url,s);var a=pn.placeholder(s.id,t.request);e.requests.loadId(s.id,null,a).then((function(){return e.retryLoading(a)})),s.subrequests.forEach((function(t){e.requests.setRemote(t.url,{path:t.path}),e.requests.loadId(t.id,null,pn.placeholder(t.id,t,a))})),e.requests.setRemote(t.request.url,s)}}})),this.settings.global.hideCommandTypeRequests&&this.settings.global.hideQueueJobTypeRequests&&this.settings.global.hideTestTypeRequests||this.startPollingRequests(),this.api.runtime.onMessage.addListener((function(t){"navigationStarted"===t.action&&(e.settings.global.preserveLog||t.details.tabId==e.api.devtools.inspectedWindow.tabId&&e.requests.clear())}))}},{key:"loadLastRequest",value:function(){var e=this;this.api.runtime.sendMessage({action:"getLastClockworkRequestInTab",tabId:this.api.devtools.inspectedWindow.tabId},(function(t){if(t){var s=e.parseHeaders(t.responseHeaders);e.updateNotification.serverVersion=s.version,e.requests.setRemote(t.url,s),e.requests.loadId(s.id,null,pn.placeholder(s.id,t)),e.settings.global.hideCommandTypeRequests&&e.settings.global.hideQueueJobTypeRequests&&e.settings.global.hideTestTypeRequests||e.startPollingRequests()}}))}},{key:"parseHeaders",value:function(e){var t,s=(t=e.find((function(e){return"x-clockwork-id"==e.name.toLowerCase()})))?t.value:void 0,a=(t=e.find((function(e){return"x-clockwork-path"==e.name.toLowerCase()})))?t.value:void 0,i=(t=e.find((function(e){return"x-clockwork-version"==e.name.toLowerCase()})))?t.value:void 0;if(s){var n={};e.forEach((function(e){if(0===e.name.toLowerCase().indexOf("x-clockwork-header-")){var t=e.name.replace(/^x-clockwork-header-/i,"");n[t]=e.value}}));var r=e.filter((function(e){return"x-clockwork-subrequest"==e.name.toLowerCase()})).reduce((function(e,t){return e.concat(t.value.split(",").map((function(e){var t=e.trim().split(";");return{id:t[0],url:decodeURIComponent(t[1]),path:decodeURIComponent(t[2])}})))}),[]);return{id:s,path:a,version:i,headers:n,subrequests:r}}}},{key:"retryLoading",value:function(e){var t=this,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.error&&(s>3||setTimeout((function(){return t.requests.loadId(e.id).then((function(){return t.retryLoading(e,s+1)}))}),(s+1)*(s+1)*100))}},{key:"startPollingRequests",value:function(){var e;this.pollingInterval=1e3,this.isPolling=!0,this.lastPolledId=null===(e=this.requests.last())||void 0===e?void 0:e.id,this.pollTimeout||this.pollRequests()}},{key:"stopPollingRequests",value:function(){this.isPolling=!1,clearTimeout(this.pollTimeout),this.pollTimeout=null}},{key:"pollRequests",value:function(){var e=this;clearTimeout(this.pollTimeout);var t=[this.settings.global.hideCommandTypeRequests?null:"command",this.settings.global.hideQueueJobTypeRequests?null:"queue-job",this.settings.global.hideTestTypeRequests?null:"test"].filter(Boolean);this.requests.withQuery({"type[]":t},(function(){e.requests.loadNext().then((function(t){var s;e.lastPolledId=(null===(s=e.requests.last())||void 0===s?void 0:s.id)||e.lastPolledId,e.isPolling&&(e.pollTimeout=setTimeout((function(){return e.pollRequests()}),e.updatePollingInterval(t.length)))})).catch((function(){e.isPolling&&(e.pollTimeout=setTimeout((function(){return e.pollRequests()}),e.updatePollingInterval(!1)))}))}))}},{key:"throttlePolling",value:function(){var e=this;document.addEventListener("visibilitychange",(function(){e.pollingInterval=document.hidden?6e4:1e3,!document.hidden&&e.isPolling&&e.pollRequests()}))}},{key:"updatePollingInterval",value:function(e){var t=(new Date).getTime();return!e&&this.pollingLastReceived||(this.pollingLastReceived=t),t-this.pollingLastReceived>6e4?this.pollingInterval=5e3:t-this.pollingLastReceived>3e4?this.pollingInterval=2500:this.pollingInterval=1e3}},{key:"hasFeature",value:function(e){var t=["delete-shared","details-request"];return!t.includes(e)}},{key:"settingsChanged",value:function(){this.settings.global.hideCommandTypeRequests&&this.settings.global.hideQueueJobTypeRequests&&this.settings.global.hideTestTypeRequests?this.stopPollingRequests():this.startPollingRequests()}}],[{key:"runningAsExtension",value:function(){return"object"==("undefined"===typeof chrome?"undefined":Object(et["a"])(chrome))&&chrome.devtools||"object"==("undefined"===typeof browser?"undefined":Object(et["a"])(browser))&&browser.devtools}}]),e}(),bn=function(){function e(){Object(tt["a"])(this,e)}return Object(st["a"])(e,[{key:"init",value:function(e){this.global=e,this.requests=e.$requests,this.authentication=e.$authentication,this.profiler=e.$profiler,this.settings=e.$settings,this.lastPolledId=null,this.useProperTheme(),this.setMetadataUrl(),this.setMetadataClient(),this.loadRequestFromUri(),this.startPollingRequests(),this.throttlePolling()}},{key:"useProperTheme",value:function(){window.matchMedia("(prefers-color-scheme: dark)").matches&&(this.settings.defaultAppearance="dark")}},{key:"setMetadataUrl",value:function(){if(this.settings.global.metadataPath)return this.requests.setRemote(window.location.href,{path:this.settings.global.metadataPath});this.requests.setRemote(window.location.href,{path:new mn.a(window.location.href).path().split("/").slice(0,-2).join("/")+"/__clockwork/"})}},{key:"setMetadataClient",value:function(){var e=this;this.requests.setClient((function(t,s,a,i){return e.profiler.withoutProfiling((function(){return e.fetch(t,s,a,i).then((function(e){var t=e.response,s=e.data;if(403==t.status)throw{error:"requires-authentication",message:s.message,requires:s.requires};if(200!=t.status)throw{error:"error-response",message:"Server returned an error response."};if(!(s instanceof Array)&&(!(s instanceof Object)||!Object.keys(s).length))throw{error:"empty-response",message:"Server returned an empty metadata."};return s}))}))}))}},{key:"fetch",value:function(e){function t(t,s){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e,t){var s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=new FormData;return Object.entries(s).forEach((function(e){var t=Object(a["a"])(e,2),s=t[0],i=t[1];return n.append(s,i)})),fetch(t,{method:e,body:Object.keys(s).length?n:null,headers:i}).then((function(e){return e.json().then((function(t){return{response:e,data:t}}))}))}))},{key:"setCookie",value:function(e,t,s){return document.cookie="".concat(e,"=").concat(t,";path=/;max-age=").concat(s),Promise.resolve()}},{key:"getCookie",value:function(e){var t=document.cookie.match(new RegExp("(?:^| )".concat(e,"=([^;]*)")));return Promise.resolve(t?t[1]:void 0)}},{key:"loadRequestFromUri",value:function(){var e=mn()(window.location.href).fragment();e&&this.requests.loadId(e,!1)}},{key:"startPollingRequests",value:function(){var e=this;this.pollingInterval=1e3,this.requests.loadLatest().then((function(){var t;if(!(e.lastPolledId=null===(t=e.requests.last())||void 0===t?void 0:t.id))throw new Error;e.pollRequests()})).catch((function(t){"requires-authentication"==t.error?e.authentication.request(t.message,t.requires).then((function(){e.startPollingRequests()})):setTimeout((function(){return e.startPollingRequests()}),e.pollingInterval)}))}},{key:"pollRequests",value:function(){var e,t=this;clearTimeout(this.pollTimeout),this.requests.loadNext(null,(null===(e=this.requests.last())||void 0===e?void 0:e.id)||this.lastPolledId).then((function(e){var s;if(!t.settings.global.preserveLog){var a=t.requests.last((function(e){return e.isRequest()&&!e.isAjax()})),i=t.requests.all().indexOf(a);t.requests.setItems(t.requests.all().slice(i))}t.lastPolledId=(null===(s=t.requests.last())||void 0===s?void 0:s.id)||t.lastPolledId,t.pollTimeout=setTimeout((function(){return t.pollRequests()}),t.updatePollingInterval(e.length))})).catch((function(){t.pollTimeout=setTimeout((function(){return t.pollRequests()}),t.updatePollingInterval(!1))}))}},{key:"throttlePolling",value:function(){var e=this;document.addEventListener("visibilitychange",(function(){e.pollingInterval=document.hidden?6e4:1e3,document.hidden||e.pollRequests()}))}},{key:"updatePollingInterval",value:function(e){var t=(new Date).getTime();return!e&&this.pollingLastReceived||(this.pollingLastReceived=t),t-this.pollingLastReceived>6e4?this.pollingInterval=5e3:t-this.pollingLastReceived>3e4?this.pollingInterval=2500:this.pollingInterval=1e3}},{key:"hasFeature",value:function(e){var t=["delete-shared","details-request"];return!t.includes(e)}},{key:"settingsChanged",value:function(){this.settings.global.metadataPath&&this.setMetadataUrl()}}]),e}(),wn=function(){function e(){Object(tt["a"])(this,e)}return Object(st["a"])(e,[{key:"init",value:function(e){this.global=e,this.requests=e.$requests,this.settings=e.$settings,this.useProperTheme(),this.setMetadataUrl("/data/"),this.setMetadataClient(),this.loadRequestFromUri(),this.isTakingScreenshot=Object.keys(mn()(window.location.href).query(!0)).includes("screenshot")}},{key:"loadRequest",value:function(e){this.requests.clear(),this.requests.loadId(e)}},{key:"useProperTheme",value:function(){window.matchMedia("(prefers-color-scheme: dark)").matches&&(this.settings.defaultAppearance="dark")}},{key:"setMetadataUrl",value:function(e){this.requests.setRemote(mn()(e).path("").toString(),{path:mn()(e).path()+"/"})}},{key:"setMetadataClient",value:function(){var e=this;this.requests.setClient((function(t,s,i,n){var r=new FormData;return Object.entries(i).forEach((function(e){var t=Object(a["a"])(e,2),s=t[0],i=t[1];return r.append(s,i)})),e.fetch(t,s,i,n).then((function(e){var t=e.response,s=e.data;if(403==t.status)throw{error:"requires-authentication",message:s.message,requires:s.requires};if(200!=t.status)throw{error:"error-response",message:"Server returned an error response."};if(!(s instanceof Object)||!Object.keys(s).length)throw{error:"empty-response",message:"Server returned an empty metadata."};return s}))}))}},{key:"fetch",value:function(e){function t(t,s){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e,t){var s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=new FormData;return Object.entries(s).forEach((function(e){var t=Object(a["a"])(e,2),s=t[0],i=t[1];return n.append(s,i)})),fetch(t,{method:e,body:Object.keys(s).length?n:null,headers:i}).then((function(e){return e.json().then((function(t){return{response:e,data:t}}))})).catch((function(e){throw{error:"empty-response",message:"Shared request was not found."}}))}))},{key:"setCookie",value:function(e,t,s){return document.cookie="".concat(e,"=").concat(t,";path=/;max-age=").concat(s),Promise.resolve()}},{key:"getCookie",value:function(e){var t=document.cookie.match(new RegExp("(?:^| )".concat(e,"=([^;]*)")));return Promise.resolve(t?t.groups[0]:void 0)}},{key:"loadRequestFromUri",value:function(){var e=mn()(window.location.href).path().split("/").slice(-1)[0];this.requests.loadId("".concat(e,".json"),!1)}},{key:"hasFeature",value:function(e){var t=["load-client-metrics","profiler","requests-list","sharing","whats-new"];return t=this.isTakingScreenshot?[].concat(Object(ts["a"])(t),["request-sidebar","tab-bar"]):[].concat(Object(ts["a"])(t),["details-request"]),!t.includes(e)}},{key:"settingsChanged",value:function(){}}]),e}(),_n=function(){function e(t){Object(tt["a"])(this,e),this.requests=t,this.username=this.password="",this.shown=!1,this.failed=!1,this.requires=[]}return Object(st["a"])(e,[{key:"attempt",value:function(){var e=this,t={username:this.username,password:this.password};return this.username=this.password="",this.failed=!1,this.requests.client("POST","".concat(this.requests.remoteUrl,"auth"),t).then((function(t){e.shown=!1,e.requests.setAuthenticationToken(t.token),e.requests.items.forEach((function(t){if(t.error&&"requires-authentication"==t.error.error)return e.requests.loadId(t.id)})),e.accept()})).catch((function(t){e.failed=!0}))}},{key:"request",value:function(e,t){var s=this;return this.shown=!0,this.requires=t,this.message=e,new Promise((function(e,t){s.accept=e,s.reject=t}))}}]),e}(),yn=function(){function e(t){Object(tt["a"])(this,e),this.platform=t,this.shown=!1,this.loaded=!1,this.version="5.1.0",this.credits={app:{contributors:[],dependencies:[],sponsors:[]},php:{contributors:[],dependencies:[],sponsors:[]}},this.authors=[{name:"its",avatarUrl:"https://avatars.githubusercontent.com/u/821582?v=3",twitterUrl:"https://twitter.com/itsgoingd",githubUrl:"https://github.com/itsgoingd",sponsorUrl:"https://github.com/sponsors/itsgoingd"}]}return Object(st["a"])(e,[{key:"toggle",value:function(){this.shown=!this.shown,this.load()}},{key:"load",value:function(){var e=this;if(!this.loaded){var t=["app","php"],s=["contributors","dependencies","sponsors"],a=[];t.forEach((function(t){s.forEach((function(s){a.push(e.platform.fetch("GET","".concat("https://meta.underground.works","/clockwork-").concat(t,"/").concat(s,".json")).then((function(a){var i=a.data;return e.credits[t][s]=i})))}))})),Promise.all(a).then((function(){return e.loaded=!0}))}}}]),e}(),Cn=function(){function e(t){Object(tt["a"])(this,e),this.settings=t}return Object(st["a"])(e,[{key:"register",value:function(){yt["a"].filter("editorLink",this.filter())}},{key:"filter",value:function(){var e=this;return function(t,s){var a={atom:function(e,t){return"atom://open?url=file://".concat(e,"&line=").concat(t)},phpstorm:function(e,t){return"phpstorm://open?file=".concat(e,"&line=").concat(t)},sublime:function(e,t){return"subl://open?url=file://".concat(e,"&line=").concat(t)},textmate:function(e,t){return"txmt://open?url=file://".concat(e,"&line=").concat(t)},"vs-code":function(e,t){return"vscode://file/".concat(e,":").concat(t)}},i=e.settings.global.editor;if(i&&a[i])return t&&e.settings.site.localPathMap.real&&(t=t.replace(e.settings.site.localPathMap.real,e.settings.site.localPathMap.local)),a[i](t,s)}}}]),e}(),qn=function(){function e(){Object(tt["a"])(this,e),this.backend=null,this.isLocalStorageAvailable()?this.backend="local-storage":this.isBrowserStorageAvailable()&&(this.backend="browser-storage"),this.persistent=!!this.backend,this.data=null,this.load()}return Object(st["a"])(e,[{key:"get",value:function(){var e=Object(te["a"])(regeneratorRuntime.mark((function e(t,s){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,this.load();case 2:if(void 0!=this.data[t]){e.next=5;break}return e.next=5,this.set(t,s);case 5:return e.abrupt("return",this.data[t]);case 6:case"end":return e.stop()}}),e,this)})));function t(t,s){return e.apply(this,arguments)}return t}()},{key:"set",value:function(){var e=Object(te["a"])(regeneratorRuntime.mark((function e(t,s){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,this.load();case 2:this.data[t]=s,this.save();case 4:case"end":return e.stop()}}),e,this)})));function t(t,s){return e.apply(this,arguments)}return t}()},{key:"load",value:function(){var e=this;return this.data?Promise.resolve():new Promise((function(t){"local-storage"==e.backend?e.loaded(t,localStorage.getItem("clockwork")):"browser-storage"==e.backend?(window.browser||window.chrome).storage.local.get(["clockwork"],(function(s){e.loaded(t,s.clockwork)})):e.loaded(t)}))}},{key:"loaded",value:function(e,t){try{this.data=JSON.parse(t)}catch(s){}this.data=this.data instanceof Object?this.data:{},e()}},{key:"save",value:function(){if("local-storage"==this.backend)try{localStorage.setItem("clockwork",JSON.stringify(this.data))}catch(e){}else"browser-storage"==this.backend&&(window.browser||window.chrome).storage.local.set({clockwork:JSON.stringify(this.data)})}},{key:"isLocalStorageAvailable",value:function(){try{localStorage}catch(e){return!1}return!0}},{key:"isBrowserStorageAvailable",value:function(){return window.browser&&browser.storage||window.chrome&&chrome.storage}}]),e}(),$n=function(){function e(t,s){Object(tt["a"])(this,e),this.platform=t,this.settings=s,this.enabled=!1,this.cookieLifetime=60}return Object(st["a"])(e,[{key:"enableProfiling",value:function(){var e=this;this.enabled=!0,this.platform.setCookie("clockwork-profile",this.settings.site.onDemandSecret,this.cookieLifetime),clearTimeout(this.timeout),this.timeout=setTimeout((function(){e.enabled&&e.enableProfiling()}),1e3*this.cookieLifetime)}},{key:"disableProfiling",value:function(){this.enabled=!1,clearTimeout(this.timeout)}}]),e}(),kn=(s("2ca0"),s("cb29"),function(){function e(t,s){Object(tt["a"])(this,e),this.metadata=t,this.functions=s}return Object(st["a"])(e,null,[{key:"parse",value:function(t){return new Promise((function(s,a){s(e.parseSync(t))}))}},{key:"parseSync",value:function(t){var s=this,i={},n=[],r={},o={};t=t.split("\n");var l,c,u,d,h=0;while(void 0!==(l=t[h++]))l.startsWith("fl=")?function(){var e=s.resolveCompressedName(l.match(/fl=(.+)/)[0],r),i=Object(a["a"])(e,2),c=(i[0],i[1]);l=t[h++];var d=s.resolveCompressedName(l.match(/fn=(.+)/)[0],o),v=Object(a["a"])(d,2),f=v[0],m=v[1];l=t[h++];var p=l.split(" ").map((function(e){return parseFloat(e)})),g=p.shift();u=n[f],u||(n[f]=u={name:m,file:c,line:g,invocations:0,self:new Array(p.length).fill(0),inclusive:new Array(p.length).fill(0),callers:[],subCalls:[]}),u.invocations++,u.self=u.self.map((function(e,t){return e+p[t]})),u.inclusive=u.inclusive.map((function(e,t){return e+p[t]}))}():l.startsWith("cfn=")?function(){var e=s.resolveCompressedName(l.match(/cfn=(.+)/)[0],o),i=Object(a["a"])(e,2),r=i[0],c=i[1];l=t[h++],l=t[h++];var v=l.split(" ").map((function(e){return parseFloat(e)})),f=v.shift(),m=n[r];u.inclusive=v.map((function(e,t){return e+(u.inclusive[t]||0)}));var p=m.callers[d];p||(m.callers[d]=p={name:u.name,line:f,calls:0,summed:new Array(v.length).fill(0)}),p.calls++,p.summed=p.summed.map((function(e,t){return e+v[t]}));var g=u.subCalls[r];g||(u.subCalls[r]=g={name:c,line:f,calls:0,summed:new Array(v.length).fill(0)}),g.calls++,g.summed=g.summed.map((function(e,t){return e+v[t]}))}():(c=l.match(/^(.+?): (.+)/))&&(i[c[1]]=c[2]);return new e(i,n.slice(1))}},{key:"resolveCompressedName",value:function(e,t){var s=e.match(/\((\d+)\)(?: (.*))?/),i=Object(a["a"])(s,3),n=(i[0],i[1]),r=i[2];return r&&(t[n]=r),[n,t[n]]}}]),e}()),xn=function(){function e(t,s){var a=this;Object(tt["a"])(this,e),this.requests=t,this.platform=s,this.available=!1,this.loading=!1,this.parsing=!1,this.ready=!1,this.isProfiling=!1,this.metric=0,this.percentual=!1,this.shownFraction=.9,this.request=void 0,this.functions=[],this.platform.getCookie("XDEBUG_PROFILE").then((function(e){return a.isProfiling=e}))}return Object(st["a"])(e,[{key:"enableProfiling",value:function(){var e=this;return this.platform.setCookie("XDEBUG_PROFILE","1",2592e3).then((function(){e.isProfiling=!0}))}},{key:"disableProfiling",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],s=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t&&this.clear(),this.platform.setCookie("XDEBUG_PROFILE","0",0).then((function(){s||(e.isProfiling=!1)}))}},{key:"withoutProfiling",value:function(e){if(!this.isProfiling)return e();this.disableProfiling(!1,!0);var t=e();return this.enableProfiling(),t}},{key:"loadRequest",value:function(e){var t=this;if(!this.request||this.request.id!=e.id){if(!e.xdebug||!e.xdebug.profile)return this.clear();if(this.request=e,this.available=this.loading=this.parsing=this.ready=!1,this.summary=this.metadata=this.functions=[],this.available=!0,e.xdebug.profileData)return this.parseProfile();this.loading=!0,this.requests.loadExtended(e.id,["xdebug"]).then((function(e){t.loading=!1,t.parseProfile()}))}}},{key:"parseProfile",value:function(){var e=this;if(!this.request.xdebug.profileData)return this.available=!1;this.ready=!1,this.parsing=!0,kn.parse(this.request.xdebug.profileData).then((function(t){if(!t.metadata.summary)return e.parsing=e.available=!1;e.metadata=t.metadata,e.summary=e.metadata.summary.split(" ");var s=e.metadata.events.includes("Time_(10ns)");e.functionsAll=t.functions.filter((function(e){return"{main}"!=e.name})).map((function(e){return e.selfAll=e.self,e.inclusiveAll=e.inclusive,e.fullPath="php:internal"==e.file?"internal":"".concat(e.file,":").concat(e.line),e.shortPath="internal"!=e.fullPath?e.fullPath.split(/[\/\\]/).pop():e.fullPath,s&&(e.selfAll[0]=e.selfAll[0]/100,e.inclusiveAll[0]=e.inclusiveAll[0]/100),e})),e.presentProfile(),e.parsing=!1,e.ready=!0}))}},{key:"presentProfile",value:function(){var e=this,t=this.shownFraction*this.summary[this.metric];this.functions=this.functionsAll.filter((function(s){return t-=s.selfAll[e.metric],t>0})).map((function(t){return t.self=e.percentual?t.selfAll[e.metric]/e.summary[e.metric]*100:t.selfAll[e.metric],t.inclusive=e.percentual?t.inclusiveAll[e.metric]/e.summary[e.metric]*100:t.inclusiveAll[e.metric],t}))}},{key:"clear",value:function(){this.available=this.loading=this.parsing=this.ready=!1,this.summary=this.metadata=this.functions=[],this.request=void 0}},{key:"showMetric",value:function(e){this.metric=e,this.presentProfile()}},{key:"showPercentual",value:function(e){this.percentual=!0===e||void 0===e,this.presentProfile()}},{key:"setShownFraction",value:function(e){this.shownFraction=e,this.presentProfile()}},{key:"formatMetric",value:function(e){return this.percentual?Math.round(e)+" %":1==this.metric?Math.round(e/1024)+" kB":Math.round(e/100)/10+" ms"}}]),e}(),Tn=function(){function e(){Object(tt["a"])(this,e),this.settings=null,this.items=[],this.query={},this.exclusive={}}return Object(st["a"])(e,[{key:"all",value:function(){return this.items}},{key:"findId",value:function(e){return this.items.find((function(t){return t.id==e}))}},{key:"loadId",value:function(e,t,s){var a=this,i=this.findId(e);return i?s=i:!1!==s&&(s=s||pn.placeholder(e),this.items.push(s)),s&&!t&&(s.loading=!0),this.withQuery(t?{only:t.join(",")}:{},(function(){return a.load(e,(function(e){return e.then((function(e){return s?s.resolve(e[0],t):a.items.push(e[0]),t||a.sort(),s||e[0]})).catch((function(e){s&&s.resolveWithError(e)}))}))}))}},{key:"loadExtended",value:function(e,t){var s=this,a=this.findId(e);return this.withQuery(t?{only:t.join(",")}:{},(function(){return s.load("".concat(e,"/extended"),(function(e){return e.then((function(e){return a.resolve(e[0],t)})).catch((function(e){}))}))}))}},{key:"loadLatest",value:function(){var e=this,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this.load("latest",(function(s){return s.then((function(s){return t&&e.merge(s),s[0]}))}),t)}},{key:"returnLatest",value:function(){return this.loadLatest(!1)}},{key:"loadNext",value:function(e,t){var s,a=this,i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return t=t||(null===(s=this.last((function(e){return!e.loading})))||void 0===s?void 0:s.id),t?this.load("".concat(t,"/next")+(e?"/".concat(e):""),(function(e){return e.then((function(e){return i&&a.merge(e),e})).catch((function(e){}))}),i):Promise.resolve([])}},{key:"returnNext",value:function(e,t){return this.loadNext(e,t,!1)}},{key:"loadPrevious",value:function(e,t){var s=this,a=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return t||this.items.length?(t=t||this.first((function(e){return!e.loading})).id,this.load("".concat(t,"/previous")+(e?"/".concat(e):""),(function(e){return e.then((function(e){return a&&s.merge(e),e})).catch((function(e){}))}),a)):Promise.resolve([])}},{key:"returnPrevious",value:function(e,t){return this.loadPrevious(e,t,!1)}},{key:"clear",value:function(){this.items.splice(0)}},{key:"merge",value:function(e){var t=this;e=e.filter((function(e){return!t.findId(e.id)})),e.length&&(this.items=this.items.concat(e),this.sort())}},{key:"sort",value:function(){this.items=this.items.sort((function(e,t){return e.time-t.time}))}},{key:"first",value:function(e){return e?this.items.find(e):this.items[0]}},{key:"last",value:function(e){return e?this.items.slice().reverse().find(e):this.items[this.items.length-1]}},{key:"setClient",value:function(e){this.client=e}},{key:"setItems",value:function(e){this.items=e}},{key:"setRemote",value:function(e,t){t=t||{},t.path=t.path||"/__clockwork/",e=new mn.a(e);var s=t.path.split("?"),i=Object(a["a"])(s,2),n=i[0],r=i[1];e.pathname(n||""),e.query(r||""),e.hash(""),this.remoteUrl=e.toString(),this.remoteHeaders=t.headers||{}}},{key:"setAuthenticationToken",value:function(e){this.settings.site.authToken=e,this.settings.save()}},{key:"setQuery",value:function(e){this.query=e}},{key:"withQuery",value:function(e,t){var s=this.query;this.query=e;var a=t();return this.query=s,a}},{key:"load",value:function(e,t){var s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(s)return this.loadExclusive(e,t);var a=mn()("".concat(this.remoteUrl).concat(e)).addQuery(this.query).toString(),i=Object.assign({},this.remoteHeaders,{"X-Clockwork-Auth":this.settings.site.authToken});return t(this.client("GET",a,{},i).then((function(e){return e?(e instanceof Array?e:[e]).map((function(e){return new pn(e)})):[]})))}},{key:"loadExclusive",value:function(e,t){var s=this;return this.exclusive[e]?this.exclusive[e]:this.exclusive[e]=this.load(e,t).finally((function(){return s.exclusive[e]=null}))}}]),e}(),Sn=s("5530"),jn=(s("841c"),function(){function e(t){var s=this;Object(tt["a"])(this,e),this.requests=t,this.tags=[{tag:"controller"},{tag:"method",validate:function(e){return["get","post","put","patch","delete","head"].includes(e)}},{tag:"status",validate:function(e){return e>=100&&e<600}},{tag:"time"},{tag:"received",validate:function(e){return new Date(e)}},{tag:"type",validate:function(e){return["command","queue-job","request"].includes(e)}}],this.shown=!1,this.input="",this.searchDebounced=Ie()((function(){return s.search()}),500)}return Object(st["a"])(e,[{key:"toggle",value:function(){this.shown=!this.shown,this.shown?yt["a"].nextTick((function(){return document.querySelector(".requests-search input").focus()})):(this.input="",this.search())}},{key:"search",value:function(){var e=this,t=this.tokenize(this.input),s=t.terms,i=t.tags;i=Object.entries(i).filter((function(t){var s=Object(a["a"])(t,2),i=s[0],n=s[1];return i=e.tags.find((function(e){return e.tag==i})),i&&(!i.validate||n.every((function(e){return i.validate(e)})))})).reduce((function(e,t){var s=Object(a["a"])(t,2),i=s[0],n=s[1];return e["".concat(i,"[]")]=n,e}),{}),this.requests.setQuery(s.length||Object.keys(i).length?Object(Sn["a"])({"uri[]":s,"name[]":s},i):{}),this.requests.returnLatest().then((function(t){e.requests.returnPrevious(9,t.id).then((function(s){e.requests.setItems(s?[].concat(Object(ts["a"])(s),[t]):[t])}))})).catch((function(){e.requests.clear()}))}},{key:"tokenize",value:function(e){var t,s=[],a={},i=/(\w+:)?("[^"]*"|[^\s]+)/g;while(t=i.exec(e)){var n=t[1]?t[1].substr(0,t[1].length-1):void 0,r=t[2];(t=r.match(/^"(.+?)"$/))&&(r=t[1]),n?(a[n]||(a[n]=[]),a[n].push(r)):s.push(r)}return{terms:s,tags:a}}}]),e}()),On=s("5c9a"),Pn=s.n(On),Dn=function(){function e(t,s,a){Object(tt["a"])(this,e),this.store=t,this.requests=s,this.platform=a,this.requests.settings=this,this.shown=!1,this.loaded=!1,this.settings=this.defaults(),this.defaultAppearance="light",this.load()}return Object(st["a"])(e,[{key:"global",get:function(){return this.settings.global}},{key:"site",get:function(){return this.settings.site[this.requests.remoteUrl]||(this.settings.site[this.requests.remoteUrl]=oa()(!0,{},this.defaults().site)),this.settings.site[this.requests.remoteUrl]}},{key:"persistent",get:function(){return this.store.persistent}},{key:"appearance",get:function(){return"auto"!=this.global.appearance?this.global.appearance:this.defaultAppearance}},{key:"toggle",value:function(){this.shown=!this.shown}},{key:"save",value:function(){this.store.set("settings",this.settings),this.platform.settingsChanged()}},{key:"load",value:function(){var e=Object(te["a"])(regeneratorRuntime.mark((function e(){var t,s;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return t=this.defaults(),e.next=3,this.store.get("settings",{});case 3:s=e.sent,this.settings={global:oa()(!0,t.global,s.global||{}),site:Pn()(s.site||{},(function(e){return oa()(!0,{},t.site,e||{})}))},this.loaded=!0,this.platform.settingsChanged();case 7:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"defaults",value:function(){return{global:{appearance:"auto",databasePrettified:!1,editor:null,showIncomingRequests:!0,hideCommandTypeRequests:this.platform instanceof gn,hideQueueJobTypeRequests:this.platform instanceof gn,hideTestTypeRequests:this.platform instanceof gn,ignoredUpdateNotifications:{},metadataPath:null,performanceVitalsInfoShown:!0,preserveLog:!0,requestsListCollapsed:!1,requestSidebarCollapsed:!1,requestSidebarCollapsedSections:{headers:!1,data:!1,getData:!1,postData:!1,cookies:!1,middleware:!1,session:!1,arguments:!1,options:!1,payload:!1,queue:!1,connection:!1,asserts:!1},seenReleaseNotesVersion:null,shareTermsAccepted:!1,timelineCondensed:{performance:!0,views:!1},timelineHiddenTags:{}},site:{localPathMap:{real:null,local:null},onDemandSecret:null}}}}]),e}(),Rn=function(){function e(t,s){Object(tt["a"])(this,e),this.$platform=t,this.$settings=s,this.shown=!1,this.shownDelete=!1,this.inProgress=!1}return Object(st["a"])(e,[{key:"termsAccepted",get:function(){return this.$settings.global.shareTermsAccepted}},{key:"acceptTerms",value:function(){this.$settings.global.shareTermsAccepted=!0,this.$settings.save()}},{key:"toggle",value:function(){this.shown=!this.shown}},{key:"toggleDelete",value:function(){this.shownDelete=!this.shownDelete}},{key:"clear",value:function(e){e.shareId=e.shareUrl=e.shareImageUrl=null}},{key:"share",value:function(e,t){var s=this;return e.shareUrl?Promise.resolve():(this.inProgress=!0,this.$platform.fetch("POST","https://clockwork.underground.works/ingest",{data:this.resolveSharedData(e,t)}).then((function(t){var a=t.response,i=t.data;return s.inProgress=!1,500==a.status?{error:"server-error"}:(e.shareId=i.shareId,e.shareUrl=i.shareUrl,e.shareImageUrl=i.shareImageUrl,i)})).catch((function(){return s.inProgress=!1,{error:"server-error"}})))}},{key:"resolveSharedData",value:function(e,t){var s=an()(e.original);return t.log||(s.log=[]),t.events||(s.events=[]),t.models||(s.modelsActions=[],s.modelsRetrieved=s.modelsCreated=s.modelsUpdated=s.modelsDeleted=void 0),t.database||(s.databaseQueries=[],s.databaseQueriesCount=s.databaseSlowQueries=s.databaseSelects=s.databaseInserts=s.databaseUpdates=s.databaseDeletes=s.databaseOthers=void 0),t.cache||(s.cacheQueries=[],s.cacheReads=s.cacheHits=s.cacheWrites=s.cacheDeletes=void 0),t.redis||(s.redisCommands=[]),t.queue||(s.queueJobs=[]),t.views||(s.viewsData=[]),t.notifications||(s.notifications=s.emailsData=[]),t.routes||(s.routes=[]),t.output||(s.commandOutput=void 0),t.userData||(s.userData=[]),JSON.stringify(s)}},{key:"deleteShared",value:function(){mn()(window.location.href).path().split("/").slice(-1)[0];return this.$platform.fetch("POST",window.location,{_method:"delete"})}}]),e}(),En=(s("b680"),function(){function e(){Object(tt["a"])(this,e)}return Object(st["a"])(e,[{key:"register",value:function(){yt["a"].filter("date",this.date),yt["a"].filter("join",this.join),yt["a"].filter("round",this.round),yt["a"].filter("shortClass",this.shortClass),yt["a"].filter("title",this.title)}},{key:"date",value:function(e,t){return Object(bt["a"])(new Date(e),t)}},{key:"join",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:", ";return e instanceof Array?e.join(t):e}},{key:"round",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return parseFloat(parseFloat(e).toFixed(t))}},{key:"shortClass",value:function(e){return e?e.split("\\").pop():""}},{key:"title",value:function(e){return"string"!=typeof e?e:e.replace(/(\w)([A-Z])/,"$1 $2").split(" ").map((function(e){return e[0].toUpperCase()+e.substr(1).toLowerCase()})).join(" ")}}]),e}()),Nn=function(){function e(t){Object(tt["a"])(this,e),this.settings=t,this.serverVersion=null}return Object(st["a"])(e,[{key:"ignoredUpdates",get:function(){return this.settings.global.ignoredUpdateNotifications||{}}},{key:"latest",value:function(){return{version:"4.1.2",url:"https://underground.works/blog/clockwork-4.1-released-with-commands-queue-jobs-tests-profiling-and-more"}}},{key:"show",value:function(e){if(!this.ignoresUpdate(e)&&this.serverVersion)return 1==this.versionCompare(this.latest().version,this.serverVersion)?{version:this.latest().version,url:this.latest().url,currentVersion:this.serverVersion}:void 0}},{key:"ignoresUpdate",value:function(e){var t=this.ignoredUpdates[e];return t&&this.versionCompare(t,this.latest().version)>=0}},{key:"ignoreUpdate",value:function(e){var t=this.ignoredUpdates;t[e]=this.latest().version,this.store.set("update-notification.ignored-updates",t)}},{key:"versionCompare",value:function(e,t){e=e.split(".").map((function(e){return parseInt(e)})),t=t.split(".").map((function(e){return parseInt(e)}));for(var s=0;st[s])return 1;if(!e[s]&&t[s]||e[s]1))break;n.splice(0,1)}a[s]=n.join("")}var l=-1,u=0,f=0,d=-1,p=!1;for(s=0;su&&(l=d,u=f)):"0"===a[s]&&(p=!0,d=s,f=1);f>u&&(l=d,u=f),u>1&&a.splice(l,u,""),i=a.length;var h="";for(""===a[0]&&(h=":"),s=0;s1?p(t):t.charCodeAt(0)).toString(16).toUpperCase()+";"}function m(t,e){return function(n){return n.replace(e,(function(e){return t[e]})).replace(d,h)}}var v=new RegExp(o.source+"|"+d.source,"g");function g(t){return t.replace(v,h)}function b(t){return t.replace(o,h)}function y(t){return function(e){return e.replace(v,(function(e){return t[e]||h(e)}))}}e.escape=g,e.escapeUTF8=b},"057f":function(t,e,n){var r=n("fc6a"),a=n("241c").f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};t.exports.f=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},"06c5":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));n("fb6a"),n("d3b7"),n("b0c0"),n("a630"),n("3ca3");var r=n("6b75");function a(t,e){if(t){if("string"===typeof t)return Object(r["a"])(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Object(r["a"])(t,e):void 0}}},"06cf":function(t,e,n){var r=n("83ab"),a=n("d1e7"),i=n("5c6c"),o=n("fc6a"),s=n("c04e"),c=n("5135"),l=n("0cfb"),u=Object.getOwnPropertyDescriptor;e.f=r?u:function(t,e){if(t=o(t),e=s(e,!0),l)try{return u(t,e)}catch(n){}if(c(t,e))return i(!a.f.call(t,e),t[e])}},"07ac":function(t,e,n){var r=n("23e7"),a=n("6f53").values;r({target:"Object",stat:!0},{values:function(t){return a(t)}})},"0b07":function(t,e,n){var r=n("34ac"),a=n("3698");function i(t,e){var n=a(t,e);return r(n)?n:void 0}t.exports=i},"0cb2":function(t,e,n){var r=n("7b0b"),a=Math.floor,i="".replace,o=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,s=/\$([$&'`]|\d{1,2})/g;t.exports=function(t,e,n,c,l,u){var f=n+t.length,d=c.length,p=s;return void 0!==l&&(l=r(l),p=o),i.call(u,p,(function(r,i){var o;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(f);case"<":o=l[i.slice(1,-1)];break;default:var s=+i;if(0===s)return r;if(s>d){var u=a(s/10);return 0===u?r:u<=d?void 0===c[u-1]?i.charAt(1):c[u-1]+i.charAt(1):r}o=c[s-1]}return void 0===o?"":o}))}},"0cfb":function(t,e,n){var r=n("83ab"),a=n("d039"),i=n("cc12");t.exports=!r&&!a((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"0fa7":function(t,e,n){"use strict";e.__esModule=!0;var r=n("bcb5"),a=p(r),i=n("f02d"),o=p(i),s=n("9f3d"),c=p(s),l=n("a733"),u=p(l),f=n("a096"),d=p(f);function p(t){return t&&t.__esModule?t:{default:t}}var h={HTML5NamedCharRefs:a.default,EntityParser:o.default,EventedTokenizer:c.default,Tokenizer:u.default,tokenize:d.default};e.default=h},"107c":function(t,e,n){var r=n("d039");t.exports=r((function(){var t=RegExp("(?b)","string".charAt(5));return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")}))},1148:function(t,e,n){"use strict";var r=n("a691"),a=n("1d80");t.exports=function(t){var e=String(a(this)),n="",i=r(t);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},1160:function(t,e){function n(t){if("function"==typeof t)return t;var e=Array.isArray(t)?[]:{};for(var a in t){var i=t[a],o={}.toString.call(i).slice(8,-1);e[a]="Array"==o||"Object"==o?n(i):"Date"==o?new Date(i.getTime()):"RegExp"==o?RegExp(i.source,r(i)):i}return e}function r(t){if("string"==typeof t.source.flags)return t.source.flags;var e=[];return t.global&&e.push("g"),t.ignoreCase&&e.push("i"),t.multiline&&e.push("m"),t.sticky&&e.push("y"),t.unicode&&e.push("u"),e.join("")}t.exports=n},1212:function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n("fd3a"),a=n("8c86");function i(t,e){Object(a["a"])(2,arguments);var n=Object(r["a"])(t),i=Object(r["a"])(e);return n.getTime()>i.getTime()}},1276:function(t,e,n){"use strict";var r=n("d784"),a=n("44e7"),i=n("825a"),o=n("1d80"),s=n("4840"),c=n("8aa5"),l=n("50c4"),u=n("14c3"),f=n("9263"),d=n("9f7f"),p=n("d039"),h=d.UNSUPPORTED_Y,m=[].push,v=Math.min,g=4294967295,b=!p((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));r("split",(function(t,e,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var r=String(o(this)),i=void 0===n?g:n>>>0;if(0===i)return[];if(void 0===t)return[r];if(!a(t))return e.call(r,t,i);var s,c,l,u=[],d=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),p=0,h=new RegExp(t.source,d+"g");while(s=f.call(h,r)){if(c=h.lastIndex,c>p&&(u.push(r.slice(p,s.index)),s.length>1&&s.index=i))break;h.lastIndex===s.index&&h.lastIndex++}return p===r.length?!l&&h.test("")||u.push(""):u.push(r.slice(p)),u.length>i?u.slice(0,i):u}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var a=o(this),i=void 0==e?void 0:e[t];return void 0!==i?i.call(e,a,n):r.call(String(a),e,n)},function(t,a){var o=n(r,this,t,a,r!==e);if(o.done)return o.value;var f=i(this),d=String(t),p=s(f,RegExp),m=f.unicode,b=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(h?"g":"y"),y=new p(h?"^(?:"+f.source+")":f,b),E=void 0===a?g:a>>>0;if(0===E)return[];if(0===d.length)return null===u(y,d)?[d]:[];var w=0,k=0,T=[];while(k|>>|<<|==|<=|>=|!<|!>|\|\|\/|\|\/|\|\||~~\*|~~|!~~\*|!~~|~\*|!~\*|!~|:=|&&|@>|<@|#-|@|.)/u,this.NO_SPACE_OPERATOR_REGEX=/^(::|->>|->|#>>|#>)/u,this.BLOCK_COMMENT_REGEX=/^(\/\*[^]*?(?:\*\/|$))/u,this.LINE_COMMENT_REGEX=this.createLineCommentRegex(t.lineCommentTypes),this.RESERVED_TOP_LEVEL_REGEX=this.createReservedWordRegex(t.reservedTopLevelWords),this.RESERVED_TOP_LEVEL_NO_INDENT_REGEX=this.createReservedWordRegex(t.reservedTopLevelWordsNoIndent),this.RESERVED_NEWLINE_REGEX=this.createReservedWordRegex(t.reservedNewlineWords),this.RESERVED_PLAIN_REGEX=this.createReservedWordRegex(t.reservedWords),this.WORD_REGEX=this.createWordRegex(t.specialWordChars),this.STRING_REGEX=this.createStringRegex(t.stringTypes),this.OPEN_PAREN_REGEX=this.createParenRegex(t.openParens),this.CLOSE_PAREN_REGEX=this.createParenRegex(t.closeParens),this.INDEXED_PLACEHOLDER_REGEX=this.createPlaceholderRegex(t.indexedPlaceholderTypes,"[0-9]*"),this.IDENT_NAMED_PLACEHOLDER_REGEX=this.createPlaceholderRegex(t.namedPlaceholderTypes,"[a-zA-Z0-9._$]+"),this.STRING_NAMED_PLACEHOLDER_REGEX=this.createPlaceholderRegex(t.namedPlaceholderTypes,this.createStringPattern(t.stringTypes))}return t.prototype.createLineCommentRegex=function(t){return new RegExp("^((?:"+t.map((function(t){return a["default"](t)})).join("|")+")[^>]*?(?:\r\n|\r|\n|$))","u")},t.prototype.createReservedWordRegex=function(t){var e=t.join("|").replace(/ /gu,"\\s+");return new RegExp("^("+e+")\\b","iu")},t.prototype.createWordRegex=function(t){return new RegExp("^([\\p{Alphabetic}\\p{Mark}\\p{Decimal_Number}\\p{Connector_Punctuation}\\p{Join_Control}"+t.join("")+"]+)","u")},t.prototype.createStringRegex=function(t){return new RegExp("^("+this.createStringPattern(t)+")","u")},t.prototype.createStringPattern=function(t){var e={"``":"((`[^`]*($|`))+)","[]":"((\\[[^\\]]*($|\\]))(\\][^\\]]*($|\\]))*)",'""':'(("[^"\\\\]*(?:\\\\.[^"\\\\]*)*("|$))+)',"''":"(('[^'\\\\]*(?:\\\\.[^'\\\\]*)*('|$))+)","N''":"((N'[^N'\\\\]*(?:\\\\.[^N'\\\\]*)*('|$))+)"};return t.map((function(t){return e[t]})).join("|")},t.prototype.createParenRegex=function(t){var e=this;return new RegExp("^("+t.map((function(t){return e.escapeParen(t)})).join("|")+")","iu")},t.prototype.escapeParen=function(t){return 1===t.length?a["default"](t):"\\b"+t+"\\b"},t.prototype.createPlaceholderRegex=function(t,e){if(!t||0===t.length)return null;var n=t.map(a["default"]).join("|");return new RegExp("^((?:"+n+")(?:"+e+"))","u")},t.prototype.tokenize=function(t){if(!t)return[];var e,n=[];while(t.length)e=this.getNextToken(t,e),t=t.substring(e.value.length),n.push(e);return n},t.prototype.getNextToken=function(t,e){return this.getWhitespaceToken(t)||this.getCommentToken(t)||this.getStringToken(t)||this.getOpenParenToken(t)||this.getCloseParenToken(t)||this.getAmbiguosOperatorToken(t)||this.getNoSpaceOperatorToken(t)||this.getServerVariableToken(t)||this.getPlaceholderToken(t)||this.getNumberToken(t)||this.getReservedWordToken(t,e)||this.getWordToken(t)||this.getOperatorToken(t)},t.prototype.getWhitespaceToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.WHITESPACE,regex:this.WHITESPACE_REGEX})},t.prototype.getCommentToken=function(t){return this.getLineCommentToken(t)||this.getBlockCommentToken(t)},t.prototype.getLineCommentToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.LINE_COMMENT,regex:this.LINE_COMMENT_REGEX})},t.prototype.getBlockCommentToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.BLOCK_COMMENT,regex:this.BLOCK_COMMENT_REGEX})},t.prototype.getStringToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.STRING,regex:this.STRING_REGEX})},t.prototype.getOpenParenToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.OPEN_PAREN,regex:this.OPEN_PAREN_REGEX})},t.prototype.getCloseParenToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.CLOSE_PAREN,regex:this.CLOSE_PAREN_REGEX})},t.prototype.getPlaceholderToken=function(t){return this.getIdentNamedPlaceholderToken(t)||this.getStringNamedPlaceholderToken(t)||this.getIndexedPlaceholderToken(t)},t.prototype.getServerVariableToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.SERVERVARIABLE,regex:/(^@@\w+)/iu})},t.prototype.getIdentNamedPlaceholderToken=function(t){return this.getPlaceholderTokenWithKey({input:t,regex:this.IDENT_NAMED_PLACEHOLDER_REGEX,parseKey:function(t){return t.slice(1)}})},t.prototype.getStringNamedPlaceholderToken=function(t){var e=this;return this.getPlaceholderTokenWithKey({input:t,regex:this.STRING_NAMED_PLACEHOLDER_REGEX,parseKey:function(t){return e.getEscapedPlaceholderKey({key:t.slice(2,-1),quoteChar:t.slice(-1)})}})},t.prototype.getIndexedPlaceholderToken=function(t){return this.getPlaceholderTokenWithKey({input:t,regex:this.INDEXED_PLACEHOLDER_REGEX,parseKey:function(t){return t.slice(1)}})},t.prototype.getPlaceholderTokenWithKey=function(t){var e=t.input,n=t.regex,r=t.parseKey,a=this.getTokenOnFirstMatch({input:e,regex:n,type:i.TokenTypes.PLACEHOLDER});return a&&(a.key=r(a.value)),a},t.prototype.getEscapedPlaceholderKey=function(t){var e=t.key,n=t.quoteChar;return e.replace(new RegExp(a["default"]("\\"+n),"gu"),n)},t.prototype.getNumberToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.NUMBER,regex:this.NUMBER_REGEX})},t.prototype.getOperatorToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.OPERATOR,regex:this.OPERATOR_REGEX})},t.prototype.getAmbiguosOperatorToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.OPERATOR,regex:this.AMBIGUOS_OPERATOR_REGEX})},t.prototype.getNoSpaceOperatorToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.NO_SPACE_OPERATOR,regex:this.NO_SPACE_OPERATOR_REGEX})},t.prototype.getReservedWordToken=function(t,e){if(!e||!e.value||"."!==e.value)return this.getToplevelReservedToken(t)||this.getNewlineReservedToken(t)||this.getTopLevelReservedTokenNoIndent(t)||this.getPlainReservedToken(t)},t.prototype.getToplevelReservedToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.RESERVED_TOP_LEVEL,regex:this.RESERVED_TOP_LEVEL_REGEX})},t.prototype.getNewlineReservedToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.RESERVED_NEWLINE,regex:this.RESERVED_NEWLINE_REGEX})},t.prototype.getPlainReservedToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.RESERVED,regex:this.RESERVED_PLAIN_REGEX})},t.prototype.getTopLevelReservedTokenNoIndent=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.RESERVED_TOP_LEVEL_NO_INDENT,regex:this.RESERVED_TOP_LEVEL_NO_INDENT_REGEX})},t.prototype.getWordToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.TokenTypes.WORD,regex:this.WORD_REGEX})},t.prototype.getTokenOnFirstMatch=function(t){var e=t.input,n=t.type,r=t.regex,a=e.match(r);if(a)return{type:n,value:a[1]}},t}();e["default"]=o},1368:function(t,e,n){var r=n("da03"),a=function(){var t=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function i(t){return!!a&&a in t}t.exports=i},"13b3":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-menu",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M3 12h18M3 6h18M3 18h18"}})]))}}},"14c3":function(t,e,n){var r=n("c6b6"),a=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var i=n.call(t,e);if("object"!==typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return a.call(t,e)}},"159b":function(t,e,n){var r=n("da84"),a=n("fdbc"),i=n("17c2"),o=n("9112");for(var s in a){var c=r[s],l=c&&c.prototype;if(l&&l.forEach!==i)try{o(l,"forEach",i)}catch(u){l.forEach=i}}},"159f":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-alert-triangle",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0zM12 9v4M12 17h.01"}})]))}}},"15f4":function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},t(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0;var i=a(n("d2dc")),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.getTokenizerConfig=function(){return{reservedWords:s,reservedTopLevelWords:c,reservedNewlineWords:u,reservedTopLevelWordsNoIndent:l,stringTypes:['""',"N''","''","``","[]"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:["@",":","%","$"],lineCommentTypes:["#","--"],specialWordChars:[]}},e}(i["default"]);e["default"]=o;var s=["ACCESSIBLE","ACTION","AGAINST","AGGREGATE","ALGORITHM","ALL","ALTER","ANALYSE","ANALYZE","AS","ASC","AUTOCOMMIT","AUTO_INCREMENT","BACKUP","BEGIN","BETWEEN","BINLOG","BOTH","CASCADE","CASE","CHANGE","CHANGED","CHARACTER SET","CHARSET","CHECK","CHECKSUM","COLLATE","COLLATION","COLUMN","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPRESSED","CONCURRENT","CONSTRAINT","CONTAINS","CONVERT","COUNT","CREATE","CROSS","CURRENT_TIMESTAMP","DATABASE","DATABASES","DAY_HOUR","DAY_MINUTE","DAY_SECOND","DAY","DEFAULT","DEFINER","DELAYED","DELETE","DESC","DESCRIBE","DETERMINISTIC","DISTINCT","DISTINCTROW","DIV","DO","DROP","DUMPFILE","DUPLICATE","DYNAMIC","ELSE","ENCLOSED","END","ENGINE","ENGINES","ENGINE_TYPE","ESCAPE","ESCAPED","EVENTS","EXEC","EXECUTE","EXISTS","EXPLAIN","EXTENDED","FAST","FETCH","FIELDS","FILE","FIRST","FIXED","FLUSH","FOR","FORCE","FOREIGN","FULL","FULLTEXT","FUNCTION","GLOBAL","GRANTS","GROUP_CONCAT","HEAP","HIGH_PRIORITY","HOSTS","HOUR","HOUR_MINUTE","HOUR_SECOND","IDENTIFIED","IF","IFNULL","IGNORE","IN","INDEX","INDEXES","INFILE","INSERT","INSERT_ID","INSERT_METHOD","INTERVAL","INTO","INVOKER","IS","ISOLATION","KEY","KEYS","KILL","LAST_INSERT_ID","LEADING","LEVEL","LIKE","LINEAR","LINES","LOAD","LOCAL","LOCK","LOCKS","LOGS","LOW_PRIORITY","MARIA","MASTER","MASTER_CONNECT_RETRY","MASTER_HOST","MASTER_LOG_FILE","MATCH","MAX_CONNECTIONS_PER_HOUR","MAX_QUERIES_PER_HOUR","MAX_ROWS","MAX_UPDATES_PER_HOUR","MAX_USER_CONNECTIONS","MEDIUM","MERGE","MINUTE","MINUTE_SECOND","MIN_ROWS","MODE","MONTH","MRG_MYISAM","MYISAM","NAMES","NATURAL","NOT","NOW()","NULL","OFFSET","ON DELETE","ON UPDATE","ON","ONLY","OPEN","OPTIMIZE","OPTION","OPTIONALLY","OUTFILE","PACK_KEYS","PAGE","PARTIAL","PARTITION","PARTITIONS","PASSWORD","PRIMARY","PRIVILEGES","PROCEDURE","PROCESS","PROCESSLIST","PURGE","QUICK","RAID0","RAID_CHUNKS","RAID_CHUNKSIZE","RAID_TYPE","RANGE","READ","READ_ONLY","READ_WRITE","REFERENCES","REGEXP","RELOAD","RENAME","REPAIR","REPEATABLE","REPLACE","REPLICATION","RESET","RESTORE","RESTRICT","RETURN","RETURNS","REVOKE","RLIKE","ROLLBACK","ROW","ROWS","ROW_FORMAT","SECOND","SECURITY","SEPARATOR","SERIALIZABLE","SESSION","SHARE","SHOW","SHUTDOWN","SLAVE","SONAME","SOUNDS","SQL","SQL_AUTO_IS_NULL","SQL_BIG_RESULT","SQL_BIG_SELECTS","SQL_BIG_TABLES","SQL_BUFFER_RESULT","SQL_CACHE","SQL_CALC_FOUND_ROWS","SQL_LOG_BIN","SQL_LOG_OFF","SQL_LOG_UPDATE","SQL_LOW_PRIORITY_UPDATES","SQL_MAX_JOIN_SIZE","SQL_NO_CACHE","SQL_QUOTE_SHOW_CREATE","SQL_SAFE_UPDATES","SQL_SELECT_LIMIT","SQL_SLAVE_SKIP_COUNTER","SQL_SMALL_RESULT","SQL_WARNINGS","START","STARTING","STATUS","STOP","STORAGE","STRAIGHT_JOIN","STRING","STRIPED","SUPER","TABLE","TABLES","TEMPORARY","TERMINATED","THEN","TO","TRAILING","TRANSACTIONAL","TRIGGER","TRUE","TRUNCATE","TYPE","TYPES","UNCOMMITTED","UNIQUE","UNLOCK","UNSIGNED","USAGE","USE","USING","VARIABLES","VIEW","WHEN","WITH","WORK","WRITE","YEAR_MONTH"],c=["ADD","AFTER","ALTER COLUMN","ALTER TABLE","CREATE OR REPLACE","DECLARE","DELETE FROM","EXCEPT","FETCH FIRST","FROM","GO","GRANT","GROUP BY","HAVING","INSERT INTO","INSERT","LIMIT","MODIFY","ORDER BY","RETURNING","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UPDATE","VALUES","WHERE"],l=["INTERSECT ALL","INTERSECT","MINUS","UNION ALL","UNION"],u=["AND","CROSS APPLY","CROSS JOIN","ELSE","INNER JOIN","FULL JOIN","FULL OUTER JOIN","LEFT JOIN","LEFT OUTER JOIN","NATURAL JOIN","OR","OUTER APPLY","OUTER JOIN","RENAME","RIGHT JOIN","RIGHT OUTER JOIN","JOIN","WHEN","XOR"]},1652:function(t,e,n){"use strict";e.__esModule=!0,e.stateify=e.TokenState=e.CharacterState=void 0;var r=n("254c");function a(){return function(t){this.j=[],this.T=t||null}}var i=a();i.prototype={defaultTransition:!1,on:function(t,e){if(t instanceof Array){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}});function c(t,e,n,r){var a=0,i=t.length,s=e,c=[],l=void 0;while(a=i)return[];while(a1?arguments[1]:void 0)}},"183c":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-users",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"}}),n("circle",{attrs:{cx:"9",cy:"7",r:"4"}}),n("path",{attrs:{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75"}})]))}}},"18d8":function(t,e,n){var r=n("234d"),a=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,o=r((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(a,(function(t,n,r,a){e.push(r?a.replace(i,"$1"):n||t)})),e}));t.exports=o},1901:function(t,e,n){t.exports=n("7613").default},"19aa":function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},"1a78":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-share",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M4 12v8a2 2 0 002 2h12a2 2 0 002-2v-8M16 6l-4-4-4 4M12 2v13"}})]))}}},"1a8c":function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1c7e":function(t,e,n){var r=n("b622"),a=r("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[a]=function(){return this},Array.from(s,(function(){throw 2}))}catch(c){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var r={};r[a]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(c){}return n}},"1cdc":function(t,e,n){var r=n("342f");t.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},"1d80":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"1da1":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));n("d3b7");function r(t,e,n,r,a,i,o){try{var s=t[i](o),c=s.value}catch(l){return void n(l)}s.done?e(c):Promise.resolve(c).then(r,a)}function a(t){return function(){var e=this,n=arguments;return new Promise((function(a,i){var o=t.apply(e,n);function s(t){r(o,a,i,s,c,"next",t)}function c(t){r(o,a,i,s,c,"throw",t)}s(void 0)}))}}},"1dde":function(t,e,n){var r=n("d039"),a=n("b622"),i=n("2d00"),o=a("species");t.exports=function(t){return i>=51||!r((function(){var e=[],n=e.constructor={};return n[o]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"1efc":function(t,e){function n(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}t.exports=n},"1fc8":function(t,e,n){var r=n("4245");function a(t,e){var n=r(this,t),a=n.size;return n.set(t,e),this.size+=n.size==a?0:1,this}t.exports=a},2266:function(t,e,n){var r=n("825a"),a=n("e95a"),i=n("50c4"),o=n("0366"),s=n("35a1"),c=n("2a62"),l=function(t,e){this.stopped=t,this.result=e};t.exports=function(t,e,n){var u,f,d,p,h,m,v,g=n&&n.that,b=!(!n||!n.AS_ENTRIES),y=!(!n||!n.IS_ITERATOR),E=!(!n||!n.INTERRUPTED),w=o(e,g,1+b+E),k=function(t){return u&&c(u),new l(!0,t)},T=function(t){return b?(r(t),E?w(t[0],t[1],k):w(t[0],t[1])):E?w(t,k):w(t)};if(y)u=t;else{if(f=s(t),"function"!=typeof f)throw TypeError("Target is not iterable");if(a(f)){for(d=0,p=i(t.length);p>d;d++)if(h=T(t[d]),h&&h instanceof l)return h;return new l(!1)}u=f.call(t)}m=u.next;while(!(v=m.call(u)).done){try{h=T(v.value)}catch(x){throw c(u),x}if("object"==typeof h&&h&&h instanceof l)return h}return new l(!1)}},"234d":function(t,e,n){var r=n("e380"),a=500;function i(t){var e=r(t,(function(t){return n.size===a&&n.clear(),t})),n=e.cache;return e}t.exports=i},"23cb":function(t,e,n){var r=n("a691"),a=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?a(n+e,0):i(n,e)}},"23e7":function(t,e,n){var r=n("da84"),a=n("06cf").f,i=n("9112"),o=n("6eeb"),s=n("ce4e"),c=n("e893"),l=n("94ca");t.exports=function(t,e){var n,u,f,d,p,h,m=t.target,v=t.global,g=t.stat;if(u=v?r:g?r[m]||s(m,{}):(r[m]||{}).prototype,u)for(f in e){if(p=e[f],t.noTargetGet?(h=a(u,f),d=h&&h.value):d=u[f],n=l(v?f:m+(g?".":"#")+f,t.forced),!n&&void 0!==d){if(typeof p===typeof d)continue;c(p,d)}(t.sham||d&&d.sham)&&i(p,"sham",!0),o(u,f,p,t)}}},"241c":function(t,e,n){var r=n("ca84"),a=n("7839"),i=a.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},2478:function(t,e,n){var r=n("4245");function a(t){return r(this,t).get(t)}t.exports=a},2504:function(t){t.exports=JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}')},2524:function(t,e,n){var r=n("6044"),a="__lodash_hash_undefined__";function i(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?a:e,this}t.exports=i},2532:function(t,e,n){"use strict";var r=n("23e7"),a=n("5a34"),i=n("1d80"),o=n("ab13");r({target:"String",proto:!0,forced:!o("includes")},{includes:function(t){return!!~String(i(this)).indexOf(a(t),arguments.length>1?arguments[1]:void 0)}})},"254c":function(t,e,n){"use strict";function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=Object.create(t.prototype);for(var a in n)r[a]=n[a];return r.constructor=e,e.prototype=r,e}e.__esModule=!0,e.inherits=r},"25f0":function(t,e,n){"use strict";var r=n("6eeb"),a=n("825a"),i=n("d039"),o=n("ad6d"),s="toString",c=RegExp.prototype,l=c[s],u=i((function(){return"/a/b"!=l.call({source:"a",flags:"b"})})),f=l.name!=s;(u||f)&&r(RegExp.prototype,s,(function(){var t=a(this),e=String(t.source),n=t.flags,r=String(void 0===n&&t instanceof RegExp&&!("flags"in c)?o.call(t):n);return"/"+e+"/"+r}),{unsafe:!0})},2626:function(t,e,n){"use strict";var r=n("d066"),a=n("9bf2"),i=n("b622"),o=n("83ab"),s=i("species");t.exports=function(t){var e=r(t),n=a.f;o&&e&&!e[s]&&n(e,s,{configurable:!0,get:function(){return this}})}},2779:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-alert-circle",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M12 8v4M12 16h.01"}})]))}}},2877:function(t,e,n){"use strict";function r(t,e,n,r,a,i,o,s){var c,l="function"===typeof t?t.options:t;if(e&&(l.render=e,l.staticRenderFns=n,l._compiled=!0),r&&(l.functional=!0),i&&(l._scopeId="data-v-"+i),o?(c=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||"undefined"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),a&&a.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(o)},l._ssrRegister=c):a&&(c=s?function(){a.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:a),c)if(l.functional){l._injectStyles=c;var u=l.render;l.render=function(t,e){return c.call(e),u(t,e)}}else{var f=l.beforeCreate;l.beforeCreate=f?[].concat(f,c):[c]}return{exports:t,options:l}}n.d(e,"a",(function(){return r}))},2878:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-database",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("ellipse",{attrs:{cx:"12",cy:"5",rx:"9",ry:"3"}}),n("path",{attrs:{d:"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"}}),n("path",{attrs:{d:"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"}})]))}}},"28c9":function(t,e){function n(){this.__data__=[],this.size=0}t.exports=n},2909:function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n("6b75");function a(t){if(Array.isArray(t))return Object(r["a"])(t)}n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0"),n("a630");function i(t){if("undefined"!==typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}var o=n("06c5");function s(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(t){return a(t)||i(t)||Object(o["a"])(t)||s()}},2987:function(t,e,n){"use strict";e.__esModule=!0,e.TokenTypes=void 0,function(t){t["WHITESPACE"]="whitespace",t["WORD"]="word",t["STRING"]="string",t["RESERVED"]="reserved",t["RESERVED_TOP_LEVEL"]="reserved-top-level",t["RESERVED_TOP_LEVEL_NO_INDENT"]="reserved-top-level-no-indent",t["RESERVED_NEWLINE"]="reserved-newline",t["OPERATOR"]="operator",t["NO_SPACE_OPERATOR"]="no-space-operator",t["OPEN_PAREN"]="open-paren",t["CLOSE_PAREN"]="close-paren",t["LINE_COMMENT"]="line-comment",t["BLOCK_COMMENT"]="block-comment",t["NUMBER"]="number",t["PLACEHOLDER"]="placeholder",t["SERVERVARIABLE"]="servervariable"}(e.TokenTypes||(e.TokenTypes={}))},"29f3":function(t,e){var n=Object.prototype,r=n.toString;function a(t){return r.call(t)}t.exports=a},"2a62":function(t,e,n){var r=n("825a");t.exports=function(t){var e=t["return"];if(void 0!==e)return r(e.call(t)).value}},"2b0e":function(t,e,n){"use strict";(function(t){ +/*! + * Vue.js v2.6.14 + * (c) 2014-2021 Evan You + * Released under the MIT License. + */ +var n=Object.freeze({});function r(t){return void 0===t||null===t}function a(t){return void 0!==t&&null!==t}function i(t){return!0===t}function o(t){return!1===t}function s(t){return"string"===typeof t||"number"===typeof t||"symbol"===typeof t||"boolean"===typeof t}function c(t){return null!==t&&"object"===typeof t}var l=Object.prototype.toString;function u(t){return"[object Object]"===l.call(t)}function f(t){return"[object RegExp]"===l.call(t)}function d(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function p(t){return a(t)&&"function"===typeof t.then&&"function"===typeof t.catch}function h(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===l?JSON.stringify(t,null,2):String(t)}function m(t){var e=parseFloat(t);return isNaN(e)?t:e}function v(t,e){for(var n=Object.create(null),r=t.split(","),a=0;a-1)return t.splice(n,1)}}var y=Object.prototype.hasOwnProperty;function E(t,e){return y.call(t,e)}function w(t){var e=Object.create(null);return function(n){var r=e[n];return r||(e[n]=t(n))}}var k=/-(\w)/g,T=w((function(t){return t.replace(k,(function(t,e){return e?e.toUpperCase():""}))})),x=w((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),A=/\B([A-Z])/g,O=w((function(t){return t.replace(A,"-$1").toLowerCase()}));function S(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function R(t,e){return t.bind(e)}var N=Function.prototype.bind?R:S;function C(t,e){e=e||0;var n=t.length-e,r=new Array(n);while(n--)r[n]=t[n+e];return r}function _(t,e){for(var n in e)t[n]=e[n];return t}function L(t){for(var e={},n=0;n0,nt=Z&&Z.indexOf("edge/")>0,rt=(Z&&Z.indexOf("android"),Z&&/iphone|ipad|ipod|ios/.test(Z)||"ios"===J),at=(Z&&/chrome\/\d+/.test(Z),Z&&/phantomjs/.test(Z),Z&&Z.match(/firefox\/(\d+)/)),it={}.watch,ot=!1;if(Q)try{var st={};Object.defineProperty(st,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,st)}catch(xo){}var ct=function(){return void 0===X&&(X=!Q&&!K&&"undefined"!==typeof t&&(t["process"]&&"server"===t["process"].env.VUE_ENV)),X},lt=Q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ut(t){return"function"===typeof t&&/native code/.test(t.toString())}var ft,dt="undefined"!==typeof Symbol&&ut(Symbol)&&"undefined"!==typeof Reflect&&ut(Reflect.ownKeys);ft="undefined"!==typeof Set&&ut(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var pt=I,ht=0,mt=function(){this.id=ht++,this.subs=[]};mt.prototype.addSub=function(t){this.subs.push(t)},mt.prototype.removeSub=function(t){b(this.subs,t)},mt.prototype.depend=function(){mt.target&&mt.target.addDep(this)},mt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(i&&!E(a,"default"))o=!1;else if(""===o||o===O(t)){var c=ee(String,a.type);(c<0||s0&&(o=Re(o,(e||"")+"_"+n),Se(o[0])&&Se(l)&&(u[c]=kt(l.text+o[0].text),o.shift()),u.push.apply(u,o)):s(o)?Se(l)?u[c]=kt(l.text+o):""!==o&&u.push(kt(o)):Se(o)&&Se(l)?u[c]=kt(l.text+o.text):(i(t._isVList)&&a(o.tag)&&r(o.key)&&a(e)&&(o.key="__vlist"+e+"_"+n+"__"),u.push(o)));return u}function Ne(t){var e=t.$options.provide;e&&(t._provided="function"===typeof e?e.call(t):e)}function Ce(t){var e=_e(t.$options.inject,t);e&&(Nt(!1),Object.keys(e).forEach((function(n){Dt(t,n,e[n])})),Nt(!0))}function _e(t,e){if(t){for(var n=Object.create(null),r=dt?Reflect.ownKeys(t):Object.keys(t),a=0;a0,o=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(o&&r&&r!==n&&s===r.$key&&!i&&!r.$hasNormal)return r;for(var c in a={},t)t[c]&&"$"!==c[0]&&(a[c]=Me(e,c,t[c]))}else a={};for(var l in e)l in a||(a[l]=Ue(e,l));return t&&Object.isExtensible(t)&&(t._normalized=a),Y(a,"$stable",o),Y(a,"$key",s),Y(a,"$hasNormal",i),a}function Me(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({});t=t&&"object"===typeof t&&!Array.isArray(t)?[t]:Oe(t);var e=t&&t[0];return t&&(!e||1===t.length&&e.isComment&&!De(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function Ue(t,e){return function(){return t[e]}}function je(t,e){var n,r,i,o,s;if(Array.isArray(t)||"string"===typeof t)for(n=new Array(t.length),r=0,i=t.length;r1?C(n):n;for(var r=C(arguments,1),a='event handler for "'+t+'"',i=0,o=n.length;idocument.createEvent("Event").timeStamp&&($n=function(){return Qn.now()})}function Kn(){var t,e;for(Xn=$n(),Yn=!0,Hn.sort((function(t,e){return t.id-e.id})),Vn=0;VnVn&&Hn[n].id>t.id)n--;Hn.splice(n+1,0,t)}else Hn.push(t);Gn||(Gn=!0,me(Kn))}}var nr=0,rr=function(t,e,n,r,a){this.vm=t,a&&(t._watcher=this),t._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++nr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ft,this.newDepIds=new ft,this.expression="","function"===typeof e?this.getter=e:(this.getter=W(e),this.getter||(this.getter=I)),this.value=this.lazy?void 0:this.get()};rr.prototype.get=function(){var t;gt(this);var e=this.vm;try{t=this.getter.call(e,e)}catch(xo){if(!this.user)throw xo;ne(xo,e,'getter for watcher "'+this.expression+'"')}finally{this.deep&&ge(t),bt(),this.cleanupDeps()}return t},rr.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},rr.prototype.cleanupDeps=function(){var t=this.deps.length;while(t--){var e=this.deps[t];this.newDepIds.has(e.id)||e.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},rr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():er(this)},rr.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||c(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';re(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},rr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},rr.prototype.depend=function(){var t=this.deps.length;while(t--)this.deps[t].depend()},rr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);var t=this.deps.length;while(t--)this.deps[t].removeSub(this);this.active=!1}};var ar={enumerable:!0,configurable:!0,get:I,set:I};function ir(t,e,n){ar.get=function(){return this[e][n]},ar.set=function(t){this[e][n]=t},Object.defineProperty(t,n,ar)}function or(t){t._watchers=[];var e=t.$options;e.props&&sr(t,e.props),e.methods&&mr(t,e.methods),e.data?cr(t):It(t._data={},!0),e.computed&&fr(t,e.computed),e.watch&&e.watch!==it&&vr(t,e.watch)}function sr(t,e){var n=t.$options.propsData||{},r=t._props={},a=t.$options._propKeys=[],i=!t.$parent;i||Nt(!1);var o=function(i){a.push(i);var o=Qt(i,e,n,t);Dt(r,i,o),i in t||ir(t,"_props",i)};for(var s in e)o(s);Nt(!0)}function cr(t){var e=t.$options.data;e=t._data="function"===typeof e?lr(e,t):e||{},u(e)||(e={});var n=Object.keys(e),r=t.$options.props,a=(t.$options.methods,n.length);while(a--){var i=n[a];0,r&&E(r,i)||G(i)||ir(t,"_data",i)}It(e,!0)}function lr(t,e){gt();try{return t.call(e,e)}catch(xo){return ne(xo,e,"data()"),{}}finally{bt()}}var ur={lazy:!0};function fr(t,e){var n=t._computedWatchers=Object.create(null),r=ct();for(var a in e){var i=e[a],o="function"===typeof i?i:i.get;0,r||(n[a]=new rr(t,o||I,I,ur)),a in t||dr(t,a,i)}}function dr(t,e,n){var r=!ct();"function"===typeof n?(ar.get=r?pr(e):hr(n),ar.set=I):(ar.get=n.get?r&&!1!==n.cache?pr(e):hr(n.get):I,ar.set=n.set||I),Object.defineProperty(t,e,ar)}function pr(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),mt.target&&e.depend(),e.value}}function hr(t){return function(){return t.call(this,this)}}function mr(t,e){t.$options.props;for(var n in e)t[n]="function"!==typeof e[n]?I:N(e[n],t)}function vr(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var a=0;a-1)return this;var n=C(arguments,1);return n.unshift(this),"function"===typeof t.install?t.install.apply(t,n):"function"===typeof t&&t.apply(null,n),e.push(t),this}}function Or(t){t.mixin=function(t){return this.options=Xt(this.options,t),this}}function Sr(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,a=t._Ctor||(t._Ctor={});if(a[r])return a[r];var i=t.name||n.options.name;var o=function(t){this._init(t)};return o.prototype=Object.create(n.prototype),o.prototype.constructor=o,o.cid=e++,o.options=Xt(n.options,t),o["super"]=n,o.options.props&&Rr(o),o.options.computed&&Nr(o),o.extend=n.extend,o.mixin=n.mixin,o.use=n.use,B.forEach((function(t){o[t]=n[t]})),i&&(o.options.components[i]=o),o.superOptions=n.options,o.extendOptions=t,o.sealedOptions=_({},o.options),a[r]=o,o}}function Rr(t){var e=t.options.props;for(var n in e)ir(t.prototype,"_props",n)}function Nr(t){var e=t.options.computed;for(var n in e)dr(t.prototype,n,e[n])}function Cr(t){B.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"===typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}function _r(t){return t&&(t.Ctor.options.name||t.tag)}function Lr(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"===typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function Ir(t,e){var n=t.cache,r=t.keys,a=t._vnode;for(var i in n){var o=n[i];if(o){var s=o.name;s&&!e(s)&&Dr(n,i,r,a)}}}function Dr(t,e,n,r){var a=t[e];!a||r&&a.tag===r.tag||a.componentInstance.$destroy(),t[e]=null,b(n,e)}Er(xr),br(xr),Cn(xr),Dn(xr),En(xr);var Pr=[String,RegExp,Array],Mr={name:"keep-alive",abstract:!0,props:{include:Pr,exclude:Pr,max:[String,Number]},methods:{cacheVNode:function(){var t=this,e=t.cache,n=t.keys,r=t.vnodeToCache,a=t.keyToCache;if(r){var i=r.tag,o=r.componentInstance,s=r.componentOptions;e[a]={name:_r(s),tag:i,componentInstance:o},n.push(a),this.max&&n.length>parseInt(this.max)&&Dr(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Dr(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Ir(t,(function(t){return Lr(e,t)}))})),this.$watch("exclude",(function(e){Ir(t,(function(t){return!Lr(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=xn(t),n=e&&e.componentOptions;if(n){var r=_r(n),a=this,i=a.include,o=a.exclude;if(i&&(!r||!Lr(i,r))||o&&r&&Lr(o,r))return e;var s=this,c=s.cache,l=s.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;c[u]?(e.componentInstance=c[u].componentInstance,b(l,u),l.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}},Ur={KeepAlive:Mr};function jr(t){var e={get:function(){return z}};Object.defineProperty(t,"config",e),t.util={warn:pt,extend:_,mergeOptions:Xt,defineReactive:Dt},t.set=Pt,t.delete=Mt,t.nextTick=me,t.observable=function(t){return It(t),t},t.options=Object.create(null),B.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,_(t.options.components,Ur),Ar(t),Or(t),Sr(t),Cr(t)}jr(xr),Object.defineProperty(xr.prototype,"$isServer",{get:ct}),Object.defineProperty(xr.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(xr,"FunctionalRenderContext",{value:Ze}),xr.version="2.6.14";var Fr=v("style,class"),Br=v("input,textarea,option,select,progress"),Hr=function(t,e,n){return"value"===n&&Br(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},zr=v("contenteditable,draggable,spellcheck"),qr=v("events,caret,typing,plaintext-only"),Gr=function(t,e){return $r(e)||"false"===e?"false":"contenteditable"===t&&qr(e)?e:"true"},Yr=v("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Vr="http://www.w3.org/1999/xlink",Wr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Xr=function(t){return Wr(t)?t.slice(6,t.length):""},$r=function(t){return null==t||!1===t};function Qr(t){var e=t.data,n=t,r=t;while(a(r.componentInstance))r=r.componentInstance._vnode,r&&r.data&&(e=Kr(r.data,e));while(a(n=n.parent))n&&n.data&&(e=Kr(e,n.data));return Jr(e.staticClass,e.class)}function Kr(t,e){return{staticClass:Zr(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function Jr(t,e){return a(t)||a(e)?Zr(t,ta(e)):""}function Zr(t,e){return t?e?t+" "+e:t:e||""}function ta(t){return Array.isArray(t)?ea(t):c(t)?na(t):"string"===typeof t?t:""}function ea(t){for(var e,n="",r=0,i=t.length;r-1?ca[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:ca[t]=/HTMLUnknownElement/.test(e.toString())}var ua=v("text,number,password,search,email,tel,url");function fa(t){if("string"===typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function da(t,e){var n=document.createElement(t);return"select"!==t||e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n}function pa(t,e){return document.createElementNS(ra[t],e)}function ha(t){return document.createTextNode(t)}function ma(t){return document.createComment(t)}function va(t,e,n){t.insertBefore(e,n)}function ga(t,e){t.removeChild(e)}function ba(t,e){t.appendChild(e)}function ya(t){return t.parentNode}function Ea(t){return t.nextSibling}function wa(t){return t.tagName}function ka(t,e){t.textContent=e}function Ta(t,e){t.setAttribute(e,"")}var xa=Object.freeze({createElement:da,createElementNS:pa,createTextNode:ha,createComment:ma,insertBefore:va,removeChild:ga,appendChild:ba,parentNode:ya,nextSibling:Ea,tagName:wa,setTextContent:ka,setStyleScope:Ta}),Aa={create:function(t,e){Oa(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Oa(t,!0),Oa(e))},destroy:function(t){Oa(t,!0)}};function Oa(t,e){var n=t.data.ref;if(a(n)){var r=t.context,i=t.componentInstance||t.elm,o=r.$refs;e?Array.isArray(o[n])?b(o[n],i):o[n]===i&&(o[n]=void 0):t.data.refInFor?Array.isArray(o[n])?o[n].indexOf(i)<0&&o[n].push(i):o[n]=[i]:o[n]=i}}var Sa=new yt("",{},[]),Ra=["create","activate","update","remove","destroy"];function Na(t,e){return t.key===e.key&&t.asyncFactory===e.asyncFactory&&(t.tag===e.tag&&t.isComment===e.isComment&&a(t.data)===a(e.data)&&Ca(t,e)||i(t.isAsyncPlaceholder)&&r(e.asyncFactory.error))}function Ca(t,e){if("input"!==t.tag)return!0;var n,r=a(n=t.data)&&a(n=n.attrs)&&n.type,i=a(n=e.data)&&a(n=n.attrs)&&n.type;return r===i||ua(r)&&ua(i)}function _a(t,e,n){var r,i,o={};for(r=e;r<=n;++r)i=t[r].key,a(i)&&(o[i]=r);return o}function La(t){var e,n,o={},c=t.modules,l=t.nodeOps;for(e=0;em?(f=r(n[b+1])?null:n[b+1].elm,T(t,f,n,h,b,i)):h>b&&A(e,d,m)}function R(t,e,n,r){for(var i=n;i-1?qa(t,e,n):Yr(e)?$r(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):zr(e)?t.setAttribute(e,Gr(e,n)):Wr(e)?$r(n)?t.removeAttributeNS(Vr,Xr(e)):t.setAttributeNS(Vr,e,n):qa(t,e,n)}function qa(t,e,n){if($r(n))t.removeAttribute(e);else{if(tt&&!et&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Ga={create:Ha,update:Ha};function Ya(t,e){var n=e.elm,i=e.data,o=t.data;if(!(r(i.staticClass)&&r(i.class)&&(r(o)||r(o.staticClass)&&r(o.class)))){var s=Qr(e),c=n._transitionClasses;a(c)&&(s=Zr(s,ta(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Va,Wa={create:Ya,update:Ya},Xa="__r",$a="__c";function Qa(t){if(a(t[Xa])){var e=tt?"change":"input";t[e]=[].concat(t[Xa],t[e]||[]),delete t[Xa]}a(t[$a])&&(t.change=[].concat(t[$a],t.change||[]),delete t[$a])}function Ka(t,e,n){var r=Va;return function a(){var i=e.apply(null,arguments);null!==i&&ti(t,a,n,r)}}var Ja=se&&!(at&&Number(at[1])<=53);function Za(t,e,n,r){if(Ja){var a=Xn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=a||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Va.addEventListener(t,e,ot?{capture:n,passive:r}:n)}function ti(t,e,n,r){(r||Va).removeEventListener(t,e._wrapper||e,n)}function ei(t,e){if(!r(t.data.on)||!r(e.data.on)){var n=e.data.on||{},a=t.data.on||{};Va=e.elm,Qa(n),we(n,a,Za,ti,Ka,e.context),Va=void 0}}var ni,ri={create:ei,update:ei};function ai(t,e){if(!r(t.data.domProps)||!r(e.data.domProps)){var n,i,o=e.elm,s=t.data.domProps||{},c=e.data.domProps||{};for(n in a(c.__ob__)&&(c=e.data.domProps=_({},c)),s)n in c||(o[n]="");for(n in c){if(i=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),i===s[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=i;var l=r(i)?"":String(i);ii(o,l)&&(o.value=l)}else if("innerHTML"===n&&ia(o.tagName)&&r(o.innerHTML)){ni=ni||document.createElement("div"),ni.innerHTML=""+i+"";var u=ni.firstChild;while(o.firstChild)o.removeChild(o.firstChild);while(u.firstChild)o.appendChild(u.firstChild)}else if(i!==s[n])try{o[n]=i}catch(xo){}}}}function ii(t,e){return!t.composing&&("OPTION"===t.tagName||oi(t,e)||si(t,e))}function oi(t,e){var n=!0;try{n=document.activeElement!==t}catch(xo){}return n&&t.value!==e}function si(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return m(n)!==m(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}var ci={create:ai,update:ai},li=w((function(t){var e={},n=/;(?![^(]*\))/g,r=/:(.+)/;return t.split(n).forEach((function(t){if(t){var n=t.split(r);n.length>1&&(e[n[0].trim()]=n[1].trim())}})),e}));function ui(t){var e=fi(t.style);return t.staticStyle?_(t.staticStyle,e):e}function fi(t){return Array.isArray(t)?L(t):"string"===typeof t?li(t):t}function di(t,e){var n,r={};if(e){var a=t;while(a.componentInstance)a=a.componentInstance._vnode,a&&a.data&&(n=ui(a.data))&&_(r,n)}(n=ui(t.data))&&_(r,n);var i=t;while(i=i.parent)i.data&&(n=ui(i.data))&&_(r,n);return r}var pi,hi=/^--/,mi=/\s*!important$/,vi=function(t,e,n){if(hi.test(e))t.style.setProperty(e,n);else if(mi.test(n))t.style.setProperty(O(e),n.replace(mi,""),"important");else{var r=bi(e);if(Array.isArray(n))for(var a=0,i=n.length;a-1?e.split(wi).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Ti(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(wi).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";while(n.indexOf(r)>=0)n=n.replace(r," ");n=n.trim(),n?t.setAttribute("class",n):t.removeAttribute("class")}}function xi(t){if(t){if("object"===typeof t){var e={};return!1!==t.css&&_(e,Ai(t.name||"v")),_(e,t),e}return"string"===typeof t?Ai(t):void 0}}var Ai=w((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Oi=Q&&!et,Si="transition",Ri="animation",Ni="transition",Ci="transitionend",_i="animation",Li="animationend";Oi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ni="WebkitTransition",Ci="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(_i="WebkitAnimation",Li="webkitAnimationEnd"));var Ii=Q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Di(t){Ii((function(){Ii(t)}))}function Pi(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),ki(t,e))}function Mi(t,e){t._transitionClasses&&b(t._transitionClasses,e),Ti(t,e)}function Ui(t,e,n){var r=Fi(t,e),a=r.type,i=r.timeout,o=r.propCount;if(!a)return n();var s=a===Si?Ci:Li,c=0,l=function(){t.removeEventListener(s,u),n()},u=function(e){e.target===t&&++c>=o&&l()};setTimeout((function(){c0&&(n=Si,u=o,f=i.length):e===Ri?l>0&&(n=Ri,u=l,f=c.length):(u=Math.max(o,l),n=u>0?o>l?Si:Ri:null,f=n?n===Si?i.length:c.length:0);var d=n===Si&&ji.test(r[Ni+"Property"]);return{type:n,timeout:u,propCount:f,hasTransform:d}}function Bi(t,e){while(t.length1}function Vi(t,e){!0!==e.data.show&&zi(e)}var Wi=Q?{create:Vi,activate:Vi,remove:function(t,e){!0!==t.data.show?qi(t,e):e()}}:{},Xi=[Ga,Wa,ri,ci,Ei,Wi],$i=Xi.concat(Ba),Qi=La({nodeOps:xa,modules:$i});et&&document.addEventListener("selectionchange",(function(){var t=document.activeElement;t&&t.vmodel&&ao(t,"input")}));var Ki={inserted:function(t,e,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?ke(n,"postpatch",(function(){Ki.componentUpdated(t,e,n)})):Ji(t,e,n.context),t._vOptions=[].map.call(t.options,eo)):("textarea"===n.tag||ua(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("compositionstart",no),t.addEventListener("compositionend",ro),t.addEventListener("change",ro),et&&(t.vmodel=!0)))},componentUpdated:function(t,e,n){if("select"===n.tag){Ji(t,e,n.context);var r=t._vOptions,a=t._vOptions=[].map.call(t.options,eo);if(a.some((function(t,e){return!M(t,r[e])}))){var i=t.multiple?e.value.some((function(t){return to(t,a)})):e.value!==e.oldValue&&to(e.value,a);i&&ao(t,"change")}}}};function Ji(t,e,n){Zi(t,e,n),(tt||nt)&&setTimeout((function(){Zi(t,e,n)}),0)}function Zi(t,e,n){var r=e.value,a=t.multiple;if(!a||Array.isArray(r)){for(var i,o,s=0,c=t.options.length;s-1,o.selected!==i&&(o.selected=i);else if(M(eo(o),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));a||(t.selectedIndex=-1)}}function to(t,e){return e.every((function(e){return!M(e,t)}))}function eo(t){return"_value"in t?t._value:t.value}function no(t){t.target.composing=!0}function ro(t){t.target.composing&&(t.target.composing=!1,ao(t.target,"input"))}function ao(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function io(t){return!t.componentInstance||t.data&&t.data.transition?t:io(t.componentInstance._vnode)}var oo={bind:function(t,e,n){var r=e.value;n=io(n);var a=n.data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&a?(n.data.show=!0,zi(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value,a=e.oldValue;if(!r!==!a){n=io(n);var i=n.data&&n.data.transition;i?(n.data.show=!0,r?zi(n,(function(){t.style.display=t.__vOriginalDisplay})):qi(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none"}},unbind:function(t,e,n,r,a){a||(t.style.display=t.__vOriginalDisplay)}},so={model:Ki,show:oo},co={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function lo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?lo(xn(e.children)):t}function uo(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var a=n._parentListeners;for(var i in a)e[T(i)]=a[i];return e}function fo(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function po(t){while(t=t.parent)if(t.data.transition)return!0}function ho(t,e){return e.key===t.key&&e.tag===t.tag}var mo=function(t){return t.tag||De(t)},vo=function(t){return"show"===t.name},go={name:"transition",props:co,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(mo),n.length)){0;var r=this.mode;0;var a=n[0];if(po(this.$vnode))return a;var i=lo(a);if(!i)return a;if(this._leaving)return fo(t,a);var o="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?o+"comment":o+i.tag:s(i.key)?0===String(i.key).indexOf(o)?i.key:o+i.key:i.key;var c=(i.data||(i.data={})).transition=uo(this),l=this._vnode,u=lo(l);if(i.data.directives&&i.data.directives.some(vo)&&(i.data.show=!0),u&&u.data&&!ho(i,u)&&!De(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var f=u.data.transition=_({},c);if("out-in"===r)return this._leaving=!0,ke(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),fo(t,a);if("in-out"===r){if(De(i))return l;var d,p=function(){d()};ke(c,"afterEnter",p),ke(c,"enterCancelled",p),ke(f,"delayLeave",(function(t){d=t}))}}return a}}},bo=_({tag:String,moveClass:String},co);delete bo.mode;var yo={props:bo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var a=Ln(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,a(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,a=this.$slots.default||[],i=this.children=[],o=uo(this),s=0;s1?arguments[1]:void 0,e.length)),r=String(t);return u?u.call(e,r,n):e.slice(n,n+r.length)===r}})},"2cf4":function(t,e,n){var r,a,i,o=n("da84"),s=n("d039"),c=n("0366"),l=n("1be4"),u=n("cc12"),f=n("1cdc"),d=n("605d"),p=o.location,h=o.setImmediate,m=o.clearImmediate,v=o.process,g=o.MessageChannel,b=o.Dispatch,y=0,E={},w="onreadystatechange",k=function(t){if(E.hasOwnProperty(t)){var e=E[t];delete E[t],e()}},T=function(t){return function(){k(t)}},x=function(t){k(t.data)},A=function(t){o.postMessage(t+"",p.protocol+"//"+p.host)};h&&m||(h=function(t){var e=[],n=1;while(arguments.length>n)e.push(arguments[n++]);return E[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},m=function(t){delete E[t]},d?r=function(t){v.nextTick(T(t))}:b&&b.now?r=function(t){b.now(T(t))}:g&&!f?(a=new g,i=a.port2,a.port1.onmessage=x,r=c(i.postMessage,i,1)):o.addEventListener&&"function"==typeof postMessage&&!o.importScripts&&p&&"file:"!==p.protocol&&!s(A)?(r=A,o.addEventListener("message",x,!1)):r=w in u("script")?function(t){l.appendChild(u("script"))[w]=function(){l.removeChild(this),k(t)}}:function(t){setTimeout(T(t),0)}),t.exports={set:h,clear:m}},"2d00":function(t,e,n){var r,a,i=n("da84"),o=n("342f"),s=i.process,c=s&&s.versions,l=c&&c.v8;l?(r=l.split("."),a=r[0]<4?1:r[0]+r[1]):o&&(r=o.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=o.match(/Chrome\/(\d+)/),r&&(a=r[1]))),t.exports=a&&+a},"2d78":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-link",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71"}}),n("path",{attrs:{d:"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"}})]))}}},"2d78d":function(t,e,n){"use strict";e.__esModule=!0,e.tokenize=e.test=e.scanner=e.parser=e.options=e.inherits=e.find=void 0;var r=n("254c"),a=n("316e"),i=u(a),o=n("b7fe"),s=u(o),c=n("4128"),l=u(c);function u(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var f=function(t){return l.run(s.run(t))},d=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=f(t),r=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=f(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=d,e.inherits=r.inherits,e.options=i,e.parser=l,e.scanner=s,e.test=p,e.tokenize=f},"2fd4":function(t,e){function n(t,e,n){var r=null,a=null,i=function(){r&&(clearTimeout(r),a=null,r=null)},o=function(){var t=a;i(),t&&t()},s=function(){if(!e)return t.apply(this,arguments);var o=this,s=arguments,c=n&&!r;return i(),a=function(){t.apply(o,s)},r=setTimeout((function(){if(r=null,!c){var t=a;return a=null,t()}}),e),c?a():void 0};return s.cancel=i,s.flush=o,s}t.exports=n},"316e":function(t,e,n){"use strict";e.__esModule=!0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a={defaultProtocol:"http",events:null,format:s,formatHref:s,nl2br:!1,tagName:"a",target:c,validate:!0,ignoreTags:[],attributes:null,className:"linkified"};function i(t){t=t||{},this.defaultProtocol=t.hasOwnProperty("defaultProtocol")?t.defaultProtocol:a.defaultProtocol,this.events=t.hasOwnProperty("events")?t.events:a.events,this.format=t.hasOwnProperty("format")?t.format:a.format,this.formatHref=t.hasOwnProperty("formatHref")?t.formatHref:a.formatHref,this.nl2br=t.hasOwnProperty("nl2br")?t.nl2br:a.nl2br,this.tagName=t.hasOwnProperty("tagName")?t.tagName:a.tagName,this.target=t.hasOwnProperty("target")?t.target:a.target,this.validate=t.hasOwnProperty("validate")?t.validate:a.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||a.attributes,this.className=t.hasOwnProperty("className")?t.className:t.linkClass||a.className;for(var e=t.hasOwnProperty("ignoreTags")?t.ignoreTags:a.ignoreTags,n=0;nc)a.f(t,n=r[c++],e[n]);return t}},3835:function(t,e,n){"use strict";function r(t){if(Array.isArray(t))return t}n.d(e,"a",(function(){return s}));n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0");function a(t,e){var n=null==t?null:"undefined"!==typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,a,i=[],o=!0,s=!1;try{for(n=n.call(t);!(o=(r=n.next()).done);o=!0)if(i.push(r.value),e&&i.length===e)break}catch(c){s=!0,a=c}finally{try{o||null==n["return"]||n["return"]()}finally{if(s)throw a}}return i}}var i=n("06c5");function o(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(t,e){return r(t)||a(t,e)||Object(i["a"])(t,e)||o()}},"3bbe":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"3c09":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-trash-2",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2M10 11v6M14 11v6"}})]))}}},"3ca3":function(t,e,n){"use strict";var r=n("6547").charAt,a=n("69f3"),i=n("7dd0"),o="String Iterator",s=a.set,c=a.getterFor(o);i(String,"String",(function(t){s(this,{type:o,string:String(t),index:0})}),(function(){var t,e=c(this),n=e.string,a=e.index;return a>=n.length?{value:void 0,done:!0}:(t=r(n,a),e.index+=t.length,{value:t,done:!1})}))},"3f61":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-check-circle",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M22 11.08V12a10 10 0 11-5.93-9.14"}}),n("path",{attrs:{d:"M22 4L12 14.01l-3-3"}})]))}}},"3f8c":function(t,e){t.exports={}},"408a":function(t,e,n){var r=n("c6b6");t.exports=function(t){if("number"!=typeof t&&"Number"!=r(t))throw TypeError("Incorrect invocation");return+t}},4128:function(t,e,n){"use strict";e.__esModule=!0,e.start=e.run=e.TOKENS=e.State=void 0;var r=n("1652"),a=n("bea1"),i=s(a),o=n("7656");function s(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var c=function(t){return new r.TokenState(t)},l=c(),u=c(),f=c(),d=c(),p=c(),h=c(),m=c(),v=c(a.URL),g=c(),b=c(a.URL),y=c(a.URL),E=c(),w=c(),k=c(),T=c(),x=c(),A=c(a.URL),O=c(a.URL),S=c(a.URL),R=c(a.URL),N=c(),C=c(),_=c(),L=c(),I=c(),D=c(),P=c(a.EMAIL),M=c(),U=c(a.EMAIL),j=c(a.MAILTOEMAIL),F=c(),B=c(),H=c(),z=c(),q=c(a.NL);l.on(o.NL,q).on(o.PROTOCOL,u).on(o.MAILTO,f).on(o.SLASH,d),u.on(o.SLASH,d),d.on(o.SLASH,p),l.on(o.TLD,h).on(o.DOMAIN,h).on(o.LOCALHOST,v).on(o.NUM,h),p.on(o.TLD,y).on(o.DOMAIN,y).on(o.NUM,y).on(o.LOCALHOST,y),h.on(o.DOT,m),I.on(o.DOT,D),m.on(o.TLD,v).on(o.DOMAIN,h).on(o.NUM,h).on(o.LOCALHOST,h),D.on(o.TLD,P).on(o.DOMAIN,I).on(o.NUM,I).on(o.LOCALHOST,I),v.on(o.DOT,m),P.on(o.DOT,D),v.on(o.COLON,g).on(o.SLASH,y),g.on(o.NUM,b),b.on(o.SLASH,y),P.on(o.COLON,M),M.on(o.NUM,U);var G=[o.DOMAIN,o.AT,o.LOCALHOST,o.NUM,o.PLUS,o.POUND,o.PROTOCOL,o.SLASH,o.TLD,o.UNDERSCORE,o.SYM,o.AMPERSAND],Y=[o.COLON,o.DOT,o.QUERY,o.PUNCTUATION,o.CLOSEBRACE,o.CLOSEBRACKET,o.CLOSEANGLEBRACKET,o.CLOSEPAREN,o.OPENBRACE,o.OPENBRACKET,o.OPENANGLEBRACKET,o.OPENPAREN];y.on(o.OPENBRACE,w).on(o.OPENBRACKET,k).on(o.OPENANGLEBRACKET,T).on(o.OPENPAREN,x),E.on(o.OPENBRACE,w).on(o.OPENBRACKET,k).on(o.OPENANGLEBRACKET,T).on(o.OPENPAREN,x),w.on(o.CLOSEBRACE,y),k.on(o.CLOSEBRACKET,y),T.on(o.CLOSEANGLEBRACKET,y),x.on(o.CLOSEPAREN,y),A.on(o.CLOSEBRACE,y),O.on(o.CLOSEBRACKET,y),S.on(o.CLOSEANGLEBRACKET,y),R.on(o.CLOSEPAREN,y),N.on(o.CLOSEBRACE,y),C.on(o.CLOSEBRACKET,y),_.on(o.CLOSEANGLEBRACKET,y),L.on(o.CLOSEPAREN,y),w.on(G,A),k.on(G,O),T.on(G,S),x.on(G,R),w.on(Y,N),k.on(Y,C),T.on(Y,_),x.on(Y,L),A.on(G,A),O.on(G,O),S.on(G,S),R.on(G,R),A.on(Y,A),O.on(Y,O),S.on(Y,S),R.on(Y,R),N.on(G,A),C.on(G,O),_.on(G,S),L.on(G,R),N.on(Y,N),C.on(Y,C),_.on(Y,_),L.on(Y,L),y.on(G,y),E.on(G,y),y.on(Y,E),E.on(Y,E),f.on(o.TLD,j).on(o.DOMAIN,j).on(o.NUM,j).on(o.LOCALHOST,j),j.on(G,j).on(Y,F),F.on(G,j).on(Y,F);var V=[o.DOMAIN,o.NUM,o.PLUS,o.POUND,o.QUERY,o.UNDERSCORE,o.SYM,o.AMPERSAND,o.TLD];h.on(V,B).on(o.AT,H),v.on(V,B).on(o.AT,H),m.on(V,B),B.on(V,B).on(o.AT,H).on(o.DOT,z),z.on(V,B),H.on(o.TLD,I).on(o.DOMAIN,I).on(o.LOCALHOST,P);var W=function(t){var e=t.length,n=0,r=[],i=[];while(n=0&&d++,n++,u++;if(d<0)for(var p=n-u;p0&&(r.push(new a.TEXT(i)),i=[]),n-=d,u-=d;var h=f.emit();r.push(new h(t.slice(n-u,n)))}}return i.length>0&&r.push(new a.TEXT(i)),r};e.State=r.TokenState,e.TOKENS=i,e.run=W,e.start=l},4245:function(t,e,n){var r=n("1290");function a(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}t.exports=a},"428f":function(t,e,n){var r=n("da84");t.exports=r},4492:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-github",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 00-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0020 4.77 5.07 5.07 0 0019.91 1S18.73.65 16 2.48a13.38 13.38 0 00-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 005 4.77a5.44 5.44 0 00-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 009 18.13V22"}})]))}}},"44ad":function(t,e,n){var r=n("d039"),a=n("c6b6"),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==a(t)?i.call(t,""):Object(t)}:Object},"44d2":function(t,e,n){var r=n("b622"),a=n("7c73"),i=n("9bf2"),o=r("unscopables"),s=Array.prototype;void 0==s[o]&&i.f(s,o,{configurable:!0,value:a(null)}),t.exports=function(t){s[o][t]=!0}},"44de":function(t,e,n){var r=n("da84");t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},"44e7":function(t,e,n){var r=n("861d"),a=n("c6b6"),i=n("b622"),o=i("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[o])?!!e:"RegExp"==a(t))}},"44f9":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-chevron-down",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M6 9l6 6 6-6"}})]))}}},"460c":function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n("fe1f"),a=n("fd3a"),i=n("8c86");function o(t,e){Object(i["a"])(2,arguments);var n=Object(a["a"])(t),o=Object(r["a"])(e);return n.setMilliseconds(o),n}},"466d":function(t,e,n){"use strict";var r=n("d784"),a=n("825a"),i=n("50c4"),o=n("1d80"),s=n("8aa5"),c=n("14c3");r("match",(function(t,e,n){return[function(e){var n=o(this),r=void 0==e?void 0:e[t];return void 0!==r?r.call(e,n):new RegExp(e)[t](String(n))},function(t){var r=n(e,this,t);if(r.done)return r.value;var o=a(this),l=String(t);if(!o.global)return c(o,l);var u=o.unicode;o.lastIndex=0;var f,d=[],p=0;while(null!==(f=c(o,l))){var h=String(f[0]);d[p]=h,""===h&&(o.lastIndex=s(l,i(o.lastIndex),u)),p++}return 0===p?null:d}]}))},"46f3":function(t,e,n){"use strict";function r(){return function(t){t&&(this.v=t)}}e.__esModule=!0,e.createTokenClass=r},"47b3":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-lock",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("rect",{attrs:{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}}),n("path",{attrs:{d:"M7 11V7a5 5 0 0110 0v4"}})]))}}},4840:function(t,e,n){var r=n("825a"),a=n("1c0b"),i=n("b622"),o=i("species");t.exports=function(t,e){var n,i=r(t).constructor;return void 0===i||void 0==(n=r(i)[o])?e:a(n)}},4930:function(t,e,n){var r=n("2d00"),a=n("d039");t.exports=!!Object.getOwnPropertySymbols&&!a((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},"498a":function(t,e,n){"use strict";var r=n("23e7"),a=n("58a8").trim,i=n("c8d2");r({target:"String",proto:!0,forced:i("trim")},{trim:function(){return a(this)}})},"49f4":function(t,e,n){var r=n("6044");function a(){this.__data__=r?r(null):{},this.size=0}t.exports=a},"4d63":function(t,e,n){var r=n("83ab"),a=n("da84"),i=n("94ca"),o=n("7156"),s=n("9112"),c=n("9bf2").f,l=n("241c").f,u=n("44e7"),f=n("ad6d"),d=n("9f7f"),p=n("6eeb"),h=n("d039"),m=n("5135"),v=n("69f3").enforce,g=n("2626"),b=n("b622"),y=n("fce3"),E=n("107c"),w=b("match"),k=a.RegExp,T=k.prototype,x=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,A=/a/g,O=/a/g,S=new k(A)!==A,R=d.UNSUPPORTED_Y,N=r&&(!S||R||y||E||h((function(){return O[w]=!1,k(A)!=A||k(O)==O||"/a/i"!=k(A,"i")}))),C=function(t){for(var e,n=t.length,r=0,a="",i=!1;r<=n;r++)e=t.charAt(r),"\\"!==e?i||"."!==e?("["===e?i=!0:"]"===e&&(i=!1),a+=e):a+="[\\s\\S]":a+=e+t.charAt(++r);return a},_=function(t){for(var e,n=t.length,r=0,a="",i=[],o={},s=!1,c=!1,l=0,u="";r<=n;r++){if(e=t.charAt(r),"\\"===e)e+=t.charAt(++r);else if("]"===e)s=!1;else if(!s)switch(!0){case"["===e:s=!0;break;case"("===e:x.test(t.slice(r+1))&&(r+=2,c=!0),a+=e,l++;continue;case">"===e&&c:if(""===u||m(o,u))throw new SyntaxError("Invalid capture group name");o[u]=!0,i.push([u,l]),c=!1,u="";continue}c?u+=e:a+=e}return[a,i]};if(i("RegExp",N)){for(var L=function(t,e){var n,r,a,i,c,l,d=this instanceof L,p=u(t),h=void 0===e,m=[],g=t;if(!d&&p&&h&&t.constructor===L)return t;if((p||t instanceof L)&&(t=t.source,h&&(e="flags"in g?g.flags:f.call(g))),t=void 0===t?"":String(t),e=void 0===e?"":String(e),g=t,y&&"dotAll"in A&&(r=!!e&&e.indexOf("s")>-1,r&&(e=e.replace(/s/g,""))),n=e,R&&"sticky"in A&&(a=!!e&&e.indexOf("y")>-1,a&&(e=e.replace(/y/g,""))),E&&(i=_(t),t=i[0],m=i[1]),c=o(k(t,e),d?this:T,L),(r||a||m.length)&&(l=v(c),r&&(l.dotAll=!0,l.raw=L(C(t),n)),a&&(l.sticky=!0),m.length&&(l.groups=m)),t!==g)try{s(c,"source",""===g?"(?:)":g)}catch(b){}return c},I=function(t){t in L||c(L,t,{configurable:!0,get:function(){return k[t]},set:function(e){k[t]=e}})},D=l(k),P=0;D.length>P;)I(D[P++]);T.constructor=L,L.prototype=T,p(a,"RegExp",L)}g("RegExp")},"4d64":function(t,e,n){var r=n("fc6a"),a=n("50c4"),i=n("23cb"),o=function(t){return function(e,n,o){var s,c=r(e),l=a(c.length),u=i(o,l);if(t&&n!=n){while(l>u)if(s=c[u++],s!=s)return!0}else for(;l>u;u++)if((t||u in c)&&c[u]===n)return t||u||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},"4de4":function(t,e,n){"use strict";var r=n("23e7"),a=n("b727").filter,i=n("1dde"),o=i("filter");r({target:"Array",proto:!0,forced:!o},{filter:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(t,e,n){"use strict";var r=n("0366"),a=n("7b0b"),i=n("9bdd"),o=n("e95a"),s=n("50c4"),c=n("8418"),l=n("35a1");t.exports=function(t){var e,n,u,f,d,p,h=a(t),m="function"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,b=void 0!==g,y=l(h),E=0;if(b&&(g=r(g,v>2?arguments[2]:void 0,2)),void 0==y||m==Array&&o(y))for(e=s(h.length),n=new m(e);e>E;E++)p=b?g(h[E],E):h[E],c(n,E,p);else for(f=y.call(h),d=f.next,n=new m;!(u=d.call(f)).done;E++)p=b?i(f,g,[u.value,E],!0):u.value,c(n,E,p);return n.length=E,n}},"4e82":function(t,e,n){"use strict";var r=n("23e7"),a=n("1c0b"),i=n("7b0b"),o=n("50c4"),s=n("d039"),c=n("addb"),l=n("a640"),u=n("04d1"),f=n("d998"),d=n("2d00"),p=n("512c"),h=[],m=h.sort,v=s((function(){h.sort(void 0)})),g=s((function(){h.sort(null)})),b=l("sort"),y=!s((function(){if(d)return d<70;if(!(u&&u>3)){if(f)return!0;if(p)return p<603;var t,e,n,r,a="";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)h.push({k:e+r,v:n})}for(h.sort((function(t,e){return e.v-t.v})),r=0;rString(n)?1:-1}};r({target:"Array",proto:!0,forced:E},{sort:function(t){void 0!==t&&a(t);var e=i(this);if(y)return void 0===t?m.call(e):m.call(e,t);var n,r,s=[],l=o(e.length);for(r=0;r0?a(r(t),9007199254740991):0}},"512c":function(t,e,n){var r=n("342f"),a=r.match(/AppleWebKit\/(\d+)\./);t.exports=!!a&&+a[1]},5135:function(t,e,n){var r=n("7b0b"),a={}.hasOwnProperty;t.exports=Object.hasOwn||function(t,e){return a.call(r(t),e)}},5319:function(t,e,n){"use strict";var r=n("d784"),a=n("d039"),i=n("825a"),o=n("50c4"),s=n("a691"),c=n("1d80"),l=n("8aa5"),u=n("0cb2"),f=n("14c3"),d=n("b622"),p=d("replace"),h=Math.max,m=Math.min,v=function(t){return void 0===t?t:String(t)},g=function(){return"$0"==="a".replace(/./,"$0")}(),b=function(){return!!/./[p]&&""===/./[p]("a","$0")}(),y=!a((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}));r("replace",(function(t,e,n){var r=b?"$":"$0";return[function(t,n){var r=c(this),a=void 0==t?void 0:t[p];return void 0!==a?a.call(t,r,n):e.call(String(r),t,n)},function(t,a){if("string"===typeof a&&-1===a.indexOf(r)&&-1===a.indexOf("$<")){var c=n(e,this,t,a);if(c.done)return c.value}var d=i(this),p=String(t),g="function"===typeof a;g||(a=String(a));var b=d.global;if(b){var y=d.unicode;d.lastIndex=0}var E=[];while(1){var w=f(d,p);if(null===w)break;if(E.push(w),!b)break;var k=String(w[0]);""===k&&(d.lastIndex=l(p,o(d.lastIndex),y))}for(var T="",x=0,A=0;A=x&&(T+=p.slice(x,S)+L,x=S+O.length)}return T+p.slice(x)}]}),!y||!g||b)},"53ca":function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0");function r(t){return r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}},"54ed":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-disc",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("circle",{attrs:{cx:"12",cy:"12",r:"3"}})]))}}},5530:function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n("b64b"),n("a4d3"),n("4de4"),n("e439"),n("159b"),n("dbb4");function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e1?arguments[1]:void 0),e}})},"5e2e":function(t,e,n){var r=n("28c9"),a=n("69d5"),i=n("b4c0"),o=n("fba5"),s=n("67ca");function c(t){var e=-1,n=null==t?0:t.length;this.clear();while(++eu){var p,h=l(arguments[u++]),m=f?i(h).concat(f(h)):i(h),v=m.length,g=0;while(v>g)p=m[g++],r&&!d.call(h,p)||(n[p]=h[p])}return n}:u},"61ab":function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){for(var n=0;n=t.length?{done:!0}:{done:!1,value:t[e++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a,i=!0,o=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var t=r.next();return i=t.done,t},e:function(t){o=!0,a=t},f:function(){try{i||null==r["return"]||r["return"]()}finally{if(o)throw a}}}}function s(t,e){if(t){if("string"===typeof t)return c(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0?40*t+55:0,o=e>0?40*e+55:0,s=n>0?40*n+55:0;r[a]=h([i,o,s])}function p(t){var e=t.toString(16);while(e.length<2)e="0"+e;return e}function h(t){var e,n=[],r=o(t);try{for(r.s();!(e=r.n()).done;){var a=e.value;n.push(p(a))}}catch(i){r.e(i)}finally{r.f()}return"#"+n.join("")}function m(t,e,n,r){var a;return"text"===e?a=k(n,r):"display"===e?a=g(t,n,r):"xterm256"===e?a=A(t,r.colors[n]):"rgb"===e&&(a=v(t,n)),a}function v(t,e){e=e.substring(2).slice(0,-1);var n=+e.substr(0,2),r=e.substring(5).split(";"),a=r.map((function(t){return("0"+Number(t).toString(16)).substr(-2)})).join("");return x(t,(38===n?"color:#":"background-color:#")+a)}function g(t,e,n){e=parseInt(e,10);var r,a={"-1":function(){return"
"},0:function(){return t.length&&b(t)},1:function(){return T(t,"b")},3:function(){return T(t,"i")},4:function(){return T(t,"u")},8:function(){return x(t,"display:none")},9:function(){return T(t,"strike")},22:function(){return x(t,"font-weight:normal;text-decoration:none;font-style:normal")},23:function(){return S(t,"i")},24:function(){return S(t,"u")},39:function(){return A(t,n.fg)},49:function(){return O(t,n.bg)},53:function(){return x(t,"text-decoration:overline")}};return a[e]?r=a[e]():4"})).join("")}function y(t,e){for(var n=[],r=t;r<=e;r++)n.push(r);return n}function E(t){return function(e){return(null===t||e.category!==t)&&"all"!==t}}function w(t){t=parseInt(t,10);var e=null;return 0===t?e="all":1===t?e="bold":2")}function x(t,e){return T(t,"span",e)}function A(t,e){return T(t,"span","color:"+e)}function O(t,e){return T(t,"span","background-color:"+e)}function S(t,e){var n;if(t.slice(-1)[0]===e&&(n=t.pop()),n)return""}function R(t,e,n){var r=!1,a=3;function i(){return""}function s(t,e){return n("xterm256",e),""}function c(t){return e.newline?n("display",-1):n("text",t),""}function l(t,e){r=!0,0===e.trim().length&&(e="0"),e=e.trimRight(";").split(";");var a,i=o(e);try{for(i.s();!(a=i.n()).done;){var s=a.value;n("display",s)}}catch(c){i.e(c)}finally{i.f()}return""}function u(t){return n("text",t),""}function f(t){return n("rgb",t),""}var d=[{pattern:/^\x08+/,sub:i},{pattern:/^\x1b\[[012]?K/,sub:i},{pattern:/^\x1b\[\(B/,sub:i},{pattern:/^\x1b\[[34]8;2;\d+;\d+;\d+m/,sub:f},{pattern:/^\x1b\[38;5;(\d+)m/,sub:s},{pattern:/^\n/,sub:c},{pattern:/^\r+\n/,sub:c},{pattern:/^\x1b\[((?:\d{1,3};?)+|)m/,sub:l},{pattern:/^\x1b\[\d?J/,sub:i},{pattern:/^\x1b\[\d{0,3};\d{0,3}f/,sub:i},{pattern:/^\x1b\[?[\d;]{0,3}/,sub:i},{pattern:/^(([^\x1b\x08\r\n])+)/,sub:u}];function p(e,n){n>a&&r||(r=!1,t=t.replace(e.pattern,e.sub))}var h=[],m=t,v=m.length;t:while(v>0){for(var g=0,b=0,y=d.length;b= 0x80 (not a basic code point)","invalid-input":"Invalid input"},w=l-u,k=Math.floor,T=String.fromCharCode;function x(t){throw new RangeError(E[t])}function A(t,e){var n=t.length,r=[];while(n--)r[n]=e(t[n]);return r}function O(t,e){var n=t.split("@"),r="";n.length>1&&(r=n[0]+"@",t=n[1]),t=t.replace(y,".");var a=t.split("."),i=A(a,e).join(".");return r+i}function S(t){var e,n,r=[],a=0,i=t.length;while(a=55296&&e<=56319&&a65535&&(t-=65536,e+=T(t>>>10&1023|55296),t=56320|1023&t),e+=T(t),e})).join("")}function N(t){return t-48<10?t-22:t-65<26?t-65:t-97<26?t-97:l}function C(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function _(t,e,n){var r=0;for(t=n?k(t/p):t>>1,t+=k(t/e);t>w*f>>1;r+=l)t=k(t/w);return k(r+(w+1)*t/(t+d))}function L(t){var e,n,r,a,i,o,s,d,p,g,b=[],y=t.length,E=0,w=m,T=h;for(n=t.lastIndexOf(v),n<0&&(n=0),r=0;r=128&&x("not-basic"),b.push(t.charCodeAt(r));for(a=n>0?n+1:0;a=y&&x("invalid-input"),d=N(t.charCodeAt(a++)),(d>=l||d>k((c-E)/o))&&x("overflow"),E+=d*o,p=s<=T?u:s>=T+f?f:s-T,dk(c/g)&&x("overflow"),o*=g}e=b.length+1,T=_(E-i,e,0==i),k(E/e)>c-w&&x("overflow"),w+=k(E/e),E%=e,b.splice(E++,0,w)}return R(b)}function I(t){var e,n,r,a,i,o,s,d,p,g,b,y,E,w,A,O=[];for(t=S(t),y=t.length,e=m,n=0,i=h,o=0;o=e&&bk((c-n)/E)&&x("overflow"),n+=(s-e)*E,e=s,o=0;oc&&x("overflow"),b==e){for(d=n,p=l;;p+=l){if(g=p<=i?u:p>=i+f?f:p-i,d=l?t?"":void 0:(i=s.charCodeAt(c),i<55296||i>56319||c+1===l||(o=s.charCodeAt(c+1))<56320||o>57343?t?s.charAt(c):i:t?s.slice(c,c+2):o-56320+(i-55296<<10)+65536)}};t.exports={codeAt:i(!1),charAt:i(!0)}},6566:function(t,e,n){"use strict";var r=n("9bf2").f,a=n("7c73"),i=n("e2cc"),o=n("0366"),s=n("19aa"),c=n("2266"),l=n("7dd0"),u=n("2626"),f=n("83ab"),d=n("f183").fastKey,p=n("69f3"),h=p.set,m=p.getterFor;t.exports={getConstructor:function(t,e,n,l){var u=t((function(t,r){s(t,u,e),h(t,{type:e,index:a(null),first:void 0,last:void 0,size:0}),f||(t.size=0),void 0!=r&&c(r,t[l],{that:t,AS_ENTRIES:n})})),p=m(e),v=function(t,e,n){var r,a,i=p(t),o=g(t,e);return o?o.value=n:(i.last=o={index:a=d(e,!0),key:e,value:n,previous:r=i.last,next:void 0,removed:!1},i.first||(i.first=o),r&&(r.next=o),f?i.size++:t.size++,"F"!==a&&(i.index[a]=o)),t},g=function(t,e){var n,r=p(t),a=d(e);if("F"!==a)return r.index[a];for(n=r.first;n;n=n.next)if(n.key==e)return n};return i(u.prototype,{clear:function(){var t=this,e=p(t),n=e.index,r=e.first;while(r)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete n[r.index],r=r.next;e.first=e.last=void 0,f?e.size=0:t.size=0},delete:function(t){var e=this,n=p(e),r=g(e,t);if(r){var a=r.next,i=r.previous;delete n.index[r.index],r.removed=!0,i&&(i.next=a),a&&(a.previous=i),n.first==r&&(n.first=a),n.last==r&&(n.last=i),f?n.size--:e.size--}return!!r},forEach:function(t){var e,n=p(this),r=o(t,arguments.length>1?arguments[1]:void 0,3);while(e=e?e.next:n.first){r(e.value,e.key,this);while(e&&e.removed)e=e.previous}},has:function(t){return!!g(this,t)}}),i(u.prototype,n?{get:function(t){var e=g(this,t);return e&&e.value},set:function(t,e){return v(this,0===t?0:t,e)}}:{add:function(t){return v(this,t=0===t?0:t,t)}}),f&&r(u.prototype,"size",{get:function(){return p(this).size}}),u},setStrong:function(t,e,n){var r=e+" Iterator",a=m(e),i=m(r);l(t,e,(function(t,e){h(this,{type:r,target:t,state:a(t),kind:e,last:void 0})}),(function(){var t=i(this),e=t.kind,n=t.last;while(n&&n.removed)n=n.previous;return t.target&&(t.last=n=n?n.next:t.state.first)?"keys"==e?{value:n.key,done:!1}:"values"==e?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),n?"entries":"values",!n,!0),u(e)}}},"656b":function(t,e,n){var r=n("e2e4"),a=n("f4d6");function i(t,e){e=r(e,t);var n=0,i=e.length;while(null!=t&&nt.length)&&(e=t.length);for(var n=0,r=new Array(e);nu)n=c[u++],r&&!o.call(s,n)||f.push(t?[n,s[n]]:s[n]);return f}};t.exports={entries:s(!0),values:s(!1)}},7073:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=r(n("2504")),i=String.fromCodePoint||function(t){var e="";return t>65535&&(t-=65536,e+=String.fromCharCode(t>>>10&1023|55296),t=56320|1023&t),e+=String.fromCharCode(t),e};function o(t){return t>=55296&&t<=57343||t>1114111?"�":(t in a.default&&(t=a.default[t]),i(t))}e.default=o},7156:function(t,e,n){var r=n("861d"),a=n("d2bb");t.exports=function(t,e,n){var i,o;return a&&"function"==typeof(i=e.constructor)&&i!==n&&r(o=i.prototype)&&o!==n.prototype&&a(t,o),t}},7268:function(t,e,n){"use strict";e.__esModule=!0,e.isSpace=o,e.isAlpha=s,e.preprocessInput=c;var r=/[\t\n\f ]/,a=/[A-Za-z]/,i=/\r\n?/g;function o(t){return r.test(t)}function s(t){return a.test(t)}function c(t){return t.replace(i,"\n")}},"72a2":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-smile",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M8 14s1.5 2 4 2 4-2 4-2M9 9h.01M15 9h.01"}})]))}}},"73d9":function(t,e,n){var r=n("44d2");r("flatMap")},7418:function(t,e){e.f=Object.getOwnPropertySymbols},"746f":function(t,e,n){var r=n("428f"),a=n("5135"),i=n("e538"),o=n("9bf2").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});a(e,t)||o(e,t,{value:i.f(t)})}},"74bb":function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},t(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0;var i=a(n("d2dc")),o=n("2987"),s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.tokenOverride=function(t,e){if(t.type===o.TokenTypes.RESERVED_TOP_LEVEL&&e.value&&"SET"===t.value.toUpperCase()&&"BY"===e.value.toUpperCase())return t.type=o.TokenTypes.RESERVED,t},e}return r(e,t),e.prototype.getTokenizerConfig=function(){return{reservedWords:c,reservedTopLevelWords:l,reservedNewlineWords:f,reservedTopLevelWordsNoIndent:u,stringTypes:['""',"N''","''","``"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:[":"],lineCommentTypes:["--"],specialWordChars:["_","$","#",".","@"]}},e}(i["default"]);e["default"]=s;var c=["A","ACCESSIBLE","AGENT","AGGREGATE","ALL","ALTER","ANY","ARRAY","AS","ASC","AT","ATTRIBUTE","AUTHID","AVG","BETWEEN","BFILE_BASE","BINARY_INTEGER","BINARY","BLOB_BASE","BLOCK","BODY","BOOLEAN","BOTH","BOUND","BREADTH","BULK","BY","BYTE","C","CALL","CALLING","CASCADE","CASE","CHAR_BASE","CHAR","CHARACTER","CHARSET","CHARSETFORM","CHARSETID","CHECK","CLOB_BASE","CLONE","CLOSE","CLUSTER","CLUSTERS","COALESCE","COLAUTH","COLLECT","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPILED","COMPRESS","CONNECT","CONSTANT","CONSTRUCTOR","CONTEXT","CONTINUE","CONVERT","COUNT","CRASH","CREATE","CREDENTIAL","CURRENT","CURRVAL","CURSOR","CUSTOMDATUM","DANGLING","DATA","DATE_BASE","DATE","DAY","DECIMAL","DEFAULT","DEFINE","DELETE","DEPTH","DESC","DETERMINISTIC","DIRECTORY","DISTINCT","DO","DOUBLE","DROP","DURATION","ELEMENT","ELSIF","EMPTY","END","ESCAPE","EXCEPTIONS","EXCLUSIVE","EXECUTE","EXISTS","EXIT","EXTENDS","EXTERNAL","EXTRACT","FALSE","FETCH","FINAL","FIRST","FIXED","FLOAT","FOR","FORALL","FORCE","FROM","FUNCTION","GENERAL","GOTO","GRANT","GROUP","HASH","HEAP","HIDDEN","HOUR","IDENTIFIED","IF","IMMEDIATE","IN","INCLUDING","INDEX","INDEXES","INDICATOR","INDICES","INFINITE","INSTANTIABLE","INT","INTEGER","INTERFACE","INTERVAL","INTO","INVALIDATE","IS","ISOLATION","JAVA","LANGUAGE","LARGE","LEADING","LENGTH","LEVEL","LIBRARY","LIKE","LIKE2","LIKE4","LIKEC","LIMITED","LOCAL","LOCK","LONG","MAP","MAX","MAXLEN","MEMBER","MERGE","MIN","MINUTE","MLSLABEL","MOD","MODE","MONTH","MULTISET","NAME","NAN","NATIONAL","NATIVE","NATURAL","NATURALN","NCHAR","NEW","NEXTVAL","NOCOMPRESS","NOCOPY","NOT","NOWAIT","NULL","NULLIF","NUMBER_BASE","NUMBER","OBJECT","OCICOLL","OCIDATE","OCIDATETIME","OCIDURATION","OCIINTERVAL","OCILOBLOCATOR","OCINUMBER","OCIRAW","OCIREF","OCIREFCURSOR","OCIROWID","OCISTRING","OCITYPE","OF","OLD","ON","ONLY","OPAQUE","OPEN","OPERATOR","OPTION","ORACLE","ORADATA","ORDER","ORGANIZATION","ORLANY","ORLVARY","OTHERS","OUT","OVERLAPS","OVERRIDING","PACKAGE","PARALLEL_ENABLE","PARAMETER","PARAMETERS","PARENT","PARTITION","PASCAL","PCTFREE","PIPE","PIPELINED","PLS_INTEGER","PLUGGABLE","POSITIVE","POSITIVEN","PRAGMA","PRECISION","PRIOR","PRIVATE","PROCEDURE","PUBLIC","RAISE","RANGE","RAW","READ","REAL","RECORD","REF","REFERENCE","RELEASE","RELIES_ON","REM","REMAINDER","RENAME","RESOURCE","RESULT_CACHE","RESULT","RETURN","RETURNING","REVERSE","REVOKE","ROLLBACK","ROW","ROWID","ROWNUM","ROWTYPE","SAMPLE","SAVE","SAVEPOINT","SB1","SB2","SB4","SEARCH","SECOND","SEGMENT","SELF","SEPARATE","SEQUENCE","SERIALIZABLE","SHARE","SHORT","SIZE_T","SIZE","SMALLINT","SOME","SPACE","SPARSE","SQL","SQLCODE","SQLDATA","SQLERRM","SQLNAME","SQLSTATE","STANDARD","START","STATIC","STDDEV","STORED","STRING","STRUCT","STYLE","SUBMULTISET","SUBPARTITION","SUBSTITUTABLE","SUBTYPE","SUCCESSFUL","SUM","SYNONYM","SYSDATE","TABAUTH","TABLE","TDO","THE","THEN","TIME","TIMESTAMP","TIMEZONE_ABBR","TIMEZONE_HOUR","TIMEZONE_MINUTE","TIMEZONE_REGION","TO","TRAILING","TRANSACTION","TRANSACTIONAL","TRIGGER","TRUE","TRUSTED","TYPE","UB1","UB2","UB4","UID","UNDER","UNIQUE","UNPLUG","UNSIGNED","UNTRUSTED","USE","USER","USING","VALIDATE","VALIST","VALUE","VARCHAR","VARCHAR2","VARIABLE","VARIANCE","VARRAY","VARYING","VIEW","VIEWS","VOID","WHENEVER","WHILE","WITH","WORK","WRAPPED","WRITE","YEAR","ZONE"],l=["ADD","ALTER COLUMN","ALTER TABLE","BEGIN","CONNECT BY","DECLARE","DELETE FROM","DELETE","END","EXCEPT","EXCEPTION","FETCH FIRST","FROM","GROUP BY","HAVING","INSERT INTO","INSERT","LIMIT","LOOP","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","START WITH","UPDATE","VALUES","WHERE"],u=["INTERSECT","INTERSECT ALL","MINUS","UNION","UNION ALL"],f=["AND","CROSS APPLY","CROSS JOIN","ELSE","END","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"]},7613:function(t,e,n){"use strict";e.__esModule=!0,e.default=m;var r=n("0fa7"),a=c(r),i=n("2d78d"),o=s(i);function s(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}function c(t){return t&&t.__esModule?t:{default:t}}var l=o.options,u=l.Options,f="StartTag",d="EndTag",p="Chars",h="Comment";function m(t){var e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=a.default.tokenize(t),i=[],o=[];for(n=new u(n),e=0;e0){var x=E(k.attributes);T+=" "+x.join(" ")}T+=">",o.push(T);break;case d:o.push("");break;case p:o.push(b(k.chars));break;case h:o.push("\x3c!--"+b(k.chars)+"--\x3e");break}}return o.join("")}function v(t,e){for(var n=o.tokenize(t),r=[],a=0;a0){var i=e[n];i.type===f&&i.tagName.toUpperCase()===t?a++:i.type===d&&i.tagName.toUpperCase()===t&&a--,r.push(i),n++}return r}function b(t){return t}function y(t){return t.replace(/"/g,""")}function E(t){for(var e=[],n=0;n"),L=o(")"),I=o("&");e.Base=i,e.DOMAIN=s,e.AT=c,e.COLON=l,e.DOT=u,e.PUNCTUATION=f,e.LOCALHOST=d,e.NL=p,e.NUM=h,e.PLUS=m,e.POUND=v,e.QUERY=y,e.PROTOCOL=g,e.MAILTO=b,e.SLASH=E,e.UNDERSCORE=w,e.SYM=k,e.TLD=T,e.WS=x,e.OPENBRACE=A,e.OPENBRACKET=O,e.OPENANGLEBRACKET=S,e.OPENPAREN=R,e.CLOSEBRACE=N,e.CLOSEBRACKET=C,e.CLOSEANGLEBRACKET=_,e.CLOSEPAREN=L,e.AMPERSAND=I},7677:function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n("fd3a"),a=n("8c86");function i(t,e){Object(a["a"])(2,arguments);var n=Object(r["a"])(t),i=Object(r["a"])(e);return n.getTime()",d="<",p="prototype",h="script",m=u("IE_PROTO"),v=function(){},g=function(t){return d+h+f+t+d+"/"+h+f},b=function(t){t.write(g("")),t.close();var e=t.parentWindow.Object;return t=null,e},y=function(){var t,e=l("iframe"),n="java"+h+":";return e.style.display="none",c.appendChild(e),e.src=String(n),t=e.contentWindow.document,t.open(),t.write(g("document.F=Object")),t.close(),t.F},E=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}E=r?b(r):y();var t=o.length;while(t--)delete E[p][o[t]];return E()};s[m]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(v[p]=a(t),n=new v,v[p]=null,n[m]=t):n=E(),void 0===e?n:i(n,e)}},"7db0":function(t,e,n){"use strict";var r=n("23e7"),a=n("b727").find,i=n("44d2"),o="find",s=!0;o in[]&&Array(1)[o]((function(){s=!1})),r({target:"Array",proto:!0,forced:s},{find:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}}),i(o)},"7dd0":function(t,e,n){"use strict";var r=n("23e7"),a=n("9ed3"),i=n("e163"),o=n("d2bb"),s=n("d44e"),c=n("9112"),l=n("6eeb"),u=n("b622"),f=n("c430"),d=n("3f8c"),p=n("ae93"),h=p.IteratorPrototype,m=p.BUGGY_SAFARI_ITERATORS,v=u("iterator"),g="keys",b="values",y="entries",E=function(){return this};t.exports=function(t,e,n,u,p,w,k){a(n,e,u);var T,x,A,O=function(t){if(t===p&&_)return _;if(!m&&t in N)return N[t];switch(t){case g:return function(){return new n(this,t)};case b:return function(){return new n(this,t)};case y:return function(){return new n(this,t)}}return function(){return new n(this)}},S=e+" Iterator",R=!1,N=t.prototype,C=N[v]||N["@@iterator"]||p&&N[p],_=!m&&C||O(p),L="Array"==e&&N.entries||C;if(L&&(T=i(L.call(new t)),h!==Object.prototype&&T.next&&(f||i(T)===h||(o?o(T,h):"function"!=typeof T[v]&&c(T,v,E)),s(T,S,!0,!0),f&&(d[S]=E))),p==b&&C&&C.name!==b&&(R=!0,_=function(){return C.call(this)}),f&&!k||N[v]===_||c(N,v,_),d[e]=_,p)if(x={values:O(b),keys:w?_:O(g),entries:O(y)},k)for(A in x)(m||R||!(A in N))&&l(N,A,x[A]);else r({target:e,proto:!0,forced:m||R},x);return x}},"7f9a":function(t,e,n){var r=n("da84"),a=n("8925"),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(a(i))},"806d":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-list",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"}})]))}}},"81c8":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-settings",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"3"}}),n("path",{attrs:{d:"M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z"}})]))}}},"81d5":function(t,e,n){"use strict";var r=n("7b0b"),a=n("23cb"),i=n("50c4");t.exports=function(t){var e=r(this),n=i(e.length),o=arguments.length,s=a(o>1?arguments[1]:void 0,n),c=o>2?arguments[2]:void 0,l=void 0===c?n:a(c,n);while(l>s)e[s++]=t;return e}},"825a":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},"83ab":function(t,e,n){var r=n("d039");t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(t,e,n){"use strict";var r=n("c04e"),a=n("9bf2"),i=n("5c6c");t.exports=function(t,e,n){var o=r(e);o in t?a.f(t,o,i(0,n)):t[o]=n}},"841c":function(t,e,n){"use strict";var r=n("d784"),a=n("825a"),i=n("1d80"),o=n("129f"),s=n("14c3");r("search",(function(t,e,n){return[function(e){var n=i(this),r=void 0==e?void 0:e[t];return void 0!==r?r.call(e,n):new RegExp(e)[t](String(n))},function(t){var r=n(e,this,t);if(r.done)return r.value;var i=a(this),c=String(t),l=i.lastIndex;o(l,0)||(i.lastIndex=0);var u=s(i,c);return o(i.lastIndex,l)||(i.lastIndex=l),null===u?-1:u.index}]}))},8609:function(t,e,n){"use strict";e.__esModule=!0;var r=function(){function t(t){this.params=t,this.index=0,this.params=t}return t.prototype.get=function(t){var e=t.key,n=t.value;return this.params?e?this.params[e]:this.params[this.index++]:n},t}();e["default"]=r},"861d":function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},"876f":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-twitter",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M23 3a10.9 10.9 0 01-3.14 1.53 4.48 4.48 0 00-7.86 3v1A10.66 10.66 0 013 4s-4 9 5 13a11.64 11.64 0 01-7 2c9 5 20 0 20-11.5a4.5 4.5 0 00-.08-.83A7.72 7.72 0 0023 3z"}})]))}}},"87f4":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-clock",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M12 6v6l4 2"}})]))}}},"87ff":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-x-circle",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M15 9l-6 6M9 9l6 6"}})]))}}},8925:function(t,e,n){var r=n("c6cd"),a=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(t){return a.call(t)}),t.exports=r.inspectSource},"89b6":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodeXMLStrict=e.decodeHTML5Strict=e.decodeHTML4Strict=e.decodeHTML5=e.decodeHTML4=e.decodeHTMLStrict=e.decodeHTML=e.decodeXML=e.encodeHTML5=e.encodeHTML4=e.escapeUTF8=e.escape=e.encodeNonAsciiHTML=e.encodeHTML=e.encodeXML=e.encode=e.decodeStrict=e.decode=void 0;var r=n("a16e"),a=n("051a");function i(t,e){return(!e||e<=0?r.decodeXML:r.decodeHTML)(t)}function o(t,e){return(!e||e<=0?r.decodeXML:r.decodeHTMLStrict)(t)}function s(t,e){return(!e||e<=0?a.encodeXML:a.encodeHTML)(t)}e.decode=i,e.decodeStrict=o,e.encode=s;var c=n("051a");Object.defineProperty(e,"encodeXML",{enumerable:!0,get:function(){return c.encodeXML}}),Object.defineProperty(e,"encodeHTML",{enumerable:!0,get:function(){return c.encodeHTML}}),Object.defineProperty(e,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return c.encodeNonAsciiHTML}}),Object.defineProperty(e,"escape",{enumerable:!0,get:function(){return c.escape}}),Object.defineProperty(e,"escapeUTF8",{enumerable:!0,get:function(){return c.escapeUTF8}}),Object.defineProperty(e,"encodeHTML4",{enumerable:!0,get:function(){return c.encodeHTML}}),Object.defineProperty(e,"encodeHTML5",{enumerable:!0,get:function(){return c.encodeHTML}});var l=n("a16e");Object.defineProperty(e,"decodeXML",{enumerable:!0,get:function(){return l.decodeXML}}),Object.defineProperty(e,"decodeHTML",{enumerable:!0,get:function(){return l.decodeHTML}}),Object.defineProperty(e,"decodeHTMLStrict",{enumerable:!0,get:function(){return l.decodeHTMLStrict}}),Object.defineProperty(e,"decodeHTML4",{enumerable:!0,get:function(){return l.decodeHTML}}),Object.defineProperty(e,"decodeHTML5",{enumerable:!0,get:function(){return l.decodeHTML}}),Object.defineProperty(e,"decodeHTML4Strict",{enumerable:!0,get:function(){return l.decodeHTMLStrict}}),Object.defineProperty(e,"decodeHTML5Strict",{enumerable:!0,get:function(){return l.decodeHTMLStrict}}),Object.defineProperty(e,"decodeXMLStrict",{enumerable:!0,get:function(){return l.decodeXML}})},"8aa5":function(t,e,n){"use strict";var r=n("6547").charAt;t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},"8c7a":function(t,e,n){(function(e){var n="undefined"!==typeof window?window:"undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},r=function(t){var e=/\blang(?:uage)?-([\w-]+)\b/i,n=0,r={},a={manual:t.Prism&&t.Prism.manual,disableWorkerMessageHandler:t.Prism&&t.Prism.disableWorkerMessageHandler,util:{encode:function t(e){return e instanceof i?new i(e.type,t(e.content),e.alias):Array.isArray(e)?e.map(t):e.replace(/&/g,"&").replace(/=f.reach)break;var x=k.value;if(e.length>t.length)return;if(!(x instanceof i)){var A,O=1;if(b){if(A=o(w,T,t,g),!A)break;var S=A.index,R=A.index+A[0].length,N=T;N+=k.value.length;while(S>=N)k=k.next,N+=k.value.length;if(N-=k.value.length,T=N,k.value instanceof i)continue;for(var C=k;C!==e.tail&&(Nf.reach&&(f.reach=D);var P=k.prev;L&&(P=l(e,P,L),T+=L.length),u(e,P,O);var M=new i(d,v?a.tokenize(_,v):_,y,_);if(k=l(e,P,M),I&&l(e,k,I),O>1){var U={cause:d+","+h,reach:D};s(t,e,n,k.prev,T,U),f&&U.reach>f.reach&&(f.reach=U.reach)}}}}}}function c(){var t={value:null,prev:null,next:null},e={value:null,prev:t,next:null};t.next=e,this.head=t,this.tail=e,this.length=0}function l(t,e,n){var r=e.next,a={value:n,prev:e,next:r};return e.next=a,r.prev=a,t.length++,a}function u(t,e,n){for(var r=e.next,a=0;a"+i.content+""},!t.document)return t.addEventListener?(a.disableWorkerMessageHandler||t.addEventListener("message",(function(e){var n=JSON.parse(e.data),r=n.language,i=n.code,o=n.immediateClose;t.postMessage(a.highlight(i,a.languages[r],r)),o&&t.close()}),!1),a):a;var d=a.util.currentScript();function p(){a.manual||a.highlightAll()}if(d&&(a.filename=d.src,d.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&d&&d.defer?document.addEventListener("DOMContentLoaded",p):window.requestAnimationFrame?window.requestAnimationFrame(p):window.setTimeout(p,16)}return a}(n); +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */t.exports&&(t.exports=r),"undefined"!==typeof e&&(e.Prism=r)}).call(this,n("c8ba"))},"8c86":function(t,e,n){"use strict";function r(t,e){if(e.length1?"s":"")+" required, but only "+e.length+" present")}n.d(e,"a",(function(){return r}))},"8ec9":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-zap",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z"}})]))}}},"90e3":function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},9112:function(t,e,n){var r=n("83ab"),a=n("9bf2"),i=n("5c6c");t.exports=r?function(t,e,n){return a.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},9263:function(t,e,n){"use strict";var r=n("ad6d"),a=n("9f7f"),i=n("5692"),o=n("7c73"),s=n("69f3").get,c=n("fce3"),l=n("107c"),u=RegExp.prototype.exec,f=i("native-string-replace",String.prototype.replace),d=u,p=function(){var t=/a/,e=/b*/g;return u.call(t,"a"),u.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),h=a.UNSUPPORTED_Y||a.BROKEN_CARET,m=void 0!==/()??/.exec("")[1],v=p||m||h||c||l;v&&(d=function(t){var e,n,a,i,c,l,v,g=this,b=s(g),y=b.raw;if(y)return y.lastIndex=g.lastIndex,e=d.call(y,t),g.lastIndex=y.lastIndex,e;var E=b.groups,w=h&&g.sticky,k=r.call(g),T=g.source,x=0,A=t;if(w&&(k=k.replace("y",""),-1===k.indexOf("g")&&(k+="g"),A=String(t).slice(g.lastIndex),g.lastIndex>0&&(!g.multiline||g.multiline&&"\n"!==t[g.lastIndex-1])&&(T="(?: "+T+")",A=" "+A,x++),n=new RegExp("^(?:"+T+")",k)),m&&(n=new RegExp("^"+T+"$(?!\\s)",k)),p&&(a=g.lastIndex),i=u.call(w?n:g,A),w?i?(i.input=i.input.slice(x),i[0]=i[0].slice(x),i.index=g.lastIndex,g.lastIndex+=i[0].length):g.lastIndex=0:p&&i&&(g.lastIndex=g.global?i.index+i[0].length:a),m&&i&&i.length>1&&f.call(i[0],n,(function(){for(c=1;c=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return a("end");if(o.tryLoc<=this.prev){var c=r.call(o,"catchLoc"),l=r.call(o,"finallyLoc");if(c&&l){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&r.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),R(n),m}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var a=r.arg;R(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:C(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),m}},t}(t.exports);try{regeneratorRuntime=r}catch(a){Function("r","regeneratorRuntime = r")(r)}},9976:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-chevron-left",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M15 18l-6-6 6-6"}})]))}}},"99af":function(t,e,n){"use strict";var r=n("23e7"),a=n("d039"),i=n("e8b5"),o=n("861d"),s=n("7b0b"),c=n("50c4"),l=n("8418"),u=n("65f0"),f=n("1dde"),d=n("b622"),p=n("2d00"),h=d("isConcatSpreadable"),m=9007199254740991,v="Maximum allowed index exceeded",g=p>=51||!a((function(){var t=[];return t[h]=!1,t.concat()[0]!==t})),b=f("concat"),y=function(t){if(!o(t))return!1;var e=t[h];return void 0!==e?!!e:i(t)},E=!g||!b;r({target:"Array",proto:!0,forced:E},{concat:function(t){var e,n,r,a,i,o=s(this),f=u(o,0),d=0;for(e=-1,r=arguments.length;em)throw TypeError(v);for(n=0;n=m)throw TypeError(v);l(f,d++,i)}return f.length=d,f}})},"9a87":function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-info",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M12 16v-4M12 8h.01"}})]))}}},"9b02":function(t,e,n){var r=n("656b");function a(t,e,n){var a=null==t?void 0:r(t,e);return void 0===a?n:a}t.exports=a},"9bdd":function(t,e,n){var r=n("825a"),a=n("2a62");t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(o){throw a(t),o}}},"9bf2":function(t,e,n){var r=n("83ab"),a=n("0cfb"),i=n("825a"),o=n("c04e"),s=Object.defineProperty;e.f=r?s:function(t,e,n){if(i(t),e=o(e,!0),i(n),a)try{return s(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"9e69":function(t,e,n){var r=n("2b3e"),a=r.Symbol;t.exports=a},"9ed3":function(t,e,n){"use strict";var r=n("ae93").IteratorPrototype,a=n("7c73"),i=n("5c6c"),o=n("d44e"),s=n("3f8c"),c=function(){return this};t.exports=function(t,e,n){var l=e+" Iterator";return t.prototype=a(r,{next:i(1,n)}),o(t,l,!1,!0),s[l]=c,t}},"9f3d":function(t,e,n){"use strict";e.__esModule=!0;var r=n("7268");function a(t,e){this.delegate=t,this.entityParser=e,this.state=null,this.input=null,this.index=-1,this.line=-1,this.column=-1,this.tagLine=-1,this.tagColumn=-1,this.reset()}a.prototype={reset:function(){this.state="beforeData",this.input="",this.index=0,this.line=1,this.column=0,this.tagLine=-1,this.tagColumn=-1,this.delegate.reset()},tokenize:function(t){this.reset(),this.tokenizePart(t),this.tokenizeEOF()},tokenizePart:function(t){this.input+=(0,r.preprocessInput)(t);while(this.index"===t?(this.delegate.finishComment(),this.state="beforeData"):(this.delegate.appendToCommentData(t),this.state="comment")},commentStartDash:function(){var t=this.consume();"-"===t?this.state="commentEnd":">"===t?(this.delegate.finishComment(),this.state="beforeData"):(this.delegate.appendToCommentData("-"),this.state="comment")},comment:function(){var t=this.consume();"-"===t?this.state="commentEndDash":this.delegate.appendToCommentData(t)},commentEndDash:function(){var t=this.consume();"-"===t?this.state="commentEnd":(this.delegate.appendToCommentData("-"+t),this.state="comment")},commentEnd:function(){var t=this.consume();">"===t?(this.delegate.finishComment(),this.state="beforeData"):(this.delegate.appendToCommentData("--"+t),this.state="comment")},tagName:function(){var t=this.consume();(0,r.isSpace)(t)?this.state="beforeAttributeName":"/"===t?this.state="selfClosingStartTag":">"===t?(this.delegate.finishTag(),this.state="beforeData"):this.delegate.appendToTagName(t)},beforeAttributeName:function(){var t=this.peek();(0,r.isSpace)(t)?this.consume():"/"===t?(this.state="selfClosingStartTag",this.consume()):">"===t?(this.consume(),this.delegate.finishTag(),this.state="beforeData"):(this.state="attributeName",this.delegate.beginAttribute(),this.consume(),this.delegate.appendToAttributeName(t))},attributeName:function(){var t=this.peek();(0,r.isSpace)(t)?(this.state="afterAttributeName",this.consume()):"/"===t?(this.delegate.beginAttributeValue(!1),this.delegate.finishAttributeValue(),this.consume(),this.state="selfClosingStartTag"):"="===t?(this.state="beforeAttributeValue",this.consume()):">"===t?(this.delegate.beginAttributeValue(!1),this.delegate.finishAttributeValue(),this.consume(),this.delegate.finishTag(),this.state="beforeData"):(this.consume(),this.delegate.appendToAttributeName(t))},afterAttributeName:function(){var t=this.peek();(0,r.isSpace)(t)?this.consume():"/"===t?(this.delegate.beginAttributeValue(!1),this.delegate.finishAttributeValue(),this.consume(),this.state="selfClosingStartTag"):"="===t?(this.consume(),this.state="beforeAttributeValue"):">"===t?(this.delegate.beginAttributeValue(!1),this.delegate.finishAttributeValue(),this.consume(),this.delegate.finishTag(),this.state="beforeData"):(this.delegate.beginAttributeValue(!1),this.delegate.finishAttributeValue(),this.consume(),this.state="attributeName",this.delegate.beginAttribute(),this.delegate.appendToAttributeName(t))},beforeAttributeValue:function(){var t=this.peek();(0,r.isSpace)(t)?this.consume():'"'===t?(this.state="attributeValueDoubleQuoted",this.delegate.beginAttributeValue(!0),this.consume()):"'"===t?(this.state="attributeValueSingleQuoted",this.delegate.beginAttributeValue(!0),this.consume()):">"===t?(this.delegate.beginAttributeValue(!1),this.delegate.finishAttributeValue(),this.consume(),this.delegate.finishTag(),this.state="beforeData"):(this.state="attributeValueUnquoted",this.delegate.beginAttributeValue(!1),this.consume(),this.delegate.appendToAttributeValue(t))},attributeValueDoubleQuoted:function(){var t=this.consume();'"'===t?(this.delegate.finishAttributeValue(),this.state="afterAttributeValueQuoted"):"&"===t?this.delegate.appendToAttributeValue(this.consumeCharRef('"')||"&"):this.delegate.appendToAttributeValue(t)},attributeValueSingleQuoted:function(){var t=this.consume();"'"===t?(this.delegate.finishAttributeValue(),this.state="afterAttributeValueQuoted"):"&"===t?this.delegate.appendToAttributeValue(this.consumeCharRef("'")||"&"):this.delegate.appendToAttributeValue(t)},attributeValueUnquoted:function(){var t=this.peek();(0,r.isSpace)(t)?(this.delegate.finishAttributeValue(),this.consume(),this.state="beforeAttributeName"):"&"===t?(this.consume(),this.delegate.appendToAttributeValue(this.consumeCharRef(">")||"&")):">"===t?(this.delegate.finishAttributeValue(),this.consume(),this.delegate.finishTag(),this.state="beforeData"):(this.consume(),this.delegate.appendToAttributeValue(t))},afterAttributeValueQuoted:function(){var t=this.peek();(0,r.isSpace)(t)?(this.consume(),this.state="beforeAttributeName"):"/"===t?(this.consume(),this.state="selfClosingStartTag"):">"===t?(this.consume(),this.delegate.finishTag(),this.state="beforeData"):this.state="beforeAttributeName"},selfClosingStartTag:function(){var t=this.peek();">"===t?(this.consume(),this.delegate.markTagAsSelfClosing(),this.delegate.finishTag(),this.state="beforeData"):this.state="beforeAttributeName"},endTagOpen:function(){var t=this.consume();(0,r.isAlpha)(t)&&(this.state="tagName",this.delegate.beginEndTag(),this.delegate.appendToTagName(t.toLowerCase()))}}},e.default=a},"9f7f":function(t,e,n){var r=n("d039"),a=function(t,e){return RegExp(t,e)};e.UNSUPPORTED_Y=r((function(){var t=a("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),e.BROKEN_CARET=r((function(){var t=a("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},a096:function(t,e,n){"use strict";e.__esModule=!0,e.default=u;var r=n("a733"),a=l(r),i=n("f02d"),o=l(i),s=n("bcb5"),c=l(s);function l(t){return t&&t.__esModule?t:{default:t}}function u(t,e){var n=new a.default(new o.default(c.default),e);return n.tokenize(t)}},a15b:function(t,e,n){"use strict";var r=n("23e7"),a=n("44ad"),i=n("fc6a"),o=n("a640"),s=[].join,c=a!=Object,l=o("join",",");r({target:"Array",proto:!0,forced:c||!l},{join:function(t){return s.call(i(this),void 0===t?",":t)}})},a16e:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.decodeHTML=e.decodeHTMLStrict=e.decodeXML=void 0;var a=r(n("c560")),i=r(n("b960")),o=r(n("f5f2")),s=r(n("7073")),c=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;function l(t){var e=f(t);return function(t){return String(t).replace(c,e)}}e.decodeXML=l(o.default),e.decodeHTMLStrict=l(a.default);var u=function(t,e){return t0&&r(d))p=o(t,e,d,a(d.length),p,l-1)-1;else{if(p>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[p]=d}p++}h++}return p};t.exports=o},a434:function(t,e,n){"use strict";var r=n("23e7"),a=n("23cb"),i=n("a691"),o=n("50c4"),s=n("7b0b"),c=n("65f0"),l=n("8418"),u=n("1dde"),f=u("splice"),d=Math.max,p=Math.min,h=9007199254740991,m="Maximum allowed length exceeded";r({target:"Array",proto:!0,forced:!f},{splice:function(t,e){var n,r,u,f,v,g,b=s(this),y=o(b.length),E=a(t,y),w=arguments.length;if(0===w?n=r=0:1===w?(n=0,r=y-E):(n=w-2,r=p(d(i(e),0),y-E)),y+n-r>h)throw TypeError(m);for(u=c(b,r),f=0;fy-r+n;f--)delete b[f-1]}else if(n>r)for(f=y-r;f>E;f--)v=f+r-1,g=f+n-1,v in b?b[g]=b[v]:delete b[g];for(f=0;fi)a.push(arguments[i++]);if(r=e,(p(e)||void 0!==t)&&!st(t))return d(e)||(e=function(t,e){if("function"==typeof r&&(e=r.call(this,t,e)),!st(e))return e}),a[1]=e,W.apply(null,a)}})}V[H][z]||S(V[H],z,V[H].valueOf),M(V,B),_[F]=!0},a501:function(t,e){function n(t,e){if(!Array.isArray(t)||!Array.isArray(e))throw new Error("expected both arguments to be arrays");for(var n=[],r=t.length,a=0;a-1&&-1==n.indexOf(i)&&n.push(i)}return n}t.exports=n},a524:function(t,e,n){var r=n("4245");function a(t){return r(this,t).has(t)}t.exports=a},a630:function(t,e,n){var r=n("23e7"),a=n("4df4"),i=n("1c7e"),o=!i((function(t){Array.from(t)}));r({target:"Array",stat:!0,forced:o},{from:a})},a640:function(t,e,n){"use strict";var r=n("d039");t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){throw 1},1)}))}},a691:function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},a729:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-cpu",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("rect",{attrs:{x:"4",y:"4",width:"16",height:"16",rx:"2",ry:"2"}}),n("path",{attrs:{d:"M9 9h6v6H9zM9 1v3M15 1v3M9 20v3M15 20v3M20 9h3M20 14h3M1 9h3M1 14h3"}})]))}}},a733:function(t,e,n){"use strict";e.__esModule=!0;var r=n("9f3d"),a=i(r);function i(t){return t&&t.__esModule?t:{default:t}}function o(t,e){this.token=null,this.startLine=1,this.startColumn=0,this.options=e||{},this.tokenizer=new a.default(this,t)}o.prototype={tokenize:function(t){return this.tokens=[],this.tokenizer.tokenize(t),this.tokens},tokenizePart:function(t){return this.tokens=[],this.tokenizer.tokenizePart(t),this.tokens},tokenizeEOF:function(){return this.tokens=[],this.tokenizer.tokenizeEOF(),this.tokens[0]},reset:function(){this.token=null,this.startLine=1,this.startColumn=0},addLocInfo:function(){this.options.loc&&(this.token.loc={start:{line:this.startLine,column:this.startColumn},end:{line:this.tokenizer.line,column:this.tokenizer.column}}),this.startLine=this.tokenizer.line,this.startColumn=this.tokenizer.column},beginData:function(){this.token={type:"Chars",chars:""},this.tokens.push(this.token)},appendToData:function(t){this.token.chars+=t},finishData:function(){this.addLocInfo()},beginComment:function(){this.token={type:"Comment",chars:""},this.tokens.push(this.token)},appendToCommentData:function(t){this.token.chars+=t},finishComment:function(){this.addLocInfo()},beginStartTag:function(){this.token={type:"StartTag",tagName:"",attributes:[],selfClosing:!1},this.tokens.push(this.token)},beginEndTag:function(){this.token={type:"EndTag",tagName:""},this.tokens.push(this.token)},finishTag:function(){this.addLocInfo()},markTagAsSelfClosing:function(){this.token.selfClosing=!0},appendToTagName:function(t){this.token.tagName+=t},beginAttribute:function(){this._currentAttribute=["","",null],this.token.attributes.push(this._currentAttribute)},appendToAttributeName:function(t){this._currentAttribute[0]+=t},beginAttributeValue:function(t){this._currentAttribute[2]=t},appendToAttributeValue:function(t){this._currentAttribute[1]=this._currentAttribute[1]||"",this._currentAttribute[1]+=t},finishAttributeValue:function(){}},e.default=o},a79d:function(t,e,n){"use strict";var r=n("23e7"),a=n("c430"),i=n("fea9"),o=n("d039"),s=n("d066"),c=n("4840"),l=n("cdf9"),u=n("6eeb"),f=!!i&&o((function(){i.prototype["finally"].call({then:function(){}},(function(){}))}));if(r({target:"Promise",proto:!0,real:!0,forced:f},{finally:function(t){var e=c(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return l(e,t()).then((function(){return n}))}:t,n?function(n){return l(e,t()).then((function(){throw n}))}:t)}}),!a&&"function"==typeof i){var d=s("Promise").prototype["finally"];i.prototype["finally"]!==d&&u(i.prototype,"finally",d,{unsafe:!0})}},ab13:function(t,e,n){var r=n("b622"),a=r("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,"/./"[t](e)}catch(r){}}return!1}},ac1f:function(t,e,n){"use strict";var r=n("23e7"),a=n("9263");r({target:"RegExp",proto:!0,forced:/./.exec!==a},{exec:a})},acb2:function(t,e,n){"use strict";e.__esModule=!0;var r=function(t){return void 0===t&&(t=[]),t[t.length-1]};e["default"]=r},ad6d:function(t,e,n){"use strict";var r=n("825a");t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},addb:function(t,e){var n=Math.floor,r=function(t,e){var o=t.length,s=n(o/2);return o<8?a(t,e):i(r(t.slice(0,s),e),r(t.slice(s),e),e)},a=function(t,e){var n,r,a=t.length,i=1;while(i0)t[r]=t[--r];r!==i++&&(t[r]=n)}return t},i=function(t,e,n){var r=t.length,a=e.length,i=0,o=0,s=[];while(i?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|IN|ILIKE|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}},afab:function(t,e,n){var r,a; +/*! + * URI.js - Mutating URLs + * Second Level Domain (SLD) Support + * + * Version: 1.19.7 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */(function(i,o){"use strict";t.exports?t.exports=o():(r=o,a="function"===typeof r?r.call(e,n,e,t):r,void 0===a||(t.exports=a))})(0,(function(t){"use strict";var e=t&&t.SecondLevelDomains,n={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ",do:" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ",in:" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch ",com:"ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ",net:"gb jp se uk ",org:"ae",de:"com "},has:function(t){var e=t.lastIndexOf(".");if(e<=0||e>=t.length-1)return!1;var r=t.lastIndexOf(".",e-1);if(r<=0||r>=e-1)return!1;var a=n.list[t.slice(e+1)];return!!a&&a.indexOf(" "+t.slice(r+1,e)+" ")>=0},is:function(t){var e=t.lastIndexOf(".");if(e<=0||e>=t.length-1)return!1;var r=t.lastIndexOf(".",e-1);if(r>=0)return!1;var a=n.list[t.slice(e+1)];return!!a&&a.indexOf(" "+t.slice(0,e)+" ")>=0},get:function(t){var e=t.lastIndexOf(".");if(e<=0||e>=t.length-1)return null;var r=t.lastIndexOf(".",e-1);if(r<=0||r>=e-1)return null;var a=n.list[t.slice(e+1)];return a?a.indexOf(" "+t.slice(r+1,e)+" ")<0?null:t.slice(r+1):null},noConflict:function(){return t.SecondLevelDomains===this&&(t.SecondLevelDomains=e),this}};return n}))},b022:function(t,e,n){"use strict";e.__esModule=!0;var r=n("2987"),a=50,i=function(){function t(){this.level=0}return t.prototype.beginIfPossible=function(t,e){0===this.level&&this.isInlineBlock(t,e)?this.level=1:this.level>0?this.level++:this.level=0},t.prototype.end=function(){this.level--},t.prototype.isActive=function(){return this.level>0},t.prototype.isInlineBlock=function(t,e){for(var n=0,i=0,o=e;oa)return!1;if(s.type===r.TokenTypes.OPEN_PAREN)i++;else if(s.type===r.TokenTypes.CLOSE_PAREN&&(i--,0===i))return!0;if(this.isForbiddenToken(s))return!1}return!1},t.prototype.isForbiddenToken=function(t){var e=t.type,n=t.value;return e===r.TokenTypes.RESERVED_TOP_LEVEL||e===r.TokenTypes.RESERVED_NEWLINE||e===r.TokenTypes.LINE_COMMENT||e===r.TokenTypes.BLOCK_COMMENT||";"===n},t}();e["default"]=i},b041:function(t,e,n){"use strict";var r=n("00ee"),a=n("f5df");t.exports=r?{}.toString:function(){return"[object "+a(this)+"]"}},b0c0:function(t,e,n){var r=n("83ab"),a=n("9bf2").f,i=Function.prototype,o=i.toString,s=/^\s*function ([^ (]*)/,c="name";r&&!(c in i)&&a(i,c,{configurable:!0,get:function(){try{return o.call(this).match(s)[1]}catch(t){return""}}})},b166:function(t,e,n){"use strict";n.d(e,"a",(function(){return Lt}));var r=n("fd3a"),a=n("8c86");function i(t){Object(a["a"])(1,arguments);var e=Object(r["a"])(t);return!isNaN(e)}var o={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function s(t,e,n){var r;return n=n||{},r="string"===typeof o[t]?o[t]:1===e?o[t].one:o[t].other.replace("{{count}}",e),n.addSuffix?n.comparison>0?"in "+r:r+" ago":r}function c(t){return function(e){var n=e||{},r=n.width?String(n.width):t.defaultWidth,a=t.formats[r]||t.formats[t.defaultWidth];return a}}var l={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},u={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},f={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},d={date:c({formats:l,defaultWidth:"full"}),time:c({formats:u,defaultWidth:"full"}),dateTime:c({formats:f,defaultWidth:"full"})},p=d,h={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function m(t,e,n,r){return h[t]}function v(t){return function(e,n){var r,a=n||{},i=a.context?String(a.context):"standalone";if("formatting"===i&&t.formattingValues){var o=t.defaultFormattingWidth||t.defaultWidth,s=a.width?String(a.width):o;r=t.formattingValues[s]||t.formattingValues[o]}else{var c=t.defaultWidth,l=a.width?String(a.width):t.defaultWidth;r=t.values[l]||t.values[c]}var u=t.argumentCallback?t.argumentCallback(e):e;return r[u]}}var g={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},b={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},y={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},E={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},w={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},k={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}};function T(t,e){var n=Number(t),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"}var x={ordinalNumber:T,era:v({values:g,defaultWidth:"wide"}),quarter:v({values:b,defaultWidth:"wide",argumentCallback:function(t){return Number(t)-1}}),month:v({values:y,defaultWidth:"wide"}),day:v({values:E,defaultWidth:"wide"}),dayPeriod:v({values:w,defaultWidth:"wide",formattingValues:k,defaultFormattingWidth:"wide"})},A=x;function O(t){return function(e,n){var r=String(e),a=n||{},i=r.match(t.matchPattern);if(!i)return null;var o=i[0],s=r.match(t.parsePattern);if(!s)return null;var c=t.valueCallback?t.valueCallback(s[0]):s[0];return c=a.valueCallback?a.valueCallback(c):c,{value:c,rest:r.slice(o.length)}}}function S(t){return function(e,n){var r=String(e),a=n||{},i=a.width,o=i&&t.matchPatterns[i]||t.matchPatterns[t.defaultMatchWidth],s=r.match(o);if(!s)return null;var c,l=s[0],u=i&&t.parsePatterns[i]||t.parsePatterns[t.defaultParseWidth];return c="[object Array]"===Object.prototype.toString.call(u)?N(u,(function(t){return t.test(l)})):R(u,(function(t){return t.test(l)})),c=t.valueCallback?t.valueCallback(c):c,c=a.valueCallback?a.valueCallback(c):c,{value:c,rest:r.slice(l.length)}}}function R(t,e){for(var n in t)if(t.hasOwnProperty(n)&&e(t[n]))return n}function N(t,e){for(var n=0;n0?n:1-n;return $("yy"===e?r%100:r,e.length)},M:function(t,e){var n=t.getUTCMonth();return"M"===e?String(n+1):$(n+1,2)},d:function(t,e){return $(t.getUTCDate(),e.length)},a:function(t,e){var n=t.getUTCHours()/12>=1?"pm":"am";switch(e){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];case"aaaa":default:return"am"===n?"a.m.":"p.m."}},h:function(t,e){return $(t.getUTCHours()%12||12,e.length)},H:function(t,e){return $(t.getUTCHours(),e.length)},m:function(t,e){return $(t.getUTCMinutes(),e.length)},s:function(t,e){return $(t.getUTCSeconds(),e.length)},S:function(t,e){var n=e.length,r=t.getUTCMilliseconds(),a=Math.floor(r*Math.pow(10,n-3));return $(a,e.length)}},K=Q,J=864e5;function Z(t){Object(a["a"])(1,arguments);var e=Object(r["a"])(t),n=e.getTime();e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0);var i=e.getTime(),o=n-i;return Math.floor(o/J)+1}function tt(t){Object(a["a"])(1,arguments);var e=1,n=Object(r["a"])(t),i=n.getUTCDay(),o=(i=o.getTime()?n+1:e.getTime()>=c.getTime()?n:n-1}function nt(t){Object(a["a"])(1,arguments);var e=et(t),n=new Date(0);n.setUTCFullYear(e,0,4),n.setUTCHours(0,0,0,0);var r=tt(n);return r}var rt=6048e5;function at(t){Object(a["a"])(1,arguments);var e=Object(r["a"])(t),n=tt(e).getTime()-nt(e).getTime();return Math.round(n/rt)+1}function it(t,e){Object(a["a"])(1,arguments);var n=e||{},i=n.locale,o=i&&i.options&&i.options.weekStartsOn,s=null==o?0:Object(V["a"])(o),c=null==n.weekStartsOn?s:Object(V["a"])(n.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var l=Object(r["a"])(t),u=l.getUTCDay(),f=(u=1&&u<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var f=new Date(0);f.setUTCFullYear(i+1,0,u),f.setUTCHours(0,0,0,0);var d=it(f,e),p=new Date(0);p.setUTCFullYear(i,0,u),p.setUTCHours(0,0,0,0);var h=it(p,e);return n.getTime()>=d.getTime()?i+1:n.getTime()>=h.getTime()?i:i-1}function st(t,e){Object(a["a"])(1,arguments);var n=e||{},r=n.locale,i=r&&r.options&&r.options.firstWeekContainsDate,o=null==i?1:Object(V["a"])(i),s=null==n.firstWeekContainsDate?o:Object(V["a"])(n.firstWeekContainsDate),c=ot(t,e),l=new Date(0);l.setUTCFullYear(c,0,s),l.setUTCHours(0,0,0,0);var u=it(l,e);return u}var ct=6048e5;function lt(t,e){Object(a["a"])(1,arguments);var n=Object(r["a"])(t),i=it(n,e).getTime()-st(n,e).getTime();return Math.round(i/ct)+1}var ut={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},ft={G:function(t,e,n){var r=t.getUTCFullYear()>0?1:0;switch(e){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});case"GGGG":default:return n.era(r,{width:"wide"})}},y:function(t,e,n){if("yo"===e){var r=t.getUTCFullYear(),a=r>0?r:1-r;return n.ordinalNumber(a,{unit:"year"})}return K.y(t,e)},Y:function(t,e,n,r){var a=ot(t,r),i=a>0?a:1-a;if("YY"===e){var o=i%100;return $(o,2)}return"Yo"===e?n.ordinalNumber(i,{unit:"year"}):$(i,e.length)},R:function(t,e){var n=et(t);return $(n,e.length)},u:function(t,e){var n=t.getUTCFullYear();return $(n,e.length)},Q:function(t,e,n){var r=Math.ceil((t.getUTCMonth()+1)/3);switch(e){case"Q":return String(r);case"QQ":return $(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(t,e,n){var r=Math.ceil((t.getUTCMonth()+1)/3);switch(e){case"q":return String(r);case"qq":return $(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(t,e,n){var r=t.getUTCMonth();switch(e){case"M":case"MM":return K.M(t,e);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(t,e,n){var r=t.getUTCMonth();switch(e){case"L":return String(r+1);case"LL":return $(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(t,e,n,r){var a=lt(t,r);return"wo"===e?n.ordinalNumber(a,{unit:"week"}):$(a,e.length)},I:function(t,e,n){var r=at(t);return"Io"===e?n.ordinalNumber(r,{unit:"week"}):$(r,e.length)},d:function(t,e,n){return"do"===e?n.ordinalNumber(t.getUTCDate(),{unit:"date"}):K.d(t,e)},D:function(t,e,n){var r=Z(t);return"Do"===e?n.ordinalNumber(r,{unit:"dayOfYear"}):$(r,e.length)},E:function(t,e,n){var r=t.getUTCDay();switch(e){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});case"EEEE":default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(t,e,n,r){var a=t.getUTCDay(),i=(a-r.weekStartsOn+8)%7||7;switch(e){case"e":return String(i);case"ee":return $(i,2);case"eo":return n.ordinalNumber(i,{unit:"day"});case"eee":return n.day(a,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(a,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(a,{width:"short",context:"formatting"});case"eeee":default:return n.day(a,{width:"wide",context:"formatting"})}},c:function(t,e,n,r){var a=t.getUTCDay(),i=(a-r.weekStartsOn+8)%7||7;switch(e){case"c":return String(i);case"cc":return $(i,e.length);case"co":return n.ordinalNumber(i,{unit:"day"});case"ccc":return n.day(a,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(a,{width:"narrow",context:"standalone"});case"cccccc":return n.day(a,{width:"short",context:"standalone"});case"cccc":default:return n.day(a,{width:"wide",context:"standalone"})}},i:function(t,e,n){var r=t.getUTCDay(),a=0===r?7:r;switch(e){case"i":return String(a);case"ii":return $(a,e.length);case"io":return n.ordinalNumber(a,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});case"iiii":default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(t,e,n){var r=t.getUTCHours(),a=r/12>=1?"pm":"am";switch(e){case"a":case"aa":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(a,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},b:function(t,e,n){var r,a=t.getUTCHours();switch(r=12===a?ut.noon:0===a?ut.midnight:a/12>=1?"pm":"am",e){case"b":case"bb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(r,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},B:function(t,e,n){var r,a=t.getUTCHours();switch(r=a>=17?ut.evening:a>=12?ut.afternoon:a>=4?ut.morning:ut.night,e){case"B":case"BB":case"BBB":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(r,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},h:function(t,e,n){if("ho"===e){var r=t.getUTCHours()%12;return 0===r&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return K.h(t,e)},H:function(t,e,n){return"Ho"===e?n.ordinalNumber(t.getUTCHours(),{unit:"hour"}):K.H(t,e)},K:function(t,e,n){var r=t.getUTCHours()%12;return"Ko"===e?n.ordinalNumber(r,{unit:"hour"}):$(r,e.length)},k:function(t,e,n){var r=t.getUTCHours();return 0===r&&(r=24),"ko"===e?n.ordinalNumber(r,{unit:"hour"}):$(r,e.length)},m:function(t,e,n){return"mo"===e?n.ordinalNumber(t.getUTCMinutes(),{unit:"minute"}):K.m(t,e)},s:function(t,e,n){return"so"===e?n.ordinalNumber(t.getUTCSeconds(),{unit:"second"}):K.s(t,e)},S:function(t,e){return K.S(t,e)},X:function(t,e,n,r){var a=r._originalDate||t,i=a.getTimezoneOffset();if(0===i)return"Z";switch(e){case"X":return pt(i);case"XXXX":case"XX":return ht(i);case"XXXXX":case"XXX":default:return ht(i,":")}},x:function(t,e,n,r){var a=r._originalDate||t,i=a.getTimezoneOffset();switch(e){case"x":return pt(i);case"xxxx":case"xx":return ht(i);case"xxxxx":case"xxx":default:return ht(i,":")}},O:function(t,e,n,r){var a=r._originalDate||t,i=a.getTimezoneOffset();switch(e){case"O":case"OO":case"OOO":return"GMT"+dt(i,":");case"OOOO":default:return"GMT"+ht(i,":")}},z:function(t,e,n,r){var a=r._originalDate||t,i=a.getTimezoneOffset();switch(e){case"z":case"zz":case"zzz":return"GMT"+dt(i,":");case"zzzz":default:return"GMT"+ht(i,":")}},t:function(t,e,n,r){var a=r._originalDate||t,i=Math.floor(a.getTime()/1e3);return $(i,e.length)},T:function(t,e,n,r){var a=r._originalDate||t,i=a.getTime();return $(i,e.length)}};function dt(t,e){var n=t>0?"-":"+",r=Math.abs(t),a=Math.floor(r/60),i=r%60;if(0===i)return n+String(a);var o=e||"";return n+String(a)+o+$(i,2)}function pt(t,e){if(t%60===0){var n=t>0?"-":"+";return n+$(Math.abs(t)/60,2)}return ht(t,e)}function ht(t,e){var n=e||"",r=t>0?"-":"+",a=Math.abs(t),i=$(Math.floor(a/60),2),o=$(a%60,2);return r+i+n+o}var mt=ft;function vt(t,e){switch(t){case"P":return e.date({width:"short"});case"PP":return e.date({width:"medium"});case"PPP":return e.date({width:"long"});case"PPPP":default:return e.date({width:"full"})}}function gt(t,e){switch(t){case"p":return e.time({width:"short"});case"pp":return e.time({width:"medium"});case"ppp":return e.time({width:"long"});case"pppp":default:return e.time({width:"full"})}}function bt(t,e){var n,r=t.match(/(P+)(p+)?/),a=r[1],i=r[2];if(!i)return vt(t,e);switch(a){case"P":n=e.dateTime({width:"short"});break;case"PP":n=e.dateTime({width:"medium"});break;case"PPP":n=e.dateTime({width:"long"});break;case"PPPP":default:n=e.dateTime({width:"full"});break}return n.replace("{{date}}",vt(a,e)).replace("{{time}}",gt(i,e))}var yt={p:gt,P:bt},Et=yt;function wt(t){var e=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return e.setUTCFullYear(t.getFullYear()),t.getTime()-e.getTime()}var kt=["D","DD"],Tt=["YY","YYYY"];function xt(t){return-1!==kt.indexOf(t)}function At(t){return-1!==Tt.indexOf(t)}function Ot(t,e,n){if("YYYY"===t)throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(e,"`) for formatting years to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("YY"===t)throw new RangeError("Use `yy` instead of `YY` (in `".concat(e,"`) for formatting years to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("D"===t)throw new RangeError("Use `d` instead of `D` (in `".concat(e,"`) for formatting days of the month to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("DD"===t)throw new RangeError("Use `dd` instead of `DD` (in `".concat(e,"`) for formatting days of the month to the input `").concat(n,"`; see: https://git.io/fxCyr"))}var St=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Rt=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,Nt=/^'([^]*?)'?$/,Ct=/''/g,_t=/[a-zA-Z]/;function Lt(t,e,n){Object(a["a"])(2,arguments);var o=String(e),s=n||{},c=s.locale||Y,l=c.options&&c.options.firstWeekContainsDate,u=null==l?1:Object(V["a"])(l),f=null==s.firstWeekContainsDate?u:Object(V["a"])(s.firstWeekContainsDate);if(!(f>=1&&f<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var d=c.options&&c.options.weekStartsOn,p=null==d?0:Object(V["a"])(d),h=null==s.weekStartsOn?p:Object(V["a"])(s.weekStartsOn);if(!(h>=0&&h<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!c.localize)throw new RangeError("locale must contain localize property");if(!c.formatLong)throw new RangeError("locale must contain formatLong property");var m=Object(r["a"])(t);if(!i(m))throw new RangeError("Invalid time value");var v=wt(m),g=X(m,v),b={firstWeekContainsDate:f,weekStartsOn:h,locale:c,_originalDate:m},y=o.match(Rt).map((function(t){var e=t[0];if("p"===e||"P"===e){var n=Et[e];return n(t,c.formatLong,b)}return t})).join("").match(St).map((function(n){if("''"===n)return"'";var r=n[0];if("'"===r)return It(n);var a=mt[r];if(a)return!s.useAdditionalWeekYearTokens&&At(n)&&Ot(n,e,t),!s.useAdditionalDayOfYearTokens&&xt(n)&&Ot(n,e,t),a(g,n,c.localize,b);if(r.match(_t))throw new RangeError("Format string contains an unescaped latin alphabet character `"+r+"`");return n})).join("");return y}function It(t){return t.match(Nt)[1].replace(Ct,"'")}},b4c0:function(t,e,n){var r=n("cb5a");function a(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}t.exports=a},b575:function(t,e,n){var r,a,i,o,s,c,l,u,f=n("da84"),d=n("06cf").f,p=n("2cf4").set,h=n("1cdc"),m=n("a4b4"),v=n("605d"),g=f.MutationObserver||f.WebKitMutationObserver,b=f.document,y=f.process,E=f.Promise,w=d(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;v&&(t=y.domain)&&t.exit();while(a){e=a.fn,a=a.next;try{e()}catch(n){throw a?o():i=void 0,n}}i=void 0,t&&t.enter()},h||v||m||!g||!b?E&&E.resolve?(l=E.resolve(void 0),l.constructor=E,u=l.then,o=function(){u.call(l,r)}):o=v?function(){y.nextTick(r)}:function(){p.call(f,r)}:(s=!0,c=b.createTextNode(""),new g(r).observe(c,{characterData:!0}),o=function(){c.data=s=!s})),t.exports=k||function(t){var e={fn:t,next:void 0};i&&(i.next=e),a||(a=e,o()),i=e}},b5ac:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-terminal",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M4 17l6-6-6-6M12 19h8"}})]))}}},b622:function(t,e,n){var r=n("da84"),a=n("5692"),i=n("5135"),o=n("90e3"),s=n("4930"),c=n("fdbf"),l=a("wks"),u=r.Symbol,f=c?u:u&&u.withoutSetter||o;t.exports=function(t){return i(l,t)&&(s||"string"==typeof l[t])||(s&&i(u,t)?l[t]=u[t]:l[t]=f("Symbol."+t)),l[t]}},b64b:function(t,e,n){var r=n("23e7"),a=n("7b0b"),i=n("df75"),o=n("d039"),s=o((function(){i(1)}));r({target:"Object",stat:!0,forced:s},{keys:function(t){return i(a(t))}})},b680:function(t,e,n){"use strict";var r=n("23e7"),a=n("a691"),i=n("408a"),o=n("1148"),s=n("d039"),c=1..toFixed,l=Math.floor,u=function(t,e,n){return 0===e?n:e%2===1?u(t,e-1,n*t):u(t*t,e/2,n)},f=function(t){var e=0,n=t;while(n>=4096)e+=12,n/=4096;while(n>=2)e+=1,n/=2;return e},d=function(t,e,n){var r=-1,a=n;while(++r<6)a+=e*t[r],t[r]=a%1e7,a=l(a/1e7)},p=function(t,e){var n=6,r=0;while(--n>=0)r+=t[n],t[n]=l(r/e),r=r%e*1e7},h=function(t){var e=6,n="";while(--e>=0)if(""!==n||0===e||0!==t[e]){var r=String(t[e]);n=""===n?r:n+o.call("0",7-r.length)+r}return n},m=c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!s((function(){c.call({})}));r({target:"Number",proto:!0,forced:m},{toFixed:function(t){var e,n,r,s,c=i(this),l=a(t),m=[0,0,0,0,0,0],v="",g="0";if(l<0||l>20)throw RangeError("Incorrect fraction digits");if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(v="-",c=-c),c>1e-21)if(e=f(c*u(2,69,1))-69,n=e<0?c*u(2,-e,1):c/u(2,e,1),n*=4503599627370496,e=52-e,e>0){d(m,0,n),r=l;while(r>=7)d(m,1e7,0),r-=7;d(m,u(10,r,1),0),r=e-1;while(r>=23)p(m,1<<23),r-=23;p(m,1<0?(s=g.length,g=v+(s<=l?"0."+o.call("0",l-s)+g:g.slice(0,s-l)+"."+g.slice(s-l))):g=v+g,g}})},b727:function(t,e,n){var r=n("0366"),a=n("44ad"),i=n("7b0b"),o=n("50c4"),s=n("65f0"),c=[].push,l=function(t){var e=1==t,n=2==t,l=3==t,u=4==t,f=6==t,d=7==t,p=5==t||f;return function(h,m,v,g){for(var b,y,E=i(h),w=a(E),k=r(m,v,3),T=o(w.length),x=0,A=g||s,O=e?A(h,T):n||d?A(h,0):void 0;T>x;x++)if((p||x in w)&&(b=w[x],y=k(b,x,E),t))if(e)O[x]=y;else if(y)switch(t){case 3:return!0;case 5:return b;case 6:return x;case 2:c.call(O,b)}else switch(t){case 4:return!1;case 7:c.call(O,b)}return f?-1:l||u?u:O}};t.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6),filterOut:l(7)}},b7fe:function(t,e,n){"use strict";e.__esModule=!0,e.start=e.run=e.TOKENS=e.State=void 0;var r=n("1652"),a=n("7656"),i=o(a);function o(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var s="aaa|aarp|abarth|abb|abbott|abbvie|abc|able|abogado|abudhabi|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|aetna|af|afamilycompany|afl|africa|ag|agakhan|agency|ai|aig|aigo|airbus|airforce|airtel|akdn|al|alfaromeo|alibaba|alipay|allfinanz|allstate|ally|alsace|alstom|am|americanexpress|americanfamily|amex|amfam|amica|amsterdam|analytics|android|anquan|anz|ao|aol|apartments|app|apple|aq|aquarelle|ar|arab|aramco|archi|army|arpa|art|arte|as|asda|asia|associates|at|athleta|attorney|au|auction|audi|audible|audio|auspost|author|auto|autos|avianca|aw|aws|ax|axa|az|azure|ba|baby|baidu|banamex|bananarepublic|band|bank|bar|barcelona|barclaycard|barclays|barefoot|bargains|baseball|basketball|bauhaus|bayern|bb|bbc|bbt|bbva|bcg|bcn|bd|be|beats|beauty|beer|bentley|berlin|best|bestbuy|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|blanco|blockbuster|blog|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bofa|bom|bond|boo|book|booking|boots|bosch|bostik|boston|bot|boutique|box|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|calvinklein|cam|camera|camp|cancerresearch|canon|capetown|capital|capitalone|car|caravan|cards|care|career|careers|cars|cartier|casa|case|caseih|cash|casino|cat|catering|catholic|cba|cbn|cbre|cbs|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chintai|chloe|christmas|chrome|chrysler|church|ci|cipriani|circle|cisco|citadel|citi|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|comcast|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cookingchannel|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruise|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|data|date|dating|datsun|day|dclk|dds|de|deal|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|dhl|diamonds|diet|digital|direct|directory|discount|discover|dish|diy|dj|dk|dm|dnp|do|docs|doctor|dodge|dog|doha|domains|dot|download|drive|dtv|dubai|duck|dunlop|duns|dupont|durban|dvag|dvr|dz|earth|eat|ec|eco|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epost|epson|equipment|er|ericsson|erni|es|esq|estate|esurance|et|etisalat|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|extraspace|fage|fail|fairwinds|faith|family|fan|fans|farm|farmers|fashion|fast|fedex|feedback|ferrari|ferrero|fi|fiat|fidelity|fido|film|final|finance|financial|fire|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|flir|florist|flowers|fly|fm|fo|foo|food|foodnetwork|football|ford|forex|forsale|forum|foundation|fox|fr|free|fresenius|frl|frogans|frontdoor|frontier|ftr|fujitsu|fujixerox|fun|fund|furniture|futbol|fyi|ga|gal|gallery|gallo|gallup|game|games|gap|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|george|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glade|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|godaddy|gold|goldpoint|golf|goo|goodhands|goodyear|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|grocery|group|gs|gt|gu|guardian|gucci|guge|guide|guitars|guru|gw|gy|hair|hamburg|hangout|haus|hbo|hdfc|hdfcbank|health|healthcare|help|helsinki|here|hermes|hgtv|hiphop|hisamitsu|hitachi|hiv|hk|hkt|hm|hn|hockey|holdings|holiday|homedepot|homegoods|homes|homesense|honda|honeywell|horse|hospital|host|hosting|hot|hoteles|hotels|hotmail|house|how|hr|hsbc|ht|htc|hu|hughes|hyatt|hyundai|ibm|icbc|ice|icu|id|ie|ieee|ifm|ikano|il|im|imamat|imdb|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|intel|international|intuit|investments|io|ipiranga|iq|ir|irish|is|iselect|ismaili|ist|istanbul|it|itau|itv|iveco|iwc|jaguar|java|jcb|jcp|je|jeep|jetzt|jewelry|jio|jlc|jll|jm|jmp|jnj|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|juniper|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kindle|kitchen|kiwi|km|kn|koeln|komatsu|kosher|kp|kpmg|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|ladbrokes|lamborghini|lamer|lancaster|lancia|lancome|land|landrover|lanxess|lasalle|lat|latino|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|lefrak|legal|lego|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|lilly|limited|limo|lincoln|linde|link|lipsy|live|living|lixil|lk|loan|loans|locker|locus|loft|lol|london|lotte|lotto|love|lpl|lplfinancial|lr|ls|lt|ltd|ltda|lu|lundbeck|lupin|luxe|luxury|lv|ly|ma|macys|madrid|maif|maison|makeup|man|management|mango|map|market|marketing|markets|marriott|marshalls|maserati|mattel|mba|mc|mckinsey|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|merckmsd|metlife|mg|mh|miami|microsoft|mil|mini|mint|mit|mitsubishi|mk|ml|mlb|mls|mm|mma|mn|mo|mobi|mobile|mobily|moda|moe|moi|mom|monash|money|monster|mopar|mormon|mortgage|moscow|moto|motorcycles|mov|movie|movistar|mp|mq|mr|ms|msd|mt|mtn|mtr|mu|museum|mutual|mv|mw|mx|my|mz|na|nab|nadex|nagoya|name|nationwide|natura|navy|nba|nc|ne|nec|net|netbank|netflix|network|neustar|new|newholland|news|next|nextdirect|nexus|nf|nfl|ng|ngo|nhk|ni|nico|nike|nikon|ninja|nissan|nissay|nl|no|nokia|northwesternmutual|norton|now|nowruz|nowtv|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|observer|off|office|okinawa|olayan|olayangroup|oldnavy|ollo|om|omega|one|ong|onl|online|onyourside|ooo|open|oracle|orange|org|organic|origins|osaka|otsuka|ott|ovh|pa|page|panasonic|panerai|paris|pars|partners|parts|party|passagens|pay|pccw|pe|pet|pf|pfizer|pg|ph|pharmacy|phd|philips|phone|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pioneer|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pnc|pohl|poker|politie|porn|post|pr|pramerica|praxi|press|prime|pro|prod|productions|prof|progressive|promo|properties|property|protection|pru|prudential|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|qvc|racing|radio|raid|re|read|realestate|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|reliance|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|richardli|ricoh|rightathome|ril|rio|rip|rmit|ro|rocher|rocks|rodeo|rogers|room|rs|rsvp|ru|rugby|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsclub|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|save|saxo|sb|sbi|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scjohnson|scor|scot|sd|se|search|seat|secure|security|seek|select|sener|services|ses|seven|sew|sex|sexy|sfr|sg|sh|shangrila|sharp|shaw|shell|shia|shiksha|shoes|shop|shopping|shouji|show|showtime|shriram|si|silk|sina|singles|site|sj|sk|ski|skin|sky|skype|sl|sling|sm|smart|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|srt|st|stada|staples|star|starhub|statebank|statefarm|statoil|stc|stcgroup|stockholm|storage|store|stream|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiftcover|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|talk|taobao|target|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|tdk|team|tech|technology|tel|telecity|telefonica|temasek|tennis|teva|tf|tg|th|thd|theater|theatre|tiaa|tickets|tienda|tiffany|tips|tires|tirol|tj|tjmaxx|tjx|tk|tkmaxx|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tr|trade|trading|training|travel|travelchannel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubank|ubs|uconnect|ug|uk|unicom|university|uno|uol|ups|us|uy|uz|va|vacations|vana|vanguard|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|vig|viking|villas|vin|vip|virgin|visa|vision|vista|vistaprint|viva|vivo|vlaanderen|vn|vodka|volkswagen|volvo|vote|voting|voto|voyage|vu|vuelos|wales|walmart|walter|wang|wanggou|warman|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weibo|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|winners|wme|wolterskluwer|woodside|work|works|world|wow|ws|wtc|wtf|xbox|xerox|xfinity|xihuan|xin|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--30rr7y|xn--3bst00m|xn--3ds443g|xn--3e0b707e|xn--3hcrj9c|xn--3oq18vl8pn36a|xn--3pxu8k|xn--42c2d9a|xn--45br5cyl|xn--45brj9c|xn--45q11c|xn--4gbrim|xn--54b7fta0cc|xn--55qw42g|xn--55qx5d|xn--5su34j936bgsg|xn--5tzm5g|xn--6frz82g|xn--6qq986b3xl|xn--80adxhks|xn--80ao21a|xn--80aqecdr1a|xn--80asehdb|xn--80aswg|xn--8y0a063a|xn--90a3ac|xn--90ae|xn--90ais|xn--9dbq2a|xn--9et52u|xn--9krt00a|xn--b4w605ferd|xn--bck1b9a5dre4c|xn--c1avg|xn--c2br7g|xn--cck2b3b|xn--cg4bki|xn--clchc0ea0b2g2a9gcd|xn--czr694b|xn--czrs0t|xn--czru2d|xn--d1acj3b|xn--d1alf|xn--e1a4c|xn--eckvdtc9d|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fhbei|xn--fiq228c5hs|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--fjq720a|xn--flw351e|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--fzys8d69uvgm|xn--g2xx48c|xn--gckr3f0f|xn--gecrj9c|xn--gk3at1e|xn--h2breg3eve|xn--h2brj9c|xn--h2brj9c8c|xn--hxt814e|xn--i1b6b1a6a2e|xn--imr513n|xn--io0a7i|xn--j1aef|xn--j1amh|xn--j6w193g|xn--jlq61u9w7b|xn--jvr189m|xn--kcrx77d1x4a|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--kput3i|xn--l1acc|xn--lgbbat1ad8j|xn--mgb9awbf|xn--mgba3a3ejt|xn--mgba3a4f16a|xn--mgba7c0bbn0a|xn--mgbaakc7dvf|xn--mgbaam7a8h|xn--mgbab2bd|xn--mgbai9azgqp6j|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a|xn--mgbbh1a71e|xn--mgbc0a9azcg|xn--mgbca7dzdo|xn--mgberp4a5d4ar|xn--mgbgu82a|xn--mgbi4ecexp|xn--mgbpl2fh|xn--mgbt3dhd|xn--mgbtx2b|xn--mgbx4cd0ab|xn--mix891f|xn--mk1bu44c|xn--mxtq1m|xn--ngbc5azd|xn--ngbe9e0a|xn--ngbrx|xn--node|xn--nqv7f|xn--nqv7fs00ema|xn--nyqy26a|xn--o3cw4h|xn--ogbpf8fl|xn--p1acf|xn--p1ai|xn--pbt977c|xn--pgbs0dh|xn--pssy2u|xn--q9jyb4c|xn--qcka1pmc|xn--qxam|xn--rhqv96g|xn--rovu88b|xn--rvc1e0am3e|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--tckwe|xn--tiq49xqyj|xn--unup4y|xn--vermgensberater-ctb|xn--vermgensberatung-pwb|xn--vhquv|xn--vuq861b|xn--w4r85el8fhu5dnra|xn--w4rs40l|xn--wgbh1c|xn--wgbl6a|xn--xhq521b|xn--xkc2al3hye2a|xn--xkc2dl3a5ee0h|xn--y9a3aq|xn--yfro4i67o|xn--ygbi2ammx|xn--zfr164b|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|you|youtube|yt|yun|za|zappos|zara|zero|zip|zippo|zm|zone|zuerich|zw".split("|"),c="0123456789".split(""),l="0123456789abcdefghijklmnopqrstuvwxyz".split(""),u=[" ","\f","\r","\t","\v"," "," ","᠎"],f=[],d=function(t){return new r.CharacterState(t)},p=d(),h=d(a.NUM),m=d(a.DOMAIN),v=d(),g=d(a.WS);p.on("@",d(a.AT)).on(".",d(a.DOT)).on("+",d(a.PLUS)).on("#",d(a.POUND)).on("?",d(a.QUERY)).on("/",d(a.SLASH)).on("_",d(a.UNDERSCORE)).on(":",d(a.COLON)).on("{",d(a.OPENBRACE)).on("[",d(a.OPENBRACKET)).on("<",d(a.OPENANGLEBRACKET)).on("(",d(a.OPENPAREN)).on("}",d(a.CLOSEBRACE)).on("]",d(a.CLOSEBRACKET)).on(">",d(a.CLOSEANGLEBRACKET)).on(")",d(a.CLOSEPAREN)).on("&",d(a.AMPERSAND)).on([",",";","!",'"',"'"],d(a.PUNCTUATION)),p.on("\n",d(a.NL)).on(u,g),g.on(u,g);for(var b=0;b=0&&l++,s++,a++;if(!(l<0)){a-=l,s-=l;var u=c.emit();r.push(new u(t.substr(a-s,s)))}}return r},D=p;e.State=r.CharacterState,e.TOKENS=i,e.run=I,e.start=D},b960:function(t){t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\\"","QUOT":"\\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}')},bb2f:function(t,e,n){var r=n("d039");t.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},bbc0:function(t,e,n){var r=n("6044"),a="__lodash_hash_undefined__",i=Object.prototype,o=i.hasOwnProperty;function s(t){var e=this.__data__;if(r){var n=e[t];return n===a?void 0:n}return o.call(e,t)?e[t]:void 0}t.exports=s},bbc2:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-pie-chart",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M21.21 15.89A10 10 0 118 2.83M22 12A10 10 0 0012 2v10z"}})]))}}},bcb5:function(t,e,n){"use strict";e.__esModule=!0;var r={nbsp:" "};e.default=r},bcee:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-arrow-down-circle",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M8 12l4 4 4-4M12 8v8"}})]))}}},bea1:function(t,e,n){"use strict";e.__esModule=!0,e.URL=e.TEXT=e.NL=e.EMAIL=e.MAILTOEMAIL=e.Base=void 0;var r=n("46f3"),a=n("254c"),i=n("7656");function o(t){return t instanceof i.DOMAIN||t instanceof i.TLD}var s=(0,r.createTokenClass)();s.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var c=(0,a.inherits)(s,(0,r.createTokenClass)(),{type:"email",isLink:!0}),l=(0,a.inherits)(s,(0,r.createTokenClass)(),{type:"email",isLink:!0,toHref:function(){return"mailto:"+this.toString()}}),u=(0,a.inherits)(s,(0,r.createTokenClass)(),{type:"text"}),f=(0,a.inherits)(s,(0,r.createTokenClass)(),{type:"nl"}),d=(0,a.inherits)(s,(0,r.createTokenClass)(),{type:"url",isLink:!0,toHref:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,r=this.v,a=[],s=0;while(r[s]instanceof i.PROTOCOL)e=!0,a.push(r[s].toString().toLowerCase()),s++;while(r[s]instanceof i.SLASH)n=!0,a.push(r[s].toString()),s++;while(o(r[s]))a.push(r[s].toString().toLowerCase()),s++;for(;s0)?["touchstart"]:["click"];function r(t){var e=t.event,n=t.handler;(0,t.middleware)(e)&&n(e)}function a(t,e){var a=function(t){var e="function"==typeof t;if(!e&&"object"!=typeof t)throw new Error("v-click-outside: Binding value must be a function or an object");return{handler:e?t:t.handler,middleware:t.middleware||function(t){return t},events:t.events||n,isActive:!(!1===t.isActive),detectIframe:!(!1===t.detectIframe)}}(e.value),i=a.handler,o=a.middleware,s=a.detectIframe;if(a.isActive){if(t["__v-click-outside"]=a.events.map((function(e){return{event:e,srcTarget:document.documentElement,handler:function(e){return function(t){var e=t.el,n=t.event,a=t.handler,i=t.middleware,o=n.path||n.composedPath&&n.composedPath();(o?o.indexOf(e)<0:!e.contains(n.target))&&r({event:n,handler:a,middleware:i})}({el:t,event:e,handler:i,middleware:o})}}})),s){var c={event:"blur",srcTarget:window,handler:function(e){return function(t){var e=t.el,n=t.event,a=t.handler,i=t.middleware;setTimeout((function(){var t=document.activeElement;t&&"IFRAME"===t.tagName&&!e.contains(t)&&r({event:n,handler:a,middleware:i})}),0)}({el:t,event:e,handler:i,middleware:o})}};t["__v-click-outside"]=[].concat(t["__v-click-outside"],[c])}t["__v-click-outside"].forEach((function(e){var n=e.event,r=e.srcTarget,a=e.handler;return setTimeout((function(){t["__v-click-outside"]&&r.addEventListener(n,a,!1)}),0)}))}}function i(t){(t["__v-click-outside"]||[]).forEach((function(t){return t.srcTarget.removeEventListener(t.event,t.handler,!1)})),delete t["__v-click-outside"]}var o=t?{bind:a,update:function(t,e){var n=e.value,r=e.oldValue;JSON.stringify(n)!==JSON.stringify(r)&&(i(t),a(t,{value:n}))},unbind:i}:{};return{install:function(t){t.directive("click-outside",o)},directive:o}}))},c430:function(t,e){t.exports=!1},c560:function(t){t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},c6b6:function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},c6cd:function(t,e,n){var r=n("da84"),a=n("ce4e"),i="__core-js_shared__",o=r[i]||a(i,{});t.exports=o},c7d2:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-star",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"}})]))}}},c84b:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-activity",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M22 12h-4l-3 9L9 3l-3 9H2"}})]))}}},c8ba:function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}t.exports=n},c8d2:function(t,e,n){var r=n("d039"),a=n("5899"),i="​…᠎";t.exports=function(t){return r((function(){return!!a[t]()||i[t]()!=i||a[t].name!==t}))}},c909:function(t,e,n){var r,a,i; +/*! + * URI.js - Mutating URLs + * + * Version: 1.19.7 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */(function(o,s){"use strict";t.exports?t.exports=s(n("63c5"),n("0056"),n("afab")):(a=[n("63c5"),n("0056"),n("afab")],r=s,i="function"===typeof r?r.apply(e,a):r,void 0===i||(t.exports=i))})(0,(function(t,e,n,r){"use strict";var a=r&&r.URI;function i(t,e){var n=arguments.length>=1,r=arguments.length>=2;if(!(this instanceof i))return n?r?new i(t,e):new i(t):new i;if(void 0===t){if(n)throw new TypeError("undefined is not a valid argument for URI");t="undefined"!==typeof location?location.href+"":""}if(null===t&&n)throw new TypeError("null is not a valid argument for URI");return this.href(t),void 0!==e?this.absoluteTo(e):this}function o(t){return/^[0-9]+$/.test(t)}i.version="1.19.7";var s=i.prototype,c=Object.prototype.hasOwnProperty;function l(t){return t.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function u(t){return void 0===t?"Undefined":String(Object.prototype.toString.call(t)).slice(8,-1)}function f(t){return"Array"===u(t)}function d(t,e){var n,r,a={};if("RegExp"===u(e))a=null;else if(f(e))for(n=0,r=e.length;n]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,i.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?«»“”„‘’]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g},i.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},i.hostProtocols=["http","https"],i.invalid_hostname_characters=/[^a-zA-Z0-9\.\-:_]/,i.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},i.getDomAttribute=function(t){if(t&&t.nodeName){var e=t.nodeName.toLowerCase();if("input"!==e||"image"===t.type)return i.domAttributes[e]}},i.encode=g,i.decode=decodeURIComponent,i.iso8859=function(){i.encode=escape,i.decode=unescape},i.unicode=function(){i.encode=g,i.decode=decodeURIComponent},i.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/gi,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},i.encodeQuery=function(t,e){var n=i.encode(t+"");return void 0===e&&(e=i.escapeQuerySpace),e?n.replace(/%20/g,"+"):n},i.decodeQuery=function(t,e){t+="",void 0===e&&(e=i.escapeQuerySpace);try{return i.decode(e?t.replace(/\+/g,"%20"):t)}catch(n){return t}};var b,y={encode:"encode",decode:"decode"},E=function(t,e){return function(n){try{return i[e](n+"").replace(i.characters[t][e].expression,(function(n){return i.characters[t][e].map[n]}))}catch(r){return n}}};for(b in y)i[b+"PathSegment"]=E("pathname",y[b]),i[b+"UrnPathSegment"]=E("urnpath",y[b]);var w=function(t,e,n){return function(r){var a;a=n?function(t){return i[e](i[n](t))}:i[e];for(var o=(r+"").split(t),s=0,c=o.length;s-1&&(e.fragment=t.substring(n+1)||null,t=t.substring(0,n)),n=t.indexOf("?"),n>-1&&(e.query=t.substring(n+1)||null,t=t.substring(0,n)),t=t.replace(/^(https?|ftp|wss?)?:[/\\]*/,"$1://"),"//"===t.substring(0,2)?(e.protocol=null,t=t.substring(2),t=i.parseAuthority(t,e)):(n=t.indexOf(":"),n>-1&&(e.protocol=t.substring(0,n)||null,e.protocol&&!e.protocol.match(i.protocol_expression)?e.protocol=void 0:"//"===t.substring(n+1,n+3).replace(/\\/g,"/")?(t=t.substring(n+3),t=i.parseAuthority(t,e)):(t=t.substring(n+1),e.urn=!0))),e.path=t,e},i.parseHost=function(t,e){t||(t=""),t=t.replace(/\\/g,"/");var n,r,a=t.indexOf("/");if(-1===a&&(a=t.length),"["===t.charAt(0))n=t.indexOf("]"),e.hostname=t.substring(1,n)||null,e.port=t.substring(n+2,a)||null,"/"===e.port&&(e.port=null);else{var o=t.indexOf(":"),s=t.indexOf("/"),c=t.indexOf(":",o+1);-1!==c&&(-1===s||c-1?o:t.length-1);return s>-1&&(-1===o||s-1?p.slice(0,h)+p.slice(h).replace(o,""):p.replace(o,""),!(p.length<=l[0].length)&&(!n.ignore||!n.ignore.test(p))){d=u+p.length;var g=e(p,u,d,t);void 0!==g?(g=String(g),t=t.slice(0,u)+g+t.slice(d),r.lastIndex=u+g.length):r.lastIndex=d}}return r.lastIndex=0,t},i.ensureValidHostname=function(e,n){var r=!!e,a=!!n,o=!1;if(a&&(o=p(i.hostProtocols,n)),o&&!r)throw new TypeError("Hostname cannot be empty, if protocol is "+n);if(e&&e.match(i.invalid_hostname_characters)){if(!t)throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');if(t.toASCII(e).match(i.invalid_hostname_characters))throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-:_]')}},i.ensureValidPort=function(t){if(t){var e=Number(t);if(!(o(e)&&e>0&&e<65536))throw new TypeError('Port "'+t+'" is not a valid port')}},i.noConflict=function(t){if(t){var e={URI:this.noConflict()};return r.URITemplate&&"function"===typeof r.URITemplate.noConflict&&(e.URITemplate=r.URITemplate.noConflict()),r.IPv6&&"function"===typeof r.IPv6.noConflict&&(e.IPv6=r.IPv6.noConflict()),r.SecondLevelDomains&&"function"===typeof r.SecondLevelDomains.noConflict&&(e.SecondLevelDomains=r.SecondLevelDomains.noConflict()),e}return r.URI===this&&(r.URI=a),this},s.build=function(t){return!0===t?this._deferred_build=!0:(void 0===t||this._deferred_build)&&(this._string=i.build(this._parts),this._deferred_build=!1),this},s.clone=function(){return new i(this)},s.valueOf=s.toString=function(){return this.build(!1)._string},s.protocol=k("protocol"),s.username=k("username"),s.password=k("password"),s.hostname=k("hostname"),s.port=k("port"),s.query=T("query","?"),s.fragment=T("fragment","#"),s.search=function(t,e){var n=this.query(t,e);return"string"===typeof n&&n.length?"?"+n:n},s.hash=function(t,e){var n=this.fragment(t,e);return"string"===typeof n&&n.length?"#"+n:n},s.pathname=function(t,e){if(void 0===t||!0===t){var n=this._parts.path||(this._parts.hostname?"/":"");return t?(this._parts.urn?i.decodeUrnPath:i.decodePath)(n):n}return this._parts.urn?this._parts.path=t?i.recodeUrnPath(t):"":this._parts.path=t?i.recodePath(t):"/",this.build(!e),this},s.path=s.pathname,s.href=function(t,e){var n;if(void 0===t)return this.toString();this._string="",this._parts=i._parts();var r=t instanceof i,a="object"===typeof t&&(t.hostname||t.path||t.pathname);if(t.nodeName){var o=i.getDomAttribute(t);t=t[o]||"",a=!1}if(!r&&a&&void 0!==t.pathname&&(t=t.toString()),"string"===typeof t||t instanceof String)this._parts=i.parse(String(t),this._parts);else{if(!r&&!a)throw new TypeError("invalid input");var s=r?t._parts:t;for(n in s)"query"!==n&&c.call(this._parts,n)&&(this._parts[n]=s[n]);s.query&&this.query(s.query,!1)}return this.build(!e),this},s.is=function(t){var e=!1,r=!1,a=!1,o=!1,s=!1,c=!1,l=!1,u=!this._parts.urn;switch(this._parts.hostname&&(u=!1,r=i.ip4_expression.test(this._parts.hostname),a=i.ip6_expression.test(this._parts.hostname),e=r||a,o=!e,s=o&&n&&n.has(this._parts.hostname),c=o&&i.idn_expression.test(this._parts.hostname),l=o&&i.punycode_expression.test(this._parts.hostname)),t.toLowerCase()){case"relative":return u;case"absolute":return!u;case"domain":case"name":return o;case"sld":return s;case"ip":return e;case"ip4":case"ipv4":case"inet4":return r;case"ip6":case"ipv6":case"inet6":return a;case"idn":return c;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return l}return null};var x=s.protocol,A=s.port,O=s.hostname;s.protocol=function(t,e){if(t&&(t=t.replace(/:(\/\/)?$/,""),!t.match(i.protocol_expression)))throw new TypeError('Protocol "'+t+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return x.call(this,t,e)},s.scheme=s.protocol,s.port=function(t,e){return this._parts.urn?void 0===t?"":this:(void 0!==t&&(0===t&&(t=null),t&&(t+="",":"===t.charAt(0)&&(t=t.substring(1)),i.ensureValidPort(t))),A.call(this,t,e))},s.hostname=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0!==t){var n={preventInvalidHostname:this._parts.preventInvalidHostname},r=i.parseHost(t,n);if("/"!==r)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-]');t=n.hostname,this._parts.preventInvalidHostname&&i.ensureValidHostname(t,this._parts.protocol)}return O.call(this,t,e)},s.origin=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t){var n=this.protocol(),r=this.authority();return r?(n?n+"://":"")+this.authority():""}var a=i(t);return this.protocol(a.protocol()).authority(a.authority()).build(!e),this},s.host=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t)return this._parts.hostname?i.buildHost(this._parts):"";var n=i.parseHost(t,this._parts);if("/"!==n)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-]');return this.build(!e),this},s.authority=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t)return this._parts.hostname?i.buildAuthority(this._parts):"";var n=i.parseAuthority(t,this._parts);if("/"!==n)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-]');return this.build(!e),this},s.userinfo=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t){var n=i.buildUserinfo(this._parts);return n?n.substring(0,n.length-1):n}return"@"!==t[t.length-1]&&(t+="@"),i.parseUserinfo(t,this._parts),this.build(!e),this},s.resource=function(t,e){var n;return void 0===t?this.path()+this.search()+this.hash():(n=i.parse(t),this._parts.path=n.path,this._parts.query=n.query,this._parts.fragment=n.fragment,this.build(!e),this)},s.subdomain=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t){if(!this._parts.hostname||this.is("IP"))return"";var n=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,n)||""}var r=this._parts.hostname.length-this.domain().length,a=this._parts.hostname.substring(0,r),o=new RegExp("^"+l(a));if(t&&"."!==t.charAt(t.length-1)&&(t+="."),-1!==t.indexOf(":"))throw new TypeError("Domains cannot contain colons");return t&&i.ensureValidHostname(t,this._parts.protocol),this._parts.hostname=this._parts.hostname.replace(o,t),this.build(!e),this},s.domain=function(t,e){if(this._parts.urn)return void 0===t?"":this;if("boolean"===typeof t&&(e=t,t=void 0),void 0===t){if(!this._parts.hostname||this.is("IP"))return"";var n=this._parts.hostname.match(/\./g);if(n&&n.length<2)return this._parts.hostname;var r=this._parts.hostname.length-this.tld(e).length-1;return r=this._parts.hostname.lastIndexOf(".",r-1)+1,this._parts.hostname.substring(r)||""}if(!t)throw new TypeError("cannot set domain empty");if(-1!==t.indexOf(":"))throw new TypeError("Domains cannot contain colons");if(i.ensureValidHostname(t,this._parts.protocol),!this._parts.hostname||this.is("IP"))this._parts.hostname=t;else{var a=new RegExp(l(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(a,t)}return this.build(!e),this},s.tld=function(t,e){if(this._parts.urn)return void 0===t?"":this;if("boolean"===typeof t&&(e=t,t=void 0),void 0===t){if(!this._parts.hostname||this.is("IP"))return"";var r=this._parts.hostname.lastIndexOf("."),a=this._parts.hostname.substring(r+1);return!0!==e&&n&&n.list[a.toLowerCase()]&&n.get(this._parts.hostname)||a}var i;if(!t)throw new TypeError("cannot set TLD empty");if(t.match(/[^a-zA-Z0-9-]/)){if(!n||!n.is(t))throw new TypeError('TLD "'+t+'" contains characters other than [A-Z0-9]');i=new RegExp(l(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(i,t)}else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");i=new RegExp(l(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(i,t)}return this.build(!e),this},s.directory=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t||!0===t){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var n=this._parts.path.length-this.filename().length-1,r=this._parts.path.substring(0,n)||(this._parts.hostname?"/":"");return t?i.decodePath(r):r}var a=this._parts.path.length-this.filename().length,o=this._parts.path.substring(0,a),s=new RegExp("^"+l(o));return this.is("relative")||(t||(t="/"),"/"!==t.charAt(0)&&(t="/"+t)),t&&"/"!==t.charAt(t.length-1)&&(t+="/"),t=i.recodePath(t),this._parts.path=this._parts.path.replace(s,t),this.build(!e),this},s.filename=function(t,e){if(this._parts.urn)return void 0===t?"":this;if("string"!==typeof t){if(!this._parts.path||"/"===this._parts.path)return"";var n=this._parts.path.lastIndexOf("/"),r=this._parts.path.substring(n+1);return t?i.decodePathSegment(r):r}var a=!1;"/"===t.charAt(0)&&(t=t.substring(1)),t.match(/\.?\//)&&(a=!0);var o=new RegExp(l(this.filename())+"$");return t=i.recodePath(t),this._parts.path=this._parts.path.replace(o,t),a?this.normalizePath(e):this.build(!e),this},s.suffix=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t||!0===t){if(!this._parts.path||"/"===this._parts.path)return"";var n,r,a=this.filename(),o=a.lastIndexOf(".");return-1===o?"":(n=a.substring(o+1),r=/^[a-z0-9%]+$/i.test(n)?n:"",t?i.decodePathSegment(r):r)}"."===t.charAt(0)&&(t=t.substring(1));var s,c=this.suffix();if(c)s=t?new RegExp(l(c)+"$"):new RegExp(l("."+c)+"$");else{if(!t)return this;this._parts.path+="."+i.recodePath(t)}return s&&(t=i.recodePath(t),this._parts.path=this._parts.path.replace(s,t)),this.build(!e),this},s.segment=function(t,e,n){var r=this._parts.urn?":":"/",a=this.path(),i="/"===a.substring(0,1),o=a.split(r);if(void 0!==t&&"number"!==typeof t&&(n=e,e=t,t=void 0),void 0!==t&&"number"!==typeof t)throw new Error('Bad segment "'+t+'", must be 0-based integer');if(i&&o.shift(),t<0&&(t=Math.max(o.length+t,0)),void 0===e)return void 0===t?o:o[t];if(null===t||void 0===o[t])if(f(e)){o=[];for(var s=0,c=e.length;sc)r(s,n=e[c++])&&(~i(l,n)||l.push(n));return l}},caad:function(t,e,n){"use strict";var r=n("23e7"),a=n("4d64").includes,i=n("44d2");r({target:"Array",proto:!0},{includes:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}}),i("includes")},cb29:function(t,e,n){var r=n("23e7"),a=n("81d5"),i=n("44d2");r({target:"Array",proto:!0},{fill:a}),i("fill")},cb5a:function(t,e,n){var r=n("9638");function a(t,e){var n=t.length;while(n--)if(r(t[n][0],e))return n;return-1}t.exports=a},cc12:function(t,e,n){var r=n("da84"),a=n("861d"),i=r.document,o=a(i)&&a(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},cc73:function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n("fd3a"),a=n("8c86");function i(t,e){Object(a["a"])(2,arguments);var n=Object(r["a"])(t),i=Object(r["a"])(e);return n.getTime()===i.getTime()}},cca6:function(t,e,n){var r=n("23e7"),a=n("60da");r({target:"Object",stat:!0,forced:Object.assign!==a},{assign:a})},cd61:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-heart",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z"}})]))}}},cdf9:function(t,e,n){var r=n("825a"),a=n("861d"),i=n("f069");t.exports=function(t,e){if(r(t),a(e)&&e.constructor===t)return e;var n=i.f(t),o=n.resolve;return o(e),n.promise}},ce4e:function(t,e,n){var r=n("da84"),a=n("9112");t.exports=function(t,e){try{a(r,t,e)}catch(n){r[t]=e}return e}},ce86:function(t,e,n){var r=n("9e69"),a=n("7948"),i=n("6747"),o=n("ffd6"),s=1/0,c=r?r.prototype:void 0,l=c?c.toString:void 0;function u(t){if("string"==typeof t)return t;if(i(t))return a(t,u)+"";if(o(t))return l?l.call(t):"";var e=t+"";return"0"==e&&1/t==-s?"-0":e}t.exports=u},d012:function(t,e){t.exports={}},d039:function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},d056:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-paperclip",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"}})]))}}},d066:function(t,e,n){var r=n("428f"),a=n("da84"),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(a[t]):r[t]&&r[t][e]||a[t]&&a[t][e]}},d1c0:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-chevron-up",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M18 15l-6-6-6 6"}})]))}}},d1e7:function(t,e,n){"use strict";var r={}.propertyIsEnumerable,a=Object.getOwnPropertyDescriptor,i=a&&!r.call({1:2},1);e.f=i?function(t){var e=a(this,t);return!!e&&e.enumerable}:r},d28b:function(t,e,n){var r=n("746f");r("iterator")},d2bb:function(t,e,n){var r=n("825a"),a=n("3bbe");t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,n={};try{t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,t.call(n,[]),e=n instanceof Array}catch(i){}return function(n,i){return r(n),a(i),e?t.call(n,i):n.__proto__=i,n}}():void 0)},d2c2:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-chevron-right",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M9 18l6-6-6-6"}})]))}}},d2dc:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0;var a=r(n("1339")),i=r(n("1768")),o=function(){function t(t){this.cfg=t}return t.prototype.format=function(t){return new i["default"](this.cfg,this.tokenizer(),this.tokenOverride).format(t)},t.prototype.tokenize=function(t){return this.tokenizer().tokenize(t)},t.prototype.tokenizer=function(){return new a["default"](this.getTokenizerConfig())},t}();e["default"]=o},d3b7:function(t,e,n){var r=n("00ee"),a=n("6eeb"),i=n("b041");r||a(Object.prototype,"toString",i,{unsafe:!0})},d44e:function(t,e,n){var r=n("9bf2").f,a=n("5135"),i=n("b622"),o=i("toStringTag");t.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,o)&&r(t,o,{configurable:!0,value:e})}},d4bc:function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},t(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0;var i=a(n("d2dc")),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.getTokenizerConfig=function(){return{reservedWords:s,reservedTopLevelWords:c,reservedNewlineWords:u,reservedTopLevelWordsNoIndent:l,stringTypes:['""',"''","``"],openParens:["(","[","{"],closeParens:[")","]","}"],namedPlaceholderTypes:["$"],lineCommentTypes:["#","--"],specialWordChars:[]}},e}(i["default"]);e["default"]=o;var s=["ALL","ALTER","ANALYZE","AND","ANY","ARRAY","AS","ASC","BEGIN","BETWEEN","BINARY","BOOLEAN","BREAK","BUCKET","BUILD","BY","CALL","CASE","CAST","CLUSTER","COLLATE","COLLECTION","COMMIT","CONNECT","CONTINUE","CORRELATE","COVER","CREATE","DATABASE","DATASET","DATASTORE","DECLARE","DECREMENT","DELETE","DERIVED","DESC","DESCRIBE","DISTINCT","DO","DROP","EACH","ELEMENT","ELSE","END","EVERY","EXCEPT","EXCLUDE","EXECUTE","EXISTS","EXPLAIN","FALSE","FETCH","FIRST","FLATTEN","FOR","FORCE","FROM","FUNCTION","GRANT","GROUP","GSI","HAVING","IF","IGNORE","ILIKE","IN","INCLUDE","INCREMENT","INDEX","INFER","INLINE","INNER","INSERT","INTERSECT","INTO","IS","JOIN","KEY","KEYS","KEYSPACE","KNOWN","LAST","LEFT","LET","LETTING","LIKE","LIMIT","LSM","MAP","MAPPING","MATCHED","MATERIALIZED","MERGE","MISSING","NAMESPACE","NEST","NOT","NULL","NUMBER","OBJECT","OFFSET","ON","OPTION","OR","ORDER","OUTER","OVER","PARSE","PARTITION","PASSWORD","PATH","POOL","PREPARE","PRIMARY","PRIVATE","PRIVILEGE","PROCEDURE","PUBLIC","RAW","REALM","REDUCE","RENAME","RETURN","RETURNING","REVOKE","RIGHT","ROLE","ROLLBACK","SATISFIES","SCHEMA","SELECT","SELF","SEMI","SET","SHOW","SOME","START","STATISTICS","STRING","SYSTEM","THEN","TO","TRANSACTION","TRIGGER","TRUE","TRUNCATE","UNDER","UNION","UNIQUE","UNKNOWN","UNNEST","UNSET","UPDATE","UPSERT","USE","USER","USING","VALIDATE","VALUE","VALUED","VALUES","VIA","VIEW","WHEN","WHERE","WHILE","WITH","WITHIN","WORK","XOR"],c=["DELETE FROM","EXCEPT ALL","EXCEPT","EXPLAIN DELETE FROM","EXPLAIN UPDATE","EXPLAIN UPSERT","FROM","GROUP BY","HAVING","INFER","INSERT INTO","LET","LIMIT","MERGE","NEST","ORDER BY","PREPARE","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNNEST","UPDATE","UPSERT","USE KEYS","VALUES","WHERE"],l=["INTERSECT","INTERSECT ALL","MINUS","UNION","UNION ALL"],u=["AND","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","XOR"]},d4ec:function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}n.d(e,"a",(function(){return r}))},d784:function(t,e,n){"use strict";n("ac1f");var r=n("6eeb"),a=n("9263"),i=n("d039"),o=n("b622"),s=n("9112"),c=o("species"),l=RegExp.prototype;t.exports=function(t,e,n,u){var f=o(t),d=!i((function(){var e={};return e[f]=function(){return 7},7!=""[t](e)})),p=d&&!i((function(){var e=!1,n=/a/;return"split"===t&&(n={},n.constructor={},n.constructor[c]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return e=!0,null},n[f](""),!e}));if(!d||!p||n){var h=/./[f],m=e(f,""[t],(function(t,e,n,r,i){var o=e.exec;return o===a||o===l.exec?d&&!i?{done:!0,value:h.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}}));r(String.prototype,t,m[0]),r(l,f,m[1])}u&&s(l[f],"sham",!0)}},d81d:function(t,e,n){"use strict";var r=n("23e7"),a=n("b727").map,i=n("1dde"),o=i("map");r({target:"Array",proto:!0,forced:!o},{map:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}})},d998:function(t,e,n){var r=n("342f");t.exports=/MSIE|Trident/.test(r)},da03:function(t,e,n){var r=n("2b3e"),a=r["__core-js_shared__"];t.exports=a},da84:function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||Function("return this")()}).call(this,n("c8ba"))},db04:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-slash",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("path",{attrs:{d:"M4.93 4.93l14.14 14.14"}})]))}}},dbb4:function(t,e,n){var r=n("23e7"),a=n("83ab"),i=n("56ef"),o=n("fc6a"),s=n("06cf"),c=n("8418");r({target:"Object",stat:!0,sham:!a},{getOwnPropertyDescriptors:function(t){var e,n,r=o(t),a=s.f,l=i(r),u={},f=0;while(l.length>f)n=a(r,e=l[f++]),void 0!==n&&c(u,e,n);return u}})},dc57:function(t,e){var n=Function.prototype,r=n.toString;function a(t){if(null!=t){try{return r.call(t)}catch(e){}try{return t+""}catch(e){}}return""}t.exports=a},ddb0:function(t,e,n){var r=n("da84"),a=n("fdbc"),i=n("e260"),o=n("9112"),s=n("b622"),c=s("iterator"),l=s("toStringTag"),u=i.values;for(var f in a){var d=r[f],p=d&&d.prototype;if(p){if(p[c]!==u)try{o(p,c,u)}catch(m){p[c]=u}if(p[l]||o(p,l,f),a[f])for(var h in i)if(p[h]!==i[h])try{o(p,h,i[h])}catch(m){p[h]=i[h]}}}},df75:function(t,e,n){var r=n("ca84"),a=n("7839");t.exports=Object.keys||function(t){return r(t,a)}},e01a:function(t,e,n){"use strict";var r=n("23e7"),a=n("83ab"),i=n("da84"),o=n("5135"),s=n("861d"),c=n("9bf2").f,l=n("e893"),u=i.Symbol;if(a&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var f={},d=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof d?new u(t):void 0===t?u():u(t);return""===t&&(f[e]=!0),e};l(d,u);var p=d.prototype=u.prototype;p.constructor=d;var h=p.toString,m="Symbol(test)"==String(u("test")),v=/^Symbol\((.*)\)[^)]+$/;c(p,"description",{configurable:!0,get:function(){var t=s(this)?this.valueOf():this,e=h.call(t);if(o(f,t))return"";var n=m?e.slice(7,-1):e.replace(v,"$1");return""===n?void 0:n}}),r({global:!0,forced:!0},{Symbol:d})}},e0e5:function(t,e){function n(){var t=[].slice.call(arguments),e=!1;"boolean"==typeof t[0]&&(e=t.shift());var i=t[0];if(a(i))throw new Error("extendee must be an object");for(var o=t.slice(1),s=o.length,c=0;c=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},e2cc:function(t,e,n){var r=n("6eeb");t.exports=function(t,e,n){for(var a in e)r(t,a,e[a],n);return t}},e2e4:function(t,e,n){var r=n("6747"),a=n("f608"),i=n("18d8"),o=n("76dd");function s(t,e){return r(t)?t:a(t,e)?[t]:i(o(t))}t.exports=s},e380:function(t,e,n){var r=n("7b83"),a="Expected a function";function i(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError(a);var n=function(){var r=arguments,a=e?e.apply(this,r):r[0],i=n.cache;if(i.has(a))return i.get(a);var o=t.apply(this,r);return n.cache=i.set(a,o)||i,o};return n.cache=new(i.Cache||r),n}i.Cache=r,t.exports=i},e3ee:function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var r=n("fe1f"),a=n("8c86"),i=36e5,o=6e4,s=2,c={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},l=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,u=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,f=/^([+-])(\d{2})(?::?(\d{2}))?$/;function d(t,e){Object(a["a"])(1,arguments);var n=e||{},i=null==n.additionalDigits?s:Object(r["a"])(n.additionalDigits);if(2!==i&&1!==i&&0!==i)throw new RangeError("additionalDigits must be 0, 1 or 2");if("string"!==typeof t&&"[object String]"!==Object.prototype.toString.call(t))return new Date(NaN);var o,c=p(t);if(c.date){var l=h(c.date,i);o=m(l.restDateString,l.year)}if(isNaN(o)||!o)return new Date(NaN);var u,f=o.getTime(),d=0;if(c.time&&(d=g(c.time),isNaN(d)||null===d))return new Date(NaN);if(!c.timezone){var v=new Date(f+d),b=new Date(0);return b.setFullYear(v.getUTCFullYear(),v.getUTCMonth(),v.getUTCDate()),b.setHours(v.getUTCHours(),v.getUTCMinutes(),v.getUTCSeconds(),v.getUTCMilliseconds()),b}return u=y(c.timezone),isNaN(u)?new Date(NaN):new Date(f+d+u)}function p(t){var e,n={},r=t.split(c.dateTimeDelimiter);if(r.length>2)return n;if(/:/.test(r[0])?(n.date=null,e=r[0]):(n.date=r[0],e=r[1],c.timeZoneDelimiter.test(n.date)&&(n.date=t.split(c.timeZoneDelimiter)[0],e=t.substr(n.date.length,t.length))),e){var a=c.timezone.exec(e);a?(n.time=e.replace(a[1],""),n.timezone=a[1]):n.time=e}return n}function h(t,e){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+e)+"})|(\\d{2}|[+-]\\d{"+(2+e)+"})$)"),r=t.match(n);if(!r)return{year:null};var a=r[1]&&parseInt(r[1]),i=r[2]&&parseInt(r[2]);return{year:null==i?a:100*i,restDateString:t.slice((r[1]||r[2]).length)}}function m(t,e){if(null===e)return null;var n=t.match(l);if(!n)return null;var r=!!n[4],a=v(n[1]),i=v(n[2])-1,o=v(n[3]),s=v(n[4]),c=v(n[5])-1;if(r)return A(e,s,c)?E(e,s,c):new Date(NaN);var u=new Date(0);return T(e,i,o)&&x(e,a)?(u.setUTCFullYear(e,i,Math.max(a,o)),u):new Date(NaN)}function v(t){return t?parseInt(t):1}function g(t){var e=t.match(u);if(!e)return null;var n=b(e[1]),r=b(e[2]),a=b(e[3]);return O(n,r,a)?n*i+r*o+1e3*a:NaN}function b(t){return t&&parseFloat(t.replace(",","."))||0}function y(t){if("Z"===t)return 0;var e=t.match(f);if(!e)return 0;var n="+"===e[1]?-1:1,r=parseInt(e[2]),a=e[3]&&parseInt(e[3])||0;return S(r,a)?n*(r*i+a*o):NaN}function E(t,e,n){var r=new Date(0);r.setUTCFullYear(t,0,4);var a=r.getUTCDay()||7,i=7*(e-1)+n+1-a;return r.setUTCDate(r.getUTCDate()+i),r}var w=[31,null,31,30,31,30,31,31,30,31,30,31];function k(t){return t%400===0||t%4===0&&t%100}function T(t,e,n){return e>=0&&e<=11&&n>=1&&n<=(w[e]||(k(t)?29:28))}function x(t,e){return e>=1&&e<=(k(t)?366:365)}function A(t,e,n){return e>=1&&e<=53&&n>=0&&n<=6}function O(t,e,n){return 24===t?0===e&&0===n:n>=0&&n<60&&e>=0&&e<60&&t>=0&&t<25}function S(t,e){return e>=0&&e<=59}},e439:function(t,e,n){var r=n("23e7"),a=n("d039"),i=n("fc6a"),o=n("06cf").f,s=n("83ab"),c=a((function(){o(1)})),l=!s||c;r({target:"Object",stat:!0,forced:l,sham:!s},{getOwnPropertyDescriptor:function(t,e){return o(i(t),e)}})},e4c9:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0,e.tokenize=e.format=void 0;var a=r(n("f4a9")),i=r(n("d4bc")),o=r(n("74bb")),s=r(n("15f4"));e.format=function(t,e){switch(void 0===e&&(e={}),e.language){case"db2":return new a["default"](e).format(t);case"n1ql":return new i["default"](e).format(t);case"pl/sql":return new o["default"](e).format(t);case"sql":default:return new s["default"](e).format(t)}},e.tokenize=function(t,e){return void 0===e&&(e={}),new s["default"](e).tokenize(t)},e["default"]={format:e.format,tokenize:e.tokenize}},e538:function(t,e,n){var r=n("b622");e.f=r},e667:function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(e){return{error:!0,value:e}}}},e6cf:function(t,e,n){"use strict";var r,a,i,o,s=n("23e7"),c=n("c430"),l=n("da84"),u=n("d066"),f=n("fea9"),d=n("6eeb"),p=n("e2cc"),h=n("d2bb"),m=n("d44e"),v=n("2626"),g=n("861d"),b=n("1c0b"),y=n("19aa"),E=n("8925"),w=n("2266"),k=n("1c7e"),T=n("4840"),x=n("2cf4").set,A=n("b575"),O=n("cdf9"),S=n("44de"),R=n("f069"),N=n("e667"),C=n("69f3"),_=n("94ca"),L=n("b622"),I=n("6069"),D=n("605d"),P=n("2d00"),M=L("species"),U="Promise",j=C.get,F=C.set,B=C.getterFor(U),H=f&&f.prototype,z=f,q=H,G=l.TypeError,Y=l.document,V=l.process,W=R.f,X=W,$=!!(Y&&Y.createEvent&&l.dispatchEvent),Q="function"==typeof PromiseRejectionEvent,K="unhandledrejection",J="rejectionhandled",Z=0,tt=1,et=2,nt=1,rt=2,at=!1,it=_(U,(function(){var t=E(z),e=t!==String(z);if(!e&&66===P)return!0;if(c&&!q["finally"])return!0;if(P>=51&&/native code/.test(t))return!1;var n=new z((function(t){t(1)})),r=function(t){t((function(){}),(function(){}))},a=n.constructor={};return a[M]=r,at=n.then((function(){}))instanceof r,!at||!e&&I&&!Q})),ot=it||!k((function(t){z.all(t)["catch"]((function(){}))})),st=function(t){var e;return!(!g(t)||"function"!=typeof(e=t.then))&&e},ct=function(t,e){if(!t.notified){t.notified=!0;var n=t.reactions;A((function(){var r=t.value,a=t.state==tt,i=0;while(n.length>i){var o,s,c,l=n[i++],u=a?l.ok:l.fail,f=l.resolve,d=l.reject,p=l.domain;try{u?(a||(t.rejection===rt&&dt(t),t.rejection=nt),!0===u?o=r:(p&&p.enter(),o=u(r),p&&(p.exit(),c=!0)),o===l.promise?d(G("Promise-chain cycle")):(s=st(o))?s.call(o,f,d):f(o)):d(r)}catch(h){p&&!c&&p.exit(),d(h)}}t.reactions=[],t.notified=!1,e&&!t.rejection&&ut(t)}))}},lt=function(t,e,n){var r,a;$?(r=Y.createEvent("Event"),r.promise=e,r.reason=n,r.initEvent(t,!1,!0),l.dispatchEvent(r)):r={promise:e,reason:n},!Q&&(a=l["on"+t])?a(r):t===K&&S("Unhandled promise rejection",n)},ut=function(t){x.call(l,(function(){var e,n=t.facade,r=t.value,a=ft(t);if(a&&(e=N((function(){D?V.emit("unhandledRejection",r,n):lt(K,n,r)})),t.rejection=D||ft(t)?rt:nt,e.error))throw e.value}))},ft=function(t){return t.rejection!==nt&&!t.parent},dt=function(t){x.call(l,(function(){var e=t.facade;D?V.emit("rejectionHandled",e):lt(J,e,t.value)}))},pt=function(t,e,n){return function(r){t(e,r,n)}},ht=function(t,e,n){t.done||(t.done=!0,n&&(t=n),t.value=e,t.state=et,ct(t,!0))},mt=function(t,e,n){if(!t.done){t.done=!0,n&&(t=n);try{if(t.facade===e)throw G("Promise can't be resolved itself");var r=st(e);r?A((function(){var n={done:!1};try{r.call(e,pt(mt,n,t),pt(ht,n,t))}catch(a){ht(n,a,t)}})):(t.value=e,t.state=tt,ct(t,!1))}catch(a){ht({done:!1},a,t)}}};if(it&&(z=function(t){y(this,z,U),b(t),r.call(this);var e=j(this);try{t(pt(mt,e),pt(ht,e))}catch(n){ht(e,n)}},q=z.prototype,r=function(t){F(this,{type:U,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:Z,value:void 0})},r.prototype=p(q,{then:function(t,e){var n=B(this),r=W(T(this,z));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=D?V.domain:void 0,n.parent=!0,n.reactions.push(r),n.state!=Z&&ct(n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),a=function(){var t=new r,e=j(t);this.promise=t,this.resolve=pt(mt,e),this.reject=pt(ht,e)},R.f=W=function(t){return t===z||t===i?new a(t):X(t)},!c&&"function"==typeof f&&H!==Object.prototype)){o=H.then,at||(d(H,"then",(function(t,e){var n=this;return new z((function(t,e){o.call(n,t,e)})).then(t,e)}),{unsafe:!0}),d(H,"catch",q["catch"],{unsafe:!0}));try{delete H.constructor}catch(vt){}h&&h(H,q)}s({global:!0,wrap:!0,forced:it},{Promise:z}),m(z,U,!1,!0),v(U),i=u(U),s({target:U,stat:!0,forced:it},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),s({target:U,stat:!0,forced:c||it},{resolve:function(t){return O(c&&this===i?z:this,t)}}),s({target:U,stat:!0,forced:ot},{all:function(t){var e=this,n=W(e),r=n.resolve,a=n.reject,i=N((function(){var n=b(e.resolve),i=[],o=0,s=1;w(t,(function(t){var c=o++,l=!1;i.push(void 0),s++,n.call(e,t).then((function(t){l||(l=!0,i[c]=t,--s||r(i))}),a)})),--s||r(i)}));return i.error&&a(i.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,a=N((function(){var a=b(e.resolve);w(t,(function(t){a.call(e,t).then(n.resolve,r)}))}));return a.error&&r(a.value),n.promise}})},e78e:function(t,e){t.exports={functional:!0,render(t,e){const{_c:n,_v:r,data:a,children:i=[]}=e,{class:o,staticClass:s,style:c,staticStyle:l,attrs:u={},...f}=a;return n("svg",{class:["feather feather-edit-2",o,s],style:[c,l],attrs:Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},u),...f},i.concat([n("path",{attrs:{d:"M17 3a2.828 2.828 0 114 4L7.5 20.5 2 22l1.5-5.5L17 3z"}})]))}}},e893:function(t,e,n){var r=n("5135"),a=n("56ef"),i=n("06cf"),o=n("9bf2");t.exports=function(t,e){for(var n=a(e),s=o.f,c=i.f,l=0;l + * Released under the MIT License. + */ +!function(e,n){t.exports=n()}(0,(function(){"use strict";var t={circle:{className:"sk-circle",divCount:12},"cube-grid":{className:"sk-cube-grid",divCount:9},wave:{className:"sk-wave",divCount:5},"folding-cube":{className:"sk-folding-cube",divCount:4},"three-bounce":{className:"sk-three-bounce",divCount:3},"double-bounce":{className:"sk-double-bounce",divCount:2},"wandering-cubes":{className:"sk-wandering-cubes",divCount:2},"chasing-dots":{className:"sk-chasing-dots",divCount:2},"rotating-plane":{className:"sk-rotating-plane",divCount:1},pulse:{className:"sk-pulse",divCount:1},wordpress:{className:"sk-wordpress",divCount:1},"fading-circle":{className:"sk-fading-circle",divCount:12}},e={"ball-grid-beat":{divCount:9},"ball-grid-pulse":{divCount:9},"line-spin-fade-loader":{divCount:8},"ball-spin-fade-loader":{divCount:8},"ball-pulse-rise":{divCount:5},"line-scale":{divCount:5},"line-scale-pulse-out":{divCount:5},"line-scale-pulse-out-rapid":{divCount:5},pacman:{divCount:5},"line-scale-party":{divCount:4},"ball-triangle-path":{divCount:3},"ball-scale-multiple":{divCount:3},"ball-scale-ripple-multiple":{divCount:3},"ball-pulse-sync":{divCount:3},"ball-beat":{divCount:3},"ball-zig-zag":{divCount:2},"ball-zig-zag-deflect":{divCount:2},"ball-clip-rotate-pulse":{divCount:2},"ball-clip-rotate-multiple":{divCount:2},"ball-clip-rotate":{divCount:1},"ball-scale-ripple":{divCount:1},"triangle-skew-spin":{divCount:1}},n={spinkitSpinners:t,loadersCssSpinners:e,allSpinners:Object.assign({},t,e)};return function(){if("undefined"!=typeof document){var t=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style"),n="/** * * All animations must live in their own file * in the animations directory and be included * here. * */ /** * Styles shared by multiple animations */ /** * Dots */ @-webkit-keyframes scale { 0% { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } 45% { -webkit-transform: scale(0.1); transform: scale(0.1); opacity: 0.7; } 80% { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } } @keyframes scale { 0% { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } 45% { -webkit-transform: scale(0.1); transform: scale(0.1); opacity: 0.7; } 80% { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } } .ball-pulse > div[data-v-39432f99]:nth-child(0) { -webkit-animation: scale 0.75s -0.36s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: scale 0.75s -0.36s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .ball-pulse > div[data-v-39432f99]:nth-child(1) { -webkit-animation: scale 0.75s -0.24s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: scale 0.75s -0.24s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .ball-pulse > div[data-v-39432f99]:nth-child(2) { -webkit-animation: scale 0.75s -0.12s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: scale 0.75s -0.12s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .ball-pulse > div[data-v-39432f99]:nth-child(3) { -webkit-animation: scale 0.75s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: scale 0.75s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .ball-pulse > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; } @-webkit-keyframes ball-pulse-sync { 33% { -webkit-transform: translateY(10px); transform: translateY(10px); } 66% { -webkit-transform: translateY(-10px); transform: translateY(-10px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes ball-pulse-sync { 33% { -webkit-transform: translateY(10px); transform: translateY(10px); } 66% { -webkit-transform: translateY(-10px); transform: translateY(-10px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); } } .ball-pulse-sync > div[data-v-39432f99]:nth-child(0) { -webkit-animation: ball-pulse-sync 0.6s -0.21s infinite ease-in-out; animation: ball-pulse-sync 0.6s -0.21s infinite ease-in-out; } .ball-pulse-sync > div[data-v-39432f99]:nth-child(1) { -webkit-animation: ball-pulse-sync 0.6s -0.14s infinite ease-in-out; animation: ball-pulse-sync 0.6s -0.14s infinite ease-in-out; } .ball-pulse-sync > div[data-v-39432f99]:nth-child(2) { -webkit-animation: ball-pulse-sync 0.6s -0.07s infinite ease-in-out; animation: ball-pulse-sync 0.6s -0.07s infinite ease-in-out; } .ball-pulse-sync > div[data-v-39432f99]:nth-child(3) { -webkit-animation: ball-pulse-sync 0.6s 0s infinite ease-in-out; animation: ball-pulse-sync 0.6s 0s infinite ease-in-out; } .ball-pulse-sync > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; } @-webkit-keyframes ball-scale { 0% { -webkit-transform: scale(0); transform: scale(0); } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; } } @keyframes ball-scale { 0% { -webkit-transform: scale(0); transform: scale(0); } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; } } .ball-scale > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; height: 60px; width: 60px; -webkit-animation: ball-scale 1s 0s ease-in-out infinite; animation: ball-scale 1s 0s ease-in-out infinite; } @keyframes ball-scale { 0% { -webkit-transform: scale(0); transform: scale(0); } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; } } .ball-scale > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; height: 60px; width: 60px; -webkit-animation: ball-scale 1s 0s ease-in-out infinite; animation: ball-scale 1s 0s ease-in-out infinite; } .ball-scale-random[data-v-39432f99] { width: 37px; height: 40px; } .ball-scale-random > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; display: inline-block; height: 30px; width: 30px; -webkit-animation: ball-scale 1s 0s ease-in-out infinite; animation: ball-scale 1s 0s ease-in-out infinite; } .ball-scale-random > div[data-v-39432f99]:nth-child(1) { margin-left: -7px; -webkit-animation: ball-scale 1s 0.2s ease-in-out infinite; animation: ball-scale 1s 0.2s ease-in-out infinite; } .ball-scale-random > div[data-v-39432f99]:nth-child(3) { margin-left: -2px; margin-top: 9px; -webkit-animation: ball-scale 1s 0.5s ease-in-out infinite; animation: ball-scale 1s 0.5s ease-in-out infinite; } @-webkit-keyframes rotate { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 50% { -webkit-transform: rotate(180deg); transform: rotate(180deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes rotate { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 50% { -webkit-transform: rotate(180deg); transform: rotate(180deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } .ball-rotate[data-v-39432f99] { position: relative; } .ball-rotate > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: relative; } .ball-rotate > div[data-v-39432f99]:first-child { -webkit-animation: rotate 1s 0s cubic-bezier(0.7, -0.13, 0.22, 0.86) infinite; animation: rotate 1s 0s cubic-bezier(0.7, -0.13, 0.22, 0.86) infinite; } .ball-rotate > div[data-v-39432f99]:before, .ball-rotate > div[data-v-39432f99]:after { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; content: \"\"; position: absolute; opacity: 0.8; } .ball-rotate > div[data-v-39432f99]:before { top: 0px; left: -28px; } .ball-rotate > div[data-v-39432f99]:after { top: 0px; left: 25px; } @keyframes rotate { 0% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } 50% { -webkit-transform: rotate(180deg) scale(0.6); transform: rotate(180deg) scale(0.6); } 100% { -webkit-transform: rotate(360deg) scale(1); transform: rotate(360deg) scale(1); } } .ball-clip-rotate > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; border: 2px solid #fff; border-bottom-color: transparent; height: 25px; width: 25px; background: transparent !important; display: inline-block; -webkit-animation: rotate 0.75s 0s linear infinite; animation: rotate 0.75s 0s linear infinite; } @keyframes rotate { 0% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } 50% { -webkit-transform: rotate(180deg) scale(0.6); transform: rotate(180deg) scale(0.6); } 100% { -webkit-transform: rotate(360deg) scale(1); transform: rotate(360deg) scale(1); } } @keyframes scale { 30% { -webkit-transform: scale(0.3); transform: scale(0.3); } 100% { -webkit-transform: scale(1); transform: scale(1); } } .ball-clip-rotate-pulse[data-v-39432f99] { position: relative; -webkit-transform: translateY(-15px); transform: translateY(-15px); } .ball-clip-rotate-pulse > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; top: 0px; left: 0px; border-radius: 100%; } .ball-clip-rotate-pulse > div[data-v-39432f99]:first-child { background: #fff; height: 16px; width: 16px; top: 7px; left: -7px; -webkit-animation: scale 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; animation: scale 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; } .ball-clip-rotate-pulse > div[data-v-39432f99]:last-child { position: absolute; border: 2px solid #fff; width: 30px; height: 30px; left: -16px; top: -2px; background: transparent; border: 2px solid; border-color: #fff transparent #fff transparent; -webkit-animation: rotate 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; animation: rotate 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; -webkit-animation-duration: 1s; animation-duration: 1s; } @keyframes rotate { 0% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } 50% { -webkit-transform: rotate(180deg) scale(0.6); transform: rotate(180deg) scale(0.6); } 100% { -webkit-transform: rotate(360deg) scale(1); transform: rotate(360deg) scale(1); } } .ball-clip-rotate-multiple[data-v-39432f99] { position: relative; } .ball-clip-rotate-multiple > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; left: -20px; top: -20px; border: 2px solid #fff; border-bottom-color: transparent; border-top-color: transparent; border-radius: 100%; height: 35px; width: 35px; -webkit-animation: rotate 1s 0s ease-in-out infinite; animation: rotate 1s 0s ease-in-out infinite; } .ball-clip-rotate-multiple > div[data-v-39432f99]:last-child { display: inline-block; top: -10px; left: -10px; width: 15px; height: 15px; -webkit-animation-duration: 0.5s; animation-duration: 0.5s; border-color: #fff transparent #fff transparent; -webkit-animation-direction: reverse; animation-direction: reverse; } @-webkit-keyframes ball-scale-ripple { 0% { -webkit-transform: scale(0.1); transform: scale(0.1); opacity: 1; } 70% { -webkit-transform: scale(1); transform: scale(1); opacity: 0.7; } 100% { opacity: 0.0; } } @keyframes ball-scale-ripple { 0% { -webkit-transform: scale(0.1); transform: scale(0.1); opacity: 1; } 70% { -webkit-transform: scale(1); transform: scale(1); opacity: 0.7; } 100% { opacity: 0.0; } } .ball-scale-ripple > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; height: 50px; width: 50px; border-radius: 100%; border: 2px solid #fff; -webkit-animation: ball-scale-ripple 1s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8); animation: ball-scale-ripple 1s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8); } @-webkit-keyframes ball-scale-ripple-multiple { 0% { -webkit-transform: scale(0.1); transform: scale(0.1); opacity: 1; } 70% { -webkit-transform: scale(1); transform: scale(1); opacity: 0.7; } 100% { opacity: 0.0; } } @keyframes ball-scale-ripple-multiple { 0% { -webkit-transform: scale(0.1); transform: scale(0.1); opacity: 1; } 70% { -webkit-transform: scale(1); transform: scale(1); opacity: 0.7; } 100% { opacity: 0.0; } } .ball-scale-ripple-multiple[data-v-39432f99] { position: relative; -webkit-transform: translateY(-25px); transform: translateY(-25px); } .ball-scale-ripple-multiple > div[data-v-39432f99]:nth-child(0) { -webkit-animation-delay: -0.8s; animation-delay: -0.8s; } .ball-scale-ripple-multiple > div[data-v-39432f99]:nth-child(1) { -webkit-animation-delay: -0.6s; animation-delay: -0.6s; } .ball-scale-ripple-multiple > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: -0.4s; animation-delay: -0.4s; } .ball-scale-ripple-multiple > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: -0.2s; animation-delay: -0.2s; } .ball-scale-ripple-multiple > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; top: -2px; left: -26px; width: 50px; height: 50px; border-radius: 100%; border: 2px solid #fff; -webkit-animation: ball-scale-ripple-multiple 1.25s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8); animation: ball-scale-ripple-multiple 1.25s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8); } @-webkit-keyframes ball-beat { 50% { opacity: 0.2; -webkit-transform: scale(0.75); transform: scale(0.75); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @keyframes ball-beat { 50% { opacity: 0.2; -webkit-transform: scale(0.75); transform: scale(0.75); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } .ball-beat > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; -webkit-animation: ball-beat 0.7s 0s infinite linear; animation: ball-beat 0.7s 0s infinite linear; } .ball-beat > div[data-v-39432f99]:nth-child(2n-1) { -webkit-animation-delay: -0.35s !important; animation-delay: -0.35s !important; } @-webkit-keyframes ball-scale-multiple { 0% { -webkit-transform: scale(0); transform: scale(0); opacity: 0; } 5% { opacity: 1; } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; } } @keyframes ball-scale-multiple { 0% { -webkit-transform: scale(0); transform: scale(0); opacity: 0; } 5% { opacity: 1; } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; } } .ball-scale-multiple[data-v-39432f99] { position: relative; -webkit-transform: translateY(-30px); transform: translateY(-30px); } .ball-scale-multiple > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: -0.4s; animation-delay: -0.4s; } .ball-scale-multiple > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: -0.2s; animation-delay: -0.2s; } .ball-scale-multiple > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; left: -30px; top: 0px; opacity: 0; margin: 0; width: 60px; height: 60px; -webkit-animation: ball-scale-multiple 1s 0s linear infinite; animation: ball-scale-multiple 1s 0s linear infinite; } @-webkit-keyframes ball-triangle-path-1 { 33% { -webkit-transform: translate(25px, -50px); transform: translate(25px, -50px); } 66% { -webkit-transform: translate(50px, 0px); transform: translate(50px, 0px); } 100% { -webkit-transform: translate(0px, 0px); transform: translate(0px, 0px); } } @keyframes ball-triangle-path-1 { 33% { -webkit-transform: translate(25px, -50px); transform: translate(25px, -50px); } 66% { -webkit-transform: translate(50px, 0px); transform: translate(50px, 0px); } 100% { -webkit-transform: translate(0px, 0px); transform: translate(0px, 0px); } } @-webkit-keyframes ball-triangle-path-2 { 33% { -webkit-transform: translate(25px, 50px); transform: translate(25px, 50px); } 66% { -webkit-transform: translate(-25px, 50px); transform: translate(-25px, 50px); } 100% { -webkit-transform: translate(0px, 0px); transform: translate(0px, 0px); } } @keyframes ball-triangle-path-2 { 33% { -webkit-transform: translate(25px, 50px); transform: translate(25px, 50px); } 66% { -webkit-transform: translate(-25px, 50px); transform: translate(-25px, 50px); } 100% { -webkit-transform: translate(0px, 0px); transform: translate(0px, 0px); } } @-webkit-keyframes ball-triangle-path-3 { 33% { -webkit-transform: translate(-50px, 0px); transform: translate(-50px, 0px); } 66% { -webkit-transform: translate(-25px, -50px); transform: translate(-25px, -50px); } 100% { -webkit-transform: translate(0px, 0px); transform: translate(0px, 0px); } } @keyframes ball-triangle-path-3 { 33% { -webkit-transform: translate(-50px, 0px); transform: translate(-50px, 0px); } 66% { -webkit-transform: translate(-25px, -50px); transform: translate(-25px, -50px); } 100% { -webkit-transform: translate(0px, 0px); transform: translate(0px, 0px); } } .ball-triangle-path[data-v-39432f99] { position: relative; -webkit-transform: translate(-29.994px, -37.50938px); transform: translate(-29.994px, -37.50938px); } .ball-triangle-path > div[data-v-39432f99]:nth-child(1) { -webkit-animation-name: ball-triangle-path-1; animation-name: ball-triangle-path-1; -webkit-animation-delay: 0; animation-delay: 0; -webkit-animation-duration: 2s; animation-duration: 2s; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; } .ball-triangle-path > div[data-v-39432f99]:nth-child(2) { -webkit-animation-name: ball-triangle-path-2; animation-name: ball-triangle-path-2; -webkit-animation-delay: 0; animation-delay: 0; -webkit-animation-duration: 2s; animation-duration: 2s; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; } .ball-triangle-path > div[data-v-39432f99]:nth-child(3) { -webkit-animation-name: ball-triangle-path-3; animation-name: ball-triangle-path-3; -webkit-animation-delay: 0; animation-delay: 0; -webkit-animation-duration: 2s; animation-duration: 2s; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; } .ball-triangle-path > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; width: 10px; height: 10px; border-radius: 100%; border: 1px solid #fff; } .ball-triangle-path > div[data-v-39432f99]:nth-of-type(1) { top: 50px; } .ball-triangle-path > div[data-v-39432f99]:nth-of-type(2) { left: 25px; } .ball-triangle-path > div[data-v-39432f99]:nth-of-type(3) { top: 50px; left: 50px; } @-webkit-keyframes ball-pulse-rise-even { 0% { -webkit-transform: scale(1.1); transform: scale(1.1); } 25% { -webkit-transform: translateY(-30px); transform: translateY(-30px); } 50% { -webkit-transform: scale(0.4); transform: scale(0.4); } 75% { -webkit-transform: translateY(30px); transform: translateY(30px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); -webkit-transform: scale(1); transform: scale(1); } } @keyframes ball-pulse-rise-even { 0% { -webkit-transform: scale(1.1); transform: scale(1.1); } 25% { -webkit-transform: translateY(-30px); transform: translateY(-30px); } 50% { -webkit-transform: scale(0.4); transform: scale(0.4); } 75% { -webkit-transform: translateY(30px); transform: translateY(30px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); -webkit-transform: scale(1); transform: scale(1); } } @-webkit-keyframes ball-pulse-rise-odd { 0% { -webkit-transform: scale(0.4); transform: scale(0.4); } 25% { -webkit-transform: translateY(30px); transform: translateY(30px); } 50% { -webkit-transform: scale(1.1); transform: scale(1.1); } 75% { -webkit-transform: translateY(-30px); transform: translateY(-30px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); -webkit-transform: scale(0.75); transform: scale(0.75); } } @keyframes ball-pulse-rise-odd { 0% { -webkit-transform: scale(0.4); transform: scale(0.4); } 25% { -webkit-transform: translateY(30px); transform: translateY(30px); } 50% { -webkit-transform: scale(1.1); transform: scale(1.1); } 75% { -webkit-transform: translateY(-30px); transform: translateY(-30px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); -webkit-transform: scale(0.75); transform: scale(0.75); } } .ball-pulse-rise > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-timing-function: cubic-bezier(0.15, 0.46, 0.9, 0.6); animation-timing-function: cubic-bezier(0.15, 0.46, 0.9, 0.6); -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-delay: 0; animation-delay: 0; } .ball-pulse-rise > div[data-v-39432f99]:nth-child(2n) { -webkit-animation-name: ball-pulse-rise-even; animation-name: ball-pulse-rise-even; } .ball-pulse-rise > div[data-v-39432f99]:nth-child(2n-1) { -webkit-animation-name: ball-pulse-rise-odd; animation-name: ball-pulse-rise-odd; } @-webkit-keyframes ball-grid-beat { 50% { opacity: 0.7; } 100% { opacity: 1; } } @keyframes ball-grid-beat { 50% { opacity: 0.7; } 100% { opacity: 1; } } .ball-grid-beat[data-v-39432f99] { width: 57px; } .ball-grid-beat > div[data-v-39432f99]:nth-child(1) { -webkit-animation-delay: 0.44s; animation-delay: 0.44s; -webkit-animation-duration: 1.27s; animation-duration: 1.27s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: 0.2s; animation-delay: 0.2s; -webkit-animation-duration: 1.52s; animation-duration: 1.52s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: 0.14s; animation-delay: 0.14s; -webkit-animation-duration: 0.61s; animation-duration: 0.61s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: 0.15s; animation-delay: 0.15s; -webkit-animation-duration: 0.82s; animation-duration: 0.82s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(5) { -webkit-animation-delay: -0.01s; animation-delay: -0.01s; -webkit-animation-duration: 1.24s; animation-duration: 1.24s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(6) { -webkit-animation-delay: -0.07s; animation-delay: -0.07s; -webkit-animation-duration: 1.35s; animation-duration: 1.35s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(7) { -webkit-animation-delay: 0.29s; animation-delay: 0.29s; -webkit-animation-duration: 1.44s; animation-duration: 1.44s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(8) { -webkit-animation-delay: 0.63s; animation-delay: 0.63s; -webkit-animation-duration: 1.19s; animation-duration: 1.19s; } .ball-grid-beat > div[data-v-39432f99]:nth-child(9) { -webkit-animation-delay: -0.18s; animation-delay: -0.18s; -webkit-animation-duration: 1.48s; animation-duration: 1.48s; } .ball-grid-beat > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; float: left; -webkit-animation-name: ball-grid-beat; animation-name: ball-grid-beat; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-delay: 0; animation-delay: 0; } @-webkit-keyframes ball-grid-pulse { 0% { -webkit-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(0.5); transform: scale(0.5); opacity: 0.7; } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } } @keyframes ball-grid-pulse { 0% { -webkit-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(0.5); transform: scale(0.5); opacity: 0.7; } 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } } .ball-grid-pulse[data-v-39432f99] { width: 57px; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(1) { -webkit-animation-delay: 0.58s; animation-delay: 0.58s; -webkit-animation-duration: 0.9s; animation-duration: 0.9s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: 0.01s; animation-delay: 0.01s; -webkit-animation-duration: 0.94s; animation-duration: 0.94s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: 0.25s; animation-delay: 0.25s; -webkit-animation-duration: 1.43s; animation-duration: 1.43s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: -0.03s; animation-delay: -0.03s; -webkit-animation-duration: 0.74s; animation-duration: 0.74s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(5) { -webkit-animation-delay: 0.21s; animation-delay: 0.21s; -webkit-animation-duration: 0.68s; animation-duration: 0.68s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(6) { -webkit-animation-delay: 0.25s; animation-delay: 0.25s; -webkit-animation-duration: 1.17s; animation-duration: 1.17s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(7) { -webkit-animation-delay: 0.46s; animation-delay: 0.46s; -webkit-animation-duration: 1.41s; animation-duration: 1.41s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(8) { -webkit-animation-delay: 0.02s; animation-delay: 0.02s; -webkit-animation-duration: 1.56s; animation-duration: 1.56s; } .ball-grid-pulse > div[data-v-39432f99]:nth-child(9) { -webkit-animation-delay: 0.13s; animation-delay: 0.13s; -webkit-animation-duration: 0.78s; animation-duration: 0.78s; } .ball-grid-pulse > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; float: left; -webkit-animation-name: ball-grid-pulse; animation-name: ball-grid-pulse; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-delay: 0; animation-delay: 0; } @-webkit-keyframes ball-spin-fade-loader { 50% { opacity: 0.3; -webkit-transform: scale(0.4); transform: scale(0.4); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @keyframes ball-spin-fade-loader { 50% { opacity: 0.3; -webkit-transform: scale(0.4); transform: scale(0.4); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } .ball-spin-fade-loader[data-v-39432f99] { position: relative; top: -10px; left: -10px; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(1) { top: 25px; left: 0; -webkit-animation: ball-spin-fade-loader 1s -0.96s infinite linear; animation: ball-spin-fade-loader 1s -0.96s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(2) { top: 17.04545px; left: 17.04545px; -webkit-animation: ball-spin-fade-loader 1s -0.84s infinite linear; animation: ball-spin-fade-loader 1s -0.84s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(3) { top: 0; left: 25px; -webkit-animation: ball-spin-fade-loader 1s -0.72s infinite linear; animation: ball-spin-fade-loader 1s -0.72s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(4) { top: -17.04545px; left: 17.04545px; -webkit-animation: ball-spin-fade-loader 1s -0.6s infinite linear; animation: ball-spin-fade-loader 1s -0.6s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(5) { top: -25px; left: 0; -webkit-animation: ball-spin-fade-loader 1s -0.48s infinite linear; animation: ball-spin-fade-loader 1s -0.48s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(6) { top: -17.04545px; left: -17.04545px; -webkit-animation: ball-spin-fade-loader 1s -0.36s infinite linear; animation: ball-spin-fade-loader 1s -0.36s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(7) { top: 0; left: -25px; -webkit-animation: ball-spin-fade-loader 1s -0.24s infinite linear; animation: ball-spin-fade-loader 1s -0.24s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99]:nth-child(8) { top: 17.04545px; left: -17.04545px; -webkit-animation: ball-spin-fade-loader 1s -0.12s infinite linear; animation: ball-spin-fade-loader 1s -0.12s infinite linear; } .ball-spin-fade-loader > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; } @-webkit-keyframes ball-spin-loader { 75% { opacity: 0.2; } 100% { opacity: 1; } } @keyframes ball-spin-loader { 75% { opacity: 0.2; } 100% { opacity: 1; } } .ball-spin-loader[data-v-39432f99] { position: relative; } .ball-spin-loader > span[data-v-39432f99]:nth-child(1) { top: 45px; left: 0; -webkit-animation: ball-spin-loader 2s 0.9s infinite linear; animation: ball-spin-loader 2s 0.9s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(2) { top: 30.68182px; left: 30.68182px; -webkit-animation: ball-spin-loader 2s 1.8s infinite linear; animation: ball-spin-loader 2s 1.8s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(3) { top: 0; left: 45px; -webkit-animation: ball-spin-loader 2s 2.7s infinite linear; animation: ball-spin-loader 2s 2.7s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(4) { top: -30.68182px; left: 30.68182px; -webkit-animation: ball-spin-loader 2s 3.6s infinite linear; animation: ball-spin-loader 2s 3.6s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(5) { top: -45px; left: 0; -webkit-animation: ball-spin-loader 2s 4.5s infinite linear; animation: ball-spin-loader 2s 4.5s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(6) { top: -30.68182px; left: -30.68182px; -webkit-animation: ball-spin-loader 2s 5.4s infinite linear; animation: ball-spin-loader 2s 5.4s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(7) { top: 0; left: -45px; -webkit-animation: ball-spin-loader 2s 6.3s infinite linear; animation: ball-spin-loader 2s 6.3s infinite linear; } .ball-spin-loader > span[data-v-39432f99]:nth-child(8) { top: 30.68182px; left: -30.68182px; -webkit-animation: ball-spin-loader 2s 7.2s infinite linear; animation: ball-spin-loader 2s 7.2s infinite linear; } .ball-spin-loader > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; width: 15px; height: 15px; border-radius: 100%; background: green; } @-webkit-keyframes ball-zig { 33% { -webkit-transform: translate(-15px, -30px); transform: translate(-15px, -30px); } 66% { -webkit-transform: translate(15px, -30px); transform: translate(15px, -30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } @keyframes ball-zig { 33% { -webkit-transform: translate(-15px, -30px); transform: translate(-15px, -30px); } 66% { -webkit-transform: translate(15px, -30px); transform: translate(15px, -30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } @-webkit-keyframes ball-zag { 33% { -webkit-transform: translate(15px, 30px); transform: translate(15px, 30px); } 66% { -webkit-transform: translate(-15px, 30px); transform: translate(-15px, 30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } @keyframes ball-zag { 33% { -webkit-transform: translate(15px, 30px); transform: translate(15px, 30px); } 66% { -webkit-transform: translate(-15px, 30px); transform: translate(-15px, 30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } .ball-zig-zag[data-v-39432f99] { position: relative; -webkit-transform: translate(-15px, -15px); transform: translate(-15px, -15px); } .ball-zig-zag > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; margin-left: 15px; top: 4px; left: -7px; } .ball-zig-zag > div[data-v-39432f99]:first-child { -webkit-animation: ball-zig 0.7s 0s infinite linear; animation: ball-zig 0.7s 0s infinite linear; } .ball-zig-zag > div[data-v-39432f99]:last-child { -webkit-animation: ball-zag 0.7s 0s infinite linear; animation: ball-zag 0.7s 0s infinite linear; } @-webkit-keyframes ball-zig-deflect { 17% { -webkit-transform: translate(-15px, -30px); transform: translate(-15px, -30px); } 34% { -webkit-transform: translate(15px, -30px); transform: translate(15px, -30px); } 50% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 67% { -webkit-transform: translate(15px, -30px); transform: translate(15px, -30px); } 84% { -webkit-transform: translate(-15px, -30px); transform: translate(-15px, -30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } @keyframes ball-zig-deflect { 17% { -webkit-transform: translate(-15px, -30px); transform: translate(-15px, -30px); } 34% { -webkit-transform: translate(15px, -30px); transform: translate(15px, -30px); } 50% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 67% { -webkit-transform: translate(15px, -30px); transform: translate(15px, -30px); } 84% { -webkit-transform: translate(-15px, -30px); transform: translate(-15px, -30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } @-webkit-keyframes ball-zag-deflect { 17% { -webkit-transform: translate(15px, 30px); transform: translate(15px, 30px); } 34% { -webkit-transform: translate(-15px, 30px); transform: translate(-15px, 30px); } 50% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 67% { -webkit-transform: translate(-15px, 30px); transform: translate(-15px, 30px); } 84% { -webkit-transform: translate(15px, 30px); transform: translate(15px, 30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } @keyframes ball-zag-deflect { 17% { -webkit-transform: translate(15px, 30px); transform: translate(15px, 30px); } 34% { -webkit-transform: translate(-15px, 30px); transform: translate(-15px, 30px); } 50% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 67% { -webkit-transform: translate(-15px, 30px); transform: translate(-15px, 30px); } 84% { -webkit-transform: translate(15px, 30px); transform: translate(15px, 30px); } 100% { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } .ball-zig-zag-deflect[data-v-39432f99] { position: relative; -webkit-transform: translate(-15px, -15px); transform: translate(-15px, -15px); } .ball-zig-zag-deflect > div[data-v-39432f99] { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; margin-left: 15px; top: 4px; left: -7px; } .ball-zig-zag-deflect > div[data-v-39432f99]:first-child { -webkit-animation: ball-zig-deflect 1.5s 0s infinite linear; animation: ball-zig-deflect 1.5s 0s infinite linear; } .ball-zig-zag-deflect > div[data-v-39432f99]:last-child { -webkit-animation: ball-zag-deflect 1.5s 0s infinite linear; animation: ball-zag-deflect 1.5s 0s infinite linear; } /** * Lines */ @-webkit-keyframes line-scale { 0% { -webkit-transform: scaley(1); transform: scaley(1); } 50% { -webkit-transform: scaley(0.4); transform: scaley(0.4); } 100% { -webkit-transform: scaley(1); transform: scaley(1); } } @keyframes line-scale { 0% { -webkit-transform: scaley(1); transform: scaley(1); } 50% { -webkit-transform: scaley(0.4); transform: scaley(0.4); } 100% { -webkit-transform: scaley(1); transform: scaley(1); } } .line-scale > div[data-v-39432f99]:nth-child(1) { -webkit-animation: line-scale 1s -0.4s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: line-scale 1s -0.4s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .line-scale > div[data-v-39432f99]:nth-child(2) { -webkit-animation: line-scale 1s -0.3s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: line-scale 1s -0.3s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .line-scale > div[data-v-39432f99]:nth-child(3) { -webkit-animation: line-scale 1s -0.2s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: line-scale 1s -0.2s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .line-scale > div[data-v-39432f99]:nth-child(4) { -webkit-animation: line-scale 1s -0.1s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: line-scale 1s -0.1s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .line-scale > div[data-v-39432f99]:nth-child(5) { -webkit-animation: line-scale 1s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); animation: line-scale 1s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); } .line-scale > div[data-v-39432f99] { background-color: #fff; width: 4px; height: 35px; border-radius: 2px; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; } @-webkit-keyframes line-scale-party { 0% { -webkit-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(0.5); transform: scale(0.5); } 100% { -webkit-transform: scale(1); transform: scale(1); } } @keyframes line-scale-party { 0% { -webkit-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(0.5); transform: scale(0.5); } 100% { -webkit-transform: scale(1); transform: scale(1); } } .line-scale-party > div[data-v-39432f99]:nth-child(1) { -webkit-animation-delay: -0.09s; animation-delay: -0.09s; -webkit-animation-duration: 0.83s; animation-duration: 0.83s; } .line-scale-party > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: 0.33s; animation-delay: 0.33s; -webkit-animation-duration: 0.64s; animation-duration: 0.64s; } .line-scale-party > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: 0.32s; animation-delay: 0.32s; -webkit-animation-duration: 0.39s; animation-duration: 0.39s; } .line-scale-party > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: 0.47s; animation-delay: 0.47s; -webkit-animation-duration: 0.52s; animation-duration: 0.52s; } .line-scale-party > div[data-v-39432f99] { background-color: #fff; width: 4px; height: 35px; border-radius: 2px; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; -webkit-animation-name: line-scale-party; animation-name: line-scale-party; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-delay: 0; animation-delay: 0; } @-webkit-keyframes line-scale-pulse-out { 0% { -webkit-transform: scaley(1); transform: scaley(1); } 50% { -webkit-transform: scaley(0.4); transform: scaley(0.4); } 100% { -webkit-transform: scaley(1); transform: scaley(1); } } @keyframes line-scale-pulse-out { 0% { -webkit-transform: scaley(1); transform: scaley(1); } 50% { -webkit-transform: scaley(0.4); transform: scaley(0.4); } 100% { -webkit-transform: scaley(1); transform: scaley(1); } } .line-scale-pulse-out > div[data-v-39432f99] { background-color: #fff; width: 4px; height: 35px; border-radius: 2px; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; -webkit-animation: line-scale-pulse-out 0.9s -0.6s infinite cubic-bezier(0.85, 0.25, 0.37, 0.85); animation: line-scale-pulse-out 0.9s -0.6s infinite cubic-bezier(0.85, 0.25, 0.37, 0.85); } .line-scale-pulse-out > div[data-v-39432f99]:nth-child(2), .line-scale-pulse-out > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: -0.4s !important; animation-delay: -0.4s !important; } .line-scale-pulse-out > div[data-v-39432f99]:nth-child(1), .line-scale-pulse-out > div[data-v-39432f99]:nth-child(5) { -webkit-animation-delay: -0.2s !important; animation-delay: -0.2s !important; } @-webkit-keyframes line-scale-pulse-out-rapid { 0% { -webkit-transform: scaley(1); transform: scaley(1); } 80% { -webkit-transform: scaley(0.3); transform: scaley(0.3); } 90% { -webkit-transform: scaley(1); transform: scaley(1); } } @keyframes line-scale-pulse-out-rapid { 0% { -webkit-transform: scaley(1); transform: scaley(1); } 80% { -webkit-transform: scaley(0.3); transform: scaley(0.3); } 90% { -webkit-transform: scaley(1); transform: scaley(1); } } .line-scale-pulse-out-rapid > div[data-v-39432f99] { background-color: #fff; width: 4px; height: 35px; border-radius: 2px; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; display: inline-block; -webkit-animation: line-scale-pulse-out-rapid 0.9s -0.5s infinite cubic-bezier(0.11, 0.49, 0.38, 0.78); animation: line-scale-pulse-out-rapid 0.9s -0.5s infinite cubic-bezier(0.11, 0.49, 0.38, 0.78); } .line-scale-pulse-out-rapid > div[data-v-39432f99]:nth-child(2), .line-scale-pulse-out-rapid > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: -0.25s !important; animation-delay: -0.25s !important; } .line-scale-pulse-out-rapid > div[data-v-39432f99]:nth-child(1), .line-scale-pulse-out-rapid > div[data-v-39432f99]:nth-child(5) { -webkit-animation-delay: 0s !important; animation-delay: 0s !important; } @-webkit-keyframes line-spin-fade-loader { 50% { opacity: 0.3; } 100% { opacity: 1; } } @keyframes line-spin-fade-loader { 50% { opacity: 0.3; } 100% { opacity: 1; } } .line-spin-fade-loader[data-v-39432f99] { position: relative; top: -10px; left: -4px; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(1) { top: 20px; left: 0; -webkit-animation: line-spin-fade-loader 1.2s -0.84s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.84s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(2) { top: 13.63636px; left: 13.63636px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-animation: line-spin-fade-loader 1.2s -0.72s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.72s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(3) { top: 0; left: 20px; -webkit-transform: rotate(90deg); transform: rotate(90deg); -webkit-animation: line-spin-fade-loader 1.2s -0.6s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.6s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(4) { top: -13.63636px; left: 13.63636px; -webkit-transform: rotate(45deg); transform: rotate(45deg); -webkit-animation: line-spin-fade-loader 1.2s -0.48s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.48s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(5) { top: -20px; left: 0; -webkit-animation: line-spin-fade-loader 1.2s -0.36s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.36s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(6) { top: -13.63636px; left: -13.63636px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-animation: line-spin-fade-loader 1.2s -0.24s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.24s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(7) { top: 0; left: -20px; -webkit-transform: rotate(90deg); transform: rotate(90deg); -webkit-animation: line-spin-fade-loader 1.2s -0.12s infinite ease-in-out; animation: line-spin-fade-loader 1.2s -0.12s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99]:nth-child(8) { top: 13.63636px; left: -13.63636px; -webkit-transform: rotate(45deg); transform: rotate(45deg); -webkit-animation: line-spin-fade-loader 1.2s 0s infinite ease-in-out; animation: line-spin-fade-loader 1.2s 0s infinite ease-in-out; } .line-spin-fade-loader > div[data-v-39432f99] { background-color: #fff; width: 4px; height: 35px; border-radius: 2px; margin: 2px; -webkit-animation-fill-mode: both; animation-fill-mode: both; position: absolute; width: 5px; height: 15px; } /** * Misc */ @-webkit-keyframes triangle-skew-spin { 25% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0); transform: perspective(100px) rotateX(180deg) rotateY(0); } 50% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg); transform: perspective(100px) rotateX(180deg) rotateY(180deg); } 75% { -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg); transform: perspective(100px) rotateX(0) rotateY(180deg); } 100% { -webkit-transform: perspective(100px) rotateX(0) rotateY(0); transform: perspective(100px) rotateX(0) rotateY(0); } } @keyframes triangle-skew-spin { 25% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0); transform: perspective(100px) rotateX(180deg) rotateY(0); } 50% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg); transform: perspective(100px) rotateX(180deg) rotateY(180deg); } 75% { -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg); transform: perspective(100px) rotateX(0) rotateY(180deg); } 100% { -webkit-transform: perspective(100px) rotateX(0) rotateY(0); transform: perspective(100px) rotateX(0) rotateY(0); } } .triangle-skew-spin > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; width: 0; height: 0; border-left: 20px solid transparent; border-right: 20px solid transparent; border-bottom: 20px solid #fff; -webkit-animation: triangle-skew-spin 3s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; animation: triangle-skew-spin 3s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; } @-webkit-keyframes square-spin { 25% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0); transform: perspective(100px) rotateX(180deg) rotateY(0); } 50% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg); transform: perspective(100px) rotateX(180deg) rotateY(180deg); } 75% { -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg); transform: perspective(100px) rotateX(0) rotateY(180deg); } 100% { -webkit-transform: perspective(100px) rotateX(0) rotateY(0); transform: perspective(100px) rotateX(0) rotateY(0); } } @keyframes square-spin { 25% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0); transform: perspective(100px) rotateX(180deg) rotateY(0); } 50% { -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg); transform: perspective(100px) rotateX(180deg) rotateY(180deg); } 75% { -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg); transform: perspective(100px) rotateX(0) rotateY(180deg); } 100% { -webkit-transform: perspective(100px) rotateX(0) rotateY(0); transform: perspective(100px) rotateX(0) rotateY(0); } } .square-spin > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; width: 50px; height: 50px; background: #fff; border: 1px solid red; -webkit-animation: square-spin 3s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; animation: square-spin 3s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite; } @-webkit-keyframes rotate_pacman_half_up { 0% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } 50% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 100% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } } @keyframes rotate_pacman_half_up { 0% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } 50% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 100% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } } @-webkit-keyframes rotate_pacman_half_down { 0% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } 50% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } } @keyframes rotate_pacman_half_down { 0% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } 50% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } } @-webkit-keyframes pacman-balls { 75% { opacity: 0.7; } 100% { -webkit-transform: translate(-100px, -6.25px); transform: translate(-100px, -6.25px); } } @keyframes pacman-balls { 75% { opacity: 0.7; } 100% { -webkit-transform: translate(-100px, -6.25px); transform: translate(-100px, -6.25px); } } .pacman[data-v-39432f99] { position: relative; } .pacman > div[data-v-39432f99]:nth-child(2) { -webkit-animation: pacman-balls 1s -0.99s infinite linear; animation: pacman-balls 1s -0.99s infinite linear; } .pacman > div[data-v-39432f99]:nth-child(3) { -webkit-animation: pacman-balls 1s -0.66s infinite linear; animation: pacman-balls 1s -0.66s infinite linear; } .pacman > div[data-v-39432f99]:nth-child(4) { -webkit-animation: pacman-balls 1s -0.33s infinite linear; animation: pacman-balls 1s -0.33s infinite linear; } .pacman > div[data-v-39432f99]:nth-child(5) { -webkit-animation: pacman-balls 1s 0s infinite linear; animation: pacman-balls 1s 0s infinite linear; } .pacman > div[data-v-39432f99]:first-of-type { width: 0px; height: 0px; border-right: 25px solid transparent; border-top: 25px solid #fff; border-left: 25px solid #fff; border-bottom: 25px solid #fff; border-radius: 25px; -webkit-animation: rotate_pacman_half_up 0.5s 0s infinite; animation: rotate_pacman_half_up 0.5s 0s infinite; position: relative; left: -30px; } .pacman > div[data-v-39432f99]:nth-child(2) { width: 0px; height: 0px; border-right: 25px solid transparent; border-top: 25px solid #fff; border-left: 25px solid #fff; border-bottom: 25px solid #fff; border-radius: 25px; -webkit-animation: rotate_pacman_half_down 0.5s 0s infinite; animation: rotate_pacman_half_down 0.5s 0s infinite; margin-top: -50px; position: relative; left: -30px; } .pacman > div[data-v-39432f99]:nth-child(3), .pacman > div[data-v-39432f99]:nth-child(4), .pacman > div[data-v-39432f99]:nth-child(5), .pacman > div[data-v-39432f99]:nth-child(6) { background-color: #fff; width: 15px; height: 15px; border-radius: 100%; margin: 2px; width: 10px; height: 10px; position: absolute; -webkit-transform: translate(0, -6.25px); transform: translate(0, -6.25px); top: 25px; left: 70px; } @-webkit-keyframes cube-transition { 25% { -webkit-transform: translateX(50px) scale(0.5) rotate(-90deg); transform: translateX(50px) scale(0.5) rotate(-90deg); } 50% { -webkit-transform: translate(50px, 50px) rotate(-180deg); transform: translate(50px, 50px) rotate(-180deg); } 75% { -webkit-transform: translateY(50px) scale(0.5) rotate(-270deg); transform: translateY(50px) scale(0.5) rotate(-270deg); } 100% { -webkit-transform: rotate(-360deg); transform: rotate(-360deg); } } @keyframes cube-transition { 25% { -webkit-transform: translateX(50px) scale(0.5) rotate(-90deg); transform: translateX(50px) scale(0.5) rotate(-90deg); } 50% { -webkit-transform: translate(50px, 50px) rotate(-180deg); transform: translate(50px, 50px) rotate(-180deg); } 75% { -webkit-transform: translateY(50px) scale(0.5) rotate(-270deg); transform: translateY(50px) scale(0.5) rotate(-270deg); } 100% { -webkit-transform: rotate(-360deg); transform: rotate(-360deg); } } .cube-transition[data-v-39432f99] { position: relative; -webkit-transform: translate(-25px, -25px); transform: translate(-25px, -25px); } .cube-transition > div[data-v-39432f99] { -webkit-animation-fill-mode: both; animation-fill-mode: both; width: 10px; height: 10px; position: absolute; top: -5px; left: -5px; background-color: #fff; -webkit-animation: cube-transition 1.6s 0s infinite ease-in-out; animation: cube-transition 1.6s 0s infinite ease-in-out; } .cube-transition > div[data-v-39432f99]:last-child { -webkit-animation-delay: -0.8s; animation-delay: -0.8s; } @-webkit-keyframes spin-rotate { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 50% { -webkit-transform: rotate(180deg); transform: rotate(180deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes spin-rotate { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 50% { -webkit-transform: rotate(180deg); transform: rotate(180deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } .semi-circle-spin[data-v-39432f99] { position: relative; width: 35px; height: 35px; overflow: hidden; } .semi-circle-spin > div[data-v-39432f99] { position: absolute; border-width: 0px; border-radius: 100%; -webkit-animation: spin-rotate 0.6s 0s infinite linear; animation: spin-rotate 0.6s 0s infinite linear; background-image: -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(70%, transparent), color-stop(30%, #fff), to(#fff)); background-image: linear-gradient(transparent 0%, transparent 70%, #fff 30%, #fff 100%); width: 100%; height: 100%; } @-webkit-keyframes bar-progress { 0% { -webkit-transform: scaleY(20%); transform: scaleY(20%); opacity: 1; } 25% { -webkit-transform: translateX(6%) scaleY(10%); transform: translateX(6%) scaleY(10%); opacity: 0.7; } 50% { -webkit-transform: translateX(20%) scaleY(20%); transform: translateX(20%) scaleY(20%); opacity: 1; } 75% { -webkit-transform: translateX(6%) scaleY(10%); transform: translateX(6%) scaleY(10%); opacity: 0.7; } 100% { -webkit-transform: scaleY(20%); transform: scaleY(20%); opacity: 1; } } @keyframes bar-progress { 0% { -webkit-transform: scaleY(20%); transform: scaleY(20%); opacity: 1; } 25% { -webkit-transform: translateX(6%) scaleY(10%); transform: translateX(6%) scaleY(10%); opacity: 0.7; } 50% { -webkit-transform: translateX(20%) scaleY(20%); transform: translateX(20%) scaleY(20%); opacity: 1; } 75% { -webkit-transform: translateX(6%) scaleY(10%); transform: translateX(6%) scaleY(10%); opacity: 0.7; } 100% { -webkit-transform: scaleY(20%); transform: scaleY(20%); opacity: 1; } } .bar-progress[data-v-39432f99] { width: 30%; height: 12px; } .bar-progress > div[data-v-39432f99] { position: relative; width: 20%; height: 12px; border-radius: 10px; background-color: #fff; -webkit-animation: bar-progress 3s cubic-bezier(0.57, 0.1, 0.44, 0.93) infinite; animation: bar-progress 3s cubic-bezier(0.57, 0.1, 0.44, 0.93) infinite; opacity: 1; } @-webkit-keyframes bar-swing { 0% { left: 0; } 50% { left: 70%; } 100% { left: 0; } } @keyframes bar-swing { 0% { left: 0; } 50% { left: 70%; } 100% { left: 0; } } .bar-swing[data-v-39432f99] { width: 30%; height: 8px; } .bar-swing > div[data-v-39432f99] { position: relative; width: 30%; height: 8px; border-radius: 10px; background-color: #fff; -webkit-animation: bar-swing 1.5s infinite; animation: bar-swing 1.5s infinite; } @-webkit-keyframes bar-swing-container { 0% { left: 0; -webkit-transform: translateX(0); transform: translateX(0); } 50% { left: 70%; -webkit-transform: translateX(-4px); transform: translateX(-4px); } 100% { left: 0; -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes bar-swing-container { 0% { left: 0; -webkit-transform: translateX(0); transform: translateX(0); } 50% { left: 70%; -webkit-transform: translateX(-4px); transform: translateX(-4px); } 100% { left: 0; -webkit-transform: translateX(0); transform: translateX(0); } } .bar-swing-container[data-v-39432f99] { width: 20%; height: 8px; position: relative; } .bar-swing-container div[data-v-39432f99]:nth-child(1) { position: absolute; width: 100%; background-color: rgba(255, 255, 255, 0.2); height: 12px; border-radius: 10px; } .bar-swing-container div[data-v-39432f99]:nth-child(2) { position: absolute; width: 30%; height: 8px; border-radius: 10px; background-color: #fff; -webkit-animation: bar-swing-container 2s cubic-bezier(0.91, 0.35, 0.12, 0.6) infinite; animation: bar-swing-container 2s cubic-bezier(0.91, 0.35, 0.12, 0.6) infinite; margin: 2px 2px 0; } .sk-spinner[data-v-39432f99] { color: #333; } .sk-spinner > div[data-v-39432f99] { background-color: currentColor; } @-webkit-keyframes sk-fade-in { 0% { opacity: 0; } 50% { opacity: 0; } 100% { opacity: 1; } } @keyframes sk-fade-in { 0% { opacity: 0; } 50% { opacity: 0; } 100% { opacity: 1; } } .sk-fade-in[data-v-39432f99] { -webkit-animation: sk-fade-in 2s; animation: sk-fade-in 2s; } .sk-fade-in-half-second[data-v-39432f99] { -webkit-animation: sk-fade-in 1s; animation: sk-fade-in 1s; } .sk-fade-in-quarter-second[data-v-39432f99] { -webkit-animation: sk-fade-in 0.5s; animation: sk-fade-in 0.5s; } .sk-rotating-plane > div[data-v-39432f99] { width: 27px; height: 27px; background-color: currentColor; -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out; animation: sk-rotateplane 1.2s infinite ease-in-out; } @-webkit-keyframes sk-rotateplane { 0% { -webkit-transform: perspective(120px) } 50% { -webkit-transform: perspective(120px) rotateY(180deg) } 100% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) } } @keyframes sk-rotateplane { 0% { transform: perspective(120px) rotateX(0deg) rotateY(0deg); -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); } 50% { transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); } 100% { transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } } .sk-double-bounce[data-v-39432f99] { width: 27px; height: 27px; position: relative; } .sk-double-bounce > div[data-v-39432f99] { width: 100%; height: 100%; border-radius: 50%; background-color: currentColor; opacity: 0.6; position: absolute; top: 0; left: 0; -webkit-animation: sk-bounce 2.0s infinite ease-in-out; animation: sk-bounce 2.0s infinite ease-in-out; } .sk-double-bounce > div[data-v-39432f99]:last-child { -webkit-animation-delay: -1.0s; animation-delay: -1.0s; } @-webkit-keyframes sk-bounce { 0%, 100% { -webkit-transform: scale(0.0) } 50% { -webkit-transform: scale(1.0) } } @keyframes sk-bounce { 0%, 100% { transform: scale(0.0); -webkit-transform: scale(0.0); } 50% { transform: scale(1.0); -webkit-transform: scale(1.0); } } .sk-wave[data-v-39432f99] { width: 50px; height: 40px; text-align: center; font-size: 10px; } .sk-wave > div[data-v-39432f99] { background-color: currentColor; height: 100%; width: 6px; margin: 0 3px 0 0; display: inline-block; -webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out; animation: sk-stretchdelay 1.2s infinite ease-in-out; } .sk-wave > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: -1.1s; animation-delay: -1.1s; } .sk-wave > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: -1.0s; animation-delay: -1.0s; } .sk-wave > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: -0.9s; animation-delay: -0.9s; } .sk-wave > div[data-v-39432f99]:nth-child(5) { -webkit-animation-delay: -0.8s; animation-delay: -0.8s; } @-webkit-keyframes sk-stretchdelay { 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } 20% { -webkit-transform: scaleY(1.0) } } @keyframes sk-stretchdelay { 0%, 40%, 100% { transform: scaleY(0.4); -webkit-transform: scaleY(0.4); } 20% { transform: scaleY(1.0); -webkit-transform: scaleY(1.0); } } .sk-wandering-cubes[data-v-39432f99] { width: 52px; height: 52px; position: relative; } .sk-wandering-cubes > div[data-v-39432f99] { background-color: currentColor; width: 10px; height: 10px; position: absolute; top: 0; left: 0; -webkit-animation: sk-cubemove 1.8s infinite ease-in-out; animation: sk-cubemove 1.8s infinite ease-in-out; } .sk-wandering-cubes > div[data-v-39432f99]:last-child { -webkit-animation-delay: -0.9s; animation-delay: -0.9s; } @-webkit-keyframes sk-cubemove { 25% { -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5) } 50% { -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg) } 75% { -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5) } 100% { -webkit-transform: rotate(-360deg) } } @keyframes sk-cubemove { 25% { transform: translateX(42px) rotate(-90deg) scale(0.5); -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); } 50% { /* Hack to make FF rotate in the right direction */ transform: translateX(42px) translateY(42px) rotate(-179deg); -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); } 50.1%[data-v-39432f99] { transform: translateX(42px) translateY(42px) rotate(-180deg); -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); } 75% { transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); } 100% { transform: rotate(-360deg); -webkit-transform: rotate(-360deg); } } .sk-pulse > div[data-v-39432f99] { width: 27px; height: 27px; background-color: currentColor; border-radius: 100%; -webkit-animation: sk-scaleout 1.0s infinite ease-in-out; animation: sk-scaleout 1.0s infinite ease-in-out; } @-webkit-keyframes sk-scaleout { 0% { -webkit-transform: scale(0.0) } 100% { -webkit-transform: scale(1.0); opacity: 0; } } @keyframes sk-scaleout { 0% { transform: scale(0.0); -webkit-transform: scale(0.0); } 100% { transform: scale(1.0); -webkit-transform: scale(1.0); opacity: 0; } } .sk-chasing-dots[data-v-39432f99] { width: 27px; height: 27px; position: relative; -webkit-animation: sk-rotate 2.0s infinite linear; animation: sk-rotate 2.0s infinite linear; } .sk-chasing-dots > div[data-v-39432f99] { width: 60%; height: 60%; display: inline-block; position: absolute; top: 0; background-color: currentColor; border-radius: 100%; -webkit-animation: sk-bounce 2.0s infinite ease-in-out; animation: sk-bounce 2.0s infinite ease-in-out; } .sk-chasing-dots > div[data-v-39432f99]:last-child { top: auto; bottom: 0; -webkit-animation-delay: -1.0s; animation-delay: -1.0s; } @-webkit-keyframes sk-rotate { 100% { -webkit-transform: rotate(360deg) }} @keyframes sk-rotate { 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg); } } @-webkit-keyframes sk-bounce { 0%, 100% { -webkit-transform: scale(0.0) } 50% { -webkit-transform: scale(1.0) } } @keyframes sk-bounce { 0%, 100% { transform: scale(0.0); -webkit-transform: scale(0.0); } 50% { transform: scale(1.0); -webkit-transform: scale(1.0); } } .sk-three-bounce[data-v-39432f99] { height: 18px; } .sk-three-bounce > div[data-v-39432f99] { width: 18px; height: 18px; background-color: currentColor; border-radius: 100%; display: inline-block; -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out; animation: sk-bouncedelay 1.4s infinite ease-in-out; /* Prevent first frame from flickering when animation starts */ -webkit-animation-fill-mode: both; animation-fill-mode: both; } .sk-three-bounce > div[data-v-39432f99]:first-child { -webkit-animation-delay: -0.32s; animation-delay: -0.32s; } .sk-three-bounce > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: -0.16s; animation-delay: -0.16s; } @-webkit-keyframes sk-bouncedelay { 0%, 80%, 100% { -webkit-transform: scale(0.0) } 40% { -webkit-transform: scale(1.0) } } @keyframes sk-bouncedelay { 0%, 80%, 100% { transform: scale(0.0); -webkit-transform: scale(0.0); } 40% { transform: scale(1.0); -webkit-transform: scale(1.0); } } .sk-circle[data-v-39432f99] { width: 40px; height: 40px; position: relative; } .sk-circle > div[data-v-39432f99] { background-color: initial; width: 100%; height: 100%; position: absolute; left: 0; top: 0; } .sk-circle > div[data-v-39432f99]::before { content: ''; display: block; margin: 0 auto; width: 20%; height: 20%; background-color: currentColor; border-radius: 100%; -webkit-animation: sk-bouncedelay 1.2s infinite ease-in-out; animation: sk-bouncedelay 1.2s infinite ease-in-out; /* Prevent first frame from flickering when animation starts */ -webkit-animation-fill-mode: both; animation-fill-mode: both; } .sk-circle > div[data-v-39432f99]:nth-child(2) { -webkit-transform: rotate(30deg); transform: rotate(30deg) } .sk-circle > div[data-v-39432f99]:nth-child(3) { -webkit-transform: rotate(60deg); transform: rotate(60deg) } .sk-circle > div[data-v-39432f99]:nth-child(4) { -webkit-transform: rotate(90deg); transform: rotate(90deg) } .sk-circle > div[data-v-39432f99]:nth-child(5) { -webkit-transform: rotate(120deg); transform: rotate(120deg) } .sk-circle > div[data-v-39432f99]:nth-child(6) { -webkit-transform: rotate(150deg); transform: rotate(150deg) } .sk-circle > div[data-v-39432f99]:nth-child(7) { -webkit-transform: rotate(180deg); transform: rotate(180deg) } .sk-circle > div[data-v-39432f99]:nth-child(8) { -webkit-transform: rotate(210deg); transform: rotate(210deg) } .sk-circle > div[data-v-39432f99]:nth-child(9) { -webkit-transform: rotate(240deg); transform: rotate(240deg) } .sk-circle > div[data-v-39432f99]:nth-child(10) { -webkit-transform: rotate(270deg); transform: rotate(270deg) } .sk-circle > div[data-v-39432f99]:nth-child(11) { -webkit-transform: rotate(300deg); transform: rotate(300deg) } .sk-circle > div[data-v-39432f99]:nth-child(12) { -webkit-transform: rotate(330deg); transform: rotate(330deg) } .sk-circle > div[data-v-39432f99]:nth-child(2)::before { -webkit-animation-delay: -1.1s; animation-delay: -1.1s } .sk-circle > div[data-v-39432f99]:nth-child(3)::before { -webkit-animation-delay: -1.0s; animation-delay: -1.0s } .sk-circle > div[data-v-39432f99]:nth-child(4)::before { -webkit-animation-delay: -0.9s; animation-delay: -0.9s } .sk-circle > div[data-v-39432f99]:nth-child(5)::before { -webkit-animation-delay: -0.8s; animation-delay: -0.8s } .sk-circle > div[data-v-39432f99]:nth-child(6)::before { -webkit-animation-delay: -0.7s; animation-delay: -0.7s } .sk-circle > div[data-v-39432f99]:nth-child(7)::before { -webkit-animation-delay: -0.6s; animation-delay: -0.6s } .sk-circle > div[data-v-39432f99]:nth-child(8)::before { -webkit-animation-delay: -0.5s; animation-delay: -0.5s } .sk-circle > div[data-v-39432f99]:nth-child(9)::before { -webkit-animation-delay: -0.4s; animation-delay: -0.4s } .sk-circle > div[data-v-39432f99]:nth-child(10)::before { -webkit-animation-delay: -0.3s; animation-delay: -0.3s } .sk-circle > div[data-v-39432f99]:nth-child(11)::before { -webkit-animation-delay: -0.2s; animation-delay: -0.2s } .sk-circle > div[data-v-39432f99]:nth-child(12)::before { -webkit-animation-delay: -0.1s; animation-delay: -0.1s } @-webkit-keyframes sk-bouncedelay { 0%, 80%, 100% { -webkit-transform: scale(0.0) } 40% { -webkit-transform: scale(1.0) } } @keyframes sk-bouncedelay { 0%, 80%, 100% { -webkit-transform: scale(0.0); transform: scale(0.0); } 40% { -webkit-transform: scale(1.0); transform: scale(1.0); } } .sk-cube-grid[data-v-39432f99] { width: 40px; height: 40px; } .sk-cube-grid > div[data-v-39432f99] { width: 33%; height: 33%; background-color: currentColor; float: left; -webkit-animation: sk-scaleDelay 1.3s infinite ease-in-out; animation: sk-scaleDelay 1.3s infinite ease-in-out; } /* * Spinner positions * 1 2 3 * 4 5 6 * 7 8 9 */ .sk-cube-grid > div[data-v-39432f99]:nth-child(1) { -webkit-animation-delay: 0.2s; animation-delay: 0.2s } .sk-cube-grid > div[data-v-39432f99]:nth-child(2) { -webkit-animation-delay: 0.3s; animation-delay: 0.3s } .sk-cube-grid > div[data-v-39432f99]:nth-child(3) { -webkit-animation-delay: 0.4s; animation-delay: 0.4s } .sk-cube-grid > div[data-v-39432f99]:nth-child(4) { -webkit-animation-delay: 0.1s; animation-delay: 0.1s } .sk-cube-grid > div[data-v-39432f99]:nth-child(5) { -webkit-animation-delay: 0.2s; animation-delay: 0.2s } .sk-cube-grid > div[data-v-39432f99]:nth-child(6) { -webkit-animation-delay: 0.3s; animation-delay: 0.3s } .sk-cube-grid > div[data-v-39432f99]:nth-child(7) { -webkit-animation-delay: 0.0s; animation-delay: 0.0s } .sk-cube-grid > div[data-v-39432f99]:nth-child(8) { -webkit-animation-delay: 0.1s; animation-delay: 0.1s } .sk-cube-grid > div[data-v-39432f99]:nth-child(9) { -webkit-animation-delay: 0.2s; animation-delay: 0.2s } @-webkit-keyframes sk-scaleDelay { 0%, 70%, 100% { -webkit-transform:scale3D(1.0, 1.0, 1.0) } 35% { -webkit-transform:scale3D(0.0, 0.0, 1.0) } } @keyframes sk-scaleDelay { 0%, 70%, 100% { -webkit-transform:scale3D(1.0, 1.0, 1.0); transform:scale3D(1.0, 1.0, 1.0) } 35% { -webkit-transform:scale3D(0.0, 0.0, 1.0); transform:scale3D(0.0, 0.0, 1.0) } } .sk-fading-circle[data-v-39432f99] { width: 40px; height: 40px; position: relative; } .sk-fading-circle > div[data-v-39432f99] { background-color: initial; width: 100%; height: 100%; position: absolute; left: 0; top: 0; } .sk-fading-circle > div[data-v-39432f99]::before { content: ''; display: block; margin: 0 auto; width: 15%; height: 15%; background-color: currentColor; border-radius: 100%; -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out both; animation: sk-circleFadeDelay 1.2s infinite ease-in-out both; } .sk-fading-circle > div[data-v-39432f99]:nth-child(2) { -webkit-transform: rotate(30deg); transform: rotate(30deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(3) { -webkit-transform: rotate(60deg); transform: rotate(60deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(4) { -webkit-transform: rotate(90deg); transform: rotate(90deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(5) { -webkit-transform: rotate(120deg); transform: rotate(120deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(6) { -webkit-transform: rotate(150deg); transform: rotate(150deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(7) { -webkit-transform: rotate(180deg); transform: rotate(180deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(8) { -webkit-transform: rotate(210deg); transform: rotate(210deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(9) { -webkit-transform: rotate(240deg); transform: rotate(240deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(10) { -webkit-transform: rotate(270deg); transform: rotate(270deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(11) { -webkit-transform: rotate(300deg); transform: rotate(300deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(12) { -webkit-transform: rotate(330deg); transform: rotate(330deg); } .sk-fading-circle > div[data-v-39432f99]:nth-child(2)::before { -webkit-animation-delay: -1.1s; animation-delay: -1.1s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(3)::before { -webkit-animation-delay: -1s; animation-delay: -1s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(4)::before { -webkit-animation-delay: -0.9s; animation-delay: -0.9s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(5)::before { -webkit-animation-delay: -0.8s; animation-delay: -0.8s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(6)::before { -webkit-animation-delay: -0.7s; animation-delay: -0.7s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(7)::before { -webkit-animation-delay: -0.6s; animation-delay: -0.6s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(8)::before { -webkit-animation-delay: -0.5s; animation-delay: -0.5s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(9)::before { -webkit-animation-delay: -0.4s; animation-delay: -0.4s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(10)::before { -webkit-animation-delay: -0.3s; animation-delay: -0.3s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(11)::before { -webkit-animation-delay: -0.2s; animation-delay: -0.2s; } .sk-fading-circle > div[data-v-39432f99]:nth-child(12)::before { -webkit-animation-delay: -0.1s; animation-delay: -0.1s; } @-webkit-keyframes sk-circleFadeDelay { 0%, 39%, 100% { opacity: 0; } 40% { opacity: 1; } } @keyframes sk-circleFadeDelay { 0%, 39%, 100% { opacity: 0; } 40% { opacity: 1; } } .sk-folding-cube[data-v-39432f99] { width: 40px; height: 40px; position: relative; -webkit-transform: rotateZ(45deg); transform: rotateZ(45deg); } .sk-folding-cube > div[data-v-39432f99] { background-color: initial; float: left; width: 50%; height: 50%; position: relative; -webkit-transform: scale(1.1); transform: scale(1.1); } .sk-folding-cube > div[data-v-39432f99]::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: currentColor; -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; animation: sk-foldCubeAngle 2.4s infinite linear both; -webkit-transform-origin: 100% 100%; transform-origin: 100% 100%; } .sk-folding-cube > div[data-v-39432f99]:nth-child(2) { -webkit-transform: scale(1.1) rotateZ(90deg); transform: scale(1.1) rotateZ(90deg); } .sk-folding-cube > div[data-v-39432f99]:nth-child(4) { -webkit-transform: scale(1.1) rotateZ(180deg); transform: scale(1.1) rotateZ(180deg); } .sk-folding-cube > div[data-v-39432f99]:nth-child(3) { -webkit-transform: scale(1.1) rotateZ(270deg); transform: scale(1.1) rotateZ(270deg); } .sk-folding-cube > div[data-v-39432f99]:nth-child(2)::before { -webkit-animation-delay: 0.3s; animation-delay: 0.3s; } .sk-folding-cube > div[data-v-39432f99]:nth-child(4)::before { -webkit-animation-delay: 0.6s; animation-delay: 0.6s; } .sk-folding-cube > div[data-v-39432f99]:nth-child(3)::before { -webkit-animation-delay: 0.9s; animation-delay: 0.9s; } @-webkit-keyframes sk-foldCubeAngle { 0%, 10% { -webkit-transform: perspective(140px) rotateX(-180deg); transform: perspective(140px) rotateX(-180deg); opacity: 0; } 25%, 75% { -webkit-transform: perspective(140px) rotateX(0deg); transform: perspective(140px) rotateX(0deg); opacity: 1; } 90%, 100% { -webkit-transform: perspective(140px) rotateY(180deg); transform: perspective(140px) rotateY(180deg); opacity: 0; } } @keyframes sk-foldCubeAngle { 0%, 10% { -webkit-transform: perspective(140px) rotateX(-180deg); transform: perspective(140px) rotateX(-180deg); opacity: 0; } 25%, 75% { -webkit-transform: perspective(140px) rotateX(0deg); transform: perspective(140px) rotateX(0deg); opacity: 1; } 90%, 100% { -webkit-transform: perspective(140px) rotateY(180deg); transform: perspective(140px) rotateY(180deg); opacity: 0; } } .sk-wordpress > div[data-v-39432f99] { width: 27px; height: 27px; background-color: currentColor; display: inline-block; border-radius: 27px; position: relative; -webkit-animation: sk-inner-circle 1s linear infinite; animation: sk-inner-circle 1s linear infinite; } .sk-wordpress > div[data-v-39432f99]::after { content: ''; display: block; background-color: #fff; width: 8px; height: 8px; position: absolute; border-radius: 8px; top: 5px; left: 5px; } @-webkit-keyframes sk-inner-circle { 0% { -webkit-transform: rotate(0); } 100% { -webkit-transform: rotate(360deg); } } @keyframes sk-inner-circle { 0% { transform: rotate(0); -webkit-transform:rotate(0); } 100% { transform: rotate(360deg); -webkit-transform:rotate(360deg); } } .ball-triangle-path > div[data-v-39432f99], .ball-scale-ripple-multiple > div[data-v-39432f99], .ball-scale-ripple > div[data-v-39432f99] { background-color: initial; border-color: currentColor; } .ball-clip-rotate > div[data-v-39432f99] { background-color: initial; border-top-color: currentColor; border-right-color: currentColor; border-left-color: currentColor; } .ball-clip-rotate-pulse > div[data-v-39432f99]:first-child { background-color: currentColor; } .ball-clip-rotate-pulse > div[data-v-39432f99]:last-child { background-color: initial; border-top-color: currentColor; border-bottom-color: currentColor; } .ball-clip-rotate-multiple > div[data-v-39432f99]:first-child { background-color: initial; border-right-color: currentColor; border-left-color: currentColor; } .ball-clip-rotate-multiple > div[data-v-39432f99]:last-child { background-color: initial; border-top-color: currentColor; border-bottom-color: currentColor; } .triangle-skew-spin > div[data-v-39432f99] { background-color: initial; border-bottom-color: currentColor; } .pacman > div[data-v-39432f99]:nth-child(1), .pacman > div[data-v-39432f99]:nth-child(2) { background-color: initial; border-top-color: currentColor; border-left-color: currentColor; border-bottom-color: currentColor; } .pacman > div[data-v-39432f99]:nth-child(3), .pacman > div[data-v-39432f99]:nth-child(4), .pacman > div[data-v-39432f99]:nth-child(5) { background-color: currentColor; } /*# sourceMappingURL=Spinner.vue.map */";e.type="text/css",e.styleSheet?e.styleSheet.cssText=n:e.appendChild(document.createTextNode(n)),t.appendChild(e)}}(),{render:function(){var t,e,n,r=this,a=r.$createElement,i=r._self._c||a;return""!==r.loading.className?i("div",{class:[(t={"sk-fade-in":"full"===r.fadeIn&&!r.noFadeIn,"sk-fade-in-half-second":"half"===r.fadeIn&&!r.noFadeIn,"sk-fade-in-quarter-second":"quarter"===r.fadeIn&&!r.noFadeIn},e=r.className,n=!!r.className,e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t),"sk-spinner",r.loading.className],style:r.style},r._l(r.loading.divCount,(function(t,e){return i("div",{key:e})}))):r._e()},staticRenderFns:[],_scopeId:"data-v-39432f99",name:"Spinner",props:{name:{type:String,default:"three-bounce"},color:{type:String,default:""},noFadeIn:{type:Boolean,default:!1},fadeIn:{type:String,default:"full"},className:{type:String,default:""},width:{type:String,default:""},height:{type:String,default:""}},data:function(){return{allSpinners:n.allSpinners}},computed:{loading:function(){var t=this.allSpinners[this.name];if(void 0!==t){var e=void 0!==t.className?t.className:this.name;return Object.assign({},t,{className:e})}return{className:"",divCount:0}},style:function(){return(""!==this.color?"color: "+this.color+";":"")+(""!==this.width?"width: "+this.width+"px;":"")+(""!==this.height?"height: "+this.height+"px;":"")}}}}))},f069:function(t,e,n){"use strict";var r=n("1c0b"),a=function(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)};t.exports.f=function(t){return new a(t)}},f183:function(t,e,n){var r=n("d012"),a=n("861d"),i=n("5135"),o=n("9bf2").f,s=n("90e3"),c=n("bb2f"),l=s("meta"),u=0,f=Object.isExtensible||function(){return!0},d=function(t){o(t,l,{value:{objectID:"O"+u++,weakData:{}}})},p=function(t,e){if(!a(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,l)){if(!f(t))return"F";if(!e)return"E";d(t)}return t[l].objectID},h=function(t,e){if(!i(t,l)){if(!f(t))return!0;if(!e)return!1;d(t)}return t[l].weakData},m=function(t){return c&&v.REQUIRED&&f(t)&&!i(t,l)&&d(t),t},v=t.exports={REQUIRED:!1,fastKey:p,getWeakData:h,onFreeze:m};r[l]=!0},f4a9:function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},t(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0;var i=a(n("d2dc")),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.getTokenizerConfig=function(){return{reservedWords:s,reservedTopLevelWords:c,reservedNewlineWords:u,reservedTopLevelWordsNoIndent:l,stringTypes:['""',"''","``","[]"],openParens:["("],closeParens:[")"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:[":"],lineCommentTypes:["--"],specialWordChars:["#","@"]}},e}(i["default"]);e["default"]=o;var s=["ABS","ACTIVATE","ALIAS","ALL","ALLOCATE","ALLOW","ALTER","ANY","ARE","ARRAY","AS","ASC","ASENSITIVE","ASSOCIATE","ASUTIME","ASYMMETRIC","AT","ATOMIC","ATTRIBUTES","AUDIT","AUTHORIZATION","AUX","AUXILIARY","AVG","BEFORE","BEGIN","BETWEEN","BIGINT","BINARY","BLOB","BOOLEAN","BOTH","BUFFERPOOL","BY","CACHE","CALL","CALLED","CAPTURE","CARDINALITY","CASCADED","CASE","CAST","CCSID","CEIL","CEILING","CHAR","CHARACTER","CHARACTER_LENGTH","CHAR_LENGTH","CHECK","CLOB","CLONE","CLOSE","CLUSTER","COALESCE","COLLATE","COLLECT","COLLECTION","COLLID","COLUMN","COMMENT","COMMIT","CONCAT","CONDITION","CONNECT","CONNECTION","CONSTRAINT","CONTAINS","CONTINUE","CONVERT","CORR","CORRESPONDING","COUNT","COUNT_BIG","COVAR_POP","COVAR_SAMP","CREATE","CROSS","CUBE","CUME_DIST","CURRENT","CURRENT_DATE","CURRENT_DEFAULT_TRANSFORM_GROUP","CURRENT_LC_CTYPE","CURRENT_PATH","CURRENT_ROLE","CURRENT_SCHEMA","CURRENT_SERVER","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_TIMEZONE","CURRENT_TRANSFORM_GROUP_FOR_TYPE","CURRENT_USER","CURSOR","CYCLE","DATA","DATABASE","DATAPARTITIONNAME","DATAPARTITIONNUM","DATE","DAY","DAYS","DB2GENERAL","DB2GENRL","DB2SQL","DBINFO","DBPARTITIONNAME","DBPARTITIONNUM","DEALLOCATE","DEC","DECIMAL","DECLARE","DEFAULT","DEFAULTS","DEFINITION","DELETE","DENSERANK","DENSE_RANK","DEREF","DESCRIBE","DESCRIPTOR","DETERMINISTIC","DIAGNOSTICS","DISABLE","DISALLOW","DISCONNECT","DISTINCT","DO","DOCUMENT","DOUBLE","DROP","DSSIZE","DYNAMIC","EACH","EDITPROC","ELEMENT","ELSE","ELSEIF","ENABLE","ENCODING","ENCRYPTION","END","END-EXEC","ENDING","ERASE","ESCAPE","EVERY","EXCEPTION","EXCLUDING","EXCLUSIVE","EXEC","EXECUTE","EXISTS","EXIT","EXP","EXPLAIN","EXTENDED","EXTERNAL","EXTRACT","FALSE","FENCED","FETCH","FIELDPROC","FILE","FILTER","FINAL","FIRST","FLOAT","FLOOR","FOR","FOREIGN","FREE","FULL","FUNCTION","FUSION","GENERAL","GENERATED","GET","GLOBAL","GOTO","GRANT","GRAPHIC","GROUP","GROUPING","HANDLER","HASH","HASHED_VALUE","HINT","HOLD","HOUR","HOURS","IDENTITY","IF","IMMEDIATE","IN","INCLUDING","INCLUSIVE","INCREMENT","INDEX","INDICATOR","INDICATORS","INF","INFINITY","INHERIT","INNER","INOUT","INSENSITIVE","INSERT","INT","INTEGER","INTEGRITY","INTERSECTION","INTERVAL","INTO","IS","ISOBID","ISOLATION","ITERATE","JAR","JAVA","KEEP","KEY","LABEL","LANGUAGE","LARGE","LATERAL","LC_CTYPE","LEADING","LEAVE","LEFT","LIKE","LINKTYPE","LN","LOCAL","LOCALDATE","LOCALE","LOCALTIME","LOCALTIMESTAMP","LOCATOR","LOCATORS","LOCK","LOCKMAX","LOCKSIZE","LONG","LOOP","LOWER","MAINTAINED","MATCH","MATERIALIZED","MAX","MAXVALUE","MEMBER","MERGE","METHOD","MICROSECOND","MICROSECONDS","MIN","MINUTE","MINUTES","MINVALUE","MOD","MODE","MODIFIES","MODULE","MONTH","MONTHS","MULTISET","NAN","NATIONAL","NATURAL","NCHAR","NCLOB","NEW","NEW_TABLE","NEXTVAL","NO","NOCACHE","NOCYCLE","NODENAME","NODENUMBER","NOMAXVALUE","NOMINVALUE","NONE","NOORDER","NORMALIZE","NORMALIZED","NOT","NULL","NULLIF","NULLS","NUMERIC","NUMPARTS","OBID","OCTET_LENGTH","OF","OFFSET","OLD","OLD_TABLE","ON","ONLY","OPEN","OPTIMIZATION","OPTIMIZE","OPTION","ORDER","OUT","OUTER","OVER","OVERLAPS","OVERLAY","OVERRIDING","PACKAGE","PADDED","PAGESIZE","PARAMETER","PART","PARTITION","PARTITIONED","PARTITIONING","PARTITIONS","PASSWORD","PATH","PERCENTILE_CONT","PERCENTILE_DISC","PERCENT_RANK","PIECESIZE","PLAN","POSITION","POWER","PRECISION","PREPARE","PREVVAL","PRIMARY","PRIQTY","PRIVILEGES","PROCEDURE","PROGRAM","PSID","PUBLIC","QUERY","QUERYNO","RANGE","RANK","READ","READS","REAL","RECOVERY","RECURSIVE","REF","REFERENCES","REFERENCING","REFRESH","REGR_AVGX","REGR_AVGY","REGR_COUNT","REGR_INTERCEPT","REGR_R2","REGR_SLOPE","REGR_SXX","REGR_SXY","REGR_SYY","RELEASE","RENAME","REPEAT","RESET","RESIGNAL","RESTART","RESTRICT","RESULT","RESULT_SET_LOCATOR","RETURN","RETURNS","REVOKE","RIGHT","ROLE","ROLLBACK","ROLLUP","ROUND_CEILING","ROUND_DOWN","ROUND_FLOOR","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_HALF_UP","ROUND_UP","ROUTINE","ROW","ROWNUMBER","ROWS","ROWSET","ROW_NUMBER","RRN","RUN","SAVEPOINT","SCHEMA","SCOPE","SCRATCHPAD","SCROLL","SEARCH","SECOND","SECONDS","SECQTY","SECURITY","SENSITIVE","SEQUENCE","SESSION","SESSION_USER","SIGNAL","SIMILAR","SIMPLE","SMALLINT","SNAN","SOME","SOURCE","SPECIFIC","SPECIFICTYPE","SQL","SQLEXCEPTION","SQLID","SQLSTATE","SQLWARNING","SQRT","STACKED","STANDARD","START","STARTING","STATEMENT","STATIC","STATMENT","STAY","STDDEV_POP","STDDEV_SAMP","STOGROUP","STORES","STYLE","SUBMULTISET","SUBSTRING","SUM","SUMMARY","SYMMETRIC","SYNONYM","SYSFUN","SYSIBM","SYSPROC","SYSTEM","SYSTEM_USER","TABLE","TABLESAMPLE","TABLESPACE","THEN","TIME","TIMESTAMP","TIMEZONE_HOUR","TIMEZONE_MINUTE","TO","TRAILING","TRANSACTION","TRANSLATE","TRANSLATION","TREAT","TRIGGER","TRIM","TRUE","TRUNCATE","TYPE","UESCAPE","UNDO","UNIQUE","UNKNOWN","UNNEST","UNTIL","UPPER","USAGE","USER","USING","VALIDPROC","VALUE","VARCHAR","VARIABLE","VARIANT","VARYING","VAR_POP","VAR_SAMP","VCAT","VERSION","VIEW","VOLATILE","VOLUMES","WHEN","WHENEVER","WHILE","WIDTH_BUCKET","WINDOW","WITH","WITHIN","WITHOUT","WLM","WRITE","XMLELEMENT","XMLEXISTS","XMLNAMESPACES","YEAR","YEARS"],c=["ADD","AFTER","ALTER COLUMN","ALTER TABLE","DELETE FROM","EXCEPT","FETCH FIRST","FROM","GROUP BY","GO","HAVING","INSERT INTO","INTERSECT","LIMIT","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UPDATE","VALUES","WHERE"],l=["INTERSECT","INTERSECT ALL","MINUS","UNION","UNION ALL"],u=["AND","CROSS JOIN","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN"]},f4d6:function(t,e,n){var r=n("ffd6"),a=1/0;function i(t){if("string"==typeof t||r(t))return t;var e=t+"";return"0"==e&&1/t==-a?"-0":e}t.exports=i},f5df:function(t,e,n){var r=n("00ee"),a=n("c6b6"),i=n("b622"),o=i("toStringTag"),s="Arguments"==a(function(){return arguments}()),c=function(t,e){try{return t[e]}catch(n){}};t.exports=r?a:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=c(e=Object(t),o))?n:s?a(e):"Object"==(r=a(e))&&"function"==typeof e.callee?"Arguments":r}},f5f2:function(t){t.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')},f608:function(t,e,n){var r=n("6747"),a=n("ffd6"),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,o=/^\w*$/;function s(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!a(t))||(o.test(t)||!i.test(t)||null!=e&&t in Object(e))}t.exports=s},f772:function(t,e,n){var r=n("5692"),a=n("90e3"),i=r("keys");t.exports=function(t){return i[t]||(i[t]=a(t))}},f7c2:function(t,e){function n(t,e){var n={};"string"===typeof e&&(e=[].slice.call(arguments,1));for(var r=e.length,a=0;a-1}t.exports=a},fc6a:function(t,e,n){var r=n("44ad"),a=n("1d80");t.exports=function(t){return r(a(t))}},fce3:function(t,e,n){var r=n("d039");t.exports=r((function(){var t=RegExp(".","string".charAt(0));return!(t.dotAll&&t.exec("\n")&&"s"===t.flags)}))},fd03:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};e.__esModule=!0;var a=r(n("acb2")),i="top-level",o="block-level",s=function(){function t(t){this.indent=t,this.indentTypes=[],this.indent=t||" "}return t.prototype.getIndent=function(){return new Array(this.indentTypes.length).fill(this.indent).join("")},t.prototype.increaseTopLevel=function(){this.indentTypes.push(i)},t.prototype.increaseBlockLevel=function(){this.indentTypes.push(o)},t.prototype.decreaseTopLevel=function(){a["default"](this.indentTypes)===i&&this.indentTypes.pop()},t.prototype.decreaseBlockLevel=function(){while(this.indentTypes.length>0){var t=this.indentTypes.pop();if(t!==i)break}},t.prototype.resetIndentation=function(){this.indentTypes=[]},t}();e["default"]=s},fd3a:function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n("8c86");function a(t){Object(r["a"])(1,arguments);var e=Object.prototype.toString.call(t);return t instanceof Date||"object"===typeof t&&"[object Date]"===e?new Date(t.getTime()):"number"===typeof t||"[object Number]"===e?new Date(t):("string"!==typeof t&&"[object String]"!==e||"undefined"===typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"),console.warn((new Error).stack)),new Date(NaN))}},fdbc:function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},fdbf:function(t,e,n){var r=n("4930");t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},fe1f:function(t,e,n){"use strict";function r(t){if(null===t||!0===t||!1===t)return NaN;var e=Number(t);return isNaN(e)?e:e<0?Math.ceil(e):Math.floor(e)}n.d(e,"a",(function(){return r}))},fea9:function(t,e,n){var r=n("da84");t.exports=r.Promise},ffd6:function(t,e,n){var r=n("3729"),a=n("1310"),i="[object Symbol]";function o(t){return"symbol"==typeof t||a(t)&&r(t)==i}t.exports=o}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvY2h1bmstdmVuZG9ycy5hN2Y2MjlhNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9qcy9jaHVuay12ZW5kb3JzLmE3ZjYyOWE0LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztBQXFEQTs7Ozs7O0FBMDNHQTs7Ozs7OztBQXlwWUE7Ozs7Ozs7O0FBeThHQTs7Ozs7Ozs7Ozs7OztBQXVnR0E7Ozs7Ozs7Ozs7OztBQWczSEE7Ozs7OztBQWtzSkEiLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/manifest.json b/vendor/itsgoingd/clockwork/Clockwork/Web/public/manifest.json new file mode 100644 index 000000000..fad59a7fe --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/public/manifest.json @@ -0,0 +1 @@ +{"name":"Clockwork","short_name":"Clockwork","theme_color":"#2786f3","icons":[{"src":"img/icons/apple-touch-icon-180x180.png","sizes":"180x180","type":"image/png"}],"start_url":"/","display":"standalone","background_color":"#fff"} \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/precache-manifest.84f394233edb6bbf15637db0e9e4acd5.js b/vendor/itsgoingd/clockwork/Clockwork/Web/public/precache-manifest.84f394233edb6bbf15637db0e9e4acd5.js new file mode 100644 index 000000000..8bb39e3f3 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/public/precache-manifest.84f394233edb6bbf15637db0e9e4acd5.js @@ -0,0 +1,62 @@ +self.__precacheManifest = (self.__precacheManifest || []).concat([ + { + "revision": "8d099129fa5ea5174496", + "url": "css/app.515e4027.css" + }, + { + "revision": "611a8f3ac0aa856f4018f676d719c67f", + "url": "img/appearance-auto-icon.png" + }, + { + "revision": "4a9a5b7dee3fc2c7d2a684e63c447b55", + "url": "img/appearance-dark-icon.png" + }, + { + "revision": "2439692fa652a49e5c3d820fd67cdc27", + "url": "img/appearance-light-icon.png" + }, + { + "revision": "bb5196d7b075e39fd6a661ba44aa6a92", + "url": "img/whats-new/5.0/client-metrics.png" + }, + { + "revision": "d78cafd4b6be96deda3eb2e9954b77ab", + "url": "img/whats-new/5.0/clockwork-5.png" + }, + { + "revision": "81a43ef164ad401de937091824436e75", + "url": "img/whats-new/5.0/models-tab.png" + }, + { + "revision": "8289742997480ce6748e3f819b68ca0e", + "url": "img/whats-new/5.0/notifications-tab.png" + }, + { + "revision": "942ad4031f62aac1061c257428b9ad40", + "url": "img/whats-new/5.0/timeline.png" + }, + { + "revision": "6c9e98b21595855028a29014642fee4c", + "url": "img/whats-new/5.0/toolbar.png" + }, + { + "revision": "a403ddd6fac00289df60a70163f8aca5", + "url": "img/whats-new/5.1/database-queries.png" + }, + { + "revision": "5f78ccbaa09abbd6ce825683b6950605", + "url": "index.html" + }, + { + "revision": "8d099129fa5ea5174496", + "url": "js/app.1b17e5e6.js" + }, + { + "revision": "70804b62af80bfb6fd7b", + "url": "js/chunk-vendors.a7f629a4.js" + }, + { + "revision": "7bcaca7d628e3fabb246a02425e072dd", + "url": "manifest.json" + } +]); \ No newline at end of file diff --git a/vendor/itsgoingd/clockwork/Clockwork/Web/public/service-worker.js b/vendor/itsgoingd/clockwork/Clockwork/Web/public/service-worker.js new file mode 100644 index 000000000..4ff9b4ed7 --- /dev/null +++ b/vendor/itsgoingd/clockwork/Clockwork/Web/public/service-worker.js @@ -0,0 +1,34 @@ +/** + * Welcome to your Workbox-powered service worker! + * + * You'll need to register this file in your web app and you should + * disable HTTP caching for this file too. + * See https://goo.gl/nhQhGp + * + * The rest of the code is auto-generated. Please don't update this file + * directly; instead, make changes to your Workbox build configuration + * and re-run your build process. + * See https://goo.gl/2aRDsh + */ + +importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); + +importScripts( + "precache-manifest.84f394233edb6bbf15637db0e9e4acd5.js" +); + +workbox.core.setCacheNameDetails({prefix: "Clockwork"}); + +self.addEventListener('message', (event) => { + if (event.data && event.data.type === 'SKIP_WAITING') { + self.skipWaiting(); + } +}); + +/** + * The workboxSW.precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ +self.__precacheManifest = [].concat(self.__precacheManifest || []); +workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); diff --git a/vendor/itsgoingd/clockwork/LICENSE b/vendor/itsgoingd/clockwork/LICENSE new file mode 100644 index 000000000..54ead0114 --- /dev/null +++ b/vendor/itsgoingd/clockwork/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Miroslav Rigler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/itsgoingd/clockwork/README.md b/vendor/itsgoingd/clockwork/README.md new file mode 100644 index 000000000..8fd597573 --- /dev/null +++ b/vendor/itsgoingd/clockwork/README.md @@ -0,0 +1,144 @@ +

+ + +

+ +> Clockwork is a development tool for PHP available right in your browser. Clockwork gives you an insight into your application runtime - including request data, performance metrics, log entries, database queries, cache queries, redis commands, dispatched events, queued jobs, rendered views and more - for HTTP requests, commands, queue jobs and tests. + +> *This repository contains the server-side component of Clockwork.* + +> Check out on the [Clockwork website](https://underground.works/clockwork) for details. + +

+ + + + + + + + + + + + + + + + + + + + + + + + +

+ +### Installation + +Install the Clockwork library via [Composer](https://getcomposer.org/). + +``` +$ composer require itsgoingd/clockwork +``` + +Congratulations, you are done! To enable more features like commands or queue jobs profiling, publish the configuration file via the `vendor:publish` Artisan command. + +**Note:** If you are using the Laravel route cache, you will need to refresh it using the route:cache Artisan command. + +Read [full installation instructions](https://underground.works/clockwork/#docs-installation) on the Clockwork website. + +### Features + +#### Collecting data + +The Clockwork server-side component collects and stores data about your application. + +Clockwork is only active when your app is in debug mode by default. You can choose to explicitly enable or disable Clockwork, or even set Clockwork to always collect data without exposing them for further analysis. + +We collect a whole bunch of useful data by default, but you can enable more features or disable features you don't need in the config file. + +Some features might allow for advanced options, eg. for database queries you can set a slow query threshold or enable detecting of duplicate (N+1) queries. Check out the config file to see all what Clockwork can do. + +There are several options that allow you to choose for which requests Clockwork is active. + +On-demand mode will collect data only when Clockwork app is open. You can even specify a secret to be set in the app settings to collect request. Errors only will record only requests ending with 4xx and 5xx responses. Slow only will collect only requests with responses above the set slow threshold. You can also filter the collected and recorded requests by a custom closure. CORS pre-flight requests will not be collected by default. + +New in Clockwork 4.1, artisan commands, queue jobs and tests can now also be collected, you need to enable this in the config file. + +Clockwork also collects stack traces for data like log messages or database queries. Last 10 frames of the trace are collected by default. You can change the frames limit or disable this feature in the configuration file. + +#### Viewing data + +##### Web interface + +Open `your.app/clockwork` to view and interact with the collected data. + +The app will show all executed requests, which is useful when the request is not made by browser, but for example a mobile application you are developing an API for. + +##### Browser extension + +A browser dev tools extension is also available for Chrome and Firefox: + +- [Chrome Web Store](https://chrome.google.com/webstore/detail/clockwork/dmggabnehkmmfmdffgajcflpdjlnoemp) +- [Firefox Addons](https://addons.mozilla.org/en-US/firefox/addon/clockwork-dev-tools/) + +##### Toolbar + +Clockwork now gives you an option to show basic request information in the form of a toolbar in your app. + +The toolbar is fully rendered client-side and requires installing a tiny javascript library. + +[Learn more](https://underground.works/clockwork/#docs-viewing-data) on the Clockwork website. + +#### Logging + +You can log any variable via the clock() helper, from a simple string to an array or object, even multiple values: + +```php +clock(User::first(), auth()->user(), $username) +``` + +The `clock()` helper function returns it's first argument, so you can easily add inline debugging statements to your code: + +```php +User::create(clock($request->all())) +``` + +If you want to specify a log level, you can use the long-form call: + +```php +clock()->info("User {$username} logged in!") +``` + +#### Timeline + +Timeline gives you a visual representation of your application runtime. + +To add an event to the timeline - start it with a description, execute the tracked code and finish the event. A fluent api is available to further configure the event. + +```php +// using timeline api with begin/end and fluent configuration +clock()->event('Importing tweets')->color('purple')->begin(); + ... +clock()->event('Importing tweets')->end(); +``` + +Alternatively you can execute the tracked code block as a closure. You can also choose to use an array based configuration instead of the fluent api. + +```php +// using timeline api with run and array-based configuration +clock()->event('Updating cache', [ 'color' => 'green' ])->run(function () { + ... +}); +``` + +Read more about available features on the [Clockwork website](https://underground.works/clockwork). + +

+ + + +

diff --git a/vendor/itsgoingd/clockwork/composer.json b/vendor/itsgoingd/clockwork/composer.json new file mode 100644 index 000000000..42f178846 --- /dev/null +++ b/vendor/itsgoingd/clockwork/composer.json @@ -0,0 +1,33 @@ +{ + "name": "itsgoingd/clockwork", + "description": "php dev tools in your browser", + "keywords": ["debugging", "profiling", "logging", "laravel", "lumen", "slim", "devtools"], + "homepage": "https://underground.works/clockwork", + "license": "MIT", + "authors": [ + { + "name": "itsgoingd", + "email": "itsgoingd@luzer.sk", + "homepage": "https://twitter.com/itsgoingd" + } + ], + "require": { + "php": ">=5.6", + "ext-json": "*" + }, + "autoload": { + "psr-4": { + "Clockwork\\": "Clockwork/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Clockwork\\Support\\Laravel\\ClockworkServiceProvider" + ], + "aliases": { + "Clockwork": "Clockwork\\Support\\Laravel\\Facade" + } + } + } +}