From 2d7d3e3bf7d997b60b3cb1f3a5f1efe1979ec35e Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Wed, 22 May 2024 10:50:37 +0100 Subject: [PATCH 001/145] Pslam + Laravel plugin --- .idea/php.xml | 67 ++++++++ .phpstorm.meta.php/laravel.meta.php | 11 ++ _ide_helper.php | 81 ++++++--- composer.json | 14 +- composer.lock | 253 +++++++++++++++++++++++----- 5 files changed, 348 insertions(+), 78 deletions(-) diff --git a/.idea/php.xml b/.idea/php.xml index 33d546493..6898004af 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -194,6 +194,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.phpstorm.meta.php/laravel.meta.php b/.phpstorm.meta.php/laravel.meta.php index f01a3dad1..d30a321df 100644 --- a/.phpstorm.meta.php/laravel.meta.php +++ b/.phpstorm.meta.php/laravel.meta.php @@ -243,6 +243,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -486,6 +487,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -729,6 +731,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -972,6 +975,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1215,6 +1219,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1458,6 +1463,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1701,6 +1707,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1944,6 +1951,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2187,6 +2195,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2430,6 +2439,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2673,6 +2683,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, diff --git a/_ide_helper.php b/_ide_helper.php index 93f3f021d..3486a74a7 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -5,7 +5,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 11.7.0. + * Generated for Laravel 11.8.0. * * This file should not be included in your code, only analyzed by your IDE! * @@ -1498,6 +1498,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -2339,6 +2340,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4059,6 +4061,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4108,26 +4111,6 @@ { /** @var \Illuminate\Cache\Repository $instance */ return $instance->macroCall($method, $parameters); - } - /** - * Remove all items from the cache. - * - * @return bool - * @static - */ public static function flush() - { - /** @var \Illuminate\Cache\ArrayStore $instance */ - return $instance->flush(); - } - /** - * Get the cache key prefix. - * - * @return string - * @static - */ public static function getPrefix() - { - /** @var \Illuminate\Cache\ArrayStore $instance */ - return $instance->getPrefix(); } /** * Get a lock instance. @@ -4139,7 +4122,7 @@ * @static */ public static function lock($name, $seconds = 0, $owner = null) { - /** @var \Illuminate\Cache\ArrayStore $instance */ + /** @var \Illuminate\Cache\NullStore $instance */ return $instance->lock($name, $seconds, $owner); } /** @@ -4151,8 +4134,28 @@ * @static */ public static function restoreLock($name, $owner) { - /** @var \Illuminate\Cache\ArrayStore $instance */ + /** @var \Illuminate\Cache\NullStore $instance */ return $instance->restoreLock($name, $owner); + } + /** + * Remove all items from the cache. + * + * @return bool + * @static + */ public static function flush() + { + /** @var \Illuminate\Cache\NullStore $instance */ + return $instance->flush(); + } + /** + * Get the cache key prefix. + * + * @return string + * @static + */ public static function getPrefix() + { + /** @var \Illuminate\Cache\NullStore $instance */ + return $instance->getPrefix(); } } /** @@ -4350,6 +4353,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4543,6 +4547,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -4874,6 +4879,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -6021,6 +6027,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -6751,6 +6758,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -7586,6 +7594,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -7911,6 +7920,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -8251,7 +8261,7 @@ * @method static \Illuminate\Contracts\View\Factory getViewFactory() * @method static void setSymfonyTransport(\Symfony\Component\Mailer\Transport\TransportInterface $transport) * @method static \Illuminate\Mail\Mailer setQueue(\Illuminate\Contracts\Queue\Factory $queue) - * @method static void macro(string $name, object|callable $macro) + * @method static void macro(string $name, object|callable $macro, object|callable $macro = null) * @method static void mixin(object $mixin, bool $replace = true) * @method static bool hasMacro(string $name) * @method static void flushMacros() @@ -8944,6 +8954,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -9762,6 +9773,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -11764,6 +11776,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -12081,6 +12094,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -12980,6 +12994,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -13496,6 +13511,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -14191,6 +14207,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -14964,6 +14981,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -15492,6 +15510,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -16073,6 +16092,7 @@ * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) @@ -18538,7 +18558,7 @@ * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation $query * @param mixed $value * @param string|null $field - * @return \Illuminate\Database\Eloquent\Relations\Relation + * @return \Illuminate\Contracts\Database\Eloquent\Builder * @static */ public static function resolveRouteBindingQuery($query, $value, $field = null) { //Method inherited from \Illuminate\Database\Eloquent\Model @@ -19368,6 +19388,16 @@ */ public static function flushEventListeners() { //Method inherited from \Illuminate\Database\Eloquent\Model \Webpatser\Countries\Countries::flushEventListeners(); + } + /** + * Get the event map for the model. + * + * @return array + * @static + */ public static function dispatchesEvents() + { //Method inherited from \Illuminate\Database\Eloquent\Model + /** @var \Webpatser\Countries\Countries $instance */ + return $instance->dispatchesEvents(); } /** * Get the event dispatcher instance. @@ -24969,6 +24999,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * @param string $name * @param object|callable $macro + * @param-closure-this static $macro * @return void * @static */ public static function macro($name, $macro) diff --git a/composer.json b/composer.json index 196b8305f..ddc425389 100644 --- a/composer.json +++ b/composer.json @@ -26,12 +26,6 @@ "require": { "php": "^8.3", "ext-json": "*", - - "laravel/framework": "^11.0", - "laravel/horizon": "^5.7", - "laravel/telescope": "^5.0", - "laravel/tinker": "^2.7", - "laravel/ui": "^4.0", "anahkiasen/former": "^4.6", "bacon/bacon-qr-code": "^2.0.3", "barryvdh/laravel-dompdf": "^2.0.0", @@ -39,14 +33,19 @@ "erusev/parsedown": "^1.7", "foil/foil": "^0.6.7", "guzzlehttp/guzzle": "^7.8", - "spatie/laravel-ignition": "^2.7", "intervention/image": "^2.7", + "laravel/framework": "^11.0", + "laravel/horizon": "^5.7", + "laravel/telescope": "^5.0", + "laravel/tinker": "^2.7", + "laravel/ui": "^4.0", "mews/purifier": "^3.4", "opensolutions/oss-snmp": "^1.0", "php-ds/php-ds": "^1.5", "pragmarx/google2fa-laravel": "^1.4.1", "s1lentium/iptools": "^1.2", "socialiteproviders/manager": "^4.6", + "spatie/laravel-ignition": "^2.7", "webpatser/laravel-countries": "^1.5.4", "wolfcast/browser-detection": "^2.9.5", "zendesk/zendesk_api_client_php": "^2.2.10" @@ -63,6 +62,7 @@ "sebastian/diff": "^5.0", "phpunit/phpunit": "^10.5.1", "vimeo/psalm": "^5.0", + "psalm/plugin-laravel": "^2.11", "staudenmeir/dusk-updater": "^1.5" }, "support": { diff --git a/composer.lock b/composer.lock index 287ef6f4f..202a96540 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": "6eb37f5db48824ff389fd64b6b66a04d", + "content-hash": "442f64447ed9d486f093f10ef22819e8", "packages": [ { "name": "anahkiasen/former", @@ -2270,16 +2270,16 @@ }, { "name": "laravel/framework", - "version": "v11.7.0", + "version": "v11.8.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "e5ac72f513f635f208024aa76b8a04efc1b47f93" + "reference": "ceb892a25817c888ef3df4d1a2af9cac53978300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/e5ac72f513f635f208024aa76b8a04efc1b47f93", - "reference": "e5ac72f513f635f208024aa76b8a04efc1b47f93", + "url": "https://api.github.com/repos/laravel/framework/zipball/ceb892a25817c888ef3df4d1a2af9cac53978300", + "reference": "ceb892a25817c888ef3df4d1a2af9cac53978300", "shasum": "" }, "require": { @@ -2404,7 +2404,7 @@ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "laravel/tinker": "Required to use the tinker console command (^2.0).", @@ -2471,7 +2471,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-05-07T13:41:51+00:00" + "time": "2024-05-21T17:57:45+00:00" }, { "name": "laravel/horizon", @@ -2554,16 +2554,16 @@ }, { "name": "laravel/prompts", - "version": "v0.1.21", + "version": "v0.1.22", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920" + "reference": "37f94de71758dbfbccc9d299b0e5eb76e02a40f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/23ea808e8a145653e0ab29e30d4385e49f40a920", - "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920", + "url": "https://api.github.com/repos/laravel/prompts/zipball/37f94de71758dbfbccc9d299b0e5eb76e02a40f5", + "reference": "37f94de71758dbfbccc9d299b0e5eb76e02a40f5", "shasum": "" }, "require": { @@ -2606,9 +2606,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.21" + "source": "https://github.com/laravel/prompts/tree/v0.1.22" }, - "time": "2024-04-30T12:46:16+00:00" + "time": "2024-05-10T19:22:18+00:00" }, { "name": "laravel/serializable-closure", @@ -2744,16 +2744,16 @@ }, { "name": "laravel/telescope", - "version": "v5.0.4", + "version": "v5.0.5", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "b5f9783c8e1ec3ec387b289d3ca8a8f85e76b4fb" + "reference": "ae5c28ca1e40a7a66bfc9b2557e7e1d84d95363c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/b5f9783c8e1ec3ec387b289d3ca8a8f85e76b4fb", - "reference": "b5f9783c8e1ec3ec387b289d3ca8a8f85e76b4fb", + "url": "https://api.github.com/repos/laravel/telescope/zipball/ae5c28ca1e40a7a66bfc9b2557e7e1d84d95363c", + "reference": "ae5c28ca1e40a7a66bfc9b2557e7e1d84d95363c", "shasum": "" }, "require": { @@ -2807,9 +2807,9 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v5.0.4" + "source": "https://github.com/laravel/telescope/tree/v5.0.5" }, - "time": "2024-04-22T09:19:03+00:00" + "time": "2024-05-09T17:09:01+00:00" }, { "name": "laravel/tinker", @@ -2879,16 +2879,16 @@ }, { "name": "laravel/ui", - "version": "v4.5.1", + "version": "v4.5.2", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "a3562953123946996a503159199d6742d5534e61" + "reference": "c75396f63268c95b053c8e4814eb70e0875e9628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/a3562953123946996a503159199d6742d5534e61", - "reference": "a3562953123946996a503159199d6742d5534e61", + "url": "https://api.github.com/repos/laravel/ui/zipball/c75396f63268c95b053c8e4814eb70e0875e9628", + "reference": "c75396f63268c95b053c8e4814eb70e0875e9628", "shasum": "" }, "require": { @@ -2936,9 +2936,9 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v4.5.1" + "source": "https://github.com/laravel/ui/tree/v4.5.2" }, - "time": "2024-03-21T18:12:29+00:00" + "time": "2024-05-08T18:07:10+00:00" }, { "name": "league/commonmark", @@ -5865,16 +5865,16 @@ }, { "name": "spatie/flare-client-php", - "version": "1.5.1", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "e27977d534eefe04c154c6fd8460217024054c05" + "reference": "220a7c8745e9fa427d54099f47147c4b97fe6462" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/e27977d534eefe04c154c6fd8460217024054c05", - "reference": "e27977d534eefe04c154c6fd8460217024054c05", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/220a7c8745e9fa427d54099f47147c4b97fe6462", + "reference": "220a7c8745e9fa427d54099f47147c4b97fe6462", "shasum": "" }, "require": { @@ -5922,7 +5922,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.5.1" + "source": "https://github.com/spatie/flare-client-php/tree/1.6.0" }, "funding": [ { @@ -5930,7 +5930,7 @@ "type": "github" } ], - "time": "2024-05-03T15:43:14+00:00" + "time": "2024-05-22T09:45:39+00:00" }, { "name": "spatie/ignition", @@ -9952,16 +9952,16 @@ }, { "name": "laravel/pint", - "version": "v1.15.3", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "3600b5d17aff52f6100ea4921849deacbbeb8656" + "reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/3600b5d17aff52f6100ea4921849deacbbeb8656", - "reference": "3600b5d17aff52f6100ea4921849deacbbeb8656", + "url": "https://api.github.com/repos/laravel/pint/zipball/1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98", + "reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98", "shasum": "" }, "require": { @@ -9972,11 +9972,11 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.54.0", - "illuminate/view": "^10.48.8", - "larastan/larastan": "^2.9.5", - "laravel-zero/framework": "^10.3.0", - "mockery/mockery": "^1.6.11", + "friendsofphp/php-cs-fixer": "^3.57.1", + "illuminate/view": "^10.48.10", + "larastan/larastan": "^2.9.6", + "laravel-zero/framework": "^10.4.0", + "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^1.15.1", "pestphp/pest": "^2.34.7" }, @@ -10014,20 +10014,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-04-30T15:02:26+00:00" + "time": "2024-05-21T18:08:25+00:00" }, { "name": "laravel/sail", - "version": "v1.29.1", + "version": "v1.29.2", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "8be4a31150eab3b46af11a2e7b2c4632eefaad7e" + "reference": "a8e4e749735ba2f091856eafeb3f99db8cd6b621" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/8be4a31150eab3b46af11a2e7b2c4632eefaad7e", - "reference": "8be4a31150eab3b46af11a2e7b2c4632eefaad7e", + "url": "https://api.github.com/repos/laravel/sail/zipball/a8e4e749735ba2f091856eafeb3f99db8cd6b621", + "reference": "a8e4e749735ba2f091856eafeb3f99db8cd6b621", "shasum": "" }, "require": { @@ -10077,7 +10077,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-03-20T20:09:31+00:00" + "time": "2024-05-16T21:39:11+00:00" }, { "name": "mockery/mockery", @@ -10369,6 +10369,95 @@ ], "time": "2024-03-06T16:20:09+00:00" }, + { + "name": "orchestra/testbench-core", + "version": "v9.1.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "174eca97e949c15250dc21a4c34835eedab72599" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/174eca97e949c15250dc21a4c34835eedab72599", + "reference": "174eca97e949c15250dc21a4c34835eedab72599", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "^8.2", + "symfony/polyfill-php83": "^1.28" + }, + "conflict": { + "brianium/paratest": "<7.3.0 || >=8.0.0", + "laravel/framework": "<11.1.0 || >=12.0.0", + "nunomaduro/collision": "<8.0.0 || >=9.0.0", + "phpunit/phpunit": "<10.5.0 || 11.0.0 || >=11.2.0" + }, + "require-dev": { + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.1", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^10.5 || ^11.0.1", + "spatie/laravel-ray": "^1.35", + "symfony/process": "^7.0", + "symfony/yaml": "^7.0", + "vlucas/phpdotenv": "^5.4.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel tresting (^7.3).", + "ext-pcntl": "Required to use all features of the console signal trapping.", + "fakerphp/faker": "Allow using Faker for testing (^1.23).", + "laravel/framework": "Required for testing (^11.1).", + "mockery/mockery": "Allow using Mockery for testing (^1.6).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^8.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^9.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^10.5 || ^11.0).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^7.0).", + "symfony/yaml": "Required for Testbench CLI (^7.0).", + "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2024-05-21T00:03:19+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -11197,6 +11286,78 @@ ], "time": "2024-04-24T06:32:35+00:00" }, + { + "name": "psalm/plugin-laravel", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/psalm/psalm-plugin-laravel.git", + "reference": "ffd51399b672959331ed3ef4eaae13984474e2f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/psalm/psalm-plugin-laravel/zipball/ffd51399b672959331ed3ef4eaae13984474e2f0", + "reference": "ffd51399b672959331ed3ef4eaae13984474e2f0", + "shasum": "" + }, + "require": { + "barryvdh/laravel-ide-helper": "^2.13 || ^3.0", + "ext-simplexml": "*", + "illuminate/config": "^10.48 || ^11.0", + "illuminate/container": "^10.48 || ^11.0", + "illuminate/contracts": "^10.48 || ^11.0", + "illuminate/database": "^10.48 || ^11.0", + "illuminate/events": "^10.48 || ^11.0", + "illuminate/http": "^10.48 || ^11.0", + "illuminate/routing": "^10.48 || ^11.0", + "illuminate/support": "^10.48 || ^11.0", + "illuminate/view": "^10.48 || ^11.0", + "nikic/php-parser": "^4.18 || ^5.0", + "orchestra/testbench-core": "^8.22 || ^9.0", + "php": "^8.1", + "symfony/console": "^6.0 || ^7.0", + "symfony/finder": "^6.0 || ^7.0", + "vimeo/psalm": "^5.20" + }, + "require-dev": { + "laravel/framework": "^10.48 || ^11.0", + "phpunit/phpunit": "^10.5 || ^11.0", + "phpyh/psalm-tester": "^0.1.0", + "ramsey/collection": "^1.3", + "rector/rector": "^1.0", + "slevomat/coding-standard": "^8.8", + "squizlabs/php_codesniffer": "*", + "symfony/http-foundation": "^6.0 || ^7.0" + }, + "type": "psalm-plugin", + "extra": { + "psalm": { + "pluginClass": "Psalm\\LaravelPlugin\\Plugin" + } + }, + "autoload": { + "psr-4": { + "Psalm\\LaravelPlugin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown", + "email": "github@muglug.com" + } + ], + "description": "Psalm plugin for Laravel", + "homepage": "https://github.com/psalm/psalm-plugin-laravel", + "support": { + "issues": "https://github.com/psalm/psalm-plugin-laravel/issues", + "source": "https://github.com/psalm/psalm-plugin-laravel/tree/v2.11.0" + }, + "time": "2024-03-19T21:40:03+00:00" + }, { "name": "sebastian/cli-parser", "version": "2.0.1", From 1fa5c4fc7e24246cc1ad652de9250e74e574f2dd Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Wed, 22 May 2024 11:02:48 +0100 Subject: [PATCH 002/145] [SCA] Fix InvalidArrayOffset InvalidArrayOffset - app/Console/Commands/Command.php:158:40 - Cannot create offset of type array-key|null, expecting array-key (see https://psalm.dev/115) $validator = \Validator::make( [key( $rules ) => $value], $rules ); " --- app/Console/Commands/Command.php | 15 -------------- app/Console/Commands/User/SetPassword.php | 24 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/app/Console/Commands/Command.php b/app/Console/Commands/Command.php index 21f4c3ccc..50bb20086 100644 --- a/app/Console/Commands/Command.php +++ b/app/Console/Commands/Command.php @@ -147,19 +147,4 @@ protected function validate_cmd( mixed $method, array $rules ): mixed return $value; } - /** - * @param array $rules - * @param mixed $value - * - * @return bool|string - */ - protected function validateInput( array $rules, mixed $value ): bool|string - { - $validator = \Validator::make( [key( $rules ) => $value], $rules ); - - if ($validator->fails()) { - return $validator->errors()->first( key( $rules ) ); - } - return true; - } } \ No newline at end of file diff --git a/app/Console/Commands/User/SetPassword.php b/app/Console/Commands/User/SetPassword.php index e2b404c38..5bbe101b3 100644 --- a/app/Console/Commands/User/SetPassword.php +++ b/app/Console/Commands/User/SetPassword.php @@ -101,7 +101,7 @@ public function handle() return 0; } - $validate = $this->validateInput( [ 'password' => $this->rules[ 'password' ] ] , $password ); + $validate = $this->validateInput( 'password', $password ); if( $password && $validate !== true ){ $this->error( $validate ); return 0; @@ -110,7 +110,7 @@ public function handle() if( !$password ){// --password option not specified, ask for password $password = $this->secret( 'Password or (return to have one generated)' ); if( $password ){// if the user type a password - $validate = $this->validateInput( [ 'password' => $this->rules[ 'password' ] ] , $password ); + $validate = $this->validateInput( 'password', $password ); if( $validate !== true ){ $this->error( $validate ); return 0; @@ -133,4 +133,24 @@ public function handle() return 0; } + + /** + * @param array $rules + * @param mixed $value + * + * @return bool|string + */ + private function validateInput( string $rule, string $value ): bool|string + { + if( !isset( $this->rules[$rule] ) ) { + throw new \Exception('Non-existent rule - coding error'); + } + + $validator = \Validator::make( [ $rule => $value ], $this->rules ); + + if ($validator->fails()) { + return $validator->errors()->first( $rule ); + } + return true; + } } \ No newline at end of file From 778d6a9f8f22d09519e100ddc99ea6d42cd5a908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 22 May 2024 16:06:25 +0100 Subject: [PATCH 003/145] psalm errors fixing --- .idea/IXP-Manager.iml | 1 + .idea/phpspec.xml | 3 + .phpstorm.meta.php/laravel.meta.php | 11 - app/Console/Commands/Contact/ExportGroup.php | 2 +- app/Events/Auth/ForgotUsername.php | 6 +- app/Exceptions/Handler.php | 8 +- app/Http/Controllers/AdminController.php | 4 +- .../Customer/Note/CustomerNotesController.php | 4 +- .../Api/V4/Provisioner/YamlController.php | 10 +- .../Controllers/Api/V4/RouterController.php | 5 +- .../Controllers/Api/V4/SwitchController.php | 11 +- .../Controllers/Contact/ContactController.php | 8 +- app/Http/Controllers/Controller.php | 2 +- .../Customer/CustomerController.php | 21 +- app/Http/Controllers/DashboardController.php | 2 +- .../Controllers/Docstore/FileController.php | 14 +- .../DocstoreCustomer/FileController.php | 16 +- app/Http/Controllers/Interfaces/Common.php | 6 +- composer.lock | 47 +- psalm_errors_240522_1253.log | 2395 +++++++++++++++++ psalm_errors_240522_1253a.log | 2330 ++++++++++++++++ psalmhelp.log | 158 ++ 22 files changed, 4967 insertions(+), 97 deletions(-) create mode 100644 psalm_errors_240522_1253.log create mode 100644 psalm_errors_240522_1253a.log create mode 100644 psalmhelp.log diff --git a/.idea/IXP-Manager.iml b/.idea/IXP-Manager.iml index 637df9904..819c67ce5 100644 --- a/.idea/IXP-Manager.iml +++ b/.idea/IXP-Manager.iml @@ -9,6 +9,7 @@ + diff --git a/.idea/phpspec.xml b/.idea/phpspec.xml index dac988cc2..3ba44d71a 100644 --- a/.idea/phpspec.xml +++ b/.idea/phpspec.xml @@ -20,6 +20,9 @@ + + \ No newline at end of file diff --git a/.phpstorm.meta.php/laravel.meta.php b/.phpstorm.meta.php/laravel.meta.php index d30a321df..f01a3dad1 100644 --- a/.phpstorm.meta.php/laravel.meta.php +++ b/.phpstorm.meta.php/laravel.meta.php @@ -243,7 +243,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -487,7 +486,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -731,7 +729,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -975,7 +972,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1219,7 +1215,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1463,7 +1458,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1707,7 +1701,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1951,7 +1944,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2195,7 +2187,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2439,7 +2430,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2683,7 +2673,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, diff --git a/app/Console/Commands/Contact/ExportGroup.php b/app/Console/Commands/Contact/ExportGroup.php index 284b8e8b4..b7590baf6 100644 --- a/app/Console/Commands/Contact/ExportGroup.php +++ b/app/Console/Commands/Contact/ExportGroup.php @@ -70,7 +70,7 @@ public function handle(): int $type = $this->option('type'); $name = $this->option('name'); // Imported from Zend Framework with little change on 2017-11 - if( ( !$type && !$name ) || ( $type && $name ) ) { + if( ( is_null($type) && is_null($name) ) || ( !is_null($type) && !is_null($name) ) ) { $this->error( "Group name or type must be set (and not both)." ); return -1; } diff --git a/app/Events/Auth/ForgotUsername.php b/app/Events/Auth/ForgotUsername.php index e716df508..a702474e6 100644 --- a/app/Events/Auth/ForgotUsername.php +++ b/app/Events/Auth/ForgotUsername.php @@ -40,14 +40,14 @@ class ForgotUsername use Dispatchable, SerializesModels; /** - * @var array of users + * @var Collection of users */ - public $users; + public Collection $users; /** * @var String Email */ - public $email; + public string $email; /** * Create a new event instance. diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index a4af7b2f4..1b894dff2 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -80,17 +80,17 @@ public function register() * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request - * @param Throwable $exception + * @param Throwable $e * * @return \Symfony\Component\HttpFoundation\Response */ - public function render($request, Throwable $exception) + public function render($request, Throwable $e) { - if( $exception instanceof GraphCannotBeProcessedException ) { + if( $e instanceof GraphCannotBeProcessedException ) { AlertContainer::push( 'No graphing backend configured to support the requested graph type.', Alert::DANGER ); return Redirect::to(''); } - return parent::render($request, $exception); + return parent::render($request, $e); } } diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 0e236805a..f40f9b759 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -82,7 +82,7 @@ public function dashboard( Request $r ): View private function dashboardStats( Request $r ): array { // only do this once every 60 minutes - if( $r->query( 'refresh_cache', 0 ) || !( $cTypes = Cache::get( 'admin_ctypes' ) ) ) { + if( $r->query( 'refresh_cache' ) || !( $cTypes = Cache::get( 'admin_ctypes' ) ) ) { // Full / Associate / Probono / Internal $cTypes[ 'types' ] = Customer::selectRaw('type AS ctype, COUNT( type ) AS cnt') ->whereRaw(Customer::SQL_CUST_CURRENT) @@ -264,7 +264,7 @@ private function publicPeeringGraphs( Request $r ): array $period = Graph::processParameterPeriod( $r->query( 'graph_period', config( 'ixp_fe.admin_dashboard.default_graph_period' ) ) ); - if( $r->query( 'refresh_cache', 0 ) || !( $graphs = Cache::get( 'admin_stats_'.$period ) ) ) { + if( $r->query( 'refresh_cache' ) || !( $graphs = Cache::get( 'admin_stats_'.$period ) ) ) { $graphs = []; $graphs['ixp'] = $grapher->ixp() diff --git a/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php b/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php index b6a4601f5..7290bfe54 100644 --- a/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php +++ b/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php @@ -74,7 +74,7 @@ public function create( Request $r, Customer $cust ): JsonResponse $cn->title = $r->title; $cn->note = $r->note ; - $cn->private = $r->public ? false : true; + $cn->private = $r->public ? 0 : 1; $cn->customer_id = $cust->id; $cn->save(); @@ -106,7 +106,7 @@ public function update( Request $r, CustomerNote $cn ): JsonResponse $cn->title = $r->title; $cn->note = $r->note ; - $cn->private = $r->public ? false : true; + $cn->private = $r->public ? 0 : 1; $cn->save(); // update the user's notes last read so he won't be told his own is new diff --git a/app/Http/Controllers/Api/V4/Provisioner/YamlController.php b/app/Http/Controllers/Api/V4/Provisioner/YamlController.php index a7cbcea19..7abf7225e 100644 --- a/app/Http/Controllers/Api/V4/Provisioner/YamlController.php +++ b/app/Http/Controllers/Api/V4/Provisioner/YamlController.php @@ -433,6 +433,9 @@ public function listCoreBundle( string $format ): Response foreach( CoreBundle::all() as $cb ) { $entry = []; + $switchSideA = $cb->switchSideX(); + $switchSideB = $cb->switchSideX( false ); + $entry['id'] = $cb->id; $entry['description'] = $cb->description; $entry['graphtitle'] = $cb->graph_title; @@ -440,8 +443,8 @@ public function listCoreBundle( string $format ): Response $entry['preference'] = $cb->preference; $entry['enabled'] = (bool)$cb->enabled; $entry['type'] = $cb->type; - $entry['switchsidea'] = $cb->switchSideX( true )->name; - $entry['switchsideb'] = $cb->switchSideX( false )->name; + $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; + $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; $speed = $cb->corelinks()->count() * $cb->speedPi() * 1000000; @@ -451,7 +454,8 @@ public function listCoreBundle( string $format ): Response $nb = count( $formats ); for( $i = 0; $i < $nb; $i++ ) { if( ( $speed / 1000.0 < 1.0 ) || ( count( $formats ) === $i + 1 ) ) { - $prettybandwidth = round( $speed ) . $formats[ $i ]; + $offset = min( $i, 4 ); + $prettybandwidth = round( $speed ) . $formats[ $offset ]; break; } $speed /= 1000.0; diff --git a/app/Http/Controllers/Api/V4/RouterController.php b/app/Http/Controllers/Api/V4/RouterController.php index e820582e6..116f2dc25 100644 --- a/app/Http/Controllers/Api/V4/RouterController.php +++ b/app/Http/Controllers/Api/V4/RouterController.php @@ -88,9 +88,8 @@ public function getCanUpdate( string $handle ) : JsonResponse abort( 404, "Unknown router handle" ); } - - - // return response()->json( $this->lastUpdatedArray( $r ) ); + return response()->json(); + //return response()->json( $this->lastUpdatedArray( $r ) ); } /** diff --git a/app/Http/Controllers/Api/V4/SwitchController.php b/app/Http/Controllers/Api/V4/SwitchController.php index e4cd6777c..5835dc6ff 100644 --- a/app/Http/Controllers/Api/V4/SwitchController.php +++ b/app/Http/Controllers/Api/V4/SwitchController.php @@ -144,18 +144,23 @@ public function coreBundlesStatus( Switcher $s ): JsonResponse $msgs = []; foreach( $s->getCoreBundles() as $cb ) { + $switchA = $cb->switchSideX(); + $switchAName = $switchA ? $switchA->name : 'none'; + $switchB = $cb->switchSideX( false ); + $switchBName = $switchB ? $switchB->name : 'none'; + if( $cb->enabled ) { $linksup = count( $cb->coreLinksWithIfOperStateX() ); // with no args this defaults to X = oper state up for enabled links $linksenabled = count( $cb->corelinks()->active()->get()->toArray() ); if( $linksup === $linksenabled ) { - $msgs[] = $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " OK - {$linksup}/${linksenabled} links up"; + $msgs[] = $switchAName . ' - ' . $switchBName . " OK - {$linksup}/{$linksenabled} links up"; } else { $okay = false; - $msgs[] = 'ISSUE: ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " has {$linksup}/${linksenabled} links up"; + $msgs[] = 'ISSUE: ' . $switchAName . ' - ' . $switchBName . " has {$linksup}/{$linksenabled} links up"; } } else { - $msgs[] = 'Ignoring ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . ' as core bundle disabled'; + $msgs[] = 'Ignoring ' . $switchAName . ' - ' . $switchBName . ' as core bundle disabled'; } } diff --git a/app/Http/Controllers/Contact/ContactController.php b/app/Http/Controllers/Contact/ContactController.php index d45cfb81d..fb5755058 100644 --- a/app/Http/Controllers/Contact/ContactController.php +++ b/app/Http/Controllers/Contact/ContactController.php @@ -231,7 +231,7 @@ protected function listGetData( ?int $id = null ): array $cgs = []; if( config('contact_group.types.ROLE') ) { - $activeGroups = ContactGroupAggregator::getGroupNamesTypeArray( false, false , true); + $activeGroups = ContactGroupAggregator::getGroupNamesTypeArray( null, null , true); if( !in_array( $role = request()->role, array_column( $activeGroups[ "ROLE" ], 'id' ), false ) ) { $role = null; @@ -385,11 +385,11 @@ protected function editPrepareForm( int $id ): array ]; $contactGroupDetail = []; - $contactGroup = ContactGroupAggregator::getGroupNamesTypeArray( false, $this->object->id ); + $contactGroup = ContactGroupAggregator::getGroupNamesTypeArray( null, $this->object->id ); foreach( $data[ 'allGroups' ] as $gname => $gvalue ) { foreach( $gvalue as $g ){ - $contactGroupDetail[ $gname . '_' . $g[ 'id' ] ] = request()->old( $gname . '_' . $g[ 'id' ] , isset( $contactGroup[ $gname ][ $g[ 'id' ] ] ) ? 1 : 0 ) ; + $contactGroupDetail[ $gname . '_' . $g[ 'id' ] ] = request()->old( $gname . '_' . $g[ 'id' ] , isset( $contactGroup[ $gname ][ $g[ 'id' ] ] ) ? '1' : '0' ) ; } } @@ -573,7 +573,7 @@ private function getContactsData(): array if( config('contact_group.types.ROLE') ) { return [ 'roles' => ContactGroupAggregator::getGroupNamesTypeArray( 'ROLE' )[ "ROLE" ], - 'allGroups' => ContactGroupAggregator::getGroupNamesTypeArray( false, false, true ) + 'allGroups' => ContactGroupAggregator::getGroupNamesTypeArray( null, null, true ) ]; } return [ 'roles' => null, 'allGroups' => [] ]; diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index accf6edd9..464965f00 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -100,7 +100,7 @@ protected function getIp(): ?string { foreach( [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ] as $key ) { if( array_key_exists( $key, $_SERVER ) === true ) { - foreach( explode(',', $_SERVER[$key] ) as $ip ) { + foreach( explode(',', (string) $_SERVER[$key] ) as $ip ) { $ip = trim($ip); if( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) { return $ip; diff --git a/app/Http/Controllers/Customer/CustomerController.php b/app/Http/Controllers/Customer/CustomerController.php index 1e75a6b9e..a646aa29b 100644 --- a/app/Http/Controllers/Customer/CustomerController.php +++ b/app/Http/Controllers/Customer/CustomerController.php @@ -25,6 +25,7 @@ use App, Auth, Cache, Countries, Former, Mail; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\{ @@ -216,28 +217,28 @@ public function edit( Request $r, Customer $cust ): View 'type' => $r->old( 'type', $cust->type ), 'shortname' => $r->old( 'shortname', $cust->shortname ), 'corpwww' => $r->old( 'corpwww', $cust->corpwww ), - 'datejoin' => $r->old( 'datejoin', !$cust->datejoin ?: $cust->datejoin->format( "Y-m-d" ) ) , - 'dateleave' => $r->old( 'dateleave', !$cust->dateleave ?: $cust->dateleave->format( "Y-m-d" ) ), + 'datejoin' => $r->old( 'datejoin', !$cust->datejoin ?: Carbon::parse($cust->datejoin)->format( "Y-m-d" ) ) , + 'dateleave' => $r->old( 'dateleave', !$cust->dateleave ?: Carbon::parse($cust->dateleave)->format( "Y-m-d" ) ), 'status' => $r->old( 'status', $cust->status ), 'MD5Support' => $r->old( 'MD5Support', $cust->MD5Support ), 'abbreviatedName' => $r->old( 'abbreviatedName', $cust->abbreviatedName ), - 'autsys' => $r->old( 'autsys', $cust->autsys ), - 'maxprefixes' => $r->old( 'maxprefixes', $cust->maxprefixes ), + 'autsys' => $r->old( 'autsys', (string) $cust->autsys ), + 'maxprefixes' => $r->old( 'maxprefixes', (string) $cust->maxprefixes ), 'peeringpolicy' => $r->old( 'peeringpolicy', $cust->peeringpolicy ), 'peeringemail' => $r->old( 'peeringemail', $cust->peeringemail ), 'peeringmacro' => $r->old( 'peeringmacro', $cust->peeringmacro ), 'peeringmacrov6' => $r->old( 'peeringmacrov6', $cust->peeringmacrov6 ), - 'irrdb' => $r->old( 'irrdb', $cust->irrdb ), - 'activepeeringmatrix' => $r->old( 'activepeeringmatrix', $cust->activepeeringmatrix ), + 'irrdb' => $r->old( 'irrdb', (string) $cust->irrdb ), + 'activepeeringmatrix' => $r->old( 'activepeeringmatrix', (string) $cust->activepeeringmatrix ), 'nocphone' => $r->old( 'nocphone', $cust->nocphone ), 'noc24hphone' => $r->old( 'noc24hphone', $cust->noc24hphone ), 'nocemail' => $r->old( 'nocemail', $cust->nocemail ), 'nochours' => $r->old( 'nochours', $cust->nochours ), 'nocwww' => $r->old( 'nocwww', $cust->nocwww ), - 'isReseller' => $r->old( 'isReseller', $cust->isReseller ), - 'isResold' => $r->old( 'isResold', ( $this->resellerMode() && $cust->reseller ) ), - 'reseller' => $r->old( 'reseller', ( $this->resellerMode() && $cust->reseller ) ? $cust->reseller : false ), - 'peeringdb_oauth' => $r->old( 'peeringdb_oauth', $cust->peeringdb_oauth ), + 'isReseller' => $r->old( 'isReseller', (string) $cust->isReseller ), + 'isResold' => $r->old( 'isResold', ( $this->resellerMode() && $cust->reseller ) ? '1' : '0' ), + 'reseller' => $r->old( 'reseller', ( $this->resellerMode() && $cust->reseller ) ? (string) $cust->reseller : null ), + 'peeringdb_oauth' => $r->old( 'peeringdb_oauth', (string) $cust->peeringdb_oauth ), ]); return view( 'customer/edit' )->with([ diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 29441e438..addf0bf0b 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -120,7 +120,7 @@ public function index( Request $r, string $tab = null ): RedirectResponse|View 'recentMembers' => Customer::getConnected( true, true, 'datejoin', 'desc' )->take( 5 ), 'crossConnects' => $c->patchPanelPorts()->masterPort()->get(), 'notesInfo' => CustomerNote::analyseForUser( $cns, $c, Auth::getUser() ), - 'rsRoutes' => $rsRoutes ?? null, + //'rsRoutes' => $rsRoutes ?? null, /* undeclared variable */ 'resoldCustomer' => $resoldCustomer ?? null, 'netInfo' => $netinfo ?? null, 'c' => $c->load( [ diff --git a/app/Http/Controllers/Docstore/FileController.php b/app/Http/Controllers/Docstore/FileController.php index 823dc7a8f..53d566e44 100644 --- a/app/Http/Controllers/Docstore/FileController.php +++ b/app/Http/Controllers/Docstore/FileController.php @@ -42,7 +42,7 @@ use Illuminate\View\View; -use League\Flysystem\Exception as FlySystemException; +use League\Flysystem\FilesystemException; use IXP\Http\Controllers\Controller; @@ -84,7 +84,7 @@ public function upload( Request $r ): View $this->authorize( 'create', DocstoreFile::class ); Former::populate([ - 'min_privs' => $r->old( 'min_privs', User::AUTH_SUPERUSER ) + 'min_privs' => $r->old( 'min_privs', (string) User::AUTH_SUPERUSER ) ]); return view( 'docstore/file/upload', [ @@ -116,7 +116,7 @@ public function store( Request $r ): RedirectResponse 'docstore_directory_id' => $r->docstore_directory_id, 'min_privs' => $r->min_privs, 'path' => $path, - 'sha256' => hash_file( 'sha256', $file ), + 'sha256' => hash_file( 'sha256', $file->getFilename() ), 'created_by' => Auth::id(), 'file_last_updated' => now(), ] ); @@ -144,7 +144,7 @@ public function edit( Request $r , DocstoreFile $file ): View 'name' => $r->old( 'name', $file->name ), 'description' => $r->old( 'descripton', $file->description ), 'sha256' => $r->old( 'sha256', $file->sha256 ), - 'min_privs' => $r->old( 'min_privs', $file->min_privs ), + 'min_privs' => $r->old( 'min_privs', (string) $file->min_privs ), 'docstore_directory_id' => $r->old( 'docstore_directory_id', $file->docstore_directory_id ?: '' ), ]); @@ -180,7 +180,7 @@ public function update( Request $r , DocstoreFile $file ): RedirectResponse $file->update([ 'path' => $path, - 'sha256' => hash_file( 'sha256', $uploadedFile ), + 'sha256' => hash_file( 'sha256', $uploadedFile->getFilename() ), 'file_last_updated' => now(), ]); @@ -252,7 +252,7 @@ public function download( DocstoreFile $file ): mixed try { return Storage::disk( $file->disk )->download( $file->path, $file->name ); - } catch( FlySystemException $e ) { + } catch( FilesystemException $e ) { AlertContainer::push( "This file could not be found / downloaded. Please report this error to the support team.", Alert::DANGER ); return redirect()->back(); } @@ -321,7 +321,7 @@ private function checkForm( Request $r, ?DocstoreFile $file = null ): void 'uploadedFile' => Rule::requiredIf( function() use ( $r, $file ) { return !$file; }), - 'sha256' => 'nullable|max:64' . ( $r->file( 'uploadedFile' ) ? '|in:' . hash_file( 'sha256', $r->file( 'uploadedFile' ) ) : '' ) , + 'sha256' => 'nullable|max:64' . ( $r->file( 'uploadedFile' ) ? '|in:' . hash_file( 'sha256', $r->file( 'uploadedFile' )->getFilename() ) : '' ) , 'min_privs' => 'required|integer|in:' . implode( ',', array_keys( User::$PRIVILEGES_TEXT_ALL ) ), 'docstore_directory_id' => 'nullable|integer|exists:docstore_directories,id', ] ); diff --git a/app/Http/Controllers/DocstoreCustomer/FileController.php b/app/Http/Controllers/DocstoreCustomer/FileController.php index 485e4544c..e2f1b6e38 100644 --- a/app/Http/Controllers/DocstoreCustomer/FileController.php +++ b/app/Http/Controllers/DocstoreCustomer/FileController.php @@ -52,7 +52,7 @@ Container as AlertContainer }; -use League\Flysystem\Exception as FlySystemException; +use League\Flysystem\FilesystemException; /** * FileController Controller @@ -107,7 +107,7 @@ public function download( Customer $cust, DocstoreCustomerFile $file ) try { return Storage::disk( $file->disk )->download( $file->path, $file->name ); - } catch( FlySystemException $e ) { + } catch( FilesystemException $e ) { AlertContainer::push( "This customer file could not be found / downloaded. Please report this error to the support team.", Alert::DANGER ); return redirect( route( 'docstore-c-dir@list', [ 'cust' => $file->customer->id , 'dir' => $file->docstore_customer_directory_id ] ) ); } @@ -151,7 +151,7 @@ public function upload( Request $r, Customer $cust ): view $this->authorize( 'create', DocstoreCustomerFile::class ); Former::populate([ - 'min_privs' => $r->old( 'min_privs', User::AUTH_SUPERUSER ) + 'min_privs' => $r->old( 'min_privs', (string) User::AUTH_SUPERUSER ) ]); return view( 'docstore-customer/file/upload', [ @@ -179,7 +179,7 @@ public function store( Request $r, Customer $cust ): RedirectResponse $uploadedFile = $r->file('uploadedFile' ); - $path = $uploadedFile->store( $cust->id, 'docstore_customers' ); + $path = $uploadedFile->store( (string) $cust->id, 'docstore_customers' ); $file = DocstoreCustomerFile::create( [ 'name' => $r->name, @@ -187,7 +187,7 @@ public function store( Request $r, Customer $cust ): RedirectResponse 'cust_id' => $cust->id, 'min_privs' => $r->min_privs, 'path' => $path, - 'sha256' => hash_file( 'sha256', $uploadedFile ), + 'sha256' => hash_file( 'sha256', $uploadedFile->getFilename() ), 'created_by' => $r->user()->id, 'file_last_updated' => now(), 'docstore_customer_directory_id' => $r->docstore_customer_directory_id, @@ -218,7 +218,7 @@ public function edit( Request $r, Customer $cust, DocstoreCustomerFile $file ): 'name' => $r->old( 'name', $file->name ), 'description' => $r->old( 'descripton', $file->description ), 'sha256' => $r->old( 'sha256', $file->sha256 ), - 'min_privs' => $r->old( 'min_privs', $file->min_privs ), + 'min_privs' => $r->old( 'min_privs', (string) $file->min_privs ), 'docstore_customer_directory_id' => $r->old( 'docstore_customer_directory_id',$file->docstore_customer_directory_id ?? '' ), ]); @@ -256,7 +256,7 @@ public function update( Request $r, Customer $cust, DocstoreCustomerFile $file ) $file->update([ 'path' => $path, - 'sha256' => hash_file( 'sha256', $uploadedFile ), + 'sha256' => hash_file( 'sha256', $uploadedFile->getFilename() ), 'file_last_updated' => now(), ]); @@ -322,7 +322,7 @@ private function checkForm( Request $r, ?DocstoreCustomerFile $file = null ): vo }), 'sha256' => [ 'nullable', 'max:64', function ( $attribute, $value, $fail ) use( $r ) { - if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' ) ) ) { + if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' )->getFilename() ) ) { return $fail( 'The sha256 checksum calculated on the server does not match the one you provided.' ); } }, diff --git a/app/Http/Controllers/Interfaces/Common.php b/app/Http/Controllers/Interfaces/Common.php index 19822e679..9a52c4f47 100644 --- a/app/Http/Controllers/Interfaces/Common.php +++ b/app/Http/Controllers/Interfaces/Common.php @@ -146,11 +146,13 @@ public function processFanoutPhysicalInterface( $r, PhysicalInterface $pi, Virtu } } + $relatedInterface = $pi->relatedInterface(); + // if the physical interface already has a related physical interface and it's not the same as the fanout physical interface - if( $pi->relatedInterface() && $pi->relatedInterface()->id !== $fnpi->id ) { + if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { // if fanout does not have a virtual interface, relate it with old fanout port virtual interface. if( !$fnpi->virtualInterface ) { - $fnpi->virtualinterfaceid = $pi->relatedInterface()->virtualinterfaceid; + $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; } $this->removeRelatedInterface( $pi ); diff --git a/composer.lock b/composer.lock index 202a96540..794afc709 100644 --- a/composer.lock +++ b/composer.lock @@ -3130,16 +3130,16 @@ }, { "name": "league/flysystem", - "version": "3.27.0", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", - "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", "shasum": "" }, "require": { @@ -3163,10 +3163,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", + "ext-mongodb": "^1.3", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -3204,32 +3207,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2024-04-07T19:17:50+00:00" + "time": "2024-05-22T10:09:12+00:00" }, { "name": "league/flysystem-local", - "version": "3.25.1", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", - "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", "shasum": "" }, "require": { @@ -3263,19 +3256,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2024-03-15T19:58:44+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/mime-type-detection", diff --git a/psalm_errors_240522_1253.log b/psalm_errors_240522_1253.log new file mode 100644 index 000000000..7004edbf1 --- /dev/null +++ b/psalm_errors_240522_1253.log @@ -0,0 +1,2395 @@ +# console command errors + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Grapher/EmailPortUtilisation.php:119:109 +Argument 2 of IXP\Mail\Grapher\PortUtilisation::__construct expects float, but array|bool|null|string provided (see https://psalm.dev/004) + Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:60:16 +The declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) + * @return array|Builder|Customer + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:68:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return Customer::currentActive( true )->get(); + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:73:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return $c; + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:82:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return $c; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 +Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) + $addresses->add( $address ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/PeeringDB/AsnLookup.php:53:42 +Argument 1 of IXP\Services\PeeringDb::getNetworkByAsn expects int, but array|bool|null|string provided (see https://psalm.dev/004) + if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CompleteRequests.php:85:17 +Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) + if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CreateMeasurements.php:77:13 +Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + CreateMeasurementsJob::dispatchNow( $ar ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/RunMeasurements.php:91:13 +Method IXP\Jobs\RipeAtlas\RunMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + RunMeasurementsJob::dispatchNow( $am ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/StopAllMeasurements.php:87:17 +Method IXP\Jobs\RipeAtlas\StopAllMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + StopAllMeasurementsJob::dispatchNow( $am->id ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateMeasurements.php:79:13 +Method IXP\Jobs\RipeAtlas\UpdateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + UpdateMeasurementsJob::dispatchNow( $am ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:78:13 +Method IXP\Jobs\RipeAtlas\UpdateProbes::dispatchnow does not exist (see https://psalm.dev/022) + UpdateProbesJob::dispatchNow( $c ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:95:16 +The declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) + * @return array Customer + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:103:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers (see https://psalm.dev/128) + return Customer::CurrentActive( true, false, false )->get(); + +ERROR: ParadoxicalCondition +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:112:13 +Condition (($c) && ($cust is numeric)) contradicts a previously-established condition ((!$c) || ($cust is not numeric)) (see https://psalm.dev/089) + if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Rir/GenerateObject.php:87:58 +Isset only works with variables and array elements (see https://psalm.dev/004) + ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:74:9 +Method IXP\Jobs\FetchFilteredPrefixesForCustomer::dispatchnow does not exist (see https://psalm.dev/022) + FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); + +ERROR: ParadoxicalCondition +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:119:13 +Condition (($c) && ($custarg is numeric)) contradicts a previously-established condition ((!$c) || ($custarg is not numeric)) (see https://psalm.dev/089) + if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 +Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) + echo ( new RouterConfigurationGenerator( $router ) )->render(); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime(true) - LARAVEL_START ) + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 +Cannot find referenced variable $password (see https://psalm.dev/024) + $user->password = Hash::make( $password ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 +Cannot find referenced variable $name (see https://psalm.dev/024) + $user->name = $name; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 +Cannot find referenced variable $mobile (see https://psalm.dev/024) + $user->authorisedMobile = $mobile; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 +Cannot find referenced variable $username (see https://psalm.dev/024) + $user->username = strtolower( $username ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 +Cannot find referenced variable $email (see https://psalm.dev/024) + $user->email = strtolower( $email ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $user->privs = $priv; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 +Cannot find referenced variable $custid (see https://psalm.dev/024) + $user->custid = $custid; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $c2u->privs = $priv; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Utils/SmtpMailTest.php:130:26 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + $this->line( $mail->logger()->dump() ); + + + + + + + +# false alarm for existing interface methods + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$u->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $u->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + + + +# not invalid, weirdly declared... + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $addresses->add( strtolower( trim( $a ) ) ); + + +# declared in php.jar + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit( $array, YAML_UTF8_ENCODING ); + + +# don't see the issues in those + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:446:55 +Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) + $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:447:55 +Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) + $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; + + + +# declared in version.php + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'version' => APPLICATION_VERSION, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 +Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) + 'verdate' => APPLICATION_VERDATE, + + +# declared in public/index.php + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime( true ) - LARAVEL_START ) + + +# declarations exists + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + $array['ixpmanager_version'] = APPLICATION_VERSION; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); + + +# no issues here + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:148:39 +Cannot fetch property on non-object $switchA of type true (see https://psalm.dev/029) + $switchAName = $switchA ? $switchA->name : 'none'; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:150:39 +Cannot fetch property on non-object $switchB of type true (see https://psalm.dev/029) + $switchBName = $switchB ? $switchB->name : 'none'; + + + +# false alarm for existing interface methods + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( $privs = Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +\ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + + +# I don't see issue here + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:488:85 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false + + + + +# false alarm for existing interface methods + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + Auth::getUser()->save(); + + +# I don't see any issue here + +ERROR: EmptyArrayAccess +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 +Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) + && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { + + + +# false alarm for existing interface methods + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + + +# don't see issues here + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:152:44 +Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) + if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:155:45 +Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) + $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; + + +# weirdly declared variables + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:384:44 +Cannot find referenced variable $cia (see https://psalm.dev/024) + $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:385:44 +Cannot find referenced variable $cib (see https://psalm.dev/024) + $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ + + + +------ + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'custid' => $r->old('custid', $cb->customer()->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'custid' => $r->old('custid', $cb->customer()->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:149:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'cost' => $r->old('cost', $cb->cost ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:150:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'preference' => $r->old('preference', $cb->preference ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:151:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'type' => $r->old('type', $cb->type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:153:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'enabled' => $r->old('enabled', $cb->enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:154:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'bfd' => $r->old('bfd', $cb->bfd ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:155:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'stp' => $r->old('stp', $cb->stp ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:161:78 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:78 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:208:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:209:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:215:25 +Cannot create offset of type int|null, expecting array-key (see https://psalm.dev/115) + [ $pi->switchportid => + [ "name" => $pi->switchPort->name, + "id" => $pi->switchportid, + "type" => $pi->switchPort->type, + "porttype" => $pi->switchPort->type ] + ]; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['switch-port-b'] = $piB->switchportid; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['duplex-b'] = $piB->duplex; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['notes-b'] = $piB->notes ?? ''; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/SflowReceiverController.php:112:56 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:144:46 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'custid' => $r->old( 'cust', $cust->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:199:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'custid' => $r->old( 'custid', $vi->custid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:200:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool|null provided (see https://psalm.dev/004) + 'trunk' => $r->old( 'trunk', $vi->trunk ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:201:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:202:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:204:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:205:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mtu' => $r->old( 'mtu', $vi->mtu ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:155:73 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:156:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:157:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:159:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:160:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:163:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:164:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:166:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:167:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:168:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:169:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'as112client' => $r->old( 'as112client', $vli->as112client ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:170:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:172:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:173:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:176:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:177:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:135:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:138:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:139:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:143:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'u_position' => $r->old( 'u_position', $pp->u_position ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:144:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:145:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:146:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0 provided (see https://psalm.dev/004) + 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:187:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:189:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:190:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'state' => $r->old( 'state', $ppp->state ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:202:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:263:27 +$pm->peered with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $pm->peered = !$pm->peered; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:268:29 +$pm->rejected with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $pm->rejected = !$pm->rejected; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/MeasurementController.php:194:35 +Argument 1 of IXP\Http\Controllers\RipeAtlas\MeasurementController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/ProbesController.php:152:35 +Argument 1 of IXP\Http\Controllers\RipeAtlas\ProbesController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ): View + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:185:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 1 provided (see https://psalm.dev/004) + 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:247:9 +Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:272:19 +Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) + } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:144:75 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:151:75 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'asn' => request()->old( 'asn', $router->asn ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:157:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'api_type' => request()->old( 'api_type', $router->api_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:159:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'lg_access' => request()->old( 'lg_access', $router->lg_access ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:160:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'quarantine' => request()->old( 'quarantine', $router->quarantine ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:161:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:162:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'rpki' => request()->old( 'rpki', $router->rpki ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:163:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:164:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:165:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'pair_id' => request()->old( 'pair_id', $router->pair_id ), + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:236:34 +$router->pause_updates with declared type 'int' cannot be assigned type 'true' (see https://psalm.dev/145) + $router->pause_updates = true; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:55 +Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:65 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:240:47 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:242:47 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:134 +Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:144 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:64:26 +$this->grapher with declared type 'IXP\Services\Grapher' cannot be assigned type 'Grapher' (see https://psalm.dev/145) + $this->grapher = $grapher; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:70:16 +The declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher is incorrect, got 'IXP\Services\Grapher' (see https://psalm.dev/011) + * @return GrapherService + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:74:16 +The inferred type 'IXP\Services\Grapher' does not match the declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher (see https://psalm.dev/128) + return $this->grapher; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/LookingGlass.php:353:54 +Method IXP\Contracts\LookingGlass::exportRoute does not exist (see https://psalm.dev/181) + 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:91:9 +Instance property IXP\Http\Requests\StatisticsRequest::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:92:9 +Instance property IXP\Http\Requests\StatisticsRequest::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:93:9 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterProtocol( $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:94:9 +Instance property IXP\Http\Requests\StatisticsRequest::$type is not defined (see https://psalm.dev/038) + $r->type = Graph::processParameterType( $r->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:336:13 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::PROTOCOL_ALL; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:339:17 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::PROTOCOL_IPV4; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:341:65 +Argument 2 of IXP\Models\Aggregators\VlanInterfaceAggregator::forVlan expects bool, but 'ipv4'|'ipv6' provided (see https://psalm.dev/004) + $targets = VlanInterfaceAggregator::forVlan( $vlan, $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category, true ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 +Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:367:67 +Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) + 'addBySnmp' => request()->old( 'add_by_snnp', false ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:418:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:419:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:429:67 +Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) + 'addBySnmp' => request()->old( 'add_by_snnp', false ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:696:13 +Cannot fetch property on non-object $switch of type false (see https://psalm.dev/029) + $switch->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:697:13 +Cannot fetch property on non-object $infra of type false (see https://psalm.dev/029) + $infra->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:698:13 +Cannot fetch property on non-object $location of type false (see https://psalm.dev/029) + $location->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:700:13 +Cannot fetch property on non-object $vlan of type false (see https://psalm.dev/029) + $vlan->id ?? null, + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchPortController.php:179:35 +Argument 1 of IXP\Http\Controllers\Switches\SwitchPortController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isCustUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 +Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) + $user->refresh(); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:242:17 +The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) + * @return RedirectResponse + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:258:35 +$user->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $user->disabled = !$r->disabled; // input as enable in the view + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:284:16 +The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store (see https://psalm.dev/128) + return redirect( $this->postStoreRedirect() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:312:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'disabled' => $r->old( 'disabled', !$u->disabled ), + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:346:17 +The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) + * @return RedirectResponse + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:363:31 +$u->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $u->disabled = !$r->disabled;// displayed as enabled in the view + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:386:16 +The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update (see https://psalm.dev/128) + return redirect( $this->postStoreRedirect() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:403:27 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isCustUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:476:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:495:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::getUser()->privs() !== $privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:63:55 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 +Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) + if( $user_priv < $controller::$minimum_privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterProtocol( $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 +Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) + $r->type = Graph::processParameterType( $r->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 +Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) + $r->id = 1; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 +Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) + $r->infrastructure = $infra->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 +Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) + $r->vlan = $vlan->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 +Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) + $r->trunkname = $trunkname; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 +Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) + $r->corebundle = $corebundle->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 +Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) + $r->side = $side; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 +Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) + $r->location = $location->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 +Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) + $r->switch = $switch->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 +Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) + $r->physint = $physint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 +Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) + $r->virtint = $virtint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 +Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) + $r->customer = $customer->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 +Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) + $r->vlanint = $vlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 +Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) + $r->vli = $vli; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 +Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) + $r->srcvlanint = $srcvlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 +Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) + $r->dstvlanint = $dstvlanint->id; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:40:28 +Class, interface or enum named Fideloper\Proxy\TrustProxies does not exist (see https://psalm.dev/019) +class TrustProxies extends Middleware + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $privs = Auth::getUser()->privs(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/ForgotUsername.php:57:66 +Argument 1 of IXP\Mail\Auth\ForgotUsername::__construct expects Illuminate\Database\Eloquent\Collection, but array provided (see https://psalm.dev/004) + Mail::to( $e->email )->send( new ForgotPasswordMailable( $e->users ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 +Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) + if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Grapher/PortsWithCounts.php:62:27 +$this->category with declared type 'float' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->category = $category; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/User/UserCreated.php:82:24 +$this->token with declared type 'bool' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->token = app('auth.password.broker')->createToken( $this->user ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:42:13 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + * @var SwiftMail SMTP dialog logging + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:44:5 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + /** + * @var SwiftMail SMTP dialog logging + */ + private $logger = null; + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:68:33 +Class, interface or enum named Swift_Plugins_Loggers_ArrayLogger does not exist (see https://psalm.dev/019) + $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:69:57 +Class, interface or enum named Swift_Plugins_LoggerPlugin does not exist (see https://psalm.dev/019) + Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:77:16 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + * @return SwiftMail|null + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:90:23 +Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) + throw new IXP_Exception( 'Invalid protocol' ); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:94:23 +Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) + throw new IXP_Exception( 'Invalid VLAN' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + }); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + return $q->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + } ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function ($query) use( $switch ) { + $query->where( 'sA.id', $switch->id ) + ->orWhere( 'sB.id', $switch->id ); + }) + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 +The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) + public function contactGroups(): BelongsToMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 +The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) + return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) + ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) + ->orderBy( 'name' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Customer.php:840:13 +Argument 2 of str_replace expects array|string, but list{null|string, null|string, null|string, ''|int, string, string, string} provided (see https://psalm.dev/004) + [ + $this->name, + $this->abbreviatedName, + $this->shortname, + $as ?: '', + $as ? "[AS{$as}]" : '', + $as ? "AS{$as}" : '', + $as ? " - AS{$as}" : '' + ], + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: NullArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:244:21 +Cannot access value on variable IXP\Models\DocstoreCustomerDirectory::$dirs[null] using null offset (see https://psalm.dev/124) + self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $builder->where('min_privs', '<=', Auth::getUser()->privs() ); + +ERROR: NullArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreDirectory.php:210:21 +Cannot access value on variable IXP\Models\DocstoreDirectory::$dirs[null] using null offset (see https://psalm.dev/124) + self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 +The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) + public function patchPanelPortFilesPublic(): HasMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 +The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) + return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) + ->where( 'is_private', 0 ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Switcher.php:323:35 +$this->mauSupported with declared type 'int|null' cannot be assigned type 'true' (see https://psalm.dev/145) + $this->mauSupported = true; + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/VirtualInterface.php:240:20 +The declared return type 'IXP\Models\SwitchPort|bool' for IXP\Models\VirtualInterface::switchPort is not nullable, but the function returns 'mixed|null' (see https://psalm.dev/139) + return $this->physicalInterfaces()->first()->switchPort; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:82:16 +No return statements were found for method IXP\Policies\CustomerPolicy::create but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:95:16 +No return statements were found for method IXP\Policies\CustomerPolicy::update but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:107:16 +No return statements were found for method IXP\Policies\CustomerPolicy::delete but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:119:16 +No return statements were found for method IXP\Policies\CustomerPolicy::restore but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:132:16 +No return statements were found for method IXP\Policies\CustomerPolicy::forceDelete but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/DocstoreLogPolicy.php:58:16 +No return statements were found for method IXP\Policies\DocstoreLogPolicy::viewAny but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: MissingFile +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/BroadcastServiceProvider.php:48:9 +Cannot find file /Users/laszlo/dev/ibn-ixp-manager/routes/channels.php to include (see https://psalm.dev/107) + require base_path('routes/channels.php'); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HelpdeskServiceProvider.php:93:33 +Class, interface or enum named IXP\Providers\arrau does not exist (see https://psalm.dev/019) + public function provides(): arrau + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::check() && Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 +Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) + ->getCompiler(); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/PurifierServiceProvider.php:40:35 +Class, interface or enum named IXP\Providers\LaravelApplication does not exist (see https://psalm.dev/019) + if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if ($this->app->isLocal()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if( $this->app->isLocal() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 +Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) + $this->userRememberToken = $this->provider->addRememberToken($user); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 +Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) + $this->provider->purgeExpiredRememberTokens( $user ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:31:14 +Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) + /** @var PlatesEngine */ + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:36:25 +$this->engine with declared type 'IXP\Services\PlatesEngine' cannot be assigned type 'Foil\Engine' (see https://psalm.dev/145) + $this->engine = $engine; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:39:31 +The declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine is incorrect, got 'IXP\Services\PlatesEngine' (see https://psalm.dev/011) + public function engine(): EngineFoil + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:41:16 +The inferred type 'IXP\Services\PlatesEngine' does not match the declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine (see https://psalm.dev/128) + return $this->engine; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:54:16 +Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) + return $this->engine->render( $path, $data ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher.php:90:30 +$this->cacheLifetime with declared type 'bool' cannot be assigned type '300' (see https://psalm.dev/145) + private $cacheLifetime = 300; + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Mrtg.php:474:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Mrtg::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:206:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:228:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::rrd does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:919:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:926:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:937:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:944:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:954:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:961:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:973:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:980:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->customer()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:52:16 +The declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray is incorrect, got 'IXP\Services\Grapher\Graph\IXP&static' (see https://psalm.dev/011) + * @return Grapher Fluid interface + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:57:16 +The inferred type 'IXP\Services\Grapher\Graph\IXP&static' does not match the declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray (see https://psalm.dev/128) + return $this; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->infrastructure()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:96:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:100:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->location()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:97:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:101:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->switch()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->vlan()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:131:68 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return number_format( $v, $decs ) . " " . $formats[$i]; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:135:28 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return $formats[$i]; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:221:26 +$this->totalIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->totalIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:234:27 +$this->totalOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->totalOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:247:24 +$this->curIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->curIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:260:25 +$this->curOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->curOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:273:28 +$this->averageIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->averageIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:286:29 +$this->averageOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->averageOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:299:24 +$this->maxIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->maxIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:327:25 +$this->maxOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->maxOut = $v; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:50:13 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + * @var Zendesk\API\Client + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:74:25 +$this->client with declared type 'IXP\Services\Helpdesk\Zendesk\API\Client' cannot be assigned type 'Zendesk\API\HttpClient' (see https://psalm.dev/145) + $this->client = new ZendeskAPI( $config['subdomain'], $config['email'] ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:91:28 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + $this->debug = $this->client->getDebug(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:96:54 +Argument 1 of json_decode expects string, but array provided (see https://psalm.dev/004) + $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:117:38 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + $this->callApi( function() { $this->client->tickets()->findAll(); } ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:264:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->create( $this->customerEntityToZendeskObject( $cust ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:24 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:109 +Argument 2 of IXP\Services\Helpdesk\Zendesk::customerEntityToZendeskObject expects bool, but int provided (see https://psalm.dev/004) + return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:319:24 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->search( $id ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:441:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->create( $this->contactEntityToZendeskObject( $contact, $org_id ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:467:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->update( $helpdeskId, $this->contactEntityToZendeskObject( $contact, null, $helpdeskId ) ); + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:475:16 +The declared return type 'IXP\Models\Contact' for IXP\Services\Helpdesk\Zendesk::userUpdate does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:498:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->search( [ 'external_id' => $id ] ); + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/IXF.php:95:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass.php:67:118 +Cannot find referenced variable $r (see https://psalm.dev/024) + throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); + +ERROR: InvalidClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass/BirdsEye.php:72:49 +Class, interface or enum IXP\Services\LookingGlass\Birdseye has wrong casing (see https://psalm.dev/007) + public function setCacheEnabled( bool $b ): Birdseye + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:133:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:185:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:86:59 +Argument 2 of IXP\Services\Purifier::addCustomDefinition expects IXP\Services\HTML_Purifier_Config|null, but HTMLPurifier_Config provided (see https://psalm.dev/004) + $this->addCustomDefinition($definitionConfig, $config); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:92:53 +Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomElements($elements, $def); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:99:57 +Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomAttributes($attributes, $def); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:112:15 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + * @param HTML_Purifier_Config $configObject Defaults to using default config + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:114:16 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + * @return HTML_Purifier_Config $configObject + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:124:9 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + $configObject->set('HTML.DefinitionID', $definitionConfig['id']); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:125:9 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + $configObject->set('HTML.DefinitionRev', $definitionConfig['rev']); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:129:13 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + $configObject->set('Cache.DefinitionImpl', null); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:133:20 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + if ($def = $configObject->maybeGetRawHTMLDefinition()) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:136:77 +Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomAttributes($definitionConfig['attributes'], $def); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:141:73 +Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomElements($definitionConfig['elements'], $def); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:152:15 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @param HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:154:16 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:165:13 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addAttribute($onElement, $attrName, $validValues); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:175:15 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @param HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 +No return statements were found for method IXP\Services\Purifier::addCustomElements but return type 'IXP\Services\HTMLPurifier_HTMLDefinition' was expected (see https://psalm.dev/011) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:190:17 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection, $attributes); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:192:17 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:145:16 +The declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough is incorrect, got 'int<0, max>' (see https://psalm.dev/011) + * @return bool + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:158:16 +The inferred type 'int<0, max>' does not match the declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough (see https://psalm.dev/128) + return count( $path[ 'ixpx' ] ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::getUser()->privs() >= $minAuth; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:97:16 +The declared return type 'string' for ixp_get_client_ip is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:104:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:116:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:126:20 +The declared return type 'string' for ixp_get_client_ip is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return request()->getClientIp(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdateAsnDb.php:95:40 +Argument 1 of IXP\Tasks\Irrdb\UpdateAsnDb::validate has wrong name $asns, expecting $prefixes as defined by IXP\Tasks\Irrdb\UpdateDb::validate (see https://psalm.dev/230) + protected function validate( array $asns, int $protocol ) : array + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 +Argument 1 of IXP\Rules\IPv4Cidr::passes expects string, but array provided (see https://psalm.dev/004) + if( !$validator->passes( [], $p ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 +Argument 1 of IXP\Rules\IPv6Cidr::passes expects string, but array provided (see https://psalm.dev/004) + if( !$validator->passes( [], $p ) ) { + +ERROR: UndefinedThisPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 +Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) + return Log::entries( self::getClass(), $this->id, $user ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Bgpq3.php:105:83 +Argument 2 of IXP\Utils\Bgpq3::execute cannot be false, int value expected (see https://psalm.dev/004) + $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'generator' => 'IXP Manager v' . APPLICATION_VERSION, + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:105:27 +Argument 1 of round expects float|int, but array|null|string provided (see https://psalm.dev/004) + return round( $size ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:170:63 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return number_format( $v, $decs ) . ' ' . $formats[ $i ]; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:177:24 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return $formats[ $i ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: LessSpecificImplementedReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 +The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) + * @return array An array of attributes with the label class + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:179:66 +Argument 1 of HtmlObject\Element::addClass expects string, but list{string, string, ''|mixed} provided (see https://psalm.dev/004) + return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:75:16 +The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:81:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:89:16 +The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return request()->getClientIp(); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:65:22 +$this->key with declared type 'array' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->key = $listname; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:84:69 +Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) + return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "1" ] ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:86:69 +Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) + return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $filtered_users->add( $e ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:143:13 +Cannot access value on variable $prefs['mailinglist'][$this->key] using a array offset, expecting array-key (see https://psalm.dev/115) + $prefs[ 'mailinglist' ][ $this->key ] = $value; + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/View/Alert/Container.php:66:20 +The declared return type 'IXP\Utils\View\Alert\Alert' for IXP\Utils\View\Alert\Container::pop is not nullable, but the function returns 'null' (see https://psalm.dev/139) + return null; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_03_30_124916_create_atlas_probes.php:28:38 +Argument 2 of Illuminate\Database\Schema\Blueprint::string expects int|null, but '255' provided (see https://psalm.dev/004) + $table->string('status', '255' )->nullable(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php:30:28 +Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 255 provided (see https://psalm.dev/004) + $table->string(255)->nullable()->after('host'); + +------------------------------ +503 errors found +------------------------------ +3433 other issues found. +You can display them with --show-info=true +------------------------------ + +Checks took 0.19 seconds and used 33.183MB of memory +No files analyzed +Psalm was able to infer types for 80.5560% of the codebase diff --git a/psalm_errors_240522_1253a.log b/psalm_errors_240522_1253a.log new file mode 100644 index 000000000..53e2a3482 --- /dev/null +++ b/psalm_errors_240522_1253a.log @@ -0,0 +1,2330 @@ + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Grapher/EmailPortUtilisation.php:119:109 +Argument 2 of IXP\Mail\Grapher\PortUtilisation::__construct expects float, but array|bool|null|string provided (see https://psalm.dev/004) + Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:60:16 +The declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) + * @return array|Builder|Customer + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:68:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return Customer::currentActive( true )->get(); + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:73:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return $c; + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:82:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return $c; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 +Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) + $addresses->add( $address ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/PeeringDB/AsnLookup.php:53:42 +Argument 1 of IXP\Services\PeeringDb::getNetworkByAsn expects int, but array|bool|null|string provided (see https://psalm.dev/004) + if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CompleteRequests.php:85:17 +Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) + if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CreateMeasurements.php:77:13 +Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + CreateMeasurementsJob::dispatchNow( $ar ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/RunMeasurements.php:91:13 +Method IXP\Jobs\RipeAtlas\RunMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + RunMeasurementsJob::dispatchNow( $am ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/StopAllMeasurements.php:87:17 +Method IXP\Jobs\RipeAtlas\StopAllMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + StopAllMeasurementsJob::dispatchNow( $am->id ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateMeasurements.php:79:13 +Method IXP\Jobs\RipeAtlas\UpdateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + UpdateMeasurementsJob::dispatchNow( $am ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:78:13 +Method IXP\Jobs\RipeAtlas\UpdateProbes::dispatchnow does not exist (see https://psalm.dev/022) + UpdateProbesJob::dispatchNow( $c ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:95:16 +The declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) + * @return array Customer + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:103:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers (see https://psalm.dev/128) + return Customer::CurrentActive( true, false, false )->get(); + +ERROR: ParadoxicalCondition +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:112:13 +Condition (($c) && ($cust is numeric)) contradicts a previously-established condition ((!$c) || ($cust is not numeric)) (see https://psalm.dev/089) + if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Rir/GenerateObject.php:87:58 +Isset only works with variables and array elements (see https://psalm.dev/004) + ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:74:9 +Method IXP\Jobs\FetchFilteredPrefixesForCustomer::dispatchnow does not exist (see https://psalm.dev/022) + FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); + +ERROR: ParadoxicalCondition +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:119:13 +Condition (($c) && ($custarg is numeric)) contradicts a previously-established condition ((!$c) || ($custarg is not numeric)) (see https://psalm.dev/089) + if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 +Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) + echo ( new RouterConfigurationGenerator( $router ) )->render(); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime(true) - LARAVEL_START ) + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 +Cannot find referenced variable $password (see https://psalm.dev/024) + $user->password = Hash::make( $password ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 +Cannot find referenced variable $name (see https://psalm.dev/024) + $user->name = $name; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 +Cannot find referenced variable $mobile (see https://psalm.dev/024) + $user->authorisedMobile = $mobile; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 +Cannot find referenced variable $username (see https://psalm.dev/024) + $user->username = strtolower( $username ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 +Cannot find referenced variable $email (see https://psalm.dev/024) + $user->email = strtolower( $email ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $user->privs = $priv; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 +Cannot find referenced variable $custid (see https://psalm.dev/024) + $user->custid = $custid; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $c2u->privs = $priv; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Utils/SmtpMailTest.php:130:26 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + $this->line( $mail->logger()->dump() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$u->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $u->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $addresses->add( strtolower( trim( $a ) ) ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit( $array, YAML_UTF8_ENCODING ); + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:446:55 +Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) + $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:447:55 +Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) + $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'version' => APPLICATION_VERSION, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 +Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) + 'verdate' => APPLICATION_VERDATE, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime( true ) - LARAVEL_START ) + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + $array['ixpmanager_version'] = APPLICATION_VERSION; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:148:39 +Cannot fetch property on non-object $switchA of type true (see https://psalm.dev/029) + $switchAName = $switchA ? $switchA->name : 'none'; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:150:39 +Cannot fetch property on non-object $switchB of type true (see https://psalm.dev/029) + $switchBName = $switchB ? $switchB->name : 'none'; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( $privs = Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:489:85 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + Auth::getUser()->save(); + +ERROR: EmptyArrayAccess +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 +Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) + && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:152:44 +Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) + if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:155:45 +Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) + $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:386:44 +Cannot find referenced variable $cia (see https://psalm.dev/024) + $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:387:44 +Cannot find referenced variable $cib (see https://psalm.dev/024) + $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ + + + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'custid' => $r->old('custid', $cb->customer()->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'custid' => $r->old('custid', $cb->customer()->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:149:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'cost' => $r->old('cost', $cb->cost ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:150:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'preference' => $r->old('preference', $cb->preference ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:151:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'type' => $r->old('type', $cb->type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:153:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'enabled' => $r->old('enabled', $cb->enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:154:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'bfd' => $r->old('bfd', $cb->bfd ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:155:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'stp' => $r->old('stp', $cb->stp ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:161:78 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:78 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:208:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:209:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:215:25 +Cannot create offset of type int|null, expecting array-key (see https://psalm.dev/115) + [ $pi->switchportid => + [ "name" => $pi->switchPort->name, + "id" => $pi->switchportid, + "type" => $pi->switchPort->type, + "porttype" => $pi->switchPort->type ] + ]; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['switch-port-b'] = $piB->switchportid; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['duplex-b'] = $piB->duplex; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['notes-b'] = $piB->notes ?? ''; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/SflowReceiverController.php:112:56 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:144:46 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'custid' => $r->old( 'cust', $cust->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:199:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'custid' => $r->old( 'custid', $vi->custid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:200:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool|null provided (see https://psalm.dev/004) + 'trunk' => $r->old( 'trunk', $vi->trunk ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:201:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:202:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:204:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:205:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mtu' => $r->old( 'mtu', $vi->mtu ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:155:73 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:156:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:157:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:159:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:160:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:163:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:164:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:166:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:167:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:168:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:169:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'as112client' => $r->old( 'as112client', $vli->as112client ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:170:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:172:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:173:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:176:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:177:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:135:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:138:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:139:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:143:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'u_position' => $r->old( 'u_position', $pp->u_position ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:144:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:145:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:146:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0 provided (see https://psalm.dev/004) + 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:187:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:189:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:190:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'state' => $r->old( 'state', $ppp->state ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:202:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:263:27 +$pm->peered with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $pm->peered = !$pm->peered; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:268:29 +$pm->rejected with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $pm->rejected = !$pm->rejected; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/MeasurementController.php:194:35 +Argument 1 of IXP\Http\Controllers\RipeAtlas\MeasurementController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/ProbesController.php:152:35 +Argument 1 of IXP\Http\Controllers\RipeAtlas\ProbesController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ): View + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:185:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 1 provided (see https://psalm.dev/004) + 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:247:9 +Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:272:19 +Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) + } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:144:75 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:151:75 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'asn' => request()->old( 'asn', $router->asn ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:157:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'api_type' => request()->old( 'api_type', $router->api_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:159:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'lg_access' => request()->old( 'lg_access', $router->lg_access ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:160:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'quarantine' => request()->old( 'quarantine', $router->quarantine ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:161:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:162:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'rpki' => request()->old( 'rpki', $router->rpki ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:163:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:164:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:165:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'pair_id' => request()->old( 'pair_id', $router->pair_id ), + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:236:34 +$router->pause_updates with declared type 'int' cannot be assigned type 'true' (see https://psalm.dev/145) + $router->pause_updates = true; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:55 +Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:65 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:240:47 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:242:47 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:134 +Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:144 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:64:26 +$this->grapher with declared type 'IXP\Services\Grapher' cannot be assigned type 'Grapher' (see https://psalm.dev/145) + $this->grapher = $grapher; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:70:16 +The declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher is incorrect, got 'IXP\Services\Grapher' (see https://psalm.dev/011) + * @return GrapherService + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:74:16 +The inferred type 'IXP\Services\Grapher' does not match the declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher (see https://psalm.dev/128) + return $this->grapher; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/LookingGlass.php:353:54 +Method IXP\Contracts\LookingGlass::exportRoute does not exist (see https://psalm.dev/181) + 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:91:9 +Instance property IXP\Http\Requests\StatisticsRequest::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:92:9 +Instance property IXP\Http\Requests\StatisticsRequest::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:93:9 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterProtocol( $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:94:9 +Instance property IXP\Http\Requests\StatisticsRequest::$type is not defined (see https://psalm.dev/038) + $r->type = Graph::processParameterType( $r->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:336:13 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::PROTOCOL_ALL; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:339:17 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::PROTOCOL_IPV4; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:341:65 +Argument 2 of IXP\Models\Aggregators\VlanInterfaceAggregator::forVlan expects bool, but 'ipv4'|'ipv6' provided (see https://psalm.dev/004) + $targets = VlanInterfaceAggregator::forVlan( $vlan, $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category, true ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 +Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:367:67 +Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) + 'addBySnmp' => request()->old( 'add_by_snnp', false ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:418:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:419:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:429:67 +Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) + 'addBySnmp' => request()->old( 'add_by_snnp', false ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:696:13 +Cannot fetch property on non-object $switch of type false (see https://psalm.dev/029) + $switch->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:697:13 +Cannot fetch property on non-object $infra of type false (see https://psalm.dev/029) + $infra->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:698:13 +Cannot fetch property on non-object $location of type false (see https://psalm.dev/029) + $location->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:700:13 +Cannot fetch property on non-object $vlan of type false (see https://psalm.dev/029) + $vlan->id ?? null, + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchPortController.php:179:35 +Argument 1 of IXP\Http\Controllers\Switches\SwitchPortController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isCustUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 +Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) + $user->refresh(); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:242:17 +The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) + * @return RedirectResponse + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:258:35 +$user->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $user->disabled = !$r->disabled; // input as enable in the view + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:284:16 +The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store (see https://psalm.dev/128) + return redirect( $this->postStoreRedirect() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:312:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'disabled' => $r->old( 'disabled', !$u->disabled ), + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:346:17 +The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) + * @return RedirectResponse + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:363:31 +$u->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $u->disabled = !$r->disabled;// displayed as enabled in the view + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:386:16 +The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update (see https://psalm.dev/128) + return redirect( $this->postStoreRedirect() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:403:27 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isCustUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:476:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:495:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::getUser()->privs() !== $privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:63:55 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 +Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) + if( $user_priv < $controller::$minimum_privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterProtocol( $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 +Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) + $r->type = Graph::processParameterType( $r->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 +Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) + $r->id = 1; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 +Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) + $r->infrastructure = $infra->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 +Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) + $r->vlan = $vlan->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 +Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) + $r->trunkname = $trunkname; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 +Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) + $r->corebundle = $corebundle->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 +Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) + $r->side = $side; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 +Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) + $r->location = $location->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 +Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) + $r->switch = $switch->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 +Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) + $r->physint = $physint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 +Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) + $r->virtint = $virtint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 +Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) + $r->customer = $customer->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 +Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) + $r->vlanint = $vlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 +Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) + $r->vli = $vli; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 +Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) + $r->srcvlanint = $srcvlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 +Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) + $r->dstvlanint = $dstvlanint->id; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:40:28 +Class, interface or enum named Fideloper\Proxy\TrustProxies does not exist (see https://psalm.dev/019) +class TrustProxies extends Middleware + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $privs = Auth::getUser()->privs(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 +Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) + if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Grapher/PortsWithCounts.php:62:27 +$this->category with declared type 'float' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->category = $category; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/User/UserCreated.php:82:24 +$this->token with declared type 'bool' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->token = app('auth.password.broker')->createToken( $this->user ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:42:13 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + * @var SwiftMail SMTP dialog logging + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:44:5 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + /** + * @var SwiftMail SMTP dialog logging + */ + private $logger = null; + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:68:33 +Class, interface or enum named Swift_Plugins_Loggers_ArrayLogger does not exist (see https://psalm.dev/019) + $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:69:57 +Class, interface or enum named Swift_Plugins_LoggerPlugin does not exist (see https://psalm.dev/019) + Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:77:16 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + * @return SwiftMail|null + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:90:23 +Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) + throw new IXP_Exception( 'Invalid protocol' ); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:94:23 +Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) + throw new IXP_Exception( 'Invalid VLAN' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + }); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + return $q->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + } ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function ($query) use( $switch ) { + $query->where( 'sA.id', $switch->id ) + ->orWhere( 'sB.id', $switch->id ); + }) + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 +The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) + public function contactGroups(): BelongsToMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 +The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) + return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) + ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) + ->orderBy( 'name' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Customer.php:840:13 +Argument 2 of str_replace expects array|string, but list{null|string, null|string, null|string, ''|int, string, string, string} provided (see https://psalm.dev/004) + [ + $this->name, + $this->abbreviatedName, + $this->shortname, + $as ?: '', + $as ? "[AS{$as}]" : '', + $as ? "AS{$as}" : '', + $as ? " - AS{$as}" : '' + ], + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: NullArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:244:21 +Cannot access value on variable IXP\Models\DocstoreCustomerDirectory::$dirs[null] using null offset (see https://psalm.dev/124) + self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $builder->where('min_privs', '<=', Auth::getUser()->privs() ); + +ERROR: NullArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreDirectory.php:210:21 +Cannot access value on variable IXP\Models\DocstoreDirectory::$dirs[null] using null offset (see https://psalm.dev/124) + self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 +The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) + public function patchPanelPortFilesPublic(): HasMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 +The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) + return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) + ->where( 'is_private', 0 ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Switcher.php:323:35 +$this->mauSupported with declared type 'int|null' cannot be assigned type 'true' (see https://psalm.dev/145) + $this->mauSupported = true; + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/VirtualInterface.php:240:20 +The declared return type 'IXP\Models\SwitchPort|bool' for IXP\Models\VirtualInterface::switchPort is not nullable, but the function returns 'mixed|null' (see https://psalm.dev/139) + return $this->physicalInterfaces()->first()->switchPort; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:82:16 +No return statements were found for method IXP\Policies\CustomerPolicy::create but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:95:16 +No return statements were found for method IXP\Policies\CustomerPolicy::update but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:107:16 +No return statements were found for method IXP\Policies\CustomerPolicy::delete but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:119:16 +No return statements were found for method IXP\Policies\CustomerPolicy::restore but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:132:16 +No return statements were found for method IXP\Policies\CustomerPolicy::forceDelete but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/DocstoreLogPolicy.php:58:16 +No return statements were found for method IXP\Policies\DocstoreLogPolicy::viewAny but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: MissingFile +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/BroadcastServiceProvider.php:48:9 +Cannot find file /Users/laszlo/dev/ibn-ixp-manager/routes/channels.php to include (see https://psalm.dev/107) + require base_path('routes/channels.php'); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HelpdeskServiceProvider.php:93:33 +Class, interface or enum named IXP\Providers\arrau does not exist (see https://psalm.dev/019) + public function provides(): arrau + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::check() && Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 +Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) + ->getCompiler(); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/PurifierServiceProvider.php:40:35 +Class, interface or enum named IXP\Providers\LaravelApplication does not exist (see https://psalm.dev/019) + if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if ($this->app->isLocal()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if( $this->app->isLocal() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 +Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) + $this->userRememberToken = $this->provider->addRememberToken($user); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 +Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) + $this->provider->purgeExpiredRememberTokens( $user ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:31:14 +Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) + /** @var PlatesEngine */ + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:36:25 +$this->engine with declared type 'IXP\Services\PlatesEngine' cannot be assigned type 'Foil\Engine' (see https://psalm.dev/145) + $this->engine = $engine; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:39:31 +The declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine is incorrect, got 'IXP\Services\PlatesEngine' (see https://psalm.dev/011) + public function engine(): EngineFoil + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:41:16 +The inferred type 'IXP\Services\PlatesEngine' does not match the declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine (see https://psalm.dev/128) + return $this->engine; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:54:16 +Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) + return $this->engine->render( $path, $data ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher.php:90:30 +$this->cacheLifetime with declared type 'bool' cannot be assigned type '300' (see https://psalm.dev/145) + private $cacheLifetime = 300; + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Mrtg.php:474:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Mrtg::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:206:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:228:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::rrd does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:919:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:926:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:937:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:944:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:954:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:961:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:973:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:980:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->customer()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:52:16 +The declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray is incorrect, got 'IXP\Services\Grapher\Graph\IXP&static' (see https://psalm.dev/011) + * @return Grapher Fluid interface + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:57:16 +The inferred type 'IXP\Services\Grapher\Graph\IXP&static' does not match the declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray (see https://psalm.dev/128) + return $this; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->infrastructure()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:96:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:100:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->location()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:97:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:101:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->switch()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->vlan()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:131:68 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return number_format( $v, $decs ) . " " . $formats[$i]; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:135:28 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return $formats[$i]; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:221:26 +$this->totalIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->totalIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:234:27 +$this->totalOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->totalOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:247:24 +$this->curIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->curIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:260:25 +$this->curOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->curOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:273:28 +$this->averageIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->averageIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:286:29 +$this->averageOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->averageOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:299:24 +$this->maxIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->maxIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:327:25 +$this->maxOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->maxOut = $v; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:50:13 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + * @var Zendesk\API\Client + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:74:25 +$this->client with declared type 'IXP\Services\Helpdesk\Zendesk\API\Client' cannot be assigned type 'Zendesk\API\HttpClient' (see https://psalm.dev/145) + $this->client = new ZendeskAPI( $config['subdomain'], $config['email'] ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:91:28 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + $this->debug = $this->client->getDebug(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:96:54 +Argument 1 of json_decode expects string, but array provided (see https://psalm.dev/004) + $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:117:38 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + $this->callApi( function() { $this->client->tickets()->findAll(); } ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:264:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->create( $this->customerEntityToZendeskObject( $cust ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:24 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:109 +Argument 2 of IXP\Services\Helpdesk\Zendesk::customerEntityToZendeskObject expects bool, but int provided (see https://psalm.dev/004) + return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:319:24 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->search( $id ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:441:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->create( $this->contactEntityToZendeskObject( $contact, $org_id ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:467:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->update( $helpdeskId, $this->contactEntityToZendeskObject( $contact, null, $helpdeskId ) ); + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:475:16 +The declared return type 'IXP\Models\Contact' for IXP\Services\Helpdesk\Zendesk::userUpdate does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:498:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->search( [ 'external_id' => $id ] ); + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/IXF.php:95:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass.php:67:118 +Cannot find referenced variable $r (see https://psalm.dev/024) + throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); + +ERROR: InvalidClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass/BirdsEye.php:72:49 +Class, interface or enum IXP\Services\LookingGlass\Birdseye has wrong casing (see https://psalm.dev/007) + public function setCacheEnabled( bool $b ): Birdseye + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:133:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:185:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:86:59 +Argument 2 of IXP\Services\Purifier::addCustomDefinition expects IXP\Services\HTML_Purifier_Config|null, but HTMLPurifier_Config provided (see https://psalm.dev/004) + $this->addCustomDefinition($definitionConfig, $config); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:92:53 +Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomElements($elements, $def); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:99:57 +Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomAttributes($attributes, $def); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:112:15 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + * @param HTML_Purifier_Config $configObject Defaults to using default config + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:114:16 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + * @return HTML_Purifier_Config $configObject + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:124:9 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + $configObject->set('HTML.DefinitionID', $definitionConfig['id']); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:125:9 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + $configObject->set('HTML.DefinitionRev', $definitionConfig['rev']); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:129:13 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + $configObject->set('Cache.DefinitionImpl', null); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:133:20 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + if ($def = $configObject->maybeGetRawHTMLDefinition()) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:136:77 +Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomAttributes($definitionConfig['attributes'], $def); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:141:73 +Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomElements($definitionConfig['elements'], $def); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:152:15 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @param HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:154:16 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:165:13 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addAttribute($onElement, $attrName, $validValues); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:175:15 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @param HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 +No return statements were found for method IXP\Services\Purifier::addCustomElements but return type 'IXP\Services\HTMLPurifier_HTMLDefinition' was expected (see https://psalm.dev/011) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:190:17 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection, $attributes); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:192:17 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:145:16 +The declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough is incorrect, got 'int<0, max>' (see https://psalm.dev/011) + * @return bool + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:158:16 +The inferred type 'int<0, max>' does not match the declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough (see https://psalm.dev/128) + return count( $path[ 'ixpx' ] ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::getUser()->privs() >= $minAuth; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:97:16 +The declared return type 'string' for ixp_get_client_ip is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:104:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:116:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:126:20 +The declared return type 'string' for ixp_get_client_ip is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return request()->getClientIp(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdateAsnDb.php:95:40 +Argument 1 of IXP\Tasks\Irrdb\UpdateAsnDb::validate has wrong name $asns, expecting $prefixes as defined by IXP\Tasks\Irrdb\UpdateDb::validate (see https://psalm.dev/230) + protected function validate( array $asns, int $protocol ) : array + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 +Argument 1 of IXP\Rules\IPv4Cidr::passes expects string, but array provided (see https://psalm.dev/004) + if( !$validator->passes( [], $p ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 +Argument 1 of IXP\Rules\IPv6Cidr::passes expects string, but array provided (see https://psalm.dev/004) + if( !$validator->passes( [], $p ) ) { + +ERROR: UndefinedThisPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 +Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) + return Log::entries( self::getClass(), $this->id, $user ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Bgpq3.php:105:83 +Argument 2 of IXP\Utils\Bgpq3::execute cannot be false, int value expected (see https://psalm.dev/004) + $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'generator' => 'IXP Manager v' . APPLICATION_VERSION, + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:105:27 +Argument 1 of round expects float|int, but array|null|string provided (see https://psalm.dev/004) + return round( $size ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:170:63 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return number_format( $v, $decs ) . ' ' . $formats[ $i ]; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:177:24 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return $formats[ $i ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: LessSpecificImplementedReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 +The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) + * @return array An array of attributes with the label class + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:179:66 +Argument 1 of HtmlObject\Element::addClass expects string, but list{string, string, ''|mixed} provided (see https://psalm.dev/004) + return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:75:16 +The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:81:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:89:16 +The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return request()->getClientIp(); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:65:22 +$this->key with declared type 'array' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->key = $listname; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:84:69 +Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) + return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "1" ] ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:86:69 +Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) + return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $filtered_users->add( $e ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:143:13 +Cannot access value on variable $prefs['mailinglist'][$this->key] using a array offset, expecting array-key (see https://psalm.dev/115) + $prefs[ 'mailinglist' ][ $this->key ] = $value; + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/View/Alert/Container.php:66:20 +The declared return type 'IXP\Utils\View\Alert\Alert' for IXP\Utils\View\Alert\Container::pop is not nullable, but the function returns 'null' (see https://psalm.dev/139) + return null; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_03_30_124916_create_atlas_probes.php:28:38 +Argument 2 of Illuminate\Database\Schema\Blueprint::string expects int|null, but '255' provided (see https://psalm.dev/004) + $table->string('status', '255' )->nullable(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php:30:28 +Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 255 provided (see https://psalm.dev/004) + $table->string(255)->nullable()->after('host'); + +------------------------------ +458 errors found +------------------------------ +3448 other issues found. +You can display them with --show-info=true +------------------------------ + +Checks took 6.03 seconds and used 616.547MB of memory +Psalm was able to infer types for 80.6251% of the codebase diff --git a/psalmhelp.log b/psalmhelp.log new file mode 100644 index 000000000..75bc86cfd --- /dev/null +++ b/psalmhelp.log @@ -0,0 +1,158 @@ +Usage: + psalm [options] [file...] + +Basic configuration: + -c, --config=psalm.xml + Path to a psalm.xml configuration file. Run psalm --init to create one. + + --use-ini-defaults + Use PHP-provided ini defaults for memory and error display + + --memory-limit=LIMIT + Use a specific memory limit. Cannot be combined with --use-ini-defaults + + --disable-extension=[extension] + Used to disable certain extensions while Psalm is running. + + --threads=INT + If greater than one, Psalm will run analysis on multiple threads, speeding things up. + + --no-diff + Turns off Psalm’s diff mode, checks all files regardless of whether they’ve changed. + + --php-version=PHP_VERSION + Explicitly set PHP version to analyse code against. + + --error-level=ERROR_LEVEL + Set the error reporting level + +Surfacing issues: + --show-info[=BOOLEAN] + Show non-exception parser findings (defaults to false). + + --show-snippet[=true] + Show code snippets with errors. Options are 'true' or 'false' + + --find-dead-code[=auto] + --find-unused-code[=auto] + Look for unused code. Options are 'auto' or 'always'. If no value is specified, default is 'auto' + + --find-unused-psalm-suppress + Finds all @psalm-suppress annotations that aren’t used + + --find-references-to=[class|method|property] + Searches the codebase for references to the given fully-qualified class or method, + where method is in the format class::methodName + + --no-suggestions + Hide suggestions + + --taint-analysis + Run Psalm in taint analysis mode – see https://psalm.dev/docs/security_analysis for more info + + --dump-taint-graph=OUTPUT_PATH + Output the taint graph using the DOT language – requires --taint-analysis + +Issue baselines: + --set-baseline=PATH + Save all current error level issues to a file, to mark them as info in subsequent runs + + Add --include-php-versions to also include a list of PHP extension versions + + --use-baseline=PATH + Allows you to use a baseline other than the default baseline provided in your config + + --ignore-baseline + Ignore the error baseline + + --update-baseline + Update the baseline by removing fixed issues. This will not add new issues to the baseline + + Add --include-php-versions to also include a list of PHP extension versions + +Plugins: + --plugin=PATH + Executes a plugin, an alternative to using the Psalm config + +Output: + -m, --monochrome + Enable monochrome output + + --output-format=console + Changes the output format. + Available formats: compact, console, text, emacs, json, pylint, xml, checkstyle, junit, sonarqube, + github, phpstorm, codeclimate, by-issue-level + + --no-progress + Disable the progress indicator + + --long-progress + Use a progress indicator suitable for Continuous Integration logs + + --stats + Shows a breakdown of Psalm’s ability to infer types in the codebase + +Reports: + --report=PATH + The path where to output report file. The output format is based on the file extension. + (Currently supported formats: ".json", ".xml", ".txt", ".emacs", ".pylint", ".console", + ".sarif", "checkstyle.xml", "sonarqube.json", "codeclimate.json", "summary.json", "junit.xml") + + --report-show-info[=BOOLEAN] + Whether the report should include non-errors in its output (defaults to true) + +Caching: + --clear-cache + Clears all cache files that Psalm uses for this specific project + + --clear-global-cache + Clears all cache files that Psalm uses for all projects + + --no-cache + Runs Psalm without using cache + + --no-reflection-cache + Runs Psalm without using cached representations of unchanged classes and files. + Useful if you want the afterClassLikeVisit plugin hook to run every time you visit a file. + + --no-file-cache + Runs Psalm without using caching every single file for later diffing. + This reduces the space Psalm uses on disk and file I/O. + +Miscellaneous: + -h, --help + Display this help message + + -v, --version + Display the Psalm version + + -i, --init [source_dir=src] [level=3] + Create a psalm config file in the current directory that points to [source_dir] + at the required level, from 1, most strict, to 8, most permissive. + + --debug + Debug information + + --debug-by-line + Debug information on a line-by-line level + + --debug-emitted-issues + Print a php backtrace to stderr when emitting issues. + + -r, --root + If running Psalm globally you’ll need to specify a project root. Defaults to cwd + + --generate-json-map=PATH + Generate a map of node references and types in JSON format, saved to the given path. + + --generate-stubs=PATH + Generate stubs for the project and dump the file in the given path + + --shepherd[=endpoint] + Send analysis statistics to Shepherd (shepherd.dev) or your server. + + --alter + Run Psalter + + --language-server + Run Psalm Language Server From 56354391a385904e26998dcf6267cd70f333763d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 22 May 2024 17:12:52 +0100 Subject: [PATCH 004/145] psalm errors fixing --- app/Http/Controllers/Interfaces/Common.php | 75 +++++++++--------- .../Interfaces/CoreBundleController.php | 52 +++++++------ psalm_errors_240522_1253.log | 51 ------------- psalm_errors_240522_1253a.log | 76 +++++-------------- 4 files changed, 86 insertions(+), 168 deletions(-) diff --git a/app/Http/Controllers/Interfaces/Common.php b/app/Http/Controllers/Interfaces/Common.php index 9a52c4f47..02dda1202 100644 --- a/app/Http/Controllers/Interfaces/Common.php +++ b/app/Http/Controllers/Interfaces/Common.php @@ -335,58 +335,61 @@ public function warnIfIrrdbFilteringButNoIrrdbSourceSet( VlanInterface $vli ): v /** * Build everything that a Core Bundle need (core link, core Interface etc) * - * @param CoreBundle $cb Core bundle object - * @param Request $r instance of the current HTTP request - * @param array $vis array of the Virtual interfaces ( side A and B ) linked to the core bundle + * @param CoreBundle $coreBundle Core bundle object + * @param Request $request instance of the current HTTP request + * @param array $virtualInterfaces array of the Virtual interfaces ( side A and B ) linked to the core bundle * @param bool $edit Are we editing the core bundle ? * * @return RedirectResponse|bool * * @throws */ - public function buildCorelink( CoreBundle $cb, Request $r, array $vis, bool $edit ) + public function buildCorelink( CoreBundle $coreBundle, Request $request, array $virtualInterfaces, bool $edit ) { - foreach( $r->input( "cl-details" ) as $clDetail ) { - $cl = new CoreLink; + foreach( $request->input( "cl-details" ) as $coreLinkDetail ) { + $coreLink = new CoreLink; - $cl->core_bundle_id = $cb->id; - $cl->enabled = $clDetail[ 'enabled-cl' ] ?? false; + $coreLink->core_bundle_id = $coreBundle->id; + $coreLink->enabled = $coreLinkDetail[ 'enabled-cl' ] ?? false; - $bfd = $clDetail[ 'bfd' ] ?? false; - $type = $edit ? $cb->type : $r->type; + $bfd = $coreLinkDetail[ 'bfd' ] ?? false; + $type = $edit ? $coreBundle->type : $request->type; - $cl->bfd = (int)$type === CoreBundle::TYPE_ECMP ? $bfd : false; - $cl->ipv4_subnet = $clDetail[ 'subnet' ] ?? null; + $coreLink->bfd = (int)$type === CoreBundle::TYPE_ECMP ? $bfd : false; + $coreLink->ipv4_subnet = $coreLinkDetail[ 'subnet' ] ?? null; - foreach( $vis as $side => $vi ) { - if( !( ${ 'sp' . $side } = SwitchPort::find( $clDetail[ "hidden-sp-$side" ] ) ) ) { - return Redirect::back()->withInput( $r->all() ); + $switchPort = []; + $physicalInterface = []; + $coreInterface = []; + foreach( $virtualInterfaces as $side => $virtualInterface ) { + $switchPort[$side] = SwitchPort::find( $coreLinkDetail[ "hidden-sp-$side" ] ); + if( !$switchPort[$side] ) { + return Redirect::back()->withInput( $request->all() ); } - ${ 'sp' . $side }->type = SwitchPort::TYPE_CORE; - ${ 'sp' . $side }->save(); - - // Creating $pia|$pib - ${ 'pi' . $side } = new PhysicalInterface; - ${ 'pi' . $side }->switchportid = ${ 'sp' . $side }->id; - ${ 'pi' . $side }->virtualinterfaceid = $vi->id; - ${ 'pi' . $side }->speed = $edit ? $cb->speedPi() : $r->speed; - ${ 'pi' . $side }->duplex = $edit ? $cb->duplexPi() : $r->duplex; - ${ 'pi' . $side }->autoneg = $edit ? $cb->autoNegPi() : $r->input('auto-neg' ) ?? false; - ${ 'pi' . $side }->status = PhysicalInterface::STATUS_CONNECTED; - ${ 'pi' . $side }->virtualinterfaceid = $vis[ $side ]->id; - ${ 'pi' . $side }->save(); - - // Creating $cia|$cib - ${ 'ci' . $side } = new CoreInterface; - ${ 'ci' . $side }->physical_interface_id = ${ 'pi' . $side }->id; - ${ 'ci' . $side }->save(); + $switchPort[$side]->type = SwitchPort::TYPE_CORE; + $switchPort[$side]->save(); + + // Creating $physicalInterface A/B + $physicalInterface[$side] = new PhysicalInterface; + $physicalInterface[$side]->switchportid = $switchPort[$side]->id; + $physicalInterface[$side]->virtualinterfaceid = $virtualInterface->id; + $physicalInterface[$side]->speed = $edit ? $coreBundle->speedPi() : $request->speed; + $physicalInterface[$side]->duplex = $edit ? $coreBundle->duplexPi() : $request->duplex; + $physicalInterface[$side]->autoneg = $edit ? $coreBundle->autoNegPi() : $request->input('auto-neg' ) ?? false; + $physicalInterface[$side]->status = PhysicalInterface::STATUS_CONNECTED; + $physicalInterface[$side]->save(); + + // Creating $coreInterface A/B + $coreInterface[$side] = new CoreInterface; + $coreInterface[$side]->physical_interface_id = $physicalInterface[$side]->id; + $coreInterface[$side]->save(); } - $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ - $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ + $coreLink->core_interface_sidea_id = $coreInterface['a']->id; + $coreLink->core_interface_sideb_id = $coreInterface['b']->id; - $cl->save(); + $coreLink->save(); } return true; } diff --git a/app/Http/Controllers/Interfaces/CoreBundleController.php b/app/Http/Controllers/Interfaces/CoreBundleController.php index 22ff6b37d..004704e48 100644 --- a/app/Http/Controllers/Interfaces/CoreBundleController.php +++ b/app/Http/Controllers/Interfaces/CoreBundleController.php @@ -134,33 +134,41 @@ public function storeWizard( Store $r ): RedirectResponse /** * Display the form to edit a core bundle * - * @param Request $r Instance of the current HTTP request - * @param CoreBundle $cb Core bundle + * @param Request $request Instance of the current HTTP request + * @param CoreBundle $coreBundle Core bundle * * @return View */ - public function edit( Request $r, CoreBundle $cb ): View + public function edit( Request $request, CoreBundle $coreBundle ): View { - // fill the form with the core bundle data - Former::populate([ - 'custid' => $r->old('custid', $cb->customer()->id ), - 'description' => $r->old('description', $cb->description ), - 'graph_title' => $r->old('graph_title', $cb->graph_title ), - 'cost' => $r->old('cost', $cb->cost ), - 'preference' => $r->old('preference', $cb->preference ), - 'type' => $r->old('type', $cb->type ), - 'ipv4_subnet' => $r->old('ipv4_subnet', $cb->ipv4_subnet ), - 'enabled' => $r->old('enabled', $cb->enabled ), - 'bfd' => $r->old('bfd', $cb->bfd ), - 'stp' => $r->old('stp', $cb->stp ), - ]); + $customer = $coreBundle->customer(); + $customerId = !$customer ? 0 : $customer->id; - return view( 'interfaces/core-bundle/edit/edit-wizard' )->with([ - 'cb' => $cb, - 'customers' => Customer::internal()->get(), - 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), - 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), - ]); + // fill the form with the core bundle data + Former::populate( [ + 'custid' => $request->old( 'custid', (string)$customerId ), + 'description' => $request->old( 'description', $coreBundle->description ), + 'graph_title' => $request->old( 'graph_title', $coreBundle->graph_title ), + 'cost' => $request->old( 'cost', (string)$coreBundle->cost ), + 'preference' => $request->old( 'preference', (string)$coreBundle->preference ), + 'type' => $request->old( 'type', (string)$coreBundle->type ), + 'ipv4_subnet' => $request->old( 'ipv4_subnet', $coreBundle->ipv4_subnet ), + 'enabled' => $request->old( 'enabled', (string)$coreBundle->enabled ), + 'bfd' => $request->old( 'bfd', (string)$coreBundle->bfd ), + 'stp' => $request->old( 'stp', (string)$coreBundle->stp ), + ] ); + + $switchSideA = $coreBundle->switchSideX(); + $switchSideAId = $switchSideA ? $switchSideA->id : null; + $switchSideB = $coreBundle->switchSideX( false ); + $switchSideBId = $switchSideB ? $switchSideB->id : null; + + return view( 'interfaces/core-bundle/edit/edit-wizard' )->with( [ + 'cb' => $coreBundle, + 'customers' => Customer::internal()->get(), + 'switchPortsSideA' => SwitcherAggregator::allPorts( $switchSideAId, [ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + 'switchPortsSideB' => SwitcherAggregator::allPorts( $switchSideBId, [ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + ] ); } /** diff --git a/psalm_errors_240522_1253.log b/psalm_errors_240522_1253.log index 7004edbf1..13aaaab6b 100644 --- a/psalm_errors_240522_1253.log +++ b/psalm_errors_240522_1253.log @@ -448,57 +448,6 @@ Cannot find referenced variable $cib (see https://psalm.dev/024) ------- - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'custid' => $r->old('custid', $cb->customer()->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'custid' => $r->old('custid', $cb->customer()->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:149:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'cost' => $r->old('cost', $cb->cost ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:150:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'preference' => $r->old('preference', $cb->preference ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:151:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'type' => $r->old('type', $cb->type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:153:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'enabled' => $r->old('enabled', $cb->enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:154:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'bfd' => $r->old('bfd', $cb->bfd ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:155:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'stp' => $r->old('stp', $cb->stp ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:161:78 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:78 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), ERROR: InvalidArgument at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 diff --git a/psalm_errors_240522_1253a.log b/psalm_errors_240522_1253a.log index 53e2a3482..a3a3b4a19 100644 --- a/psalm_errors_240522_1253a.log +++ b/psalm_errors_240522_1253a.log @@ -379,67 +379,20 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php: Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:386:44 -Cannot find referenced variable $cia (see https://psalm.dev/024) - $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:387:44 -Cannot find referenced variable $cib (see https://psalm.dev/024) - $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ - - - ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'custid' => $r->old('custid', $cb->customer()->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'custid' => $r->old('custid', $cb->customer()->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:149:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'cost' => $r->old('cost', $cb->cost ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:150:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'preference' => $r->old('preference', $cb->preference ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:151:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'type' => $r->old('type', $cb->type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:153:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'enabled' => $r->old('enabled', $cb->enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:154:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'bfd' => $r->old('bfd', $cb->bfd ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:155:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'stp' => $r->old('stp', $cb->stp ), +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:145:40 +Cannot fetch property on non-object $customer of type true (see https://psalm.dev/029) + $customerId = !$customer ? 0 : $customer->id; ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:161:78 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:41 +Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) + $switchSideAId = $switchSideA ? $switchSideA->id : null; ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:78 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:164:41 +Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) + $switchSideBId = $switchSideB ? $switchSideB->id : null; ERROR: InvalidArgument at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 @@ -2320,11 +2273,16 @@ Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 2 $table->string(255)->nullable()->after('host'); ------------------------------ -458 errors found +449 errors found ------------------------------ 3448 other issues found. You can display them with --show-info=true ------------------------------ +Psalm can automatically fix 1 of these issues. +Run Psalm again with +--alter --issues=MissingReturnType --dry-run +to see what it can fix. +------------------------------ -Checks took 6.03 seconds and used 616.547MB of memory -Psalm was able to infer types for 80.6251% of the codebase +Checks took 6.16 seconds and used 613.923MB of memory +Psalm was able to infer types for 80.7823% of the codebase From 2fe132ca39ba932e609535804b715d69a9f5697d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 22 May 2024 17:46:17 +0100 Subject: [PATCH 005/145] psalm errors fixing --- app/Models/Aggregators/VlanAggregator.php | 14 +++++++------- psalm_errors_240522_1253a.log | 11 +++-------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/app/Models/Aggregators/VlanAggregator.php b/app/Models/Aggregators/VlanAggregator.php index eafe26031..40cf5ecbe 100644 --- a/app/Models/Aggregators/VlanAggregator.php +++ b/app/Models/Aggregators/VlanAggregator.php @@ -120,13 +120,13 @@ public static function ipAddresses( int $vid, int $proto ) : array } return Vlan::select( [ - "${table}.id", "${table}.address", + "{$table}.id", "{$table}.address", 'vlan.id AS vid', 'vli.id as vliid' ] ) - ->leftJoin( $table, "${table}.vlanid", 'vlan.id' ) - ->leftJoin( 'vlaninterface as vli', "vli.${table}id", "${table}.id" ) + ->leftJoin( $table, "{$table}.vlanid", 'vlan.id' ) + ->leftJoin( 'vlaninterface as vli', "vli.{$table}id", "{$table}.id" ) ->where( 'vlan.id', $vid ) - ->orderByRaw( "${orderBy}(address) ASC" ) + ->orderByRaw( "{$orderBy}(address) ASC" ) ->get()->toArray(); } @@ -174,11 +174,11 @@ public static function usedAcrossVlans( string $ip ) : array 'v.id AS vid', 'v.name AS vname', 'v.number AS vnumber' ] ) ->from( 'vlaninterface AS vli' ) - ->leftJoin( $table, "${table}.id", "vli.${table}id" ) + ->leftJoin( $table, "{$table}.id", "vli.{$table}id" ) ->leftJoin( 'virtualinterface AS vi', 'vi.id', 'vli.virtualinterfaceid') ->leftJoin( 'cust AS c', 'c.id', 'vi.custid' ) ->leftJoin( 'vlan AS v', 'v.id', 'vli.vlanid') - ->where( "${table}.address", $ip )->get()->toArray(); + ->where( "{$table}.address", $ip )->get()->toArray(); } /** @@ -219,7 +219,7 @@ public static function arpaDetails( Vlan $vlan, int $proto ): array ) ->from( 'vlan AS v' ) ->join( 'vlaninterface AS vli', 'vli.vlanid', 'v.id' ) - ->join( "{$table} AS addr", 'addr.id', "vli.${table}id" ) + ->join( "{$table} AS addr", 'addr.id', "vli.{$table}id" ) ->where( 'v.id', $vlan->id ) ->whereNotNull( "vli.ipv{$proto}hostname" ) ->where( "vli.ipv{$proto}hostname", '!=', '' ) diff --git a/psalm_errors_240522_1253a.log b/psalm_errors_240522_1253a.log index a3a3b4a19..e368f079e 100644 --- a/psalm_errors_240522_1253a.log +++ b/psalm_errors_240522_1253a.log @@ -2275,14 +2275,9 @@ Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 2 ------------------------------ 449 errors found ------------------------------ -3448 other issues found. +3450 other issues found. You can display them with --show-info=true ------------------------------ -Psalm can automatically fix 1 of these issues. -Run Psalm again with ---alter --issues=MissingReturnType --dry-run -to see what it can fix. ------------------------------- -Checks took 6.16 seconds and used 613.923MB of memory -Psalm was able to infer types for 80.7823% of the codebase +Checks took 6.24 seconds and used 613.448MB of memory +Psalm was able to infer types for 80.7594% of the codebase From 06c3142ba6f5d69bc3f3912076768eca2f49a3b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Fri, 24 May 2024 17:13:05 +0100 Subject: [PATCH 006/145] psalm errors fixing --- .phpunit.cache/test-results | 2 +- .../PhysicalInterfaceController.php | 8 +- .../Interfaces/SflowReceiverController.php | 2 +- .../Interfaces/VirtualInterfaceController.php | 14 +- .../Interfaces/VlanInterfaceController.php | 32 +- .../PatchPanel/PatchPanelController.php | 14 +- .../PatchPanel/Port/PortController.php | 8 +- .../Controllers/PeeringManagerController.php | 4 +- .../RipeAtlas/MeasurementController.php | 6 +- .../RipeAtlas/ProbesController.php | 10 +- .../Controllers/RipeAtlas/RunController.php | 22 +- app/Http/Controllers/RouterController.php | 22 +- app/Http/Controllers/RsFilterController.php | 8 +- app/Http/Controllers/Services/Grapher/Api.php | 10 +- .../Controllers/Services/LookingGlass.php | 2 +- app/Http/Controllers/StatisticsController.php | 64 +-- app/Http/Requests/StatisticsRequest.php | 18 + app/Models/Aggregators/CustomerAggregator.php | 4 +- .../Aggregators/VlanInterfaceAggregator.php | 2 +- app/Models/PhysicalInterface.php | 2 +- ...240522_1253a.log => psalm_errors_CHECK.log | 390 +----------------- ...s_240522_1253.log => psalm_errors_WORK.log | 378 +---------------- 22 files changed, 152 insertions(+), 870 deletions(-) rename psalm_errors_240522_1253a.log => psalm_errors_CHECK.log (80%) rename psalm_errors_240522_1253.log => psalm_errors_WORK.log (80%) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 2eaafdb93..360a997cc 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":7,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":8,"Tests\\Browser\\VlanControllerTest::testAdd":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.516,"Tests\\Browser\\ApiKeyControllerTest::test":2.482,"Browser\\CabinetControllerTest::testCabinet":2.842,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.315,"Tests\\Browser\\ContactControllerTest::testAdd":5.251,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.071,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.533,"Tests\\Browser\\InfrastructureControllerTest::testAdd":4.879,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.716,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.445,"Tests\\Browser\\LocationControllerTest::testAdd":4.669,"Tests\\Browser\\LoginTest::testExample":0.799,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":4.007,"Tests\\Browser\\RouterControllerTest::testAdd":3.741,"Tests\\Browser\\SwitchControllerTest::testAdd":3.981,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.825,"Tests\\Browser\\User2FAControllerTest::test":13.053,"Tests\\Browser\\UserControllerTest::testAdd":11.566,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.972,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.978,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":3.035,"Tests\\Browser\\VendorControllerTest::testVendor":2.305,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.413,"Tests\\Browser\\VlanControllerTest::testAdd":4.591}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":7,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":7,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":8,"Tests\\Browser\\VlanControllerTest::testAdd":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":2.363,"Tests\\Browser\\ApiKeyControllerTest::test":2.482,"Browser\\CabinetControllerTest::testCabinet":2.842,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.315,"Tests\\Browser\\ContactControllerTest::testAdd":5.251,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.071,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.533,"Tests\\Browser\\InfrastructureControllerTest::testAdd":4.879,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.716,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.445,"Tests\\Browser\\LocationControllerTest::testAdd":4.669,"Tests\\Browser\\LoginTest::testExample":0.799,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":4.007,"Tests\\Browser\\RouterControllerTest::testAdd":3.741,"Tests\\Browser\\SwitchControllerTest::testAdd":3.981,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.825,"Tests\\Browser\\User2FAControllerTest::test":13.053,"Tests\\Browser\\UserControllerTest::testAdd":11.566,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.972,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.978,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":3.035,"Tests\\Browser\\VendorControllerTest::testVendor":2.305,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.413,"Tests\\Browser\\VlanControllerTest::testAdd":4.713}} \ No newline at end of file diff --git a/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php b/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php index 8671ac536..cc1e2f27e 100644 --- a/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php +++ b/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php @@ -201,18 +201,18 @@ public function edit( Request $r, PhysicalInterface $pi, VirtualInterface $vi = // fill the form with physical interface data $data = [ 'switch' => $r->old( 'switch', $pi->switchPort->switchid ), - 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), + 'switchportid' => $r->old( 'switchportid', (string)$pi->switchportid ), 'status' => $r->old( 'status', $pi->status ), 'speed' => $r->old( 'speed', $pi->speed ), 'duplex' => $r->old( 'duplex', $pi->duplex ), - 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), - 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), + 'rate_limit' => $r->old( 'rate_limit', (string)$pi->rate_limit ), + 'autoneg' => $r->old( 'autoneg', (string)$pi->autoneg ), 'notes' => $r->old( 'notes', $pi->notes ), ]; // get all the switch ports available and add the switch port associated to the physical interface in the list $switchports = SwitcherAggregator::allPorts( $pi->switchPort->switchid, [], [], true, true ) + - [ $pi->switchportid => + [ (string)$pi->switchportid => [ "name" => $pi->switchPort->name, "id" => $pi->switchportid, "type" => $pi->switchPort->type, diff --git a/app/Http/Controllers/Interfaces/SflowReceiverController.php b/app/Http/Controllers/Interfaces/SflowReceiverController.php index 4b73f5817..a4c976e2f 100644 --- a/app/Http/Controllers/Interfaces/SflowReceiverController.php +++ b/app/Http/Controllers/Interfaces/SflowReceiverController.php @@ -109,7 +109,7 @@ public function edit( Request $r, SflowReceiver $sflr, VirtualInterface $vi = nu { Former::populate([ 'dst_ip' => $r->old( 'dst_ip', $sflr->dst_ip ), - 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), + 'dst_port' => $r->old( 'dst_port', (string)$sflr->dst_port ), ]); return view( 'interfaces/sflow-receiver/edit' )->with([ diff --git a/app/Http/Controllers/Interfaces/VirtualInterfaceController.php b/app/Http/Controllers/Interfaces/VirtualInterfaceController.php index 9b0344994..43c51ffb1 100644 --- a/app/Http/Controllers/Interfaces/VirtualInterfaceController.php +++ b/app/Http/Controllers/Interfaces/VirtualInterfaceController.php @@ -141,7 +141,7 @@ public function create( Request $r, Customer $cust = null ): View { if( $cust ) { Former::populate( [ - 'custid' => $r->old( 'cust', $cust->id ), + 'custid' => $r->old( 'cust', (string)$cust->id ), ] ); } @@ -196,13 +196,13 @@ public function edit( Request $r, VirtualInterface $vi ): View // fill the form with Virtual interface data Former::populate([ - 'custid' => $r->old( 'custid', $vi->custid ), - 'trunk' => $r->old( 'trunk', $vi->trunk ), - 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), - 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), + 'custid' => $r->old( 'custid', (string)$vi->custid ), + 'trunk' => $r->old( 'trunk', (string)$vi->trunk ), + 'lag_framing' => $r->old( 'lag_framing', (string)$vi->lag_framing ), + 'fastlacp' => $r->old( 'fastlacp', (string)$vi->fastlacp ), 'description' => $r->old( 'description', $vi->description ), - 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), - 'mtu' => $r->old( 'mtu', $vi->mtu ), + 'channelgroup' => $r->old( 'channel-group', (string)$vi->channelgroup ), + 'mtu' => $r->old( 'mtu', (string)$vi->mtu ), 'name' => $name, ]); diff --git a/app/Http/Controllers/Interfaces/VlanInterfaceController.php b/app/Http/Controllers/Interfaces/VlanInterfaceController.php index b67a4d922..e42cd55df 100644 --- a/app/Http/Controllers/Interfaces/VlanInterfaceController.php +++ b/app/Http/Controllers/Interfaces/VlanInterfaceController.php @@ -152,29 +152,29 @@ public function store( StoreVlanInterface $r ): RedirectResponse public function edit( Request $r, VlanInterface $vli, VirtualInterface $vi = null, Vlan $duplicateTo = null ): View { Former::populate([ - 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), - 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), - 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), + 'vlanid' => $r->old( 'vlanid', (string)$duplicateTo->id ?? $vli->vlanid ), + 'irrdbfilter' => $r->old( 'irrdbfilter', (string)$vli->irrdbfilter ), + 'mcastenabled' => $r->old( 'mcastenabled', (string)$vli->mcastenabled ), - 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), - 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), + 'ipv4enabled' => $r->old( 'ipv4enabled', (string)$vli->ipv4enabled ), + 'ipv4address' => $r->old( 'ipv4address', (string)$vli->ipv4addressid ), 'ipv4hostname' => $r->old( 'ipv4hostname', $vli->ipv4hostname ), 'ipv4bgpmd5secret' => $r->old( 'ipv4bgpmd5secret', $vli->ipv4bgpmd5secret ), - 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), - 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), + 'ipv4canping' => $r->old( 'ipv4canping', (string)$vli->ipv4canping ), + 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', (string)$vli->ipv4monitorrcbgp ), - 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), - 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), - 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), - 'as112client' => $r->old( 'as112client', $vli->as112client ), - 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), + 'maxbgpprefix' => $r->old( 'maxbgpprefix', (string)$vli->maxbgpprefix ), + 'rsclient' => $r->old( 'rsclient', (string)$vli->rsclient ), + 'rsmorespecifics' => $r->old( 'rsmorespecifics', (string)$vli->rsmorespecifics ), + 'as112client' => $r->old( 'as112client', (string)$vli->as112client ), + 'busyhost' => $r->old( 'busyhost', (string)$vli->busyhost ), - 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), - 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), + 'ipv6enabled' => $r->old( 'ipv6enabled', (string)$vli->ipv6enabled ), + 'ipv6address' => $r->old( 'ipv6address', (string)$vli->ipv6addressid ), 'ipv6hostname' => $r->old( 'ipv6hostname', $vli->ipv6hostname ), 'ipv6bgpmd5secret' => $r->old( 'ipv6bgpmd5secret', $vli->ipv6bgpmd5secret ), - 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), - 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), + 'ipv6canping' => $r->old( 'ipv6canping', (string)$vli->ipv6canping ), + 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', (string)$vli->ipv6monitorrcbgp ), ]); $redirect2vi = (bool) $vi; diff --git a/app/Http/Controllers/PatchPanel/PatchPanelController.php b/app/Http/Controllers/PatchPanel/PatchPanelController.php index d28ab0aa5..23725a7c7 100644 --- a/app/Http/Controllers/PatchPanel/PatchPanelController.php +++ b/app/Http/Controllers/PatchPanel/PatchPanelController.php @@ -132,18 +132,18 @@ public function store( StorePatchPanel $r ): RedirectResponse public function edit( Request $r, PatchPanel $pp ): View { Former::populate([ - 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), + 'cabinet_id' => $r->old( 'cabinet_id', (string)$pp->cabinet_id ), 'name' => $r->old( 'name', $pp->name ), 'colo_reference' => $r->old( 'colo_reference', $pp->colo_reference ), - 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), - 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), + 'cable_type' => $r->old( 'cable_type', (string)$pp->cable_type ), + 'connector_type' => $r->old( 'connector_type', (string)$pp->connector_type ), 'installation_date' => $r->old( 'installation_date', $pp->installation_date ), 'port_prefix' => $r->old( 'port_prefix', $pp->port_prefix ), 'location_notes' => $r->old( 'location_notes', $pp->location_notes ), - 'u_position' => $r->old( 'u_position', $pp->u_position ), - 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), - 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), - 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), + 'u_position' => $r->old( 'u_position', (string)$pp->u_position ), + 'colo_pp_type' => $r->old( 'colo_pp_type', (string)$pp->colo_pp_type ), + 'mounted_at' => $r->old( 'mounted_at', (string)$pp->mounted_at ), + 'numberOfPorts' => $r->old( 'numberOfPorts','0' ), ]); return view( 'patch-panel/edit' )->with([ diff --git a/app/Http/Controllers/PatchPanel/Port/PortController.php b/app/Http/Controllers/PatchPanel/Port/PortController.php index a2c6014bf..a1a32c4bc 100644 --- a/app/Http/Controllers/PatchPanel/Port/PortController.php +++ b/app/Http/Controllers/PatchPanel/Port/PortController.php @@ -184,10 +184,10 @@ public function edit( Request $r, PatchPanelPort $ppp, string $formType = null ) $duplexSlaveId = $ppp->duplexSlavePorts()->exists() ? $ppp->duplexSlavePorts()->first()->id : null; // fill the form with patch panel port data Former::populate( [ - 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), + 'switch_port_id' => $r->old( 'switch_port_id', (string)$ppp->switch_port_id ), 'patch_panel' => $ppp->patchPanel->name, - 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), - 'state' => $r->old( 'state', $ppp->state ), + 'customer_id' => $r->old( 'customer_id', (string)$ppp->customer_id ), + 'state' => $r->old( 'state', (string)$ppp->state ), 'notes' => $r->old( 'notes', $ppp->notes ), 'assigned_at' => $r->old( 'assigned_at', $ppp->assigned_at ), 'connected_at' => $r->old( 'connected_at', $ppp->connected_at ), @@ -199,7 +199,7 @@ public function edit( Request $r, PatchPanelPort $ppp, string $formType = null ) 'colo_circuit_ref' => $r->old( 'colo_circuit_ref', $ppp->colo_circuit_ref ), 'ticket_ref' => $r->old( 'ticket_ref', $ppp->ticket_ref ), 'private_notes' => $r->old( 'private_notes', $ppp->private_notes ), - 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), + 'owned_by' => $r->old( 'owned_by', (string)$ppp->owned_by ), 'description' => $r->old( 'description', $ppp->description ), 'colo_billing_ref' => $r->old( 'colo_billing_ref', $ppp->colo_billing_ref ), 'cabinet_name' => $ppp->patchPanel->cabinet->name, diff --git a/app/Http/Controllers/PeeringManagerController.php b/app/Http/Controllers/PeeringManagerController.php index 2618a0dde..6aa62b7e9 100644 --- a/app/Http/Controllers/PeeringManagerController.php +++ b/app/Http/Controllers/PeeringManagerController.php @@ -260,12 +260,12 @@ public function markPeering( int $custid, string $status ): RedirectResponse $pm = $this->loadPeeringManager( Customer::find( Auth::getUser()->custid ), $peer ); if( $status === "peered" ) { - $pm->peered = !$pm->peered; + $pm->peered = $pm->peered === 0 ? 1 : 0; if( $pm->peered && $pm->rejected ){ $pm->rejected = false; } } else{ - $pm->rejected = !$pm->rejected; + $pm->rejected = $pm->rejected === 0 ? 1 : 0; if( $pm->peered && $pm->rejected ){ $pm->peered = false; } diff --git a/app/Http/Controllers/RipeAtlas/MeasurementController.php b/app/Http/Controllers/RipeAtlas/MeasurementController.php index 118cdb4e1..906f9d4f5 100644 --- a/app/Http/Controllers/RipeAtlas/MeasurementController.php +++ b/app/Http/Controllers/RipeAtlas/MeasurementController.php @@ -187,14 +187,14 @@ protected static function additionalRoutes( string $route_prefix ): void /** * List the contents of a database table. * - * @param Request $r + * @param Request $param * * @return View */ - public function list( Request $r ) : View + public function list( Request $param ) : View { $rid = false; - if( $run = AtlasRun::find( $r->atlasrun ) ) { + if( $run = AtlasRun::find( $param->atlasrun ) ) { $rid = $run->id; } diff --git a/app/Http/Controllers/RipeAtlas/ProbesController.php b/app/Http/Controllers/RipeAtlas/ProbesController.php index f9b53c613..62eb9b78f 100644 --- a/app/Http/Controllers/RipeAtlas/ProbesController.php +++ b/app/Http/Controllers/RipeAtlas/ProbesController.php @@ -145,20 +145,20 @@ public function feInit() /** * List the contents of a database table. * - * @param Request $r + * @param Request $param * * @return View */ - public function list( Request $r ): View + public function list( Request $param ): View { $cid = $protocol = false; - if( $cust = Customer::find( $r->cust ) ) { + if( $cust = Customer::find( $param->cust ) ) { $cid = $cust->id; } - if( array_key_exists( $r->protocol, Router::$PROTOCOLS ) ) { - $protocol = $r->protocol; + if( array_key_exists( $param->protocol, Router::$PROTOCOLS ) ) { + $protocol = $param->protocol; } $this->data[ 'params' ][ 'cid' ] = $cid; diff --git a/app/Http/Controllers/RipeAtlas/RunController.php b/app/Http/Controllers/RipeAtlas/RunController.php index 0bb49db11..e94e96931 100644 --- a/app/Http/Controllers/RipeAtlas/RunController.php +++ b/app/Http/Controllers/RipeAtlas/RunController.php @@ -182,7 +182,7 @@ protected function createPrepareForm(): array { Former::populate( [ 'protocol' => request()->old( 'protocol', Router::PROTOCOL_IPV4 ), - 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), + 'scheduled_at' => request()->old( 'scheduled_at', (string)AtlasRun::SCHEDULED_AT_NOW ), 'scheduled_date' => request()->old( 'scheduled_date' ), 'scheduled_time' => request()->old( 'scheduled_time' ), ] ); @@ -225,28 +225,28 @@ public function addStep2( Request $r ): View /** * Function to do the actual validation and storing of the submitted object. * - * @param Request $r + * @param Request $request * * @return bool|RedirectResponse */ - public function doStore( Request $r ): bool|RedirectResponse + public function doStore( Request $request ): bool|RedirectResponse { - if( !$r->selected_custs || !count( $r->selected_custs ) ) { + if( !$request->selected_custs || !count( $request->selected_custs ) ) { AlertContainer::push( "You need to select at least one " . config( "ixp_fe.lang.customer.one" ) . ".", Alert::DANGER ); return Redirect::back()->withInput(); } - $this->checkForm( $r ); + $this->checkForm( $request ); $this->object = AtlasRun::create( [ - 'protocol' => $r->protocol, - 'scheduled_at' => $r->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ? now() : new Carbon( $r->scheduled_date . $r->scheduled_time ), - 'vlan_id' => $r->vlan_id + 'protocol' => $request->protocol, + 'scheduled_at' => $request->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ? now() : new Carbon( $request->scheduled_date . $request->scheduled_time ), + 'vlan_id' => $request->vlan_id ] ); - CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); + CreateMeasurementsJob::dispatchSync( $this->object, $request->selected_custs ); - if( (int)$r->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ) { + if( (int)$request->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ) { $this->object->atlasMeasurements()->each( function( $am ) { RunMeasurementsJob::dispatchAfterResponse( $am ); } ); @@ -269,7 +269,7 @@ public function completeRun( AtlasRun $atlasrun ): RedirectResponse { if( $atlasrun->completed_at ) { AlertContainer::push( 'The command complete atlas run have already executed.', Alert::DANGER ); - } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { + } elseif( CompleteRequestsJob::dispatchSync( $atlasrun ) ) { AlertContainer::push( 'The command complete atlas run executed with success.', Alert::SUCCESS ); } else { AlertContainer::push( 'The command complete atlas run cannot be executed, some atlas measurements are not ended.', Alert::DANGER ); diff --git a/app/Http/Controllers/RouterController.php b/app/Http/Controllers/RouterController.php index 7f2b52380..9d4951f9e 100644 --- a/app/Http/Controllers/RouterController.php +++ b/app/Http/Controllers/RouterController.php @@ -141,28 +141,28 @@ public function edit( Router $router ): View { Former::populate([ 'handle' => request()->old( 'handle', $router->handle ), - 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), + 'vlan_id' => request()->old( 'vlan_id', (string)$router->vlan_id ), 'protocol' => request()->old( 'protocol', $router->protocol ), 'type' => request()->old( 'type', $router->type ), 'name' => request()->old( 'name', $router->name ), 'shortname' => request()->old( 'shortname', $router->shortname ), 'router_id' => request()->old( 'router_id', $router->router_id ), 'peering_ip' => request()->old( 'peering_ip', $router->peering_ip ), - 'asn' => request()->old( 'asn', $router->asn ), + 'asn' => request()->old( 'asn', (string)$router->asn ), 'software' => request()->old( 'software', $router->software ), 'software_version' => request()->old( 'software_version', $router->software_version ), 'operating_system' => request()->old( 'operating_system', $router->operating_system ), 'operating_system_version' => request()->old( 'operating_system_version', $router->operating_system_version ), 'mgmt_host' => request()->old( 'mgmt_host', $router->mgmt_host ), - 'api_type' => request()->old( 'api_type', $router->api_type ), + 'api_type' => request()->old( 'api_type', (string)$router->api_type ), 'api' => request()->old( 'api', $router->api ), - 'lg_access' => request()->old( 'lg_access', $router->lg_access ), - 'quarantine' => request()->old( 'quarantine', $router->quarantine ), - 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), - 'rpki' => request()->old( 'rpki', $router->rpki ), - 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), - 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), - 'pair_id' => request()->old( 'pair_id', $router->pair_id ), + 'lg_access' => request()->old( 'lg_access', (string)$router->lg_access ), + 'quarantine' => request()->old( 'quarantine', (string)$router->quarantine ), + 'bgp_lc' => request()->old( 'bgp_lc', (string)$router->bgp_lc ), + 'rpki' => request()->old( 'rpki', (string)$router->rpki ), + 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', (string)$router->rfc1997_passthru ), + 'skip_md5' => request()->old( 'skip_md5', (string)$router->skip_md5 ), + 'pair_id' => request()->old( 'pair_id', (string)$router->pair_id ), 'template' => request()->old( 'template', $router->template ), ]); @@ -233,7 +233,7 @@ public function delete( Router $router): RedirectResponse */ public function pause( Router $router): RedirectResponse { - $router->pause_updates = true; + $router->pause_updates = 1; $router->save(); AlertContainer::push( 'Automatic updates for router ' . $router->handle . ' paused.', Alert::SUCCESS ); diff --git a/app/Http/Controllers/RsFilterController.php b/app/Http/Controllers/RsFilterController.php index fe2e9ca60..a8c9f1ecd 100644 --- a/app/Http/Controllers/RsFilterController.php +++ b/app/Http/Controllers/RsFilterController.php @@ -172,7 +172,7 @@ public function create( Request $r, Customer $cust ): View } $peers = array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + CustomerAggregator::getByVlanAndProtocol( (int)$vlanid , (int)$protocol ) ); // exclude this network foreach( $peers as $i => $p ) { @@ -237,9 +237,9 @@ public function edit( Request $r, RouteServerFilter $rsf ): View { $this->authorize( 'checkRsfObject', [ RouteServerFilter::class, $rsf ] ); - $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); + $vlanid = $r->old( 'vlan_id', (string)$rsf->vlan_id ?? null ); $protocol = $r->old( 'protocol', $rsf->protocol ?? null ); - $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); + $peerid = $r->old( 'peer_id', (string)$rsf->peer_id ?? null ); Former::populate( [ 'vlan_id' => $vlanid ?? "null", @@ -256,7 +256,7 @@ public function edit( Request $r, RouteServerFilter $rsf ): View 'c' => $rsf->customer, 'vlans' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All LANs" ] ], $this->getPublicPeeringVLANs( $rsf->customer_id ) ), 'protocols' => Router::$PROTOCOLS, - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( (int)$vlanid , (int)$protocol ) ), ] ); } diff --git a/app/Http/Controllers/Services/Grapher/Api.php b/app/Http/Controllers/Services/Grapher/Api.php index d02235557..84f1e696a 100644 --- a/app/Http/Controllers/Services/Grapher/Api.php +++ b/app/Http/Controllers/Services/Grapher/Api.php @@ -22,7 +22,7 @@ * * http://www.gnu.org/licenses/gpl-2.0.html */ -use Grapher as GrapherService; +use IXP\Services\Grapher as GrapherService; use Illuminate\Http\{ Request, @@ -33,8 +33,6 @@ use IXP\Http\Controllers\Controller; -use IXP\Services\Grapher; - /** * Grapher Controller * @@ -50,9 +48,9 @@ class Api extends Controller /** * The grapher service * - * @var Grapher + * @var GrapherService */ - private $grapher; + private GrapherService $grapher; /** * Constructor @@ -77,7 +75,7 @@ private function grapher(): GrapherService public function generateConfiguration( Request $request ): Response { // get the appropriate backend - $grapher = GrapherService::backend( $request->input( 'backend', 'mrtg' ) ); + $grapher = $this->grapher()->backend( $request->input( 'backend', 'mrtg' ) ); if( !$grapher->isConfigurationRequired() ) { abort( 404, "This grapher backend (" . $grapher->name() . ") does not require any configuration to be generated" ); diff --git a/app/Http/Controllers/Services/LookingGlass.php b/app/Http/Controllers/Services/LookingGlass.php index 15811a457..3aec4439f 100644 --- a/app/Http/Controllers/Services/LookingGlass.php +++ b/app/Http/Controllers/Services/LookingGlass.php @@ -350,7 +350,7 @@ public function routeTable( string $handle, string $network, string $mask, strin public function routeExport( string $handle, string $network, string $mask, string $protocol ): View { return view('services/lg/route' )->with([ - 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), + 'content' => json_decode( $this->lg()->protocolRoute( $protocol, $network, (int)$mask ), false ), 'source' => 'export', 'name' => $protocol, 'lg' => $this->lg(), diff --git a/app/Http/Controllers/StatisticsController.php b/app/Http/Controllers/StatisticsController.php index 87c609ade..dbb44b455 100644 --- a/app/Http/Controllers/StatisticsController.php +++ b/app/Http/Controllers/StatisticsController.php @@ -82,16 +82,16 @@ class StatisticsController extends Controller * * These are safe for use from the request. * - * @param StatisticsRequest $r + * @param StatisticsRequest $request * * @return void */ - private function processGraphParams( StatisticsRequest $r ): void + private function processGraphParams( StatisticsRequest $request ): void { - $r->period = Graph::processParameterPeriod( $r->period ); - $r->category = Graph::processParameterCategory( $r->category ); - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - $r->type = Graph::processParameterType( $r->type ); + $request->period = Graph::processParameterPeriod( $request->period ); + $request->category = Graph::processParameterCategory( $request->category ); + $request->protocol = Graph::processParameterProtocol( $request->protocol ); + $request->type = Graph::processParameterType( $request->type ); } /** @@ -506,18 +506,18 @@ public function latency( VlanInterface $vli, string $protocol ): View|RedirectRe /** * sFlow Peer to Peer statistics * - * @param Request $r - * @param Customer|null $cust + * @param Request $request + * @param Customer|null $customer * * @return RedirectResponse|View * * @throws ParameterException */ - public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View + public function p2p( Request $request, Customer $customer = null ): RedirectResponse|View { // default to the current user: - if( !$cust && Auth::check() ) { - $cust = Auth::getUser()->customer; + if( !$customer && Auth::check() ) { + $customer = Auth::getUser()->customer; } $showGraphsOption = false; @@ -530,27 +530,27 @@ public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View } if( $showGraphsOption ) { - if( $r->submit === "Show Graphs" ) { + if( $request->submit === "Show Graphs" ) { $showGraphs = true; - $r->session()->put( 'controller.statistics.p2p.show_graphs', true ); - } else if( $r->submit === "Hide Graphs" ) { + $request->session()->put( 'controller.statistics.p2p.show_graphs', true ); + } else if( $request->submit === "Hide Graphs" ) { $showGraphs = false; - $r->session()->put( 'controller.statistics.p2p.show_graphs', false ); + $request->session()->put( 'controller.statistics.p2p.show_graphs', false ); } else { - $showGraphs = $r->session()->get( 'controller.statistics.p2p.show_graphs', config('grapher.backends.sflow.show_graphs_on_index_page') ); + $showGraphs = $request->session()->get( 'controller.statistics.p2p.show_graphs', config('grapher.backends.sflow.show_graphs_on_index_page') ); } } - $r->category = Graph::processParameterCategory( $r->category, true ); - $r->period = Graph::processParameterPeriod( $r->period ); - $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); + $request->category = Graph::processParameterCategory( $request->category, true ); + $request->period = Graph::processParameterPeriod( $request->period ); + $request->protocol = Graph::processParameterRealProtocol( $request->protocol ); $srcVlis = VlanInterface::select( [ 'vli.*' ] ) ->from( 'vlaninterface AS vli' ) ->Join( 'virtualinterface AS vi', 'vi.id', 'vli.virtualinterfaceid' ) ->Join( 'cust AS c', 'c.id', 'vi.custid' ) ->Join( 'vlan AS v', 'v.id', 'vli.vlanid' ) - ->where( 'c.id', $cust->id ) + ->where( 'c.id', $customer->id ) ->with( [ 'vlan' ] ) ->orderBy( 'v.number' )->get()->keyBy( 'id' ); @@ -560,7 +560,7 @@ public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View return redirect()->back(); } - if( ( $svlid = $r->svli ) && isset( $srcVlis[ $svlid ] ) ) { + if( ( $svlid = $request->svli ) && isset( $srcVlis[ $svlid ] ) ) { /** @var VlanInterface $srcVli */ $srcVli = $srcVlis[ $svlid ]; } else { @@ -568,8 +568,8 @@ public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View } // is the requested protocol support? - if( !$srcVli->vlan->private && !$srcVli->ipvxEnabled( $r->protocol ) ) { - AlertContainer::push( Graph::resolveProtocol( $r->protocol ) . " is not supported on the requested VLAN interface.", Alert::WARNING ); + if( !$srcVli->vlan->private && !$srcVli->ipvxEnabled( $request->protocol ) ) { + AlertContainer::push( Graph::resolveProtocol( $request->protocol ) . " is not supported on the requested VLAN interface.", Alert::WARNING ); return redirect()->back(); } // Now find the possible other VLAN interfaces that this customer could exchange traffic with @@ -582,7 +582,7 @@ public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View return redirect()->back(); } - if( ( $dvlid = $r->dvli ) && isset( $dstVlis[ $dvlid ] ) ) { + if( ( $dvlid = $request->dvli ) && isset( $dstVlis[ $dvlid ] ) ) { $dstVli = $dstVlis[ $dvlid ]; } else { $dstVli = false; @@ -600,7 +600,7 @@ public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View } } - if( !$dstVli && $r->dvli !== null ) { + if( !$dstVli && $request->dvli !== null ) { AlertContainer::push( "The customer selected for destination traffic does not have any interfaces on the requested VLAN", Alert::WARNING ); return redirect()->back(); } @@ -628,19 +628,19 @@ public function p2p( Request $r, Customer $cust = null ): RedirectResponse|View // authenticate on one of the graphs $graph = App::make( Grapher::class ) ->p2p( $srcVli, $dstVli ?: $dstVlis[ $dstVlis->first()->id ]) - ->setProtocol( $r->protocol ) - ->setCategory( $r->category ) - ->setPeriod( $r->period ); + ->setProtocol( $request->protocol ) + ->setCategory( $request->category ) + ->setPeriod( $request->period ); $graph->authorise(); $viewOptions = [ - 'c' => $cust, - 'category' => $r->category, + 'c' => $customer, + 'category' => $request->category, 'dstVlis' => $dstVlis, 'dstVli' => $dstVli, 'graph' => $graph, - 'period' => $r->period, - 'protocol' => $r->protocol, + 'period' => $request->period, + 'protocol' => $request->protocol, 'showGraphs' => $showGraphs, 'showGraphsOption' => $showGraphsOption, 'srcVlis' => $srcVlis, diff --git a/app/Http/Requests/StatisticsRequest.php b/app/Http/Requests/StatisticsRequest.php index a4f7b5c62..d25580096 100644 --- a/app/Http/Requests/StatisticsRequest.php +++ b/app/Http/Requests/StatisticsRequest.php @@ -23,6 +23,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html */ +use AllowDynamicProperties; use Auth; use Illuminate\Foundation\Http\FormRequest; @@ -39,6 +40,23 @@ */ class StatisticsRequest extends FormRequest { + /** + * @var mixed|string + */ + public mixed $period; + /** + * @var mixed|string + */ + public mixed $category; + /** + * @var mixed|string + */ + public mixed $protocol; + /** + * @var mixed|string + */ + public mixed $type; + /** * Determine if the user is authorized to make this request. * diff --git a/app/Models/Aggregators/CustomerAggregator.php b/app/Models/Aggregators/CustomerAggregator.php index f2ca0382c..781c37c9b 100644 --- a/app/Models/Aggregators/CustomerAggregator.php +++ b/app/Models/Aggregators/CustomerAggregator.php @@ -303,13 +303,13 @@ public static function getByVlanAndProtocol( int $vlanid = null, int $protocol = * ] * * @param Customer $cust Current customer - * @param Vlan[] $vlans Array of Vlans + * @param Vlan[] $vlans Array of Vlans * @param array $protos Array of protos * * @return array|null * */ - public static function getPeeringManagerArrayByType( Customer $cust, $vlans, array $protos ): ?array + public static function getPeeringManagerArrayByType( Customer $cust, array $vlans, array $protos ): ?array { if( !count( $vlans ) ) { return null; diff --git a/app/Models/Aggregators/VlanInterfaceAggregator.php b/app/Models/Aggregators/VlanInterfaceAggregator.php index 584137ff5..fb01aedd0 100644 --- a/app/Models/Aggregators/VlanInterfaceAggregator.php +++ b/app/Models/Aggregators/VlanInterfaceAggregator.php @@ -103,7 +103,7 @@ class VlanInterfaceAggregator extends VlanInterface * Utility function to provide an array of VLAN interface objects on a given VLAN. * * @param Vlan $vlan The VLAN to gather VlanInterfaces for - * @param bool $protocol Either 4 or 6 to limit the results to interface with IPv4 / IPv6 + * @param bool|mixed $protocol Either 4 or 6 to limit the results to interface with IPv4 / IPv6 * * @return Collection * diff --git a/app/Models/PhysicalInterface.php b/app/Models/PhysicalInterface.php index fdb8ef060..b763c33c5 100644 --- a/app/Models/PhysicalInterface.php +++ b/app/Models/PhysicalInterface.php @@ -384,7 +384,7 @@ public function relatedInterface() * * @return PhysicalInterface|bool */ - public function otherPICoreLink() + public function otherPICoreLink(): PhysicalInterface|bool { if( $ci = $this->coreInterface ){ if( $this->id === $ci->coreLink()->coreInterfaceSideA->physical_interface_id ){ diff --git a/psalm_errors_240522_1253a.log b/psalm_errors_CHECK.log similarity index 80% rename from psalm_errors_240522_1253a.log rename to psalm_errors_CHECK.log index e368f079e..079e2378c 100644 --- a/psalm_errors_240522_1253a.log +++ b/psalm_errors_CHECK.log @@ -394,31 +394,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleC Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) $switchSideBId = $switchSideB ? $switchSideB->id : null; -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:208:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:209:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:215:25 -Cannot create offset of type int|null, expecting array-key (see https://psalm.dev/115) - [ $pi->switchportid => - [ "name" => $pi->switchPort->name, - "id" => $pi->switchportid, - "type" => $pi->switchPort->type, - "porttype" => $pi->switchPort->type ] - ]; - ERROR: InvalidPropertyFetch at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) @@ -439,126 +414,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInt Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) $data['notes-b'] = $piB->notes ?? ''; -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/SflowReceiverController.php:112:56 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:144:46 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'custid' => $r->old( 'cust', $cust->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:199:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'custid' => $r->old( 'custid', $vi->custid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:200:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool|null provided (see https://psalm.dev/004) - 'trunk' => $r->old( 'trunk', $vi->trunk ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:201:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:202:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:204:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:205:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mtu' => $r->old( 'mtu', $vi->mtu ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:155:73 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:156:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:157:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:159:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:160:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:163:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:164:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:166:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:167:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:168:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:169:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'as112client' => $r->old( 'as112client', $vli->as112client ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:170:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:172:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:173:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:176:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:177:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -584,61 +439,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:135:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:138:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:139:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:143:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'u_position' => $r->old( 'u_position', $pp->u_position ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:144:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:145:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:146:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0 provided (see https://psalm.dev/004) - 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:187:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:189:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:190:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'state' => $r->old( 'state', $ppp->state ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:202:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -649,16 +449,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerControll Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:263:27 -$pm->peered with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $pm->peered = !$pm->peered; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:268:29 -$pm->rejected with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $pm->rejected = !$pm->rejected; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -675,184 +465,24 @@ Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https $user->save(); ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/MeasurementController.php:194:35 -Argument 1 of IXP\Http\Controllers\RipeAtlas\MeasurementController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/ProbesController.php:152:35 -Argument 1 of IXP\Http\Controllers\RipeAtlas\ProbesController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ): View - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:185:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 1 provided (see https://psalm.dev/004) - 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:247:9 -Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:272:19 -Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) - } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:144:75 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:151:75 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'asn' => request()->old( 'asn', $router->asn ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:157:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'api_type' => request()->old( 'api_type', $router->api_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:159:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'lg_access' => request()->old( 'lg_access', $router->lg_access ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:160:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'quarantine' => request()->old( 'quarantine', $router->quarantine ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:161:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:162:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'rpki' => request()->old( 'rpki', $router->rpki ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:163:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:164:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:165:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'pair_id' => request()->old( 'pair_id', $router->pair_id ), - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:236:34 -$router->pause_updates with declared type 'int' cannot be assigned type 'true' (see https://psalm.dev/145) - $router->pause_updates = true; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:55 -Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:65 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:240:47 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:242:47 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:134 -Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:144 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:64:26 -$this->grapher with declared type 'IXP\Services\Grapher' cannot be assigned type 'Grapher' (see https://psalm.dev/145) - $this->grapher = $grapher; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:70:16 -The declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher is incorrect, got 'IXP\Services\Grapher' (see https://psalm.dev/011) - * @return GrapherService - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:74:16 -The inferred type 'IXP\Services\Grapher' does not match the declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher (see https://psalm.dev/128) - return $this->grapher; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/LookingGlass.php:353:54 -Method IXP\Contracts\LookingGlass::exportRoute does not exist (see https://psalm.dev/181) - 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:91:9 -Instance property IXP\Http\Requests\StatisticsRequest::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:92:9 -Instance property IXP\Http\Requests\StatisticsRequest::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:93:9 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:94:9 -Instance property IXP\Http\Requests\StatisticsRequest::$type is not defined (see https://psalm.dev/038) - $r->type = Graph::processParameterType( $r->type ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:336:13 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::PROTOCOL_ALL; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:339:17 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::PROTOCOL_IPV4; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:341:65 -Argument 2 of IXP\Models\Aggregators\VlanInterfaceAggregator::forVlan expects bool, but 'ipv4'|'ipv6' provided (see https://psalm.dev/004) - $targets = VlanInterfaceAggregator::forVlan( $vlan, $r->protocol ); +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:232:38 +Argument 1 of IXP\Http\Controllers\RipeAtlas\RunController::doStore has wrong name $request, expecting $r as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::doStore (see https://psalm.dev/230) + public function doStore( Request $request ): bool|RedirectResponse ERROR: UndefinedPropertyAssignment at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category, true ); + $request->category = Graph::processParameterCategory( $request->category, true ); ERROR: UndefinedPropertyAssignment at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); + $request->period = Graph::processParameterPeriod( $request->period ); ERROR: UndefinedPropertyAssignment at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); + $request->protocol = Graph::processParameterRealProtocol( $request->protocol ); ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 @@ -2273,11 +1903,11 @@ Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 2 $table->string(255)->nullable()->after('host'); ------------------------------ -449 errors found +376 errors found ------------------------------ -3450 other issues found. +3457 other issues found. You can display them with --show-info=true ------------------------------ -Checks took 6.24 seconds and used 613.448MB of memory -Psalm was able to infer types for 80.7594% of the codebase +Checks took 6.33 seconds and used 606.813MB of memory +Psalm was able to infer types for 81.5154% of the codebase diff --git a/psalm_errors_240522_1253.log b/psalm_errors_WORK.log similarity index 80% rename from psalm_errors_240522_1253.log rename to psalm_errors_WORK.log index 13aaaab6b..5fac91a95 100644 --- a/psalm_errors_240522_1253.log +++ b/psalm_errors_WORK.log @@ -447,32 +447,7 @@ Cannot find referenced variable $cib (see https://psalm.dev/024) $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ - - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:208:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:209:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:215:25 -Cannot create offset of type int|null, expecting array-key (see https://psalm.dev/115) - [ $pi->switchportid => - [ "name" => $pi->switchPort->name, - "id" => $pi->switchportid, - "type" => $pi->switchPort->type, - "porttype" => $pi->switchPort->type ] - ]; +# don't see issues here ERROR: InvalidPropertyFetch at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 @@ -494,125 +469,8 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInt Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) $data['notes-b'] = $piB->notes ?? ''; -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/SflowReceiverController.php:112:56 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:144:46 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'custid' => $r->old( 'cust', $cust->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:199:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'custid' => $r->old( 'custid', $vi->custid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:200:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool|null provided (see https://psalm.dev/004) - 'trunk' => $r->old( 'trunk', $vi->trunk ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:201:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:202:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:204:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:205:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mtu' => $r->old( 'mtu', $vi->mtu ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:155:73 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:156:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:157:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:159:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:160:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:163:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:164:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:166:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:167:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:168:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:169:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'as112client' => $r->old( 'as112client', $vli->as112client ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:170:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:172:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:173:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:176:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:177:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), +# false alarm for existing interface methods ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 @@ -639,61 +497,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:135:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:138:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:139:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:143:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'u_position' => $r->old( 'u_position', $pp->u_position ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:144:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:145:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:146:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0 provided (see https://psalm.dev/004) - 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:187:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:189:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:190:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'state' => $r->old( 'state', $ppp->state ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:202:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -704,16 +507,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerControll Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:263:27 -$pm->peered with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $pm->peered = !$pm->peered; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:268:29 -$pm->rejected with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $pm->rejected = !$pm->rejected; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -729,170 +522,9 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php: Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) $user->save(); -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/MeasurementController.php:194:35 -Argument 1 of IXP\Http\Controllers\RipeAtlas\MeasurementController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/ProbesController.php:152:35 -Argument 1 of IXP\Http\Controllers\RipeAtlas\ProbesController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ): View - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:185:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 1 provided (see https://psalm.dev/004) - 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:247:9 -Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:272:19 -Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) - } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:144:75 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:151:75 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'asn' => request()->old( 'asn', $router->asn ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:157:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'api_type' => request()->old( 'api_type', $router->api_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:159:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'lg_access' => request()->old( 'lg_access', $router->lg_access ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:160:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'quarantine' => request()->old( 'quarantine', $router->quarantine ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:161:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:162:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'rpki' => request()->old( 'rpki', $router->rpki ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:163:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:164:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:165:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'pair_id' => request()->old( 'pair_id', $router->pair_id ), - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:236:34 -$router->pause_updates with declared type 'int' cannot be assigned type 'true' (see https://psalm.dev/145) - $router->pause_updates = true; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:55 -Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:65 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:240:47 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:242:47 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:134 -Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:144 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:64:26 -$this->grapher with declared type 'IXP\Services\Grapher' cannot be assigned type 'Grapher' (see https://psalm.dev/145) - $this->grapher = $grapher; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:70:16 -The declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher is incorrect, got 'IXP\Services\Grapher' (see https://psalm.dev/011) - * @return GrapherService - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:74:16 -The inferred type 'IXP\Services\Grapher' does not match the declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher (see https://psalm.dev/128) - return $this->grapher; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/LookingGlass.php:353:54 -Method IXP\Contracts\LookingGlass::exportRoute does not exist (see https://psalm.dev/181) - 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:91:9 -Instance property IXP\Http\Requests\StatisticsRequest::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:92:9 -Instance property IXP\Http\Requests\StatisticsRequest::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:93:9 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:94:9 -Instance property IXP\Http\Requests\StatisticsRequest::$type is not defined (see https://psalm.dev/038) - $r->type = Graph::processParameterType( $r->type ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:336:13 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::PROTOCOL_ALL; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:339:17 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::PROTOCOL_IPV4; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:341:65 -Argument 2 of IXP\Models\Aggregators\VlanInterfaceAggregator::forVlan expects bool, but 'ipv4'|'ipv6' provided (see https://psalm.dev/004) - $targets = VlanInterfaceAggregator::forVlan( $vlan, $r->protocol ); +# I don't see issue here ERROR: UndefinedPropertyAssignment at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 @@ -919,6 +551,10 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchControl Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + + + + ERROR: ParamNameMismatch at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) From 4d84f4cb2f495ec60d928b4824ec47045130b484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Tue, 28 May 2024 16:28:21 +0100 Subject: [PATCH 007/145] psalm errors fixing --- .../Commands/Grapher/EmailPortUtilisation.php | 3 +- app/Console/Commands/Irrdb/UpdateDb.php | 4 +- app/Console/Commands/PeeringDB/AsnLookup.php | 2 +- .../Commands/RipeAtlas/CompleteRequests.php | 2 +- .../Commands/RipeAtlas/CreateMeasurements.php | 2 +- .../Commands/RipeAtlas/RunMeasurements.php | 2 +- .../RipeAtlas/StopAllMeasurements.php | 2 +- .../Commands/RipeAtlas/UpdateMeasurements.php | 2 +- .../Commands/RipeAtlas/UpdateProbes.php | 26 +- app/Console/Commands/Rir/GenerateObject.php | 2 +- .../Commands/Router/FilteredPrefixes.php | 20 +- app/Console/Commands/Utils/SmtpMailTest.php | 11 +- .../Controllers/Switches/SwitchController.php | 52 +- .../Switches/SwitchPortController.php | 22 +- app/Http/Controllers/User/UserController.php | 19 +- app/Http/Middleware/Eloquent2Frontend.php | 1 + app/Http/Middleware/Services/Grapher.php | 98 +- app/Http/Middleware/TrustProxies.php | 2 +- app/Listeners/Auth/ForgotUsername.php | 3 +- app/Mail/Grapher/PortsWithCounts.php | 2 +- app/Mail/User/UserCreated.php | 2 +- app/Mail/Utils/SmtpTest.php | 83 - .../Aggregators/BgpSessionDataAggregator.php | 6 +- app/Models/Customer.php | 8 +- app/Models/DocstoreCustomerDirectory.php | 2 +- app/Models/DocstoreDirectory.php | 2 +- app/Models/Switcher.php | 4 +- app/Models/VirtualInterface.php | 4 +- app/Policies/CustomerPolicy.php | 7 +- app/Policies/DocstoreLogPolicy.php | 1 - app/Providers/BroadcastServiceProvider.php | 2 +- app/Providers/HelpdeskServiceProvider.php | 2 +- app/Providers/PurifierServiceProvider.php | 6 +- app/Services/FoilEngine.php | 5 +- app/Services/Grapher.php | 2 +- app/Services/Grapher/Backend/Mrtg.php | 2 +- app/Services/Grapher/Backend/Sflow.php | 4 +- app/Services/Grapher/Graph.php | 124 +- app/Services/Grapher/Graph/Customer.php | 2 +- app/Services/Grapher/Graph/IXP.php | 6 +- app/Services/Grapher/Graph/Infrastructure.php | 2 +- app/Services/Grapher/Graph/Latency.php | 12 +- app/Services/Grapher/Graph/Location.php | 2 +- app/Services/Grapher/Graph/Switcher.php | 2 +- app/Services/Grapher/Graph/Vlan.php | 2 +- .../Grapher/Renderer/Extensions/Grapher.php | 17 +- app/Services/Grapher/Statistics.php | 28 +- app/Services/Helpdesk/Zendesk.php | 15 +- app/Services/IXF.php | 7 +- app/Services/LookingGlass.php | 2 +- app/Services/LookingGlass/BirdsEye.php | 2 +- app/Services/PeeringDb.php | 6 +- app/Services/Purifier.php | 9 +- app/Services/RipeAtlas/Interpretor.php | 5 +- app/Support/helpers.php | 10 +- app/Tasks/Irrdb/UpdateAsnDb.php | 14 +- app/Tasks/Irrdb/UpdatePrefixDb.php | 8 +- app/Utils/Bgpq3.php | 2 +- app/Utils/Foil/Extensions/IXP.php | 9 +- .../Former/Framework/TwitterBootstrap4.php | 2 +- app/Utils/IpAddress.php | 7 +- app/Utils/MailingList.php | 10 +- app/Utils/View/Alert/Container.php | 2 +- .../2021_03_30_124916_create_atlas_probes.php | 2 +- ...9_17_144421_modernise_irrdb_conf_table.php | 2 +- psalm_errors_CHECK.log | 1913 ----------------- psalm_errors_WORK.log | 855 +------- 67 files changed, 365 insertions(+), 3133 deletions(-) delete mode 100644 app/Mail/Utils/SmtpTest.php delete mode 100644 psalm_errors_CHECK.log diff --git a/app/Console/Commands/Grapher/EmailPortUtilisation.php b/app/Console/Commands/Grapher/EmailPortUtilisation.php index 5fc764df8..0d88bc557 100644 --- a/app/Console/Commands/Grapher/EmailPortUtilisation.php +++ b/app/Console/Commands/Grapher/EmailPortUtilisation.php @@ -116,7 +116,8 @@ public function handle(): int } if( count( $excess ) ) { - Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); + Mail::to( explode( ',', $this->argument( 'email' ) ) ) + ->send( new PortUtilisationMail( $excess, (float)$this->option('threshold') ) ); } return 0; diff --git a/app/Console/Commands/Irrdb/UpdateDb.php b/app/Console/Commands/Irrdb/UpdateDb.php index 44452eab0..8de6863aa 100644 --- a/app/Console/Commands/Irrdb/UpdateDb.php +++ b/app/Console/Commands/Irrdb/UpdateDb.php @@ -57,9 +57,9 @@ protected function setupChecks(): bool /** * Returns all customers or, if specified on the command line, a specific customer * - * @return array|Builder|Customer + * @return mixed */ - protected function resolveCustomers() + protected function resolveCustomers(): mixed { $custarg = $this->argument('customer' ); diff --git a/app/Console/Commands/PeeringDB/AsnLookup.php b/app/Console/Commands/PeeringDB/AsnLookup.php index e976bac9a..e268da7ee 100644 --- a/app/Console/Commands/PeeringDB/AsnLookup.php +++ b/app/Console/Commands/PeeringDB/AsnLookup.php @@ -50,7 +50,7 @@ public function handle() $pdb = app()->make( PeeringDb::class ); - if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { + if( $net = $pdb->getNetworkByAsn( (integer)$this->argument('asn') ) ) { echo $pdb->netAsAscii($net); return 0; } diff --git a/app/Console/Commands/RipeAtlas/CompleteRequests.php b/app/Console/Commands/RipeAtlas/CompleteRequests.php index 17ecdf324..c9892e5a8 100644 --- a/app/Console/Commands/RipeAtlas/CompleteRequests.php +++ b/app/Console/Commands/RipeAtlas/CompleteRequests.php @@ -82,7 +82,7 @@ public function handle(): int } $ars->each( function ( $ar ) use ( $bar ) { - if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { + if( CompleteRequestsJob::dispatchSync( $ar ) && $this->isVerbosityVerbose() ) { $this->info("Marking request: Atals Run ID:{$ar->id} complete"); } $bar->advance(); diff --git a/app/Console/Commands/RipeAtlas/CreateMeasurements.php b/app/Console/Commands/RipeAtlas/CreateMeasurements.php index 919c1c333..509130a91 100644 --- a/app/Console/Commands/RipeAtlas/CreateMeasurements.php +++ b/app/Console/Commands/RipeAtlas/CreateMeasurements.php @@ -74,7 +74,7 @@ public function handle(): int $bar->start(); $ars->each( function( $ar ) use ( $bar ) { - CreateMeasurementsJob::dispatchNow( $ar ); + CreateMeasurementsJob::dispatchSync( $ar ); $bar->advance(); }); diff --git a/app/Console/Commands/RipeAtlas/RunMeasurements.php b/app/Console/Commands/RipeAtlas/RunMeasurements.php index fc817904d..78b298406 100644 --- a/app/Console/Commands/RipeAtlas/RunMeasurements.php +++ b/app/Console/Commands/RipeAtlas/RunMeasurements.php @@ -88,7 +88,7 @@ public function handle(): int foreach( $ams as $am ){ $atlasRuns[ $am->run_id ] = $am->atlasRun(); - RunMeasurementsJob::dispatchNow( $am ); + RunMeasurementsJob::dispatchSync( $am ); $bar->advance(); } diff --git a/app/Console/Commands/RipeAtlas/StopAllMeasurements.php b/app/Console/Commands/RipeAtlas/StopAllMeasurements.php index f2e0d7c40..bce5f8296 100644 --- a/app/Console/Commands/RipeAtlas/StopAllMeasurements.php +++ b/app/Console/Commands/RipeAtlas/StopAllMeasurements.php @@ -84,7 +84,7 @@ public function handle(): int $bar->start(); foreach( $measurements->results as $am ) { - StopAllMeasurementsJob::dispatchNow( $am->id ); + StopAllMeasurementsJob::dispatchSync( $am->id ); $this->info("Stop requested for {$am->id}"); $bar->advance(); } diff --git a/app/Console/Commands/RipeAtlas/UpdateMeasurements.php b/app/Console/Commands/RipeAtlas/UpdateMeasurements.php index 99d8715f6..a8fea5089 100644 --- a/app/Console/Commands/RipeAtlas/UpdateMeasurements.php +++ b/app/Console/Commands/RipeAtlas/UpdateMeasurements.php @@ -76,7 +76,7 @@ public function handle(): int // find uncompleted measurements: $ams->each( function( $am ) use( $bar ) { - UpdateMeasurementsJob::dispatchNow( $am ); + UpdateMeasurementsJob::dispatchSync( $am ); $bar->advance(); }); diff --git a/app/Console/Commands/RipeAtlas/UpdateProbes.php b/app/Console/Commands/RipeAtlas/UpdateProbes.php index f712260c7..dbb2c196d 100644 --- a/app/Console/Commands/RipeAtlas/UpdateProbes.php +++ b/app/Console/Commands/RipeAtlas/UpdateProbes.php @@ -23,6 +23,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html */ +use Illuminate\Database\Eloquent\Collection; use IXP\Console\Commands\Command; use IXP\Jobs\RipeAtlas\UpdateProbes as UpdateProbesJob; @@ -75,7 +76,7 @@ public function handle(): int $bar->start(); foreach( $customers as $c ){ - UpdateProbesJob::dispatchNow( $c ); + UpdateProbesJob::dispatchSync( $c ); $bar->advance(); } @@ -92,9 +93,9 @@ public function handle(): int /** * Returns all customers or, if specified on the command line, a specific customer * - * @return array Customer + * @return Collection|array Customer */ - protected function resolveCustomers() + protected function resolveCustomers(): Collection|array { $cust = $this->argument('customer'); @@ -104,17 +105,18 @@ protected function resolveCustomers() } // assume ASN first: - if( is_numeric( $cust ) && ( $c = Customer::where( 'autsys', $cust )->first() ) ) { - return [ $c ]; - } - - // then ID: - if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { - return [ $c ]; + if( is_numeric( $cust )) { + $c = Customer::where( 'autsys', $cust )->first(); + if ( !$c ) { + // then ID: + $c = Customer::find( $cust ); + } + } else { + // then check shortname: + $c = Customer::where( 'shortname', $cust )->first(); } - // then check shortname: - if( $c = Customer::where( 'shortname', $cust )->first() ) { + if($c) { return [ $c ]; } diff --git a/app/Console/Commands/Rir/GenerateObject.php b/app/Console/Commands/Rir/GenerateObject.php index 412d7827a..d8fa56152 100644 --- a/app/Console/Commands/Rir/GenerateObject.php +++ b/app/Console/Commands/Rir/GenerateObject.php @@ -84,7 +84,7 @@ public function handle() Mail::raw( $obj, function( $m ) { $m->to( $this->checkEmail( 'to', $this->option( "to" ) ?? config( 'ixp_api.rir.email.to' ) ) ) - ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) + ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?: config( 'ixp_api.rir.email.from' ) ) ?: config( 'mail.from.address' ) ) ) ->subject( "Changes to {$this->argument ('object' )} via IXP Manager" ); } ); diff --git a/app/Console/Commands/Router/FilteredPrefixes.php b/app/Console/Commands/Router/FilteredPrefixes.php index 51d48c534..898fe8ccb 100644 --- a/app/Console/Commands/Router/FilteredPrefixes.php +++ b/app/Console/Commands/Router/FilteredPrefixes.php @@ -71,7 +71,7 @@ public function handle(): int $this->info( "Checking route server filtering for " . $customer->abbreviatedName . ". Please wait..." ); - FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); + FetchFilteredPrefixesForCustomer::dispatchSync( $customer ); $filteredPrefixes = Cache::get( 'filtered-prefixes-' . $customer->id ); if( $filteredPrefixes === [] ) { @@ -111,16 +111,18 @@ protected function resolveCustomer(): Customer $custarg = $this->argument('customer'); // assume ASN first: - if( is_numeric( $custarg ) && ( $c = Customer::where( 'autsys', $custarg )->first() ) ) { - return $c; - } - - // then ID: - if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { - return $c; + if( is_numeric( $custarg )) { + $c = Customer::where( 'autsys', $custarg )->first(); + if(!$c) { + // then ID: + $c = Customer::find( $custarg ); + } + } else { + // then check shortname: + $c = Customer::where( 'shortname', $custarg )->first(); } - if( $c = Customer::where( 'shortname', $custarg )->first() ) { + if ($c) { return $c; } diff --git a/app/Console/Commands/Utils/SmtpMailTest.php b/app/Console/Commands/Utils/SmtpMailTest.php index 38d266964..75162cbbd 100644 --- a/app/Console/Commands/Utils/SmtpMailTest.php +++ b/app/Console/Commands/Utils/SmtpMailTest.php @@ -26,8 +26,6 @@ use IXP\Console\Commands\Command as IXPCommand; -use IXP\Mail\Utils\SmtpTest as SmtpTestMail; - /** * Class SmtpMailTest - test sending emails * @@ -94,11 +92,10 @@ public function handle() $this->info( "Trying to send email...\n" ); - if( $this->getOutput()->isVerbose() ) { - $mail = new SmtpTestMail( true ); - } else { - $mail = new SmtpTestMail; - } + $mail = (object) [ + "markdown" => 'utils.emails.smtp-test', + "subject" =>'SMTP test email from IXP Manager' + ]; try { Mail::to( $email )->send( $mail ); diff --git a/app/Http/Controllers/Switches/SwitchController.php b/app/Http/Controllers/Switches/SwitchController.php index 8a6c78e95..5ccaf31c0 100644 --- a/app/Http/Controllers/Switches/SwitchController.php +++ b/app/Http/Controllers/Switches/SwitchController.php @@ -211,38 +211,38 @@ protected static function additionalRoutes( string $route_prefix ): void /** * List the contents of a database table. * - * @param Request $r + * @param Request $param * * @return View */ - public function list( Request $r ) : View + public function list( Request $param ) : View { - if( ( $showActiveOnly = $r->activeOnly ) !== null ) { - $r->session()->put( "switch-list-active-only", $showActiveOnly ); - } else if( $r->session()->exists( "switch-list-active-only" ) ) { - $showActiveOnly = $r->session()->get( "switch-list-active-only" ); + if( ( $showActiveOnly = $param->activeOnly ) !== null ) { + $param->session()->put( "switch-list-active-only", $showActiveOnly ); + } else if( $param->session()->exists( "switch-list-active-only" ) ) { + $showActiveOnly = $param->session()->get( "switch-list-active-only" ); } else { $showActiveOnly = false; } - if( $vtype = $r->vtype ) { - $r->session()->put( "switch-list-vtype", $vtype ); - } elseif( $r->session()->exists( "switch-list-vtype" ) ) { - $vtype = $r->session()->get( "switch-list-vtype" ); + if( $vtype = $param->vtype ) { + $param->session()->put( "switch-list-vtype", $vtype ); + } elseif( $param->session()->exists( "switch-list-vtype" ) ) { + $vtype = $param->session()->get( "switch-list-vtype" ); } else { - $r->session()->remove( "switch-list-vtype" ); + $param->session()->remove( "switch-list-vtype" ); $vtype = Switcher::VIEW_MODE_DEFAULT; } - if( $r->infra ) { - if( $infra = Infrastructure::find( $r->infra ) ) { - $r->session()->put( "switch-list-infra", $infra ); + if( $param->infra ) { + if( $infra = Infrastructure::find( $param->infra ) ) { + $param->session()->put( "switch-list-infra", $infra ); } else { - $r->session()->remove( "switch-list-infra" ); + $param->session()->remove( "switch-list-infra" ); $infra = false; } - } else if( $r->session()->exists( "switch-list-infra" ) ) { - $infra = $r->session()->get( "switch-list-infra" ); + } else if( $param->session()->exists( "switch-list-infra" ) ) { + $infra = $param->session()->get( "switch-list-infra" ); } else { $infra = false; } @@ -364,7 +364,7 @@ protected function createPrepareForm(): array { return [ 'object' => $this->object, - 'addBySnmp' => request()->old( 'add_by_snnp', false ), + 'addBySnmp' => request()->old( 'add_by_snnp', null ), 'preAddForm' => false, 'cabinets' => Location::with( 'cabinets' ) ->has( 'cabinets' )->get()->toArray(),// getting the cabinets via the location to build the grouped options dropdown @@ -415,8 +415,8 @@ protected function editPrepareForm( int $id ): array 'snmppasswd' => request()->old( 'snmppasswd', $this->object->snmppasswd ), 'vendorid' => request()->old( 'vendorid', $this->object->vendorid ), 'model' => request()->old( 'model', $this->object->model ), - 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), - 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), + 'active' => request()->old( 'active', ( $this->object->active ? '1' : '0' ) ), + 'poll' => request()->old( 'poll', ( $this->object->poll ? '1' : '0' ) ), 'asn' => request()->old( 'asn', $this->object->asn ), 'loopback_ip' => request()->old( 'loopback_ip', $this->object->loopback_ip ), 'loopback_name' => request()->old( 'loopback_name', $this->object->loopback_name ), @@ -426,7 +426,7 @@ protected function editPrepareForm( int $id ): array return [ 'object' => $this->object, - 'addBySnmp' => request()->old( 'add_by_snnp', false ), + 'addBySnmp' => request()->old( 'add_by_snnp', null ), 'preAddForm' => false, 'cabinets' => Location::with( 'cabinets' ) ->has( 'cabinets' )->get()->toArray(),// getting the cabinets via the location to build the grouped options dropdown @@ -693,11 +693,11 @@ public function configuration( Request $r ) : View } $config = SwitcherAggregator::getConfiguration( - $switch->id ?? null, - $infra->id ?? null, - $location->id ?? null, + $switch ? $switch->id : null, + $infra ? $infra->id : null, + $location ? $location->id : null, $speed, - $vlan->id ?? null, + $vlan ? $vlan->id : null, (bool) $r->input('rs-client'), (bool) $r->input('ipv6-enabled') ); @@ -713,7 +713,7 @@ public function configuration( Request $r ) : View 'infras' => $switch ? [ Infrastructure::find( $switch->infrastructure ) ] : Infrastructure::orderBy( 'name' )->get(), 'vlans' => Vlan::orderBy( 'name' )->get(), 'locations' => $switch ? [ Location::find( $switch->cabinet->locationid ) ] : Location::orderBy( 'name' )->get(), - 'switches' => SwitcherAggregator::getByLocationInfrastructureSpeed( $infra->id ?? null, $location->id ?? null, $speed ?: null ), + 'switches' => SwitcherAggregator::getByLocationInfrastructureSpeed( $infra ? $infra->id : null, $location ? $location->id : null, $speed ?: null ), 'config' => $config, ]); } diff --git a/app/Http/Controllers/Switches/SwitchPortController.php b/app/Http/Controllers/Switches/SwitchPortController.php index e1b9fdda1..b7a193a1f 100644 --- a/app/Http/Controllers/Switches/SwitchPortController.php +++ b/app/Http/Controllers/Switches/SwitchPortController.php @@ -172,25 +172,25 @@ protected function listGetData( int $id = null ): array /** * List the contents of a database table. * - * @param Request $r + * @param Request $param * * @return View */ - public function list( Request $r ) : View + public function list( Request $param ) : View { - $s = false; - if( $r->switch !== null ) { - if( $s = Switcher::find( $r->switch ) ) { - $r->session()->put( "switch-port-list", $s->id ); + $switch = false; + if( $param->switch !== null ) { + if( $switch = Switcher::find( $param->switch ) ) { + $param->session()->put( "switch-port-list", $switch->id ); } else { - $r->session()->remove( "switch-port-list" ); - $s = false; + $param->session()->remove( "switch-port-list" ); + $switch = false; } - } else if( $r->session()->exists( "switch-port-list" ) ) { - $s = Switcher::find( $r->session()->get( "switch-port-list" ) ); + } else if( $param->session()->exists( "switch-port-list" ) ) { + $switch = Switcher::find( $param->session()->get( "switch-port-list" ) ); } - $this->data[ 'params' ][ 'switch' ] = $s; + $this->data[ 'params' ][ 'switch' ] = $switch; $this->data[ 'params' ][ 'switches' ] = Switcher::orderBy( 'name' )->get()->keyBy( 'id' ); $this->data[ 'rows' ] = $this->listGetData(); diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php index 90896c8df..fea99cfef 100644 --- a/app/Http/Controllers/User/UserController.php +++ b/app/Http/Controllers/User/UserController.php @@ -27,6 +27,7 @@ use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Routing\Redirector; use Illuminate\Support\Str; use Illuminate\View\View; @@ -239,11 +240,11 @@ public function create( Request $r ): View * * @param StoreUser $r instance of the current HTTP request * - * @return RedirectResponse + * @return RedirectResponse|Redirector * * @throws AuthorizationException */ - public function store( StoreUser $r ): RedirectResponse + public function store( StoreUser $r ): RedirectResponse|Redirector { $this->authorize( 'any', User::class ); @@ -255,7 +256,7 @@ public function store( StoreUser $r ): RedirectResponse $user->authorisedMobile = $r->authorisedMobile; $user->username = strtolower( $r->username ); $user->email = strtolower( $r->email ); - $user->disabled = !$r->disabled; // input as enable in the view + $user->disabled = $r->disabled ? 0 : 1; // input as enable in the view $user->lastupdatedby = Auth::id(); $user->privs = $r->privs; $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; @@ -309,7 +310,7 @@ public function edit( Request $r, User $u ): View 'username' => $r->old( 'username', $u->username ), 'email' => $r->old( 'email', $u->email ), 'authorisedMobile' => $r->old( 'authorisedMobile', $u->authorisedMobile ), - 'disabled' => $r->old( 'disabled', !$u->disabled ), + 'disabled' => $r->old( 'disabled', $u->disabled ? '0' : '1' ), 'linkCancel' => $r->old( 'linkCancel', $r->headers->get( 'referer', "" ) ), ]; @@ -340,14 +341,14 @@ public function edit( Request $r, User $u ): View /** * Allow to update a User * - * @param UpdateUser $r instance of the current HTTP request - * @param User $u + * @param UpdateUser $r instance of the current HTTP request + * @param User $u * - * @return RedirectResponse + * @return RedirectResponse|Redirector * * @throws AuthorizationException */ - public function update( UpdateUser $r, User $u ): RedirectResponse + public function update( UpdateUser $r, User $u ): RedirectResponse|Redirector { $this->authorize( 'access', $u ); @@ -360,7 +361,7 @@ public function update( UpdateUser $r, User $u ): RedirectResponse if( $isSuperUser ) { $u->username = strtolower( $r->username ); $u->email = $r->email; - $u->disabled = !$r->disabled;// displayed as enabled in the view + $u->disabled = $r->disabled ? 0 : 1;// displayed as enabled in the view // Delete Remember Token for the user if disabled if(!$r->disabled){ diff --git a/app/Http/Middleware/Eloquent2Frontend.php b/app/Http/Middleware/Eloquent2Frontend.php index 447cde45d..8aaa2d5fe 100644 --- a/app/Http/Middleware/Eloquent2Frontend.php +++ b/app/Http/Middleware/Eloquent2Frontend.php @@ -27,6 +27,7 @@ use Illuminate\Http\Request; +use IXP\Http\Controllers\Contact\ContactController; use IXP\Models\User; use IXP\Utils\View\Alert\{ diff --git a/app/Http/Middleware/Services/Grapher.php b/app/Http/Middleware/Services/Grapher.php index b5c9ac801..a4a6abe18 100644 --- a/app/Http/Middleware/Services/Grapher.php +++ b/app/Http/Middleware/Services/Grapher.php @@ -91,104 +91,104 @@ public function handle( Request $r, Closure $next ) /** * All graphs have common parameters. We process these here for every request - and set sensible defaults. * - * @param Request $r + * @param Request $request * @param GrapherService $grapher * * @return Graph */ - private function processParameters( Request $r, GrapherService $grapher ): Graph + private function processParameters( Request $request, GrapherService $grapher ): Graph { // while the Grapher service stores the processed parameters in its own object, we update the $request // parameters here also just in case we need to final versions later in the request. - $target = explode( '/', $r->path() ); + $target = explode( '/', $request->path() ); $target = array_pop( $target ); - $r->period = Graph::processParameterPeriod( $r->period ); - $r->category = Graph::processParameterCategory( $r->category ); - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - $r->type = Graph::processParameterType( $r->type ); + $request->period = Graph::processParameterPeriod( $request->period ); + $request->category = Graph::processParameterCategory( $request->category ); + $request->protocol = Graph::processParameterProtocol( $request->protocol ); + $request->type = Graph::processParameterType( $request->type ); switch( $target ) { case 'ixp': - $r->id = 1; - $graph = $grapher->ixp()->setParamsFromArray( $r->all() ); + $request->id = 1; + $graph = $grapher->ixp()->setParamsFromArray( $request->all() ); break; case 'infrastructure': - $infra = InfrastructureGraph::processParameterInfrastructure( (int)$r->input( 'id', 0 ) ); - $r->infrastructure = $infra->id; - $graph = $grapher->infrastructure( $infra )->setParamsFromArray( $r->all() ); + $infra = InfrastructureGraph::processParameterInfrastructure( (int)$request->input( 'id', 0 ) ); + $request->infrastructure = $infra->id; + $graph = $grapher->infrastructure( $infra )->setParamsFromArray( $request->all() ); break; case 'vlan': - $vlan = VlanGraph::processParameterVlan( (int)$r->input( 'id', 0 ) ); - $r->vlan = $vlan->id; - $graph = $grapher->vlan( $vlan )->setParamsFromArray( $r->all() ); + $vlan = VlanGraph::processParameterVlan( (int)$request->input( 'id', 0 ) ); + $request->vlan = $vlan->id; + $graph = $grapher->vlan( $vlan )->setParamsFromArray( $request->all() ); break; case 'trunk': - $trunkname = TrunkGraph::processParameterTrunkname( (string)$r->input( 'id', '' ) ); - $r->trunkname = $trunkname; - $graph = $grapher->trunk( $trunkname )->setParamsFromArray( $r->all() ); + $trunkname = TrunkGraph::processParameterTrunkname( (string)$request->input( 'id', '' ) ); + $request->trunkname = $trunkname; + $graph = $grapher->trunk( $trunkname )->setParamsFromArray( $request->all() ); break; case 'corebundle': - $corebundle = CoreBundleGraph::processParameterCoreBundle( (int)$r->input( 'id', 0 ) ); - $side = CoreBundleGraph::processParameterSide( $r->input( 'side', 'a' ) ); - $r->corebundle = $corebundle->id; - $r->side = $side; - $graph = $grapher->coreBundle( $corebundle, $side )->setParamsFromArray( $r->all() ); + $corebundle = CoreBundleGraph::processParameterCoreBundle( (int)$request->input( 'id', 0 ) ); + $side = CoreBundleGraph::processParameterSide( $request->input( 'side', 'a' ) ); + $request->corebundle = $corebundle->id; + $request->side = $side; + $graph = $grapher->coreBundle( $corebundle, $side )->setParamsFromArray( $request->all() ); break; case 'location': - $location = LocationGraph::processParameterLocation( (int)$r->input( 'id', 0 ) ); - $r->location = $location->id; - $graph = $grapher->location( $location )->setParamsFromArray( $r->all() ); + $location = LocationGraph::processParameterLocation( (int)$request->input( 'id', 0 ) ); + $request->location = $location->id; + $graph = $grapher->location( $location )->setParamsFromArray( $request->all() ); break; case 'switch': - $switch = SwitchGraph::processParameterSwitch( (int)$r->input( 'id', 0 ) ); - $r->switch = $switch->id; - $graph = $grapher->switch( $switch )->setParamsFromArray( $r->all() ); + $switch = SwitchGraph::processParameterSwitch( (int)$request->input( 'id', 0 ) ); + $request->switch = $switch->id; + $graph = $grapher->switch( $switch )->setParamsFromArray( $request->all() ); break; case 'physicalinterface': - $physint = PhysIntGraph::processParameterPhysicalInterface( (int)$r->input( 'id', 0 ) ); - $r->physint = $physint->id; - $graph = $grapher->physint( $physint )->setParamsFromArray( $r->all() ); + $physint = PhysIntGraph::processParameterPhysicalInterface( (int)$request->input( 'id', 0 ) ); + $request->physint = $physint->id; + $graph = $grapher->physint( $physint )->setParamsFromArray( $request->all() ); break; case 'virtualinterface': - $virtint = VirtIntGraph::processParameterVirtualInterface( (int)$r->input( 'id', 0 ) ); - $r->virtint = $virtint->id; - $graph = $grapher->virtint( $virtint )->setParamsFromArray( $r->all() ); + $virtint = VirtIntGraph::processParameterVirtualInterface( (int)$request->input( 'id', 0 ) ); + $request->virtint = $virtint->id; + $graph = $grapher->virtint( $virtint )->setParamsFromArray( $request->all() ); break; case 'customer': - $customer = CustomerGraph::processParameterCustomer( (int)$r->input( 'id', 0 ) ); - $r->customer = $customer->id; - $graph = $grapher->customer( $customer )->setParamsFromArray( $r->all() ); + $customer = CustomerGraph::processParameterCustomer( (int)$request->input( 'id', 0 ) ); + $request->customer = $customer->id; + $graph = $grapher->customer( $customer )->setParamsFromArray( $request->all() ); break; case 'vlaninterface': - $vlanint = VlanIntGraph::processParameterVlanInterface( (int)$r->input( 'id', 0 ) ); - $r->vlanint = $vlanint->id; - $graph = $grapher->vlanint( $vlanint )->setParamsFromArray( $r->all() ); + $vlanint = VlanIntGraph::processParameterVlanInterface( (int)$request->input( 'id', 0 ) ); + $request->vlanint = $vlanint->id; + $graph = $grapher->vlanint( $vlanint )->setParamsFromArray( $request->all() ); break; case 'latency': - $vli = LatencyGraph::processParameterVlanInterface( (int)$r->input( 'id', 0 ) ); - $r->vli = $vli; - $graph = $grapher->latency( $vli )->setParamsFromArray( $r->all() ); + $vli = LatencyGraph::processParameterVlanInterface( (int)$request->input( 'id', 0 ) ); + $request->vli = $vli; + $graph = $grapher->latency( $vli )->setParamsFromArray( $request->all() ); break; case 'p2p': - $srcvlanint = P2pGraph::processParameterSourceVlanInterface( (int)$r->input( 'svli', 0 ) ); - $dstvlanint = P2pGraph::processParameterDestinationVlanInterface( (int)$r->input( 'dvli', 0 ) ); - $r->srcvlanint = $srcvlanint->id; - $r->dstvlanint = $dstvlanint->id; - $graph = $grapher->p2p( $srcvlanint, $dstvlanint )->setParamsFromArray( $r->all() ); + $srcvlanint = P2pGraph::processParameterSourceVlanInterface( (int)$request->input( 'svli', 0 ) ); + $dstvlanint = P2pGraph::processParameterDestinationVlanInterface( (int)$request->input( 'dvli', 0 ) ); + $request->srcvlanint = $srcvlanint->id; + $request->dstvlanint = $dstvlanint->id; + $graph = $grapher->p2p( $srcvlanint, $dstvlanint )->setParamsFromArray( $request->all() ); break; default: abort(404, 'No such graph type'); diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index ffc1bc8cd..619ca730e 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -25,7 +25,7 @@ use Illuminate\Http\Request; -use Fideloper\Proxy\TrustProxies as Middleware; +use Illuminate\Http\Middleware\TrustProxies as Middleware; /** * Middleware: TrustProxies diff --git a/app/Listeners/Auth/ForgotUsername.php b/app/Listeners/Auth/ForgotUsername.php index d2c9966d2..efc8d47e3 100644 --- a/app/Listeners/Auth/ForgotUsername.php +++ b/app/Listeners/Auth/ForgotUsername.php @@ -54,6 +54,7 @@ public function __construct(){} */ public function handle( ForgotUsernameEvent $e ): void { - Mail::to( $e->email )->send( new ForgotPasswordMailable( $e->users ) ); + Mail::to( $e->email ) + ->send( new ForgotPasswordMailable( $e->users ) ); } } \ No newline at end of file diff --git a/app/Mail/Grapher/PortsWithCounts.php b/app/Mail/Grapher/PortsWithCounts.php index 352d26a1d..581238072 100644 --- a/app/Mail/Grapher/PortsWithCounts.php +++ b/app/Mail/Grapher/PortsWithCounts.php @@ -46,7 +46,7 @@ class PortsWithCounts extends Mailable public $ports; /** - * @var float + * @var string */ public $category; diff --git a/app/Mail/User/UserCreated.php b/app/Mail/User/UserCreated.php index b761b23b6..c4c488276 100644 --- a/app/Mail/User/UserCreated.php +++ b/app/Mail/User/UserCreated.php @@ -55,7 +55,7 @@ class UserCreated extends Mailable /** * Existing? - * @var bool + * @var mixed */ public $token = null; diff --git a/app/Mail/Utils/SmtpTest.php b/app/Mail/Utils/SmtpTest.php deleted file mode 100644 index 0882a652e..000000000 --- a/app/Mail/Utils/SmtpTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @package IXP\Mail\Utils - * @copyright Copyright (C) 2009 - 2020 Internet Neutral Exchange Association Company Limited By Guarantee - * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 - */ -class SmtpTest extends Mailable -{ - use Queueable, SerializesModels; - - /** - * @var SwiftMail SMTP dialog logging - */ - private $logger = null; - - /** - * @var bool Debug flag to indicate if the SMTP dialog should be recorded - */ - protected $debug; - - /** - * SmtpTest constructor. - * @param bool $debug If true, record the SMTP dialog - */ - public function __construct( bool $debug = false ) - { - $this->debug = $debug; - } - - /** - * Build the message. - * - * @return $this - */ - public function build(): self - { - if( $this->debug ) { - $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; - Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); - } - - return $this->markdown( 'utils.emails.smtp-test' ) - ->subject( 'SMTP test email from IXP Manager' ); - } - - /** - * @return SwiftMail|null - */ - public function logger() - { - return $this->logger; - } -} diff --git a/app/Models/Aggregators/BgpSessionDataAggregator.php b/app/Models/Aggregators/BgpSessionDataAggregator.php index 91cb4ba99..17e885422 100644 --- a/app/Models/Aggregators/BgpSessionDataAggregator.php +++ b/app/Models/Aggregators/BgpSessionDataAggregator.php @@ -7,7 +7,7 @@ use Illuminate\Database\Eloquent\Model; use IXP\Models\BgpSessionData; use IXP\Models\Vlan; -use IXP_Exception; +use IXP\Exceptions\GeneralException as IXP_Exception; /** * IXP\Models\BGPSessionData @@ -74,11 +74,11 @@ class BgpSessionDataAggregator extends BgpSessionData * @param int|null $asn Optional ASN to limit the query to * @param bool $forceDb Set to true to ignore the cache and force the query to the database * - * @return array Array of peerings (as described above) + * @return array|string Array of peerings (as described above) * * @throws */ - public static function getPeers( ?int $vlan = null, int $protocol = 6, ?int $asn = null, bool $forceDb = false ): array + public static function getPeers( ?int $vlan = null, int $protocol = 6, ?int $asn = null, bool $forceDb = false ): array|string { $key = "pm_sessions_{$vlan}_{$protocol}"; diff --git a/app/Models/Customer.php b/app/Models/Customer.php index 76f87e2a5..6f0e54a46 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -838,10 +838,10 @@ public function getFormattedName( $fmt = null ): ?string return str_replace( [ '%n', '%a', '%s', '%i', '%j', '%k', '%l' ], [ - $this->name, - $this->abbreviatedName, - $this->shortname, - $as ?: '', + $this->name ?: '', + $this->abbreviatedName ?: '', + $this->shortname ?: '', + $as ? (string) $as : '', $as ? "[AS{$as}]" : '', $as ? "AS{$as}" : '', $as ? " - AS{$as}" : '' diff --git a/app/Models/DocstoreCustomerDirectory.php b/app/Models/DocstoreCustomerDirectory.php index d37860699..0dcd2da30 100644 --- a/app/Models/DocstoreCustomerDirectory.php +++ b/app/Models/DocstoreCustomerDirectory.php @@ -241,7 +241,7 @@ public static function getHierarchyForCustomerAndUserClass( Customer $cust, int } )->get()->isNotEmpty(); if( $rootDirVisible && $showRoot ) { - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + self::$dirs[] = [ 'id' => null, 'name' => 'Root Directory' ]; } } diff --git a/app/Models/DocstoreDirectory.php b/app/Models/DocstoreDirectory.php index b229bc813..a2ad57d61 100644 --- a/app/Models/DocstoreDirectory.php +++ b/app/Models/DocstoreDirectory.php @@ -207,7 +207,7 @@ public static function getHierarchyForUserClass( int $priv = User::AUTH_SUPERUSE } )->get()->isNotEmpty(); if( $rootDirVisible ) { - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + self::$dirs[] = [ 'id' => null, 'name' => 'Root Directory' ]; } } return self::$dirs; diff --git a/app/Models/Switcher.php b/app/Models/Switcher.php index 823d0ff73..e64bbce1e 100644 --- a/app/Models/Switcher.php +++ b/app/Models/Switcher.php @@ -320,9 +320,9 @@ public function snmpPoll( $host, bool $logger = false, bool $nosave = false ): S // does this switch support the IANA MAU MIB? try { $host->useMAU()->types(); - $this->mauSupported = true; + $this->mauSupported = 1; } catch( \OSS_SNMP\Exception $e ) { - $this->mauSupported = false; + $this->mauSupported = 0; } // uptime data diff --git a/app/Models/VirtualInterface.php b/app/Models/VirtualInterface.php index 17402b342..d1ba72306 100644 --- a/app/Models/VirtualInterface.php +++ b/app/Models/VirtualInterface.php @@ -232,9 +232,9 @@ public function fanoutPhysicalInterface(): array /** * Get a Switch Port of a virtual interface. * - * @return SwitchPort|bool The switch port or false if no switch port. + * @return bool|SwitchPort|null The switch port or false if no switch port. */ - public function switchPort() + public function switchPort(): bool|SwitchPort|null { if( $this->physicalInterfaces()->count() ){ return $this->physicalInterfaces()->first()->switchPort; diff --git a/app/Policies/CustomerPolicy.php b/app/Policies/CustomerPolicy.php index feef6f6ce..a716720f5 100644 --- a/app/Policies/CustomerPolicy.php +++ b/app/Policies/CustomerPolicy.php @@ -79,7 +79,6 @@ public function view( User $user, Customer $customer ): bool * * @param User $user * - * @return mixed */ public function create( User $user ) { @@ -92,7 +91,6 @@ public function create( User $user ) * @param User $user * @param Customer $customer * - * @return mixed */ public function update(User $user, Customer $customer) { @@ -104,7 +102,7 @@ public function update(User $user, Customer $customer) * * @param User $user * @param Customer $customer - * @return mixed + * */ public function delete( User $user, Customer $customer ) { @@ -116,7 +114,7 @@ public function delete( User $user, Customer $customer ) * * @param User $user * @param Customer $customer - * @return mixed + * */ public function restore( User $user, Customer $customer ) { @@ -129,7 +127,6 @@ public function restore( User $user, Customer $customer ) * @param User $user * @param Customer $customer * - * @return mixed */ public function forceDelete( User $user, Customer $customer ) { diff --git a/app/Policies/DocstoreLogPolicy.php b/app/Policies/DocstoreLogPolicy.php index 0f7ae4f46..fb4bc6b53 100644 --- a/app/Policies/DocstoreLogPolicy.php +++ b/app/Policies/DocstoreLogPolicy.php @@ -55,7 +55,6 @@ public function before( $user, $ability ) * * @param User $user * - * @return mixed */ public function viewAny( User $user ) {} } diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php index 3f98577f3..ab18ed6b0 100644 --- a/app/Providers/BroadcastServiceProvider.php +++ b/app/Providers/BroadcastServiceProvider.php @@ -45,6 +45,6 @@ class BroadcastServiceProvider extends ServiceProvider public function boot(): void { Broadcast::routes(); - require base_path('routes/channels.php'); + /* require base_path('routes/channels.php'); */ } } \ No newline at end of file diff --git a/app/Providers/HelpdeskServiceProvider.php b/app/Providers/HelpdeskServiceProvider.php index 71729a2ee..79456b722 100644 --- a/app/Providers/HelpdeskServiceProvider.php +++ b/app/Providers/HelpdeskServiceProvider.php @@ -90,7 +90,7 @@ public function register(): void * * @return array */ - public function provides(): arrau + public function provides(): array { return [ Helpdesk::class ]; } diff --git a/app/Providers/PurifierServiceProvider.php b/app/Providers/PurifierServiceProvider.php index 1fddd027f..92caf0f15 100644 --- a/app/Providers/PurifierServiceProvider.php +++ b/app/Providers/PurifierServiceProvider.php @@ -7,6 +7,7 @@ use Illuminate\Container\Container; use Illuminate\Support\ServiceProvider; +use Illuminate\Foundation\Application as LaravelApplication; use IXP\Services\Purifier; @@ -22,9 +23,8 @@ class PurifierServiceProvider extends ServiceProvider /** * Boot the service provider. * - * @return null */ - public function boot() + public function boot(): void { $this->setupConfig(); } @@ -34,7 +34,7 @@ public function boot() * * @return void */ - protected function setupConfig() + protected function setupConfig(): void { $source = config_path( 'purifier.php' ); if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { diff --git a/app/Services/FoilEngine.php b/app/Services/FoilEngine.php index 9d6adf22d..fcdcbe9ea 100644 --- a/app/Services/FoilEngine.php +++ b/app/Services/FoilEngine.php @@ -28,8 +28,7 @@ class FoilEngine implements EngineInterface { - /** @var PlatesEngine */ - private $engine; + private EngineFoil $engine; public function __construct( EngineFoil $engine ) { @@ -49,7 +48,7 @@ public function engine(): EngineFoil * * @return string */ - public function get( $path, array $data = array() ) + public function get( $path, array $data = array() ): string { return $this->engine->render( $path, $data ); } diff --git a/app/Services/Grapher.php b/app/Services/Grapher.php index ef7a81aba..c6012804e 100644 --- a/app/Services/Grapher.php +++ b/app/Services/Grapher.php @@ -85,7 +85,7 @@ class Grapher /** * Is the cache enabled? * - * @var bool + * @var integer */ private $cacheLifetime = 300; diff --git a/app/Services/Grapher/Backend/Mrtg.php b/app/Services/Grapher/Backend/Mrtg.php index 53917bfc1..c973f357f 100644 --- a/app/Services/Grapher/Backend/Mrtg.php +++ b/app/Services/Grapher/Backend/Mrtg.php @@ -471,7 +471,7 @@ public function png( Graph $graph ): string return @file_get_contents( $rrd->png() ); } catch( FileErrorException $e ) { Log::notice("[Grapher] {$this->name()} png(): could not load rrd file " . ( isset( $rrd ) ? $rrd->file() : '???' ) ); - return false; // FIXME check handling of this + return ''; // FIXME check handling of this } } diff --git a/app/Services/Grapher/Backend/Sflow.php b/app/Services/Grapher/Backend/Sflow.php index 0a76fe813..36e70ac9b 100644 --- a/app/Services/Grapher/Backend/Sflow.php +++ b/app/Services/Grapher/Backend/Sflow.php @@ -203,7 +203,7 @@ public function png( Graph $graph ): string return @file_get_contents( $rrd->png() ); } catch( FileErrorException $e ) { Log::notice("[Grapher] {$this->name()} png(): could not load rrd file " . ( isset( $rrd ) ? $rrd->file() : '???' ) ); - return false; // FIXME check handling of this + return ''; // FIXME check handling of this } } @@ -225,7 +225,7 @@ public function rrd( Graph $graph ): string return $rrd->rrd(); } catch( FileErrorException $e ) { Log::notice("[Grapher] {$this->name()} rrd(): could not load rrd file {$rrd->file()}"); - return false; // FIXME check handling of this + return ''; // FIXME check handling of this } } diff --git a/app/Services/Grapher/Graph.php b/app/Services/Grapher/Graph.php index ce0c683ee..53afb23de 100644 --- a/app/Services/Grapher/Graph.php +++ b/app/Services/Grapher/Graph.php @@ -662,14 +662,16 @@ public function key(): string * In it's default incarnation, this will **always** fail. You need to explicitly * allow graph access based on your own requirements. * - * @return bool + * UNFINISHED METHOD! + * + * @return void //bool * * @throws */ - public function authorise(): bool + public function authorise(): void { $this->deny(); - return false; + /*return false;*/ } /** @@ -706,23 +708,23 @@ public function period(): string /** * Set the period we should use * - * @param string $v + * @param string $value * * @return Graph Fluid interface * * @throws ParameterException */ - public function setPeriod( string $v ): Graph + public function setPeriod( string $value ): Graph { - if( !isset( $this::PERIODS[ $v ] ) ) { - throw new ParameterException('Invalid period ' . $v ); + if( !isset( $this::PERIODS[ $value ] ) ) { + throw new ParameterException('Invalid period ' . $value ); } - if( $this->period() !== $v ) { + if( $this->period() !== $value ) { $this->wipe(); } - $this->period = $v; + $this->period = $value; return $this; } @@ -751,23 +753,23 @@ public function protocol(): string /** * Set the protocol we should use * - * @param string $v + * @param string $value * * @return Graph Fluid interface * * @throws ParameterException */ - public function setProtocol( string $v ): Graph + public function setProtocol( string $value ): Graph { - if( !isset( $this::PROTOCOLS[ $v ] ) ) { - throw new ParameterException('Invalid protocol ' . $v ); + if( !isset( $this::PROTOCOLS[ $value ] ) ) { + throw new ParameterException('Invalid protocol ' . $value ); } - if( $this->protocol() !== $v ) { + if( $this->protocol() !== $value ) { $this->wipe(); } - $this->protocol = $v; + $this->protocol = $value; return $this; } @@ -817,23 +819,23 @@ public static function resolveCategory( string $category ): string /** * Set the category we should use * - * @param string $v + * @param string $category_value * * @return Graph Fluid interface * * @throws ParameterException */ - public function setCategory( string $v ): Graph + public function setCategory( string $category_value ): Graph { - if( !isset( $this::CATEGORIES[ $v ] ) ) { - throw new ParameterException('Invalid category ' . $v ); + if( !isset( $this::CATEGORIES[ $category_value ] ) ) { + throw new ParameterException('Invalid category ' . $category_value ); } - if( $this->category() !== $v ) { + if( $this->category() !== $category_value ) { $this->wipe(); } - $this->category = $v; + $this->category = $category_value; return $this; } @@ -849,23 +851,23 @@ public function type(): string /** * Set the type we should use * - * @param string $v + * @param string $type_value * * @return Graph Fluid interface * * @throws ParameterException */ - public function setType( string $v ): Graph + public function setType( string $type_value ): Graph { - if( !isset( $this::TYPES[ $v ] ) ) { - throw new ParameterException('Invalid type ' . $v ); + if( !isset( $this::TYPES[ $type_value ] ) ) { + throw new ParameterException('Invalid type ' . $type_value ); } - if( $this->type() !== $v ) { + if( $this->type() !== $type_value ) { $this->wipe(); } - $this->type = $v; + $this->type = $type_value; return $this; } @@ -900,11 +902,11 @@ public function setParamsFromArray( array $params ): Graph */ public function getParamsAsArray(): array { - $p = []; + $parameters = []; foreach( [ 'type', 'category', 'period', 'protocol'] as $param ){ - $p[ $param ] = $this->$param(); + $parameters[ $param ] = $this->$param(); } - return $p; + return $parameters; } /** @@ -913,17 +915,17 @@ public function getParamsAsArray(): array * Note that this function just sets the default if the input is invalid. * If you want to force an exception in such cases, use setPeriod() * - * @param string|null $v The user input value - * @param string|null $d The preferred default value + * @param string|null $value The user input value + * @param string|null $default The preferred default value * - * @return string The verified / sanitised / default value + * @return string|null The verified / sanitised / default value */ - public static function processParameterPeriod( $v = null, $d = null ): string + public static function processParameterPeriod( string $value = null, string $default = null ): string|null { - if( !isset( self::PERIODS[ $v ] ) ) { - $v = $d ?? self::PERIOD_DEFAULT; + if( !isset( self::PERIODS[ $value ] ) ) { + $value = $default ?? self::PERIOD_DEFAULT; } - return $v; + return $value; } /** @@ -932,16 +934,16 @@ public static function processParameterPeriod( $v = null, $d = null ): string * Note that this function just sets the default if the input is invalid. * If you want to force an exception in such cases, use setProtocol() * - * @param string|null $v The user input value + * @param string|null $value The user input value * - * @return string The verified / sanitised / default value + * @return string|null The verified / sanitised / default value */ - public static function processParameterProtocol( $v = null ): string + public static function processParameterProtocol( string $value = null ): string|null { - if( !isset( self::PROTOCOLS[ $v ] ) ) { - $v = self::PROTOCOL_DEFAULT; + if( !isset( self::PROTOCOLS[ $value ] ) ) { + $value = self::PROTOCOL_DEFAULT; } - return $v; + return $value; } /** @@ -950,15 +952,15 @@ public static function processParameterProtocol( $v = null ): string * Note that this function just sets the default (ipv4) if the input is invalid. * If you want to force an exception in such cases, use setProtocol() * - * @param string|null $v The user input value - * @return string The verified / sanitised / default value + * @param string|null $value The user input value + * @return string|null The verified / sanitised / default value */ - public static function processParameterRealProtocol( $v = null ): string + public static function processParameterRealProtocol( string $value = null ): string|null { - if( !isset( self::PROTOCOLS_REAL[ $v ] ) ) { - $v = self::PROTOCOL_IPV4; + if( !isset( self::PROTOCOLS_REAL[ $value ] ) ) { + $value = self::PROTOCOL_IPV4; } - return $v; + return $value; } /** @@ -967,17 +969,17 @@ public static function processParameterRealProtocol( $v = null ): string * Note that this function just sets the default if the input is invalid. * If you want to force an exception in such cases, use setCategory() * - * @param string|null $v The user input value + * @param string|null $value The user input value * @param bool $bits_pkts_only * - * @return string The verified / sanitised / default value + * @return string|null The verified / sanitised / default value */ - public static function processParameterCategory( $v = null, $bits_pkts_only = false ): string + public static function processParameterCategory( string $value = null, bool $bits_pkts_only = false ): string|null { - if( ( $bits_pkts_only && !isset( self::CATEGORIES_BITS_PKTS[$v] ) ) || ( !$bits_pkts_only && !isset( self::CATEGORIES[ $v ] ) ) ) { - $v = self::CATEGORY_DEFAULT; + if( ( $bits_pkts_only && !isset( self::CATEGORIES_BITS_PKTS[$value] ) ) || ( !$bits_pkts_only && !isset( self::CATEGORIES[ $value ] ) ) ) { + $value = self::CATEGORY_DEFAULT; } - return $v; + return $value; } /** @@ -986,15 +988,15 @@ public static function processParameterCategory( $v = null, $bits_pkts_only = fa * Note that this function just sets the default if the input is invalid. * If you want to force an exception in such cases, use setType() * - * @param string|null $v The user input value + * @param string|null $value The user input value * - * @return string The verified / sanitised / default value + * @return string|null The verified / sanitised / default value */ - public static function processParameterType( $v = null ): string + public static function processParameterType( string $value = null ): string|null { - if( !isset( self::TYPES[ $v ] ) ) { - $v = self::TYPE_DEFAULT; + if( !isset( self::TYPES[ $value ] ) ) { + $value = self::TYPE_DEFAULT; } - return $v; + return $value; } } \ No newline at end of file diff --git a/app/Services/Grapher/Graph/Customer.php b/app/Services/Grapher/Graph/Customer.php index 892e6f281..a28ee9036 100644 --- a/app/Services/Grapher/Graph/Customer.php +++ b/app/Services/Grapher/Graph/Customer.php @@ -99,7 +99,7 @@ public function setCustomer( CustomerModel $c ): Customer */ public function name(): string { - return $this->customer()->name; + return $this->customer()->name ?: ''; } /** diff --git a/app/Services/Grapher/Graph/IXP.php b/app/Services/Grapher/Graph/IXP.php index 9d4eb0bd8..d10308cf0 100644 --- a/app/Services/Grapher/Graph/IXP.php +++ b/app/Services/Grapher/Graph/IXP.php @@ -49,9 +49,9 @@ class IXP extends Graph * * @param array $params * - * @return Grapher Fluid interface + * @return IXP Fluid interface */ - public function setParamsFromArray( array $params ): Graph + public function setParamsFromArray( array $params ): IXP { parent::setParamsFromArray( $params ); return $this; @@ -95,7 +95,6 @@ public function authorise(): bool if( in_array( $this->category(), [ self::CATEGORY_ERRORS, self::CATEGORY_DISCARDS ], true ) ) { $this->deny(); - return false; } if( is_numeric( config( 'grapher.access.ixp' ) ) && (int)config( 'grapher.access.ixp' ) === User::AUTH_PUBLIC ) { @@ -107,7 +106,6 @@ public function authorise(): bool } $this->deny(); - return false; } /** diff --git a/app/Services/Grapher/Graph/Infrastructure.php b/app/Services/Grapher/Graph/Infrastructure.php index 26988eb2b..311109bc9 100644 --- a/app/Services/Grapher/Graph/Infrastructure.php +++ b/app/Services/Grapher/Graph/Infrastructure.php @@ -99,7 +99,7 @@ public function setInfrastructure( InfrastructureModel $infra ): Infrastructure */ public function name(): string { - return $this->infrastructure()->name; + return $this->infrastructure()->name ?: ''; } /** diff --git a/app/Services/Grapher/Graph/Latency.php b/app/Services/Grapher/Graph/Latency.php index 41c0dfc7b..b0f013630 100644 --- a/app/Services/Grapher/Graph/Latency.php +++ b/app/Services/Grapher/Graph/Latency.php @@ -126,23 +126,23 @@ public function __construct( Grapher $grapher, VlanInterfaceModel $vli ) /** * Set the period we should use * - * @param string $v + * @param string $value * * @return Graph Fluid interface * * @throws ParameterException */ - public function setPeriod( string $v ): Graph + public function setPeriod( string $value ): Graph { - if( !isset( self::PERIODS[ $v ] ) ) { - throw new ParameterException('Invalid period ' . $v ); + if( !isset( self::PERIODS[ $value ] ) ) { + throw new ParameterException('Invalid period ' . $value ); } - if( $this->period() !== $v ) { + if( $this->period() !== $value ) { $this->wipe(); } - $this->period = $v; + $this->period = $value; return $this; } diff --git a/app/Services/Grapher/Graph/Location.php b/app/Services/Grapher/Graph/Location.php index 821fd292b..906d7feb0 100644 --- a/app/Services/Grapher/Graph/Location.php +++ b/app/Services/Grapher/Graph/Location.php @@ -97,7 +97,7 @@ public function setLocation( LocationModel $location ): Location */ public function name(): string { - return $this->location()->name; + return $this->location()->name ?: ''; } /** diff --git a/app/Services/Grapher/Graph/Switcher.php b/app/Services/Grapher/Graph/Switcher.php index ec41d6d4c..28c30b88f 100644 --- a/app/Services/Grapher/Graph/Switcher.php +++ b/app/Services/Grapher/Graph/Switcher.php @@ -98,7 +98,7 @@ public function setSwitch( SwitcherModel $switch ): Switcher */ public function name(): string { - return $this->switch()->name; + return $this->switch()->name ?: ''; } /** diff --git a/app/Services/Grapher/Graph/Vlan.php b/app/Services/Grapher/Graph/Vlan.php index de1c6bf6d..39ec09f16 100644 --- a/app/Services/Grapher/Graph/Vlan.php +++ b/app/Services/Grapher/Graph/Vlan.php @@ -99,7 +99,7 @@ public function setVlan( VlanModel $vlan ): Vlan */ public function name(): string { - return $this->vlan()->name; + return $this->vlan()->name ?: ''; } /** diff --git a/app/Services/Grapher/Renderer/Extensions/Grapher.php b/app/Services/Grapher/Renderer/Extensions/Grapher.php index 0064f4502..8dca281c8 100644 --- a/app/Services/Grapher/Renderer/Extensions/Grapher.php +++ b/app/Services/Grapher/Renderer/Extensions/Grapher.php @@ -101,14 +101,14 @@ public function escapeCommunityForMrtg( string $c ): string * 1 => scaled value without string. E.g. 12,354.235 * 2 => just the string. E.g. Tbits * - * @param float $v The value to scale + * @param float $value The value to scale * @param string $format The format to sue (as above: bytes / pkts / errs / etc ) - * @param int $decs Number of decimals after the decimal point. Defaults to 3. + * @param int $decimals Number of decimals after the decimal point. Defaults to 3. * @param int $returnType Type of string to return. Valid values are listed above. Defaults to 0. * * @return string Scaled / formatted number / type. */ - public function scale( float $v, string $format, int $decs = 3, int $returnType = 0 ): string + public function scale( float $value, string $format, int $decimals = 3, int $returnType = 0 ): string { if( $format === "bytes" ) { $formats = [ @@ -126,15 +126,16 @@ public function scale( float $v, string $format, int $decs = 3, int $returnType for( $i = 0; $i < sizeof( $formats ); $i++ ) { - if( ( $v / 1000.0 < 1.0 ) || ( sizeof( $formats ) === $i + 1 ) ) { + $format = $i>4 ? $formats[4] : $formats[$i]; + if( ( $value / 1000.0 < 1.0 ) || ( sizeof( $formats ) === $i + 1 ) ) { if( $returnType == 0 ) - return number_format( $v, $decs ) . " " . $formats[$i]; + return number_format( $value, $decimals ) . " " . $format; elseif( $returnType == 1 ) - return number_format( $v, $decs ); + return number_format( $value, $decimals ); else - return $formats[$i]; + return $format; } else { - $v /= 1000.0; + $value /= 1000.0; } } diff --git a/app/Services/Grapher/Statistics.php b/app/Services/Grapher/Statistics.php index 452be0acc..01fdaf51d 100644 --- a/app/Services/Grapher/Statistics.php +++ b/app/Services/Grapher/Statistics.php @@ -39,49 +39,49 @@ class Statistics /** * Total packets/bits in * - * @var int + * @var float */ private $totalIn; /** * Total packets/bits out * - * @var int + * @var float */ private $totalOut; /** * Current packets/bits in * - * @var int + * @var float */ private $curIn; /** * Current packets/bits out * - * @var int + * @var float */ private $curOut; /** * Average packets/bits in * - * @var int + * @var float */ private $averageIn; /** * Average packets/bits out * - * @var int + * @var float */ private $averageOut; /** * Max packets/bits in * - * @var int + * @var float */ private $maxIn; @@ -95,7 +95,7 @@ class Statistics /** * Max packets/bits out * - * @var int + * @var float */ private $maxOut; @@ -212,26 +212,26 @@ function process() /** * Set statistics value * - * @param float $v + * @param float $value * * @return Statistics (for fluid interface) */ - public function setTotalIn( float $v ): Statistics + public function setTotalIn( float $value ): Statistics { - $this->totalIn = $v; + $this->totalIn = $value; return $this; } /** * Set statistics value * - * @param float $v + * @param float $value * * @return Statistics (for fluid interface) */ - public function setTotalOut( float $v ): Statistics + public function setTotalOut( float $value ): Statistics { - $this->totalOut = $v; + $this->totalOut = $value; return $this; } diff --git a/app/Services/Helpdesk/Zendesk.php b/app/Services/Helpdesk/Zendesk.php index 4737cfd3d..67f49c99a 100644 --- a/app/Services/Helpdesk/Zendesk.php +++ b/app/Services/Helpdesk/Zendesk.php @@ -47,9 +47,9 @@ class Zendesk implements HelpdeskContract /** * The Zendesk Client * - * @var Zendesk\API\Client + * @var ZendeskAPI */ - private $client; + private ZendeskAPI $client; /** * Debug object @@ -93,7 +93,7 @@ protected function callApi( $fn ) $apie = new ApiException( "Zendesk API error - further details available from \$helpdeskInstance->getDebug() / \$this->getErrorDetails()" ); if( $e instanceof \Zendesk\API\Exceptions\ApiResponseException ) - $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); + $apie->setErrorDetails( (object)$e->getErrorDetails() ); throw $apie; } @@ -132,11 +132,11 @@ public function ticketsFindAll() * Convert a IXP Customer entity into an associated array as rerquired by Zendesk's API * * @param Customer $cust The IXP Manager customer entity - * @param bool $id If updating, set to Zendesk organisation ID + * @param bool|int $id If updating, set to Zendesk organisation ID * * @return array Data in associate array format as required by Zendesk PHP API */ - private function customerEntityToZendeskObject( Customer $cust, $id = false ): array + private function customerEntityToZendeskObject( Customer $cust, bool|int $id = false ): array { $data = []; $data['external_id'] = $cust->id; @@ -287,7 +287,7 @@ public function organisationCreate( Customer $cust ) public function organisationUpdate( int $helpdeskId, Customer $cust ) { $response = $this->callApi( function() use ( $cust, $helpdeskId ) { - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + return $this->client->organizations()->update( null, $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); }); if( isset( $response->organization ) ) @@ -457,7 +457,7 @@ public function userCreate( Contact $contact, $org_id ) * @param int $helpdeskId The ID of the helpdesk's user object * @param Contact $contact An IXP Manager contact as returned by `userFind()` * - * @return Contact Decoupled contact object with `helpdesk_id` + * @return Contact|bool Decoupled contact object with `helpdesk_id` * * @throws \IXP\Services\Helpdesk\ApiException */ @@ -471,7 +471,6 @@ public function userUpdate( int $helpdeskId, Contact $contact ): Contact return $this->zendeskObjectToContactEntity( $response->user ); } - return false; } diff --git a/app/Services/IXF.php b/app/Services/IXF.php index 44521b53d..6001ff88a 100644 --- a/app/Services/IXF.php +++ b/app/Services/IXF.php @@ -24,6 +24,7 @@ */ use Exception; +use Throwable; use Illuminate\Http\Client\Response as HttpResponse; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; @@ -38,7 +39,7 @@ * @copyright Copyright (C) 2009 - 2024 Internet Neutral Exchange Association Company Limited By Guarantee * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 */ -class IXF +class IXF extends Exception { /** @const Cache key for IXs */ @@ -56,9 +57,9 @@ class IXF public int $status = 0; /** - * @var ?Exception If the api call threw an exception, it is caught and stored here. + * @var Exception If the api call threw an exception, it is caught and stored here. */ - public ?Exception $exception; + public Exception $exception; diff --git a/app/Services/LookingGlass.php b/app/Services/LookingGlass.php index 0885b8120..93dadbce4 100644 --- a/app/Services/LookingGlass.php +++ b/app/Services/LookingGlass.php @@ -64,7 +64,7 @@ public function forRouter( Router $router ) return $be; break; default: - throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); + throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $router->apiType() ); } } } \ No newline at end of file diff --git a/app/Services/LookingGlass/BirdsEye.php b/app/Services/LookingGlass/BirdsEye.php index bd4f9c70c..d2473e87b 100644 --- a/app/Services/LookingGlass/BirdsEye.php +++ b/app/Services/LookingGlass/BirdsEye.php @@ -69,7 +69,7 @@ public function __construct( Router $r ) * * @return BirdsEye */ - public function setCacheEnabled( bool $b ): Birdseye + public function setCacheEnabled( bool $b ): BirdsEye { $this->cacheEnabled = $b; return $this; diff --git a/app/Services/PeeringDb.php b/app/Services/PeeringDb.php index 76efb819e..45c6487a3 100644 --- a/app/Services/PeeringDb.php +++ b/app/Services/PeeringDb.php @@ -40,7 +40,7 @@ * @copyright Copyright (C) 2009 - 2024 Internet Neutral Exchange Association Company Limited By Guarantee * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 */ -class PeeringDb +class PeeringDb extends Exception { /** @const Cache key for IXs */ @@ -60,9 +60,9 @@ class PeeringDb public int $status = 0; /** - * @var ?Exception If the api call threw an exception, it is caught and stored here. + * @var Exception If the api call threw an exception, it is caught and stored here. */ - public ?Exception $exception; + public Exception $exception; diff --git a/app/Services/Purifier.php b/app/Services/Purifier.php index 2843033c7..23e3286f7 100644 --- a/app/Services/Purifier.php +++ b/app/Services/Purifier.php @@ -22,6 +22,7 @@ use Exception; use HTMLPurifier; use HTMLPurifier_Config; +use HTMLPurifier_HTMLDefinition; use Illuminate\Contracts\Config\Repository; use Illuminate\Filesystem\Filesystem; @@ -109,9 +110,9 @@ private function setUp() * * @see http://htmlpurifier.org/docs/enduser-customize.html * @param array $definitionConfig - * @param HTML_Purifier_Config $configObject Defaults to using default config + * @param HTMLPurifier_Config $configObject Defaults to using default config * - * @return HTML_Purifier_Config $configObject + * @return HTMLPurifier_Config $configObject */ private function addCustomDefinition(array $definitionConfig, $configObject = null) { @@ -174,9 +175,9 @@ private function addCustomAttributes(array $attributes, $definition) * @param array $elements * @param HTMLPurifier_HTMLDefinition $definition * - * @return HTMLPurifier_HTMLDefinition $definition + * @return void $definition */ - private function addCustomElements(array $elements, $definition) + private function addCustomElements(array $elements, $definition): void { foreach ($elements as $element) { // Get configuration of element diff --git a/app/Services/RipeAtlas/Interpretor.php b/app/Services/RipeAtlas/Interpretor.php index 27951923f..0bdbd7c01 100644 --- a/app/Services/RipeAtlas/Interpretor.php +++ b/app/Services/RipeAtlas/Interpretor.php @@ -28,6 +28,7 @@ AtlasResult, Customer }; +use phpseclib3\Math\PrimeField\Integer; /** * RipeAtlas Interpretor @@ -142,9 +143,9 @@ private function parsePath( array $tracert ): array * @param array $path Path of IP addresses * @param array $addrs List of addresses to find in $path * - * @return bool + * @return integer */ - private function queryPassesThrough( array &$path, array $addrs ) + private function queryPassesThrough( array &$path, array $addrs ): integer { foreach( $path[ 'hops' ] as $ipset ) { diff --git a/app/Support/helpers.php b/app/Support/helpers.php index db7aae6d0..9c08360ab 100644 --- a/app/Support/helpers.php +++ b/app/Support/helpers.php @@ -94,14 +94,15 @@ function ixp_min_auth( int $minAuth ): bool * * Source: https://stackoverflow.com/questions/33268683/how-to-get-client-ip-address-in-laravel-5/41769505#41769505 * - * @return string + * @return string|null */ - function ixp_get_client_ip(): string + function ixp_get_client_ip(): null|string { // look for public: foreach( [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ] as $key ) { if( array_key_exists( $key, $_SERVER ) === true ) { - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + $value = (string)$_SERVER[ $key ]; + foreach( explode(',', $value ) as $ip ) { $ip = trim( $ip ); if( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) { return $ip; @@ -113,7 +114,8 @@ function ixp_get_client_ip(): string // accept private: foreach( [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ] as $key ) { if( array_key_exists( $key, $_SERVER ) === true ) { - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + $value = (string)$_SERVER[ $key ]; + foreach( explode(',', $value ) as $ip ) { $ip = trim( $ip ); if( filter_var( $ip, FILTER_VALIDATE_IP ) !== false ) { return $ip; diff --git a/app/Tasks/Irrdb/UpdateAsnDb.php b/app/Tasks/Irrdb/UpdateAsnDb.php index c0edce102..944c3ccfc 100644 --- a/app/Tasks/Irrdb/UpdateAsnDb.php +++ b/app/Tasks/Irrdb/UpdateAsnDb.php @@ -87,19 +87,19 @@ public function update(): array * Validate a given array of CIDR formatted prefixes for the given protocol and * remove (and alert on) any elements failing validation. * - * @param array $asns ASNs from IRRDB + * @param array $prefixes ASNs from IRRDB * @param int $protocol Either 4/6 * * @return array Valid ASNs */ - protected function validate( array $asns, int $protocol ) : array + protected function validate( array $prefixes, int $protocol ) : array { - foreach( $asns as $i => $a ) { - if( !is_numeric( $a ) || $a <= 0 || $a > 4294967294 ) { - unset( $asns[ $i ] ); - Log::alert( 'IRRDB CLI action - removing invalid ASN ' . $a . ' from IRRDB result set!' ); + foreach( $prefixes as $key => $value ) { + if( !is_numeric( $value ) || $value <= 0 || $value > 4294967294 ) { + unset( $prefixes[ $key ] ); + Log::alert( 'IRRDB CLI action - removing invalid ASN ' . $value . ' from IRRDB result set!' ); } } - return $asns; + return $prefixes; } } diff --git a/app/Tasks/Irrdb/UpdatePrefixDb.php b/app/Tasks/Irrdb/UpdatePrefixDb.php index c18d8fc01..da29c8491 100644 --- a/app/Tasks/Irrdb/UpdatePrefixDb.php +++ b/app/Tasks/Irrdb/UpdatePrefixDb.php @@ -105,10 +105,10 @@ protected function validate( array $prefixes, int $protocol ): array $validator = new ValidateIPv6Cidr; } - foreach( $prefixes as $i => $p ) { - if( !$validator->passes( [], $p ) ) { - unset( $prefixes[$i] ); - Log::alert( 'IRRDB CLI action - removing invalid prefix ' . $p . ' from IRRDB result set!' ); + foreach( $prefixes as $key => $prefix ) { + if( !$validator->passes( '', $prefix ) ) { + unset( $prefixes[$key] ); + Log::alert( 'IRRDB CLI action - removing invalid prefix ' . $prefix . ' from IRRDB result set!' ); } } diff --git a/app/Utils/Bgpq3.php b/app/Utils/Bgpq3.php index eeb6a66b2..7ba3f0df9 100644 --- a/app/Utils/Bgpq3.php +++ b/app/Utils/Bgpq3.php @@ -102,7 +102,7 @@ public function getPrefixList( string $asmacro, int $proto = 4 ): array */ public function getAsnList( string $asmacro, int $proto = 4 ): array { - $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); + $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), $proto ); $array = json_decode( $json, true ); if( $array === null ){ diff --git a/app/Utils/Foil/Extensions/IXP.php b/app/Utils/Foil/Extensions/IXP.php index 4e4284921..7c2657049 100644 --- a/app/Utils/Foil/Extensions/IXP.php +++ b/app/Utils/Foil/Extensions/IXP.php @@ -99,10 +99,10 @@ public function maxFileUploadSize(): string if( $unit ) { // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by. - return round( $size * ( 1024 ** stripos( 'bkmgtpezy', $unit[0] ) ) ); + return (string)round( $size * ( 1024 ** stripos( 'bkmgtpezy', $unit[0] ) ) ); } - return round( $size ); + return (string)round( $size * 1 ); }; if( $max_size === null ) { @@ -165,16 +165,17 @@ private function scale( float $v, string $format, int $decs = 3, int $returnType $num_formats = count( $formats ); for( $i = 0; $i < $num_formats; $i++ ) { + $format = $i > 4 ? $formats[ 4 ] : $formats[ $i ]; if( ( $v / 1000.0 < 1.0 ) || ( $num_formats === $i + 1 ) ) { if( $returnType === 0 ) { - return number_format( $v, $decs ) . ' ' . $formats[ $i ]; + return number_format( $v, $decs ) . ' ' . $format; } if( $returnType === 1 ) { return number_format( $v, $decs ); } - return $formats[ $i ]; + return $format; } $v /= 1000.0; diff --git a/app/Utils/Former/Framework/TwitterBootstrap4.php b/app/Utils/Former/Framework/TwitterBootstrap4.php index 6298d674e..6357770b5 100644 --- a/app/Utils/Former/Framework/TwitterBootstrap4.php +++ b/app/Utils/Former/Framework/TwitterBootstrap4.php @@ -176,7 +176,7 @@ public function wrapActions( $actions ): string if( $class === 'grey-box' ){ return Element::create('div', $actions )->addClass( "bg-light p-4 mt-4 shadow-sm text-center col-lg-12" ); } - return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); + return Element::create('div', $actions )->addClass( $this->fieldOffset.' '.$this->fieldWidth.' '.$class ); } return $actions; diff --git a/app/Utils/IpAddress.php b/app/Utils/IpAddress.php index f096a75f8..bc0b96302 100644 --- a/app/Utils/IpAddress.php +++ b/app/Utils/IpAddress.php @@ -72,13 +72,14 @@ public static function toArpa( string $ip, int $protocol ): string * * Source: https://stackoverflow.com/questions/33268683/how-to-get-client-ip-address-in-laravel-5/41769505#41769505 * - * @return string + * @return string|null */ - public static function getIp(): string + public static function getIp(): string|null { foreach( [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ] as $key ) { if( array_key_exists( $key, $_SERVER ) === true ) { - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + $value = (string)$_SERVER[ $key ]; + foreach( explode(',', $value ) as $ip ) { $ip = trim( $ip ); if( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) { return $ip; diff --git a/app/Utils/MailingList.php b/app/Utils/MailingList.php index 87088c760..381282f86 100644 --- a/app/Utils/MailingList.php +++ b/app/Utils/MailingList.php @@ -41,7 +41,7 @@ class MailingList { /** - * @var array Mailing list config key (from config/mailinglist.php) + * @var array-key Mailing list config key (from config/mailinglist.php) */ private $key = null; @@ -86,10 +86,10 @@ public function getSubscriberEmails( bool $subscribed = true ): array return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); })->orderBy( 'email' )->get(); - foreach( $users as $u ) { - $e = strtolower( $u->email ); - if( !$filtered_users->contains( $e ) && filter_var( $e, FILTER_VALIDATE_EMAIL ) !== false ) { - $filtered_users->add( $e ); + foreach( $users as $user ) { + $email = strtolower( $user->email ); + if( !$filtered_users->contains( $email ) && filter_var( $email, FILTER_VALIDATE_EMAIL ) !== false ) { + $filtered_users->add( $email ); } } diff --git a/app/Utils/View/Alert/Container.php b/app/Utils/View/Alert/Container.php index 8d68300a2..cca0272d7 100644 --- a/app/Utils/View/Alert/Container.php +++ b/app/Utils/View/Alert/Container.php @@ -56,7 +56,7 @@ public static function push( string $message, string $class = Alert::INFO, $clea * * FIXME: when PHP 7.1 is a req, fix the return type * - * @return Alert null for none ( === null) + * @return Alert|null for none ( === null) */ public static function pop() { diff --git a/database/migrations/2021_03_30_124916_create_atlas_probes.php b/database/migrations/2021_03_30_124916_create_atlas_probes.php index 701dece29..33a6813c0 100644 --- a/database/migrations/2021_03_30_124916_create_atlas_probes.php +++ b/database/migrations/2021_03_30_124916_create_atlas_probes.php @@ -25,7 +25,7 @@ public function up(): void $table->tinyInteger('is_anchor' ); $table->tinyInteger('is_public' ); $table->dateTime('last_connected' )->nullable(); - $table->string('status', '255' )->nullable(); + $table->string('status', 255 )->nullable(); $table->json('api_data' )->nullable(); $table->timestamps(); $table->foreign('cust_id')->references('id')->on('cust'); diff --git a/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php b/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php index 42f2ad830..4e660d4ee 100644 --- a/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php +++ b/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php @@ -27,7 +27,7 @@ public function up() public function down() { Schema::table('irrdbconfig', function (Blueprint $table) { - $table->string(255)->nullable()->after('host'); + $table->string('protocol')->nullable()->after('host'); }); } } diff --git a/psalm_errors_CHECK.log b/psalm_errors_CHECK.log deleted file mode 100644 index 079e2378c..000000000 --- a/psalm_errors_CHECK.log +++ /dev/null @@ -1,1913 +0,0 @@ - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Grapher/EmailPortUtilisation.php:119:109 -Argument 2 of IXP\Mail\Grapher\PortUtilisation::__construct expects float, but array|bool|null|string provided (see https://psalm.dev/004) - Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:60:16 -The declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) - * @return array|Builder|Customer - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:68:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return Customer::currentActive( true )->get(); - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:73:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return $c; - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:82:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return $c; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 -Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) - $addresses->add( $address ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/PeeringDB/AsnLookup.php:53:42 -Argument 1 of IXP\Services\PeeringDb::getNetworkByAsn expects int, but array|bool|null|string provided (see https://psalm.dev/004) - if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CompleteRequests.php:85:17 -Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) - if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CreateMeasurements.php:77:13 -Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - CreateMeasurementsJob::dispatchNow( $ar ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/RunMeasurements.php:91:13 -Method IXP\Jobs\RipeAtlas\RunMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - RunMeasurementsJob::dispatchNow( $am ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/StopAllMeasurements.php:87:17 -Method IXP\Jobs\RipeAtlas\StopAllMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - StopAllMeasurementsJob::dispatchNow( $am->id ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateMeasurements.php:79:13 -Method IXP\Jobs\RipeAtlas\UpdateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - UpdateMeasurementsJob::dispatchNow( $am ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:78:13 -Method IXP\Jobs\RipeAtlas\UpdateProbes::dispatchnow does not exist (see https://psalm.dev/022) - UpdateProbesJob::dispatchNow( $c ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:95:16 -The declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) - * @return array Customer - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:103:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers (see https://psalm.dev/128) - return Customer::CurrentActive( true, false, false )->get(); - -ERROR: ParadoxicalCondition -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:112:13 -Condition (($c) && ($cust is numeric)) contradicts a previously-established condition ((!$c) || ($cust is not numeric)) (see https://psalm.dev/089) - if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Rir/GenerateObject.php:87:58 -Isset only works with variables and array elements (see https://psalm.dev/004) - ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:74:9 -Method IXP\Jobs\FetchFilteredPrefixesForCustomer::dispatchnow does not exist (see https://psalm.dev/022) - FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); - -ERROR: ParadoxicalCondition -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:119:13 -Condition (($c) && ($custarg is numeric)) contradicts a previously-established condition ((!$c) || ($custarg is not numeric)) (see https://psalm.dev/089) - if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 -Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) - echo ( new RouterConfigurationGenerator( $router ) )->render(); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime(true) - LARAVEL_START ) - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 -Cannot find referenced variable $password (see https://psalm.dev/024) - $user->password = Hash::make( $password ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 -Cannot find referenced variable $name (see https://psalm.dev/024) - $user->name = $name; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 -Cannot find referenced variable $mobile (see https://psalm.dev/024) - $user->authorisedMobile = $mobile; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 -Cannot find referenced variable $username (see https://psalm.dev/024) - $user->username = strtolower( $username ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 -Cannot find referenced variable $email (see https://psalm.dev/024) - $user->email = strtolower( $email ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $user->privs = $priv; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 -Cannot find referenced variable $custid (see https://psalm.dev/024) - $user->custid = $custid; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $c2u->privs = $priv; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Utils/SmtpMailTest.php:130:26 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - $this->line( $mail->logger()->dump() ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$u->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $u->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $addresses->add( strtolower( trim( $a ) ) ); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit( $array, YAML_UTF8_ENCODING ); - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:446:55 -Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) - $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:447:55 -Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) - $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'version' => APPLICATION_VERSION, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 -Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) - 'verdate' => APPLICATION_VERDATE, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime( true ) - LARAVEL_START ) - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - $array['ixpmanager_version'] = APPLICATION_VERSION; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:148:39 -Cannot fetch property on non-object $switchA of type true (see https://psalm.dev/029) - $switchAName = $switchA ? $switchA->name : 'none'; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:150:39 -Cannot fetch property on non-object $switchB of type true (see https://psalm.dev/029) - $switchBName = $switchB ? $switchB->name : 'none'; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( $privs = Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:489:85 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - Auth::getUser()->save(); - -ERROR: EmptyArrayAccess -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 -Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) - && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:152:44 -Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) - if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:155:45 -Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) - $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:145:40 -Cannot fetch property on non-object $customer of type true (see https://psalm.dev/029) - $customerId = !$customer ? 0 : $customer->id; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:41 -Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) - $switchSideAId = $switchSideA ? $switchSideA->id : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:164:41 -Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) - $switchSideBId = $switchSideB ? $switchSideB->id : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['switch-port-b'] = $piB->switchportid; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['duplex-b'] = $piB->duplex; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['notes-b'] = $piB->notes ?? ''; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:232:38 -Argument 1 of IXP\Http\Controllers\RipeAtlas\RunController::doStore has wrong name $request, expecting $r as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::doStore (see https://psalm.dev/230) - public function doStore( Request $request ): bool|RedirectResponse - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $request->category = Graph::processParameterCategory( $request->category, true ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $request->period = Graph::processParameterPeriod( $request->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $request->protocol = Graph::processParameterRealProtocol( $request->protocol ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 -Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:367:67 -Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) - 'addBySnmp' => request()->old( 'add_by_snnp', false ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:418:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:419:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:429:67 -Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) - 'addBySnmp' => request()->old( 'add_by_snnp', false ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:696:13 -Cannot fetch property on non-object $switch of type false (see https://psalm.dev/029) - $switch->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:697:13 -Cannot fetch property on non-object $infra of type false (see https://psalm.dev/029) - $infra->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:698:13 -Cannot fetch property on non-object $location of type false (see https://psalm.dev/029) - $location->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:700:13 -Cannot fetch property on non-object $vlan of type false (see https://psalm.dev/029) - $vlan->id ?? null, - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchPortController.php:179:35 -Argument 1 of IXP\Http\Controllers\Switches\SwitchPortController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isCustUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 -Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) - $user->refresh(); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:242:17 -The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) - * @return RedirectResponse - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:258:35 -$user->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $user->disabled = !$r->disabled; // input as enable in the view - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:284:16 -The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store (see https://psalm.dev/128) - return redirect( $this->postStoreRedirect() ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:312:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'disabled' => $r->old( 'disabled', !$u->disabled ), - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:346:17 -The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) - * @return RedirectResponse - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:363:31 -$u->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $u->disabled = !$r->disabled;// displayed as enabled in the view - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:386:16 -The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update (see https://psalm.dev/128) - return redirect( $this->postStoreRedirect() ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:403:27 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isCustUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:476:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:495:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::getUser()->privs() !== $privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:63:55 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 -Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) - if( $user_priv < $controller::$minimum_privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 -Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) - $r->type = Graph::processParameterType( $r->type ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 -Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) - $r->id = 1; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 -Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) - $r->infrastructure = $infra->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 -Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) - $r->vlan = $vlan->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 -Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) - $r->trunkname = $trunkname; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 -Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) - $r->corebundle = $corebundle->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 -Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) - $r->side = $side; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 -Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) - $r->location = $location->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 -Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) - $r->switch = $switch->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 -Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) - $r->physint = $physint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 -Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) - $r->virtint = $virtint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 -Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) - $r->customer = $customer->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 -Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) - $r->vlanint = $vlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 -Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) - $r->vli = $vli; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 -Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) - $r->srcvlanint = $srcvlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 -Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) - $r->dstvlanint = $dstvlanint->id; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:40:28 -Class, interface or enum named Fideloper\Proxy\TrustProxies does not exist (see https://psalm.dev/019) -class TrustProxies extends Middleware - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $privs = Auth::getUser()->privs(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 -Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) - if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Grapher/PortsWithCounts.php:62:27 -$this->category with declared type 'float' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->category = $category; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/User/UserCreated.php:82:24 -$this->token with declared type 'bool' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->token = app('auth.password.broker')->createToken( $this->user ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:42:13 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - * @var SwiftMail SMTP dialog logging - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:44:5 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - /** - * @var SwiftMail SMTP dialog logging - */ - private $logger = null; - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:68:33 -Class, interface or enum named Swift_Plugins_Loggers_ArrayLogger does not exist (see https://psalm.dev/019) - $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:69:57 -Class, interface or enum named Swift_Plugins_LoggerPlugin does not exist (see https://psalm.dev/019) - Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:77:16 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - * @return SwiftMail|null - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:90:23 -Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) - throw new IXP_Exception( 'Invalid protocol' ); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:94:23 -Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) - throw new IXP_Exception( 'Invalid VLAN' ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - }); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - return $q->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - } ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function ($query) use( $switch ) { - $query->where( 'sA.id', $switch->id ) - ->orWhere( 'sB.id', $switch->id ); - }) - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 -The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) - public function contactGroups(): BelongsToMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 -The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) - return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) - ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) - ->orderBy( 'name' ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Customer.php:840:13 -Argument 2 of str_replace expects array|string, but list{null|string, null|string, null|string, ''|int, string, string, string} provided (see https://psalm.dev/004) - [ - $this->name, - $this->abbreviatedName, - $this->shortname, - $as ?: '', - $as ? "[AS{$as}]" : '', - $as ? "AS{$as}" : '', - $as ? " - AS{$as}" : '' - ], - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: NullArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:244:21 -Cannot access value on variable IXP\Models\DocstoreCustomerDirectory::$dirs[null] using null offset (see https://psalm.dev/124) - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $builder->where('min_privs', '<=', Auth::getUser()->privs() ); - -ERROR: NullArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreDirectory.php:210:21 -Cannot access value on variable IXP\Models\DocstoreDirectory::$dirs[null] using null offset (see https://psalm.dev/124) - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 -The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) - public function patchPanelPortFilesPublic(): HasMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 -The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) - return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) - ->where( 'is_private', 0 ); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Switcher.php:323:35 -$this->mauSupported with declared type 'int|null' cannot be assigned type 'true' (see https://psalm.dev/145) - $this->mauSupported = true; - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/VirtualInterface.php:240:20 -The declared return type 'IXP\Models\SwitchPort|bool' for IXP\Models\VirtualInterface::switchPort is not nullable, but the function returns 'mixed|null' (see https://psalm.dev/139) - return $this->physicalInterfaces()->first()->switchPort; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:82:16 -No return statements were found for method IXP\Policies\CustomerPolicy::create but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:95:16 -No return statements were found for method IXP\Policies\CustomerPolicy::update but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:107:16 -No return statements were found for method IXP\Policies\CustomerPolicy::delete but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:119:16 -No return statements were found for method IXP\Policies\CustomerPolicy::restore but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:132:16 -No return statements were found for method IXP\Policies\CustomerPolicy::forceDelete but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/DocstoreLogPolicy.php:58:16 -No return statements were found for method IXP\Policies\DocstoreLogPolicy::viewAny but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: MissingFile -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/BroadcastServiceProvider.php:48:9 -Cannot find file /Users/laszlo/dev/ibn-ixp-manager/routes/channels.php to include (see https://psalm.dev/107) - require base_path('routes/channels.php'); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HelpdeskServiceProvider.php:93:33 -Class, interface or enum named IXP\Providers\arrau does not exist (see https://psalm.dev/019) - public function provides(): arrau - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::check() && Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 -Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) - ->getCompiler(); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/PurifierServiceProvider.php:40:35 -Class, interface or enum named IXP\Providers\LaravelApplication does not exist (see https://psalm.dev/019) - if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if ($this->app->isLocal()) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if( $this->app->isLocal() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 -Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) - $this->userRememberToken = $this->provider->addRememberToken($user); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 -Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) - $this->provider->purgeExpiredRememberTokens( $user ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:31:14 -Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) - /** @var PlatesEngine */ - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:36:25 -$this->engine with declared type 'IXP\Services\PlatesEngine' cannot be assigned type 'Foil\Engine' (see https://psalm.dev/145) - $this->engine = $engine; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:39:31 -The declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine is incorrect, got 'IXP\Services\PlatesEngine' (see https://psalm.dev/011) - public function engine(): EngineFoil - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:41:16 -The inferred type 'IXP\Services\PlatesEngine' does not match the declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine (see https://psalm.dev/128) - return $this->engine; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:54:16 -Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) - return $this->engine->render( $path, $data ); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher.php:90:30 -$this->cacheLifetime with declared type 'bool' cannot be assigned type '300' (see https://psalm.dev/145) - private $cacheLifetime = 300; - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Mrtg.php:474:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Mrtg::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:206:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:228:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::rrd does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:919:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:926:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:937:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:944:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:954:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:961:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:973:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:980:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->customer()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:52:16 -The declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray is incorrect, got 'IXP\Services\Grapher\Graph\IXP&static' (see https://psalm.dev/011) - * @return Grapher Fluid interface - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:57:16 -The inferred type 'IXP\Services\Grapher\Graph\IXP&static' does not match the declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray (see https://psalm.dev/128) - return $this; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->infrastructure()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:96:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:100:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->location()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:97:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:101:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->switch()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->vlan()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:131:68 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return number_format( $v, $decs ) . " " . $formats[$i]; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:135:28 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return $formats[$i]; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:221:26 -$this->totalIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->totalIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:234:27 -$this->totalOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->totalOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:247:24 -$this->curIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->curIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:260:25 -$this->curOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->curOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:273:28 -$this->averageIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->averageIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:286:29 -$this->averageOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->averageOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:299:24 -$this->maxIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->maxIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:327:25 -$this->maxOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->maxOut = $v; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:50:13 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - * @var Zendesk\API\Client - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:74:25 -$this->client with declared type 'IXP\Services\Helpdesk\Zendesk\API\Client' cannot be assigned type 'Zendesk\API\HttpClient' (see https://psalm.dev/145) - $this->client = new ZendeskAPI( $config['subdomain'], $config['email'] ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:91:28 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - $this->debug = $this->client->getDebug(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:96:54 -Argument 1 of json_decode expects string, but array provided (see https://psalm.dev/004) - $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:117:38 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - $this->callApi( function() { $this->client->tickets()->findAll(); } ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:264:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->create( $this->customerEntityToZendeskObject( $cust ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:24 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:109 -Argument 2 of IXP\Services\Helpdesk\Zendesk::customerEntityToZendeskObject expects bool, but int provided (see https://psalm.dev/004) - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:319:24 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->search( $id ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:441:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->create( $this->contactEntityToZendeskObject( $contact, $org_id ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:467:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->update( $helpdeskId, $this->contactEntityToZendeskObject( $contact, null, $helpdeskId ) ); - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:475:16 -The declared return type 'IXP\Models\Contact' for IXP\Services\Helpdesk\Zendesk::userUpdate does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:498:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->search( [ 'external_id' => $id ] ); - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/IXF.php:95:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass.php:67:118 -Cannot find referenced variable $r (see https://psalm.dev/024) - throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); - -ERROR: InvalidClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass/BirdsEye.php:72:49 -Class, interface or enum IXP\Services\LookingGlass\Birdseye has wrong casing (see https://psalm.dev/007) - public function setCacheEnabled( bool $b ): Birdseye - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:133:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:185:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:86:59 -Argument 2 of IXP\Services\Purifier::addCustomDefinition expects IXP\Services\HTML_Purifier_Config|null, but HTMLPurifier_Config provided (see https://psalm.dev/004) - $this->addCustomDefinition($definitionConfig, $config); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:92:53 -Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomElements($elements, $def); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:99:57 -Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomAttributes($attributes, $def); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:112:15 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - * @param HTML_Purifier_Config $configObject Defaults to using default config - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:114:16 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - * @return HTML_Purifier_Config $configObject - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:124:9 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - $configObject->set('HTML.DefinitionID', $definitionConfig['id']); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:125:9 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - $configObject->set('HTML.DefinitionRev', $definitionConfig['rev']); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:129:13 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - $configObject->set('Cache.DefinitionImpl', null); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:133:20 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - if ($def = $configObject->maybeGetRawHTMLDefinition()) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:136:77 -Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomAttributes($definitionConfig['attributes'], $def); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:141:73 -Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomElements($definitionConfig['elements'], $def); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:152:15 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @param HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:154:16 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:165:13 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addAttribute($onElement, $attrName, $validValues); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:175:15 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @param HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 -No return statements were found for method IXP\Services\Purifier::addCustomElements but return type 'IXP\Services\HTMLPurifier_HTMLDefinition' was expected (see https://psalm.dev/011) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:190:17 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection, $attributes); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:192:17 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:145:16 -The declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough is incorrect, got 'int<0, max>' (see https://psalm.dev/011) - * @return bool - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:158:16 -The inferred type 'int<0, max>' does not match the declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough (see https://psalm.dev/128) - return count( $path[ 'ixpx' ] ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::getUser()->privs() >= $minAuth; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:97:16 -The declared return type 'string' for ixp_get_client_ip is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:104:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:116:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:126:20 -The declared return type 'string' for ixp_get_client_ip is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return request()->getClientIp(); - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdateAsnDb.php:95:40 -Argument 1 of IXP\Tasks\Irrdb\UpdateAsnDb::validate has wrong name $asns, expecting $prefixes as defined by IXP\Tasks\Irrdb\UpdateDb::validate (see https://psalm.dev/230) - protected function validate( array $asns, int $protocol ) : array - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 -Argument 1 of IXP\Rules\IPv4Cidr::passes expects string, but array provided (see https://psalm.dev/004) - if( !$validator->passes( [], $p ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 -Argument 1 of IXP\Rules\IPv6Cidr::passes expects string, but array provided (see https://psalm.dev/004) - if( !$validator->passes( [], $p ) ) { - -ERROR: UndefinedThisPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 -Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) - return Log::entries( self::getClass(), $this->id, $user ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Bgpq3.php:105:83 -Argument 2 of IXP\Utils\Bgpq3::execute cannot be false, int value expected (see https://psalm.dev/004) - $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'generator' => 'IXP Manager v' . APPLICATION_VERSION, - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:105:27 -Argument 1 of round expects float|int, but array|null|string provided (see https://psalm.dev/004) - return round( $size ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:170:63 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return number_format( $v, $decs ) . ' ' . $formats[ $i ]; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:177:24 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return $formats[ $i ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: LessSpecificImplementedReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 -The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) - * @return array An array of attributes with the label class - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:179:66 -Argument 1 of HtmlObject\Element::addClass expects string, but list{string, string, ''|mixed} provided (see https://psalm.dev/004) - return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:75:16 -The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:81:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:89:16 -The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return request()->getClientIp(); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:65:22 -$this->key with declared type 'array' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->key = $listname; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:84:69 -Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) - return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "1" ] ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:86:69 -Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) - return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $filtered_users->add( $e ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:143:13 -Cannot access value on variable $prefs['mailinglist'][$this->key] using a array offset, expecting array-key (see https://psalm.dev/115) - $prefs[ 'mailinglist' ][ $this->key ] = $value; - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/View/Alert/Container.php:66:20 -The declared return type 'IXP\Utils\View\Alert\Alert' for IXP\Utils\View\Alert\Container::pop is not nullable, but the function returns 'null' (see https://psalm.dev/139) - return null; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_03_30_124916_create_atlas_probes.php:28:38 -Argument 2 of Illuminate\Database\Schema\Blueprint::string expects int|null, but '255' provided (see https://psalm.dev/004) - $table->string('status', '255' )->nullable(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php:30:28 -Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 255 provided (see https://psalm.dev/004) - $table->string(255)->nullable()->after('host'); - ------------------------------- -376 errors found ------------------------------- -3457 other issues found. -You can display them with --show-info=true ------------------------------- - -Checks took 6.33 seconds and used 606.813MB of memory -Psalm was able to infer types for 81.5154% of the codebase diff --git a/psalm_errors_WORK.log b/psalm_errors_WORK.log index 5fac91a95..d91dfbe75 100644 --- a/psalm_errors_WORK.log +++ b/psalm_errors_WORK.log @@ -1,110 +1,29 @@ -# console command errors - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Grapher/EmailPortUtilisation.php:119:109 -Argument 2 of IXP\Mail\Grapher\PortUtilisation::__construct expects float, but array|bool|null|string provided (see https://psalm.dev/004) - Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:60:16 -The declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) - * @return array|Builder|Customer - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:68:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return Customer::currentActive( true )->get(); - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:73:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return $c; - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:82:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return $c; +# package wrong variable type declarations ERROR: InvalidArgument at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) $addresses->add( $address ); -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/PeeringDB/AsnLookup.php:53:42 -Argument 1 of IXP\Services\PeeringDb::getNetworkByAsn expects int, but array|bool|null|string provided (see https://psalm.dev/004) - if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CompleteRequests.php:85:17 -Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) - if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CreateMeasurements.php:77:13 -Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - CreateMeasurementsJob::dispatchNow( $ar ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/RunMeasurements.php:91:13 -Method IXP\Jobs\RipeAtlas\RunMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - RunMeasurementsJob::dispatchNow( $am ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/StopAllMeasurements.php:87:17 -Method IXP\Jobs\RipeAtlas\StopAllMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - StopAllMeasurementsJob::dispatchNow( $am->id ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateMeasurements.php:79:13 -Method IXP\Jobs\RipeAtlas\UpdateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - UpdateMeasurementsJob::dispatchNow( $am ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:78:13 -Method IXP\Jobs\RipeAtlas\UpdateProbes::dispatchnow does not exist (see https://psalm.dev/022) - UpdateProbesJob::dispatchNow( $c ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:95:16 -The declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) - * @return array Customer - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:103:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers (see https://psalm.dev/128) - return Customer::CurrentActive( true, false, false )->get(); -ERROR: ParadoxicalCondition -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:112:13 -Condition (($c) && ($cust is numeric)) contradicts a previously-established condition ((!$c) || ($cust is not numeric)) (see https://psalm.dev/089) - if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Rir/GenerateObject.php:87:58 -Isset only works with variables and array elements (see https://psalm.dev/004) - ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:74:9 -Method IXP\Jobs\FetchFilteredPrefixesForCustomer::dispatchnow does not exist (see https://psalm.dev/022) - FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); - -ERROR: ParadoxicalCondition -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:119:13 -Condition (($c) && ($custarg is numeric)) contradicts a previously-established condition ((!$c) || ($custarg is not numeric)) (see https://psalm.dev/089) - if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { +# I am not sure what is the goal here, but the echo doesn't work like this ERROR: InvalidArgument at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) echo ( new RouterConfigurationGenerator( $router ) )->render(); + +# superglobal defined elsewhere + ERROR: UndefinedConstant at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 Const LARAVEL_START is not defined (see https://psalm.dev/020) microtime(true) - LARAVEL_START ) + +# false positive - check line #128 + ERROR: UndefinedVariable at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 Cannot find referenced variable $password (see https://psalm.dev/024) @@ -145,14 +64,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 Cannot find referenced variable $priv (see https://psalm.dev/024) $c2u->privs = $priv; -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Utils/SmtpMailTest.php:130:26 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - $this->line( $mail->logger()->dump() ); - - - - @@ -522,8 +433,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php: Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) $user->save(); - - # I don't see issue here ERROR: UndefinedPropertyAssignment @@ -551,60 +460,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchControl Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - - - - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 -Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:367:67 -Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) - 'addBySnmp' => request()->old( 'add_by_snnp', false ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:418:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:419:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:429:67 -Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) - 'addBySnmp' => request()->old( 'add_by_snnp', false ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:696:13 -Cannot fetch property on non-object $switch of type false (see https://psalm.dev/029) - $switch->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:697:13 -Cannot fetch property on non-object $infra of type false (see https://psalm.dev/029) - $infra->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:698:13 -Cannot fetch property on non-object $location of type false (see https://psalm.dev/029) - $location->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:700:13 -Cannot fetch property on non-object $vlan of type false (see https://psalm.dev/029) - $vlan->id ?? null, - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchPortController.php:179:35 -Argument 1 of IXP\Http\Controllers\Switches\SwitchPortController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) @@ -620,56 +475,21 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) $user->refresh(); -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:242:17 -The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) - * @return RedirectResponse - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:258:35 -$user->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $user->disabled = !$r->disabled; // input as enable in the view - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:284:16 -The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store (see https://psalm.dev/128) - return redirect( $this->postStoreRedirect() ); - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) $isSuperUser = Auth::user()->isSuperUser(); -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:312:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'disabled' => $r->old( 'disabled', !$u->disabled ), - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:346:17 -The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) - * @return RedirectResponse - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:363:31 -$u->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $u->disabled = !$r->disabled;// displayed as enabled in the view - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:386:16 -The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update (see https://psalm.dev/128) - return redirect( $this->postStoreRedirect() ); - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -715,11 +535,15 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:6 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; +# false positive error + ERROR: InvalidPropertyFetch at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) if( $user_priv < $controller::$minimum_privilege ) { +# Auth::getUser() provide a Model that has the Method -> false positive + ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) @@ -730,6 +554,8 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { +# I don't see issue here (Grapher got weird methods) + ERROR: UndefinedPropertyAssignment at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) @@ -750,6 +576,8 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:11 Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) $r->type = Graph::processParameterType( $r->type ); +# false positive, the properties existence depends on the target + ERROR: UndefinedPropertyAssignment at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) @@ -825,16 +653,13 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:19 Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) $r->dstvlanint = $dstvlanint->id; +# Auth::getUser() provide a Model that has the Method -> false positive + ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:40:28 -Class, interface or enum named Fideloper\Proxy\TrustProxies does not exist (see https://psalm.dev/019) -class TrustProxies extends Middleware - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -975,63 +800,7 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) $isSuperUser = Auth::user()->isSuperUser(); -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/ForgotUsername.php:57:66 -Argument 1 of IXP\Mail\Auth\ForgotUsername::__construct expects Illuminate\Database\Eloquent\Collection, but array provided (see https://psalm.dev/004) - Mail::to( $e->email )->send( new ForgotPasswordMailable( $e->users ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 -Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) - if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Grapher/PortsWithCounts.php:62:27 -$this->category with declared type 'float' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->category = $category; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/User/UserCreated.php:82:24 -$this->token with declared type 'bool' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->token = app('auth.password.broker')->createToken( $this->user ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:42:13 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - * @var SwiftMail SMTP dialog logging - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:44:5 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - /** - * @var SwiftMail SMTP dialog logging - */ - private $logger = null; - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:68:33 -Class, interface or enum named Swift_Plugins_Loggers_ArrayLogger does not exist (see https://psalm.dev/019) - $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:69:57 -Class, interface or enum named Swift_Plugins_LoggerPlugin does not exist (see https://psalm.dev/019) - Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:77:16 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - * @return SwiftMail|null - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:90:23 -Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) - throw new IXP_Exception( 'Invalid protocol' ); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:94:23 -Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) - throw new IXP_Exception( 'Invalid VLAN' ); +# I didn't see issues here ERROR: InvalidArgument at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 @@ -1069,29 +838,13 @@ The inferred type 'Illuminate\Database\Eloquent\Builderwhere( 'type', '!=', ContactGroup::TYPE_ROLE ) ->orderBy( 'name' ); -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Customer.php:840:13 -Argument 2 of str_replace expects array|string, but list{null|string, null|string, null|string, ''|int, string, string, string} provided (see https://psalm.dev/004) - [ - $this->name, - $this->abbreviatedName, - $this->shortname, - $as ?: '', - $as ? "[AS{$as}]" : '', - $as ? "AS{$as}" : '', - $as ? " - AS{$as}" : '' - ], +# Auth::getUser() provide a Model that has the Method -> false positive ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) } elseif( !Auth::getUser()->isSuperUser() ) { -ERROR: NullArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:244:21 -Cannot access value on variable IXP\Models\DocstoreCustomerDirectory::$dirs[null] using null offset (see https://psalm.dev/124) - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1102,10 +855,7 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) $builder->where('min_privs', '<=', Auth::getUser()->privs() ); -ERROR: NullArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreDirectory.php:210:21 -Cannot access value on variable IXP\Models\DocstoreDirectory::$dirs[null] using null offset (see https://psalm.dev/124) - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; +# I don't see issues here ERROR: InvalidReturnType at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 @@ -1118,55 +868,7 @@ The inferred type 'Illuminate\Database\Eloquent\BuilderhasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) ->where( 'is_private', 0 ); -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Switcher.php:323:35 -$this->mauSupported with declared type 'int|null' cannot be assigned type 'true' (see https://psalm.dev/145) - $this->mauSupported = true; - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/VirtualInterface.php:240:20 -The declared return type 'IXP\Models\SwitchPort|bool' for IXP\Models\VirtualInterface::switchPort is not nullable, but the function returns 'mixed|null' (see https://psalm.dev/139) - return $this->physicalInterfaces()->first()->switchPort; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:82:16 -No return statements were found for method IXP\Policies\CustomerPolicy::create but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:95:16 -No return statements were found for method IXP\Policies\CustomerPolicy::update but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:107:16 -No return statements were found for method IXP\Policies\CustomerPolicy::delete but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:119:16 -No return statements were found for method IXP\Policies\CustomerPolicy::restore but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:132:16 -No return statements were found for method IXP\Policies\CustomerPolicy::forceDelete but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/DocstoreLogPolicy.php:58:16 -No return statements were found for method IXP\Policies\DocstoreLogPolicy::viewAny but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: MissingFile -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/BroadcastServiceProvider.php:48:9 -Cannot find file /Users/laszlo/dev/ibn-ixp-manager/routes/channels.php to include (see https://psalm.dev/107) - require base_path('routes/channels.php'); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HelpdeskServiceProvider.php:93:33 -Class, interface or enum named IXP\Providers\arrau does not exist (see https://psalm.dev/019) - public function provides(): arrau +# Auth::getUser() provide a Model that has the Method -> false positive ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 @@ -1178,16 +880,13 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { +# I don't see issues here + ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) ->getCompiler(); -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/PurifierServiceProvider.php:40:35 -Class, interface or enum named IXP\Providers\LaravelApplication does not exist (see https://psalm.dev/019) - if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) @@ -1198,6 +897,8 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php: Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) if( $this->app->isLocal() ) { +# false positive, it is a polymorphic call + ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) @@ -1208,90 +909,7 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) $this->provider->purgeExpiredRememberTokens( $user ); -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:31:14 -Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) - /** @var PlatesEngine */ - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:36:25 -$this->engine with declared type 'IXP\Services\PlatesEngine' cannot be assigned type 'Foil\Engine' (see https://psalm.dev/145) - $this->engine = $engine; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:39:31 -The declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine is incorrect, got 'IXP\Services\PlatesEngine' (see https://psalm.dev/011) - public function engine(): EngineFoil - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:41:16 -The inferred type 'IXP\Services\PlatesEngine' does not match the declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine (see https://psalm.dev/128) - return $this->engine; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:54:16 -Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) - return $this->engine->render( $path, $data ); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher.php:90:30 -$this->cacheLifetime with declared type 'bool' cannot be assigned type '300' (see https://psalm.dev/145) - private $cacheLifetime = 300; - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Mrtg.php:474:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Mrtg::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:206:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:228:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::rrd does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:919:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:926:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:937:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:944:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:954:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:961:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:973:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:980:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; +# Auth::getUser() provide a Model that has the Method -> false positive ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 @@ -1303,16 +921,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:1 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->customer()->name; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1338,16 +946,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:52:16 -The declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray is incorrect, got 'IXP\Services\Grapher\Graph\IXP&static' (see https://psalm.dev/011) - * @return Grapher Fluid interface - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:57:16 -The inferred type 'IXP\Services\Grapher\Graph\IXP&static' does not match the declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray (see https://psalm.dev/128) - return $this; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1358,16 +956,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->infrastructure()->name; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1393,16 +981,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236: Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) if( Auth::getUser()->isSuperUser() ) { -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:96:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:100:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->location()->name; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1438,16 +1016,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterfac Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) if( Auth::getUser()->isSuperUser() ) { -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:97:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:101:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->switch()->name; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1478,16 +1046,6 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->vlan()->name; - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) @@ -1508,320 +1066,28 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.ph Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:131:68 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return number_format( $v, $decs ) . " " . $formats[$i]; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:135:28 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return $formats[$i]; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:221:26 -$this->totalIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->totalIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:234:27 -$this->totalOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->totalOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:247:24 -$this->curIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->curIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:260:25 -$this->curOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->curOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:273:28 -$this->averageIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->averageIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:286:29 -$this->averageOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->averageOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:299:24 -$this->maxIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->maxIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:327:25 -$this->maxOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->maxOut = $v; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:50:13 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - * @var Zendesk\API\Client - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:74:25 -$this->client with declared type 'IXP\Services\Helpdesk\Zendesk\API\Client' cannot be assigned type 'Zendesk\API\HttpClient' (see https://psalm.dev/145) - $this->client = new ZendeskAPI( $config['subdomain'], $config['email'] ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:91:28 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - $this->debug = $this->client->getDebug(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:96:54 -Argument 1 of json_decode expects string, but array provided (see https://psalm.dev/004) - $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:117:38 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - $this->callApi( function() { $this->client->tickets()->findAll(); } ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:264:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->create( $this->customerEntityToZendeskObject( $cust ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:24 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:109 -Argument 2 of IXP\Services\Helpdesk\Zendesk::customerEntityToZendeskObject expects bool, but int provided (see https://psalm.dev/004) - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:319:24 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->search( $id ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:441:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->create( $this->contactEntityToZendeskObject( $contact, $org_id ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:467:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->update( $helpdeskId, $this->contactEntityToZendeskObject( $contact, null, $helpdeskId ) ); - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:475:16 -The declared return type 'IXP\Models\Contact' for IXP\Services\Helpdesk\Zendesk::userUpdate does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:498:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->search( [ 'external_id' => $id ] ); - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/IXF.php:95:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass.php:67:118 -Cannot find referenced variable $r (see https://psalm.dev/024) - throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); - -ERROR: InvalidClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass/BirdsEye.php:72:49 -Class, interface or enum IXP\Services\LookingGlass\Birdseye has wrong casing (see https://psalm.dev/007) - public function setCacheEnabled( bool $b ): Birdseye - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:133:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:185:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:86:59 -Argument 2 of IXP\Services\Purifier::addCustomDefinition expects IXP\Services\HTML_Purifier_Config|null, but HTMLPurifier_Config provided (see https://psalm.dev/004) - $this->addCustomDefinition($definitionConfig, $config); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:92:53 -Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomElements($elements, $def); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:99:57 -Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomAttributes($attributes, $def); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:112:15 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - * @param HTML_Purifier_Config $configObject Defaults to using default config - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:114:16 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - * @return HTML_Purifier_Config $configObject - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:124:9 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - $configObject->set('HTML.DefinitionID', $definitionConfig['id']); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:125:9 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - $configObject->set('HTML.DefinitionRev', $definitionConfig['rev']); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:129:13 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - $configObject->set('Cache.DefinitionImpl', null); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:133:20 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - if ($def = $configObject->maybeGetRawHTMLDefinition()) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:136:77 -Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomAttributes($definitionConfig['attributes'], $def); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:141:73 -Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomElements($definitionConfig['elements'], $def); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:152:15 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @param HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:154:16 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:165:13 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addAttribute($onElement, $attrName, $validValues); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:175:15 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @param HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 -No return statements were found for method IXP\Services\Purifier::addCustomElements but return type 'IXP\Services\HTMLPurifier_HTMLDefinition' was expected (see https://psalm.dev/011) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:190:17 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection, $attributes); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:192:17 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:145:16 -The declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough is incorrect, got 'int<0, max>' (see https://psalm.dev/011) - * @return bool - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:158:16 -The inferred type 'int<0, max>' does not match the declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough (see https://psalm.dev/128) - return count( $path[ 'ixpx' ] ); - ERROR: UndefinedInterfaceMethod at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) return Auth::getUser()->privs() >= $minAuth; -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:97:16 -The declared return type 'string' for ixp_get_client_ip is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:104:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:116:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:126:20 -The declared return type 'string' for ixp_get_client_ip is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return request()->getClientIp(); - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdateAsnDb.php:95:40 -Argument 1 of IXP\Tasks\Irrdb\UpdateAsnDb::validate has wrong name $asns, expecting $prefixes as defined by IXP\Tasks\Irrdb\UpdateDb::validate (see https://psalm.dev/230) - protected function validate( array $asns, int $protocol ) : array - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 -Argument 1 of IXP\Rules\IPv4Cidr::passes expects string, but array provided (see https://psalm.dev/004) - if( !$validator->passes( [], $p ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 -Argument 1 of IXP\Rules\IPv6Cidr::passes expects string, but array provided (see https://psalm.dev/004) - if( !$validator->passes( [], $p ) ) { +# Not really known what this method does, it is unused. It is callable as polymrophic ERROR: UndefinedThisPropertyFetch at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) return Log::entries( self::getClass(), $this->id, $user ); -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Bgpq3.php:105:83 -Argument 2 of IXP\Utils\Bgpq3::execute cannot be false, int value expected (see https://psalm.dev/004) - $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); + +# global variable defined in version.php ERROR: UndefinedConstant at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) 'generator' => 'IXP Manager v' . APPLICATION_VERSION, -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:105:27 -Argument 1 of round expects float|int, but array|null|string provided (see https://psalm.dev/004) - return round( $size ); -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:170:63 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return number_format( $v, $decs ) . ' ' . $formats[ $i ]; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:177:24 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return $formats[ $i ]; +# issue inside the Former package ERROR: UndefinedDocblockClass at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 @@ -1833,11 +1099,17 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +# it isn't error... + ERROR: LessSpecificImplementedReturnType at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) * @return array An array of attributes with the label class + +# issue inside the Former package + ERROR: UndefinedDocblockClass at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) @@ -1908,65 +1180,14 @@ at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:179:66 -Argument 1 of HtmlObject\Element::addClass expects string, but list{string, string, ''|mixed} provided (see https://psalm.dev/004) - return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:75:16 -The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:81:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:89:16 -The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return request()->getClientIp(); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:65:22 -$this->key with declared type 'array' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->key = $listname; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:84:69 -Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) - return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "1" ] ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:86:69 -Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) - return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); +# issue of the package: variable type wrong declared (no errors caused) ERROR: InvalidArgument at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) $filtered_users->add( $e ); -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:143:13 -Cannot access value on variable $prefs['mailinglist'][$this->key] using a array offset, expecting array-key (see https://psalm.dev/115) - $prefs[ 'mailinglist' ][ $this->key ] = $value; - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/View/Alert/Container.php:66:20 -The declared return type 'IXP\Utils\View\Alert\Alert' for IXP\Utils\View\Alert\Container::pop is not nullable, but the function returns 'null' (see https://psalm.dev/139) - return null; -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_03_30_124916_create_atlas_probes.php:28:38 -Argument 2 of Illuminate\Database\Schema\Blueprint::string expects int|null, but '255' provided (see https://psalm.dev/004) - $table->string('status', '255' )->nullable(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php:30:28 -Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 255 provided (see https://psalm.dev/004) - $table->string(255)->nullable()->after('host'); ------------------------------ 503 errors found From 1f927db1785c286b38134e50cf42dfb2d2034dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Tue, 28 May 2024 17:41:39 +0100 Subject: [PATCH 008/145] browser tests and debuging --- .phpunit.cache/test-results | 2 +- app/Models/Aggregators/CustomerAggregator.php | 2 +- app/Services/Grapher/Graph.php | 6 +++--- app/Services/Grapher/Graph/Customer.php | 7 ++++--- tests/Browser/ContactControllerTest.php | 6 +++--- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 360a997cc..82a183660 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":7,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":7,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":8,"Tests\\Browser\\VlanControllerTest::testAdd":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":2.363,"Tests\\Browser\\ApiKeyControllerTest::test":2.482,"Browser\\CabinetControllerTest::testCabinet":2.842,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.315,"Tests\\Browser\\ContactControllerTest::testAdd":5.251,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.071,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.533,"Tests\\Browser\\InfrastructureControllerTest::testAdd":4.879,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.716,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.445,"Tests\\Browser\\LocationControllerTest::testAdd":4.669,"Tests\\Browser\\LoginTest::testExample":0.799,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":4.007,"Tests\\Browser\\RouterControllerTest::testAdd":3.741,"Tests\\Browser\\SwitchControllerTest::testAdd":3.981,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.825,"Tests\\Browser\\User2FAControllerTest::test":13.053,"Tests\\Browser\\UserControllerTest::testAdd":11.566,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.972,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.978,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":3.035,"Tests\\Browser\\VendorControllerTest::testVendor":2.305,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.413,"Tests\\Browser\\VlanControllerTest::testAdd":4.713}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":7,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":3.211,"Tests\\Browser\\ApiKeyControllerTest::test":2.461,"Browser\\CabinetControllerTest::testCabinet":2.732,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.284,"Tests\\Browser\\ContactControllerTest::testAdd":6.069,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.292,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.431,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.553,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.625,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.296,"Tests\\Browser\\LocationControllerTest::testAdd":6.402,"Tests\\Browser\\LoginTest::testExample":0.721,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":6.369,"Tests\\Browser\\RouterControllerTest::testAdd":3.634,"Tests\\Browser\\SwitchControllerTest::testAdd":3.673,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":2.55,"Tests\\Browser\\User2FAControllerTest::test":6.889,"Tests\\Browser\\UserControllerTest::testAdd":9.059,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":3.022,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":0.797,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.977,"Tests\\Browser\\VendorControllerTest::testVendor":2.222,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":8.598,"Tests\\Browser\\VlanControllerTest::testAdd":4.484,"Tests\\Browser\\ExampleTest::testBasicExample":0.407}} \ No newline at end of file diff --git a/app/Models/Aggregators/CustomerAggregator.php b/app/Models/Aggregators/CustomerAggregator.php index 781c37c9b..585987bcb 100644 --- a/app/Models/Aggregators/CustomerAggregator.php +++ b/app/Models/Aggregators/CustomerAggregator.php @@ -309,7 +309,7 @@ public static function getByVlanAndProtocol( int $vlanid = null, int $protocol = * @return array|null * */ - public static function getPeeringManagerArrayByType( Customer $cust, array $vlans, array $protos ): ?array + public static function getPeeringManagerArrayByType( Customer $cust, $vlans, array $protos ): ?array { if( !count( $vlans ) ) { return null; diff --git a/app/Services/Grapher/Graph.php b/app/Services/Grapher/Graph.php index 53afb23de..291158cf0 100644 --- a/app/Services/Grapher/Graph.php +++ b/app/Services/Grapher/Graph.php @@ -664,14 +664,14 @@ public function key(): string * * UNFINISHED METHOD! * - * @return void //bool + * @return bool * * @throws */ - public function authorise(): void + public function authorise(): bool { $this->deny(); - /*return false;*/ + return false; } /** diff --git a/app/Services/Grapher/Graph/Customer.php b/app/Services/Grapher/Graph/Customer.php index a28ee9036..66fa1fce7 100644 --- a/app/Services/Grapher/Graph/Customer.php +++ b/app/Services/Grapher/Graph/Customer.php @@ -162,20 +162,21 @@ public function authorise(): bool } if( config( 'grapher.access.customer' ) !== 'own_graphs_only' - && is_numeric( config( 'grapher.access.customer' ) ) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + && is_numeric( config( 'grapher.access.customer' ) ) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [Customer]: user %d::%s tried to access a customer aggregate graph " - . "{$this->customer()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->customer()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) ); $this->deny(); return false; } + /** * Generate a URL to get this graphs 'file' of a given type * diff --git a/tests/Browser/ContactControllerTest.php b/tests/Browser/ContactControllerTest.php index d22095db9..04092206d 100644 --- a/tests/Browser/ContactControllerTest.php +++ b/tests/Browser/ContactControllerTest.php @@ -215,13 +215,13 @@ public function testAdd(): void ->type( 'phone', '0209110000' ) ->type( 'mobile', '0209120000' ) ->type( 'notes', 'Test note' ) - ->press( 'Create' ) - ->assertPathIs( '/customer/overview/5/contacts' ) + ->press( 'Create' ); + + $browser->assertPathIs( '/customer/overview/5/contacts' ) ->assertSee( 'Contact created' ) ->assertSee( 'Test Contact 1' ) ->assertSee( '0209110000 / 0209120000' ) ->assertSee( 'test-contact1@example.com' ); - // get the contact: $c = Contact::whereName( 'Test Contact 1' )->first(); // test the values: From 3444ba0ad301444f8930ea7b4f814ea708895dc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 29 May 2024 12:07:48 +0100 Subject: [PATCH 009/145] browser tests and debugging --- .idea/IXP-Manager.iml | 2 - .phpunit.cache/test-results | 2 +- .../Interfaces/CoreBundleController.php | 34 +- .../Interfaces/VlanInterfaceController.php | 51 +- psalm_errors_ACTUAL.log | 1121 +++++++ psalm_errors_FULL.log | 2563 +++++++++++++++++ .../Browser/InfrastructureControllerTest.php | 1 - .../VirtualInterfaceControllerTest.php | 2 +- 8 files changed, 3729 insertions(+), 47 deletions(-) create mode 100644 psalm_errors_ACTUAL.log create mode 100644 psalm_errors_FULL.log diff --git a/.idea/IXP-Manager.iml b/.idea/IXP-Manager.iml index 057170545..637df9904 100644 --- a/.idea/IXP-Manager.iml +++ b/.idea/IXP-Manager.iml @@ -4,13 +4,11 @@ - - diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 82a183660..1a610cb37 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":7,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":3.211,"Tests\\Browser\\ApiKeyControllerTest::test":2.461,"Browser\\CabinetControllerTest::testCabinet":2.732,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.284,"Tests\\Browser\\ContactControllerTest::testAdd":6.069,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.292,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.431,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.553,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.625,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.296,"Tests\\Browser\\LocationControllerTest::testAdd":6.402,"Tests\\Browser\\LoginTest::testExample":0.721,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":6.369,"Tests\\Browser\\RouterControllerTest::testAdd":3.634,"Tests\\Browser\\SwitchControllerTest::testAdd":3.673,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":2.55,"Tests\\Browser\\User2FAControllerTest::test":6.889,"Tests\\Browser\\UserControllerTest::testAdd":9.059,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":3.022,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":0.797,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.977,"Tests\\Browser\\VendorControllerTest::testVendor":2.222,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":8.598,"Tests\\Browser\\VlanControllerTest::testAdd":4.484,"Tests\\Browser\\ExampleTest::testBasicExample":0.407}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391}} \ No newline at end of file diff --git a/app/Http/Controllers/Interfaces/CoreBundleController.php b/app/Http/Controllers/Interfaces/CoreBundleController.php index 004704e48..1ce26af21 100644 --- a/app/Http/Controllers/Interfaces/CoreBundleController.php +++ b/app/Http/Controllers/Interfaces/CoreBundleController.php @@ -134,37 +134,37 @@ public function storeWizard( Store $r ): RedirectResponse /** * Display the form to edit a core bundle * - * @param Request $request Instance of the current HTTP request - * @param CoreBundle $coreBundle Core bundle + * @param Request $r Instance of the current HTTP request + * @param CoreBundle $cb Core bundle * * @return View */ - public function edit( Request $request, CoreBundle $coreBundle ): View + public function edit( Request $r, CoreBundle $cb ): View { - $customer = $coreBundle->customer(); + $customer = $cb->customer(); $customerId = !$customer ? 0 : $customer->id; // fill the form with the core bundle data Former::populate( [ - 'custid' => $request->old( 'custid', (string)$customerId ), - 'description' => $request->old( 'description', $coreBundle->description ), - 'graph_title' => $request->old( 'graph_title', $coreBundle->graph_title ), - 'cost' => $request->old( 'cost', (string)$coreBundle->cost ), - 'preference' => $request->old( 'preference', (string)$coreBundle->preference ), - 'type' => $request->old( 'type', (string)$coreBundle->type ), - 'ipv4_subnet' => $request->old( 'ipv4_subnet', $coreBundle->ipv4_subnet ), - 'enabled' => $request->old( 'enabled', (string)$coreBundle->enabled ), - 'bfd' => $request->old( 'bfd', (string)$coreBundle->bfd ), - 'stp' => $request->old( 'stp', (string)$coreBundle->stp ), + 'custid' => $r->old( 'custid', (string)$customerId ), + 'description' => $r->old( 'description', $cb->description ), + 'graph_title' => $r->old( 'graph_title', $cb->graph_title ), + 'cost' => $r->old( 'cost', (string)$cb->cost ), + 'preference' => $r->old( 'preference', (string)$cb->preference ), + 'type' => $r->old( 'type', (string)$cb->type ), + 'ipv4_subnet' => $r->old( 'ipv4_subnet', $cb->ipv4_subnet ), + 'enabled' => $r->old( 'enabled', (string)$cb->enabled ), + 'bfd' => $r->old( 'bfd', (string)$cb->bfd ), + 'stp' => $r->old( 'stp', (string)$cb->stp ), ] ); - $switchSideA = $coreBundle->switchSideX(); + $switchSideA = $cb->switchSideX(); $switchSideAId = $switchSideA ? $switchSideA->id : null; - $switchSideB = $coreBundle->switchSideX( false ); + $switchSideB = $cb->switchSideX( false ); $switchSideBId = $switchSideB ? $switchSideB->id : null; return view( 'interfaces/core-bundle/edit/edit-wizard' )->with( [ - 'cb' => $coreBundle, + 'cb' => $cb, 'customers' => Customer::internal()->get(), 'switchPortsSideA' => SwitcherAggregator::allPorts( $switchSideAId, [ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), 'switchPortsSideB' => SwitcherAggregator::allPorts( $switchSideBId, [ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), diff --git a/app/Http/Controllers/Interfaces/VlanInterfaceController.php b/app/Http/Controllers/Interfaces/VlanInterfaceController.php index e42cd55df..54694b617 100644 --- a/app/Http/Controllers/Interfaces/VlanInterfaceController.php +++ b/app/Http/Controllers/Interfaces/VlanInterfaceController.php @@ -151,31 +151,32 @@ public function store( StoreVlanInterface $r ): RedirectResponse */ public function edit( Request $r, VlanInterface $vli, VirtualInterface $vi = null, Vlan $duplicateTo = null ): View { - Former::populate([ - 'vlanid' => $r->old( 'vlanid', (string)$duplicateTo->id ?? $vli->vlanid ), - 'irrdbfilter' => $r->old( 'irrdbfilter', (string)$vli->irrdbfilter ), - 'mcastenabled' => $r->old( 'mcastenabled', (string)$vli->mcastenabled ), - - 'ipv4enabled' => $r->old( 'ipv4enabled', (string)$vli->ipv4enabled ), - 'ipv4address' => $r->old( 'ipv4address', (string)$vli->ipv4addressid ), - 'ipv4hostname' => $r->old( 'ipv4hostname', $vli->ipv4hostname ), - 'ipv4bgpmd5secret' => $r->old( 'ipv4bgpmd5secret', $vli->ipv4bgpmd5secret ), - 'ipv4canping' => $r->old( 'ipv4canping', (string)$vli->ipv4canping ), - 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', (string)$vli->ipv4monitorrcbgp ), - - 'maxbgpprefix' => $r->old( 'maxbgpprefix', (string)$vli->maxbgpprefix ), - 'rsclient' => $r->old( 'rsclient', (string)$vli->rsclient ), - 'rsmorespecifics' => $r->old( 'rsmorespecifics', (string)$vli->rsmorespecifics ), - 'as112client' => $r->old( 'as112client', (string)$vli->as112client ), - 'busyhost' => $r->old( 'busyhost', (string)$vli->busyhost ), - - 'ipv6enabled' => $r->old( 'ipv6enabled', (string)$vli->ipv6enabled ), - 'ipv6address' => $r->old( 'ipv6address', (string)$vli->ipv6addressid ), - 'ipv6hostname' => $r->old( 'ipv6hostname', $vli->ipv6hostname ), - 'ipv6bgpmd5secret' => $r->old( 'ipv6bgpmd5secret', $vli->ipv6bgpmd5secret ), - 'ipv6canping' => $r->old( 'ipv6canping', (string)$vli->ipv6canping ), - 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', (string)$vli->ipv6monitorrcbgp ), - ]); + $vlanId = $duplicateTo->id ?? $vli->vlanid; + Former::populate( [ + 'vlanid' => $r->old( 'vlanid', (string)$vlanId ), + 'irrdbfilter' => $r->old( 'irrdbfilter', (string)$vli->irrdbfilter ), + 'mcastenabled' => $r->old( 'mcastenabled', (string)$vli->mcastenabled ), + + 'ipv4enabled' => $r->old( 'ipv4enabled', (string)$vli->ipv4enabled ), + 'ipv4address' => $r->old( 'ipv4address', (string)$vli->ipv4addressid ), + 'ipv4hostname' => $r->old( 'ipv4hostname', $vli->ipv4hostname ), + 'ipv4bgpmd5secret' => $r->old( 'ipv4bgpmd5secret', $vli->ipv4bgpmd5secret ), + 'ipv4canping' => $r->old( 'ipv4canping', (string)$vli->ipv4canping ), + 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', (string)$vli->ipv4monitorrcbgp ), + + 'maxbgpprefix' => $r->old( 'maxbgpprefix', (string)$vli->maxbgpprefix ), + 'rsclient' => $r->old( 'rsclient', (string)$vli->rsclient ), + 'rsmorespecifics' => $r->old( 'rsmorespecifics', (string)$vli->rsmorespecifics ), + 'as112client' => $r->old( 'as112client', (string)$vli->as112client ), + 'busyhost' => $r->old( 'busyhost', (string)$vli->busyhost ), + + 'ipv6enabled' => $r->old( 'ipv6enabled', (string)$vli->ipv6enabled ), + 'ipv6address' => $r->old( 'ipv6address', (string)$vli->ipv6addressid ), + 'ipv6hostname' => $r->old( 'ipv6hostname', $vli->ipv6hostname ), + 'ipv6bgpmd5secret' => $r->old( 'ipv6bgpmd5secret', $vli->ipv6bgpmd5secret ), + 'ipv6canping' => $r->old( 'ipv6canping', (string)$vli->ipv6canping ), + 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', (string)$vli->ipv6monitorrcbgp ), + ] ); $redirect2vi = (bool) $vi; if( !$vi ){ diff --git a/psalm_errors_ACTUAL.log b/psalm_errors_ACTUAL.log new file mode 100644 index 000000000..65d36c5a5 --- /dev/null +++ b/psalm_errors_ACTUAL.log @@ -0,0 +1,1121 @@ + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 +Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) + $addresses->add( $address ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 +Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) + echo ( new RouterConfigurationGenerator( $router ) )->render(); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime(true) - LARAVEL_START ) + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 +Cannot find referenced variable $password (see https://psalm.dev/024) + $user->password = Hash::make( $password ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 +Cannot find referenced variable $name (see https://psalm.dev/024) + $user->name = $name; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 +Cannot find referenced variable $mobile (see https://psalm.dev/024) + $user->authorisedMobile = $mobile; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 +Cannot find referenced variable $username (see https://psalm.dev/024) + $user->username = strtolower( $username ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 +Cannot find referenced variable $email (see https://psalm.dev/024) + $user->email = strtolower( $email ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $user->privs = $priv; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 +Cannot find referenced variable $custid (see https://psalm.dev/024) + $user->custid = $custid; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $c2u->privs = $priv; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$u->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $u->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $addresses->add( strtolower( trim( $a ) ) ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit( $array, YAML_UTF8_ENCODING ); + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:446:55 +Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) + $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:447:55 +Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) + $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'version' => APPLICATION_VERSION, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 +Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) + 'verdate' => APPLICATION_VERDATE, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime( true ) - LARAVEL_START ) + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + $array['ixpmanager_version'] = APPLICATION_VERSION; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:148:39 +Cannot fetch property on non-object $switchA of type true (see https://psalm.dev/029) + $switchAName = $switchA ? $switchA->name : 'none'; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:150:39 +Cannot fetch property on non-object $switchB of type true (see https://psalm.dev/029) + $switchBName = $switchB ? $switchB->name : 'none'; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( $privs = Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:489:85 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + Auth::getUser()->save(); + +ERROR: EmptyArrayAccess +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 +Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) + && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:152:44 +Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) + if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:155:45 +Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) + $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:145:40 +Cannot fetch property on non-object $customer of type true (see https://psalm.dev/029) + $customerId = !$customer ? 0 : $customer->id; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:41 +Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) + $switchSideAId = $switchSideA ? $switchSideA->id : null; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:164:41 +Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) + $switchSideBId = $switchSideB ? $switchSideB->id : null; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['switch-port-b'] = $piB->switchportid; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['duplex-b'] = $piB->duplex; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['notes-b'] = $piB->notes ?? ''; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:232:38 +Argument 1 of IXP\Http\Controllers\RipeAtlas\RunController::doStore has wrong name $request, expecting $r as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::doStore (see https://psalm.dev/230) + public function doStore( Request $request ): bool|RedirectResponse + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $request->category = Graph::processParameterCategory( $request->category, true ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $request->period = Graph::processParameterPeriod( $request->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $request->protocol = Graph::processParameterRealProtocol( $request->protocol ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isCustUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 +Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) + $user->refresh(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:262:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:302:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:356:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:395:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:404:27 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isCustUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:477:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:496:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::getUser()->privs() !== $privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:64:55 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:67:26 +Cannot fetch property on non-object $__fake_var_2057 of type string (see https://psalm.dev/029) + if( $user_priv < $controller::$minimum_privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $request->period = Graph::processParameterPeriod( $request->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $request->category = Graph::processParameterCategory( $request->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $request->protocol = Graph::processParameterProtocol( $request->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 +Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) + $request->type = Graph::processParameterType( $request->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 +Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) + $request->id = 1; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 +Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) + $request->infrastructure = $infra->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 +Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) + $request->vlan = $vlan->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 +Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) + $request->trunkname = $trunkname; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 +Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) + $request->corebundle = $corebundle->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 +Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) + $request->side = $side; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 +Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) + $request->location = $location->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 +Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) + $request->switch = $switch->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 +Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) + $request->physint = $physint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 +Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) + $request->virtint = $virtint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 +Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) + $request->customer = $customer->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 +Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) + $request->vlanint = $vlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 +Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) + $request->vli = $vli; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 +Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) + $request->srcvlanint = $srcvlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 +Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) + $request->dstvlanint = $dstvlanint->id; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:54:26 +$this->headers with declared type 'array' cannot be assigned type '30' (see https://psalm.dev/145) + protected $headers = Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $privs = Auth::getUser()->privs(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 +Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) + if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + }); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + return $q->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + } ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function ($query) use( $switch ) { + $query->where( 'sA.id', $switch->id ) + ->orWhere( 'sB.id', $switch->id ); + }) + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 +The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) + public function contactGroups(): BelongsToMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 +The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) + return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) + ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) + ->orderBy( 'name' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $builder->where('min_privs', '<=', Auth::getUser()->privs() ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 +The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) + public function patchPanelPortFilesPublic(): HasMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 +The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) + return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) + ->where( 'is_private', 0 ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::check() && Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 +Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) + ->getCompiler(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if ($this->app->isLocal()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if( $this->app->isLocal() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 +Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) + $this->userRememberToken = $this->provider->addRememberToken($user); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 +Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) + $this->provider->purgeExpiredRememberTokens( $user ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:220:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:88:16 +Not all code paths of IXP\Services\Grapher\Graph\IXP::authorise end in a return statement, return type bool expected (see https://psalm.dev/011) + * @return bool + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:104:95 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::getUser()->privs() >= $minAuth; + +ERROR: UndefinedThisPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 +Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) + return Log::entries( self::getClass(), $this->id, $user ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'generator' => 'IXP Manager v' . APPLICATION_VERSION, + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: LessSpecificImplementedReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 +The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) + * @return array An array of attributes with the label class + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $filtered_users->add( $email ); + +------------------------------ +218 errors found +------------------------------ +3488 other issues found. +You can display them with --show-info=true +------------------------------ +Psalm can automatically fix 68 of these issues. +Run Psalm again with +--alter --issues=MissingReturnType,InvalidReturnType,MissingClosureReturnType,MismatchingDocblockParamType,MismatchingDocblockReturnType,LessSpecificReturnType,MissingParamType --dry-run +to see what it can fix. +------------------------------ + +Checks took 17.84 seconds and used 1,554.291MB of memory +Psalm was able to infer types for 80.5999% of the codebase diff --git a/psalm_errors_FULL.log b/psalm_errors_FULL.log new file mode 100644 index 000000000..5046c9470 --- /dev/null +++ b/psalm_errors_FULL.log @@ -0,0 +1,2563 @@ + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Command.php:158:40 +Cannot create offset of type array-key|null, expecting array-key (see https://psalm.dev/115) + $validator = \Validator::make( [key( $rules ) => $value], $rules ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Grapher/EmailPortUtilisation.php:119:109 +Argument 2 of IXP\Mail\Grapher\PortUtilisation::__construct expects float, but array|bool|null|string provided (see https://psalm.dev/004) + Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:60:16 +The declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) + * @return array|Builder|Customer + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:68:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return Customer::currentActive( true )->get(); + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:73:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return $c; + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:82:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) + return $c; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 +Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) + $addresses->add( $address ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/PeeringDB/AsnLookup.php:53:42 +Argument 1 of IXP\Services\PeeringDb::getNetworkByAsn expects int, but array|bool|null|string provided (see https://psalm.dev/004) + if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CompleteRequests.php:85:17 +Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) + if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CreateMeasurements.php:77:13 +Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + CreateMeasurementsJob::dispatchNow( $ar ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/RunMeasurements.php:91:13 +Method IXP\Jobs\RipeAtlas\RunMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + RunMeasurementsJob::dispatchNow( $am ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/StopAllMeasurements.php:87:17 +Method IXP\Jobs\RipeAtlas\StopAllMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + StopAllMeasurementsJob::dispatchNow( $am->id ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateMeasurements.php:79:13 +Method IXP\Jobs\RipeAtlas\UpdateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + UpdateMeasurementsJob::dispatchNow( $am ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:78:13 +Method IXP\Jobs\RipeAtlas\UpdateProbes::dispatchnow does not exist (see https://psalm.dev/022) + UpdateProbesJob::dispatchNow( $c ); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:95:16 +The declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) + * @return array Customer + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:103:20 +The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers (see https://psalm.dev/128) + return Customer::CurrentActive( true, false, false )->get(); + +ERROR: ParadoxicalCondition +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:112:13 +Condition (($c) && ($cust is numeric)) contradicts a previously-established condition ((!$c) || ($cust is not numeric)) (see https://psalm.dev/089) + if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Rir/GenerateObject.php:87:58 +Isset only works with variables and array elements (see https://psalm.dev/004) + ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:74:9 +Method IXP\Jobs\FetchFilteredPrefixesForCustomer::dispatchnow does not exist (see https://psalm.dev/022) + FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); + +ERROR: ParadoxicalCondition +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:119:13 +Condition (($c) && ($custarg is numeric)) contradicts a previously-established condition ((!$c) || ($custarg is not numeric)) (see https://psalm.dev/089) + if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 +Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) + echo ( new RouterConfigurationGenerator( $router ) )->render(); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime(true) - LARAVEL_START ) + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 +Cannot find referenced variable $password (see https://psalm.dev/024) + $user->password = Hash::make( $password ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 +Cannot find referenced variable $name (see https://psalm.dev/024) + $user->name = $name; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 +Cannot find referenced variable $mobile (see https://psalm.dev/024) + $user->authorisedMobile = $mobile; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 +Cannot find referenced variable $username (see https://psalm.dev/024) + $user->username = strtolower( $username ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 +Cannot find referenced variable $email (see https://psalm.dev/024) + $user->email = strtolower( $email ); + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $user->privs = $priv; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 +Cannot find referenced variable $custid (see https://psalm.dev/024) + $user->custid = $custid; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 +Cannot find referenced variable $priv (see https://psalm.dev/024) + $c2u->privs = $priv; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Utils/SmtpMailTest.php:130:26 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + $this->line( $mail->logger()->dump() ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Events/Auth/ForgotUsername.php:60:28 +$this->users with declared type 'array' cannot be assigned type 'Illuminate\Database\Eloquent\Collection' (see https://psalm.dev/145) + $this->users = $users; + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Exceptions/Handler.php:87:48 +Argument 2 of IXP\Exceptions\Handler::render has wrong name $exception, expecting $e as defined by Illuminate\Contracts\Debug\ExceptionHandler::render (see https://psalm.dev/230) + public function render($request, Throwable $exception) + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Exceptions/Handler.php:87:48 +Argument 2 of IXP\Exceptions\Handler::render has wrong name $exception, expecting $e as defined by Illuminate\Foundation\Exceptions\Handler::render (see https://psalm.dev/230) + public function render($request, Throwable $exception) + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/AdminController.php:85:41 +Argument 2 of Illuminate\Http\Request::query expects array|null|string, but 0 provided (see https://psalm.dev/004) + if( $r->query( 'refresh_cache', 0 ) || !( $cTypes = Cache::get( 'admin_ctypes' ) ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/AdminController.php:267:41 +Argument 2 of Illuminate\Http\Request::query expects array|null|string, but 0 provided (see https://psalm.dev/004) + if( $r->query( 'refresh_cache', 0 ) || !( $graphs = Cache::get( 'admin_stats_'.$period ) ) ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:77:33 +$cn->private with declared type 'int' cannot be assigned type 'bool' (see https://psalm.dev/145) + $cn->private = $r->public ? false : true; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:109:26 +$cn->private with declared type 'int' cannot be assigned type 'bool' (see https://psalm.dev/145) + $cn->private = $r->public ? false : true; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$u->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $u->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $addresses->add( strtolower( trim( $a ) ) ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit( $array, YAML_UTF8_ENCODING ); + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:443:40 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $entry['switchsidea'] = $cb->switchSideX( true )->name; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:444:40 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $entry['switchsideb'] = $cb->switchSideX( false )->name; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:454:59 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + $prettybandwidth = round( $speed ) . $formats[ $i ]; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'version' => APPLICATION_VERSION, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 +Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) + 'verdate' => APPLICATION_VERDATE, + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 +Const LARAVEL_START is not defined (see https://psalm.dev/020) + microtime( true ) - LARAVEL_START ) + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:83:16 +Not all code paths of IXP\Http\Controllers\Api\V4\RouterController::getCanUpdate end in a return statement, return type Illuminate\Http\JsonResponse expected (see https://psalm.dev/011) + * @return JsonResponse + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + $array['ixpmanager_version'] = APPLICATION_VERSION; + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 +Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) + $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:152:31 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $msgs[] = $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " OK - {$linksup}/${linksenabled} links up"; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:152:72 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $msgs[] = $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " OK - {$linksup}/${linksenabled} links up"; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:155:43 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $msgs[] = 'ISSUE: ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " has {$linksup}/${linksenabled} links up"; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:155:84 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $msgs[] = 'ISSUE: ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " has {$linksup}/${linksenabled} links up"; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:158:41 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $msgs[] = 'Ignoring ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . ' as core bundle disabled'; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:158:82 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $msgs[] = 'Ignoring ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . ' as core bundle disabled'; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( $privs = Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:234:79 +Argument 1 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, null|string value expected (see https://psalm.dev/004) + $activeGroups = ContactGroupAggregator::getGroupNamesTypeArray( false, false , true); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:234:86 +Argument 2 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, int|null value expected (see https://psalm.dev/004) + $activeGroups = ContactGroupAggregator::getGroupNamesTypeArray( false, false , true); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:388:80 +Argument 1 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, null|string value expected (see https://psalm.dev/004) + $contactGroup = ContactGroupAggregator::getGroupNamesTypeArray( false, $this->object->id ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:392:113 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + $contactGroupDetail[ $gname . '_' . $g[ 'id' ] ] = request()->old( $gname . '_' . $g[ 'id' ] , isset( $contactGroup[ $gname ][ $g[ 'id' ] ] ) ? 1 : 0 ) ; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ){ + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:576:80 +Argument 1 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, null|string value expected (see https://psalm.dev/004) + 'allGroups' => ContactGroupAggregator::getGroupNamesTypeArray( false, false, true ) + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:576:87 +Argument 2 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, int|null value expected (see https://psalm.dev/004) + 'allGroups' => ContactGroupAggregator::getGroupNamesTypeArray( false, false, true ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:103:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[$key] ) as $ip ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: InvalidMethodCall +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:219:109 +Cannot call method on non-falsy-string variable $cust->datejoin (see https://psalm.dev/091) + 'datejoin' => $r->old( 'datejoin', !$cust->datejoin ?: $cust->datejoin->format( "Y-m-d" ) ) , + +ERROR: InvalidMethodCall +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:220:111 +Cannot call method on non-falsy-string variable $cust->dateleave (see https://psalm.dev/091) + 'dateleave' => $r->old( 'dateleave', !$cust->dateleave ?: $cust->dateleave->format( "Y-m-d" ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:224:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'autsys' => $r->old( 'autsys', $cust->autsys ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:225:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'maxprefixes' => $r->old( 'maxprefixes', $cust->maxprefixes ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:230:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'irrdb' => $r->old( 'irrdb', $cust->irrdb ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:231:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'activepeeringmatrix' => $r->old( 'activepeeringmatrix', $cust->activepeeringmatrix ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:237:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'isReseller' => $r->old( 'isReseller', $cust->isReseller ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:238:74 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'isResold' => $r->old( 'isResold', ( $this->resellerMode() && $cust->reseller ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:239:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but false|int provided (see https://psalm.dev/004) + 'reseller' => $r->old( 'reseller', ( $this->resellerMode() && $cust->reseller ) ? $cust->reseller : false ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:240:72 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'peeringdb_oauth' => $r->old( 'peeringdb_oauth', $cust->peeringdb_oauth ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:488:85 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + Auth::getUser()->save(); + +ERROR: EmptyArrayAccess +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 +Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) + && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:123:48 +Cannot find referenced variable $rsRoutes (see https://psalm.dev/024) + 'rsRoutes' => $rsRoutes ?? null, + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:87:50 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 3 provided (see https://psalm.dev/004) + 'min_privs' => $r->old( 'min_privs', User::AUTH_SUPERUSER ) + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:119:61 +Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) + 'sha256' => hash_file( 'sha256', $file ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:147:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'min_privs' => $r->old( 'min_privs', $file->min_privs ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:183:65 +Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) + 'sha256' => hash_file( 'sha256', $uploadedFile ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:255:18 +Class, interface or enum named League\Flysystem\Exception does not exist (see https://psalm.dev/019) + } catch( FlySystemException $e ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:324:121 +Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) + 'sha256' => 'nullable|max:64' . ( $r->file( 'uploadedFile' ) ? '|in:' . hash_file( 'sha256', $r->file( 'uploadedFile' ) ) : '' ) , + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 +Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) + return Storage::disk( $file->disk )->download( $file->path, $file->name ); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:110:18 +Class, interface or enum named League\Flysystem\Exception does not exist (see https://psalm.dev/019) + } catch( FlySystemException $e ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:154:50 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 3 provided (see https://psalm.dev/004) + 'min_privs' => $r->old( 'min_privs', User::AUTH_SUPERUSER ) + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:182:39 +Argument 1 of Illuminate\Http\UploadedFile::store expects string, but int provided (see https://psalm.dev/004) + $path = $uploadedFile->store( $cust->id, 'docstore_customers' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:190:73 +Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) + 'sha256' => hash_file( 'sha256', $uploadedFile ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:221:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'min_privs' => $r->old( 'min_privs', $file->min_privs ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:259:65 +Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) + 'sha256' => hash_file( 'sha256', $uploadedFile ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:325:96 +Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) + if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' ) ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:150:40 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + if( $pi->relatedInterface() && $pi->relatedInterface()->id !== $fnpi->id ) { + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:153:45 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + $fnpi->virtualinterfaceid = $pi->relatedInterface()->virtualinterfaceid; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:384:44 +Cannot find referenced variable $cia (see https://psalm.dev/024) + $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:385:44 +Cannot find referenced variable $cib (see https://psalm.dev/024) + $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'custid' => $r->old('custid', $cb->customer()->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'custid' => $r->old('custid', $cb->customer()->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:149:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'cost' => $r->old('cost', $cb->cost ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:150:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'preference' => $r->old('preference', $cb->preference ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:151:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'type' => $r->old('type', $cb->type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:153:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'enabled' => $r->old('enabled', $cb->enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:154:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'bfd' => $r->old('bfd', $cb->bfd ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:155:67 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'stp' => $r->old('stp', $cb->stp ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:161:78 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:78 +Cannot fetch property on non-object of type bool (see https://psalm.dev/029) + 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:208:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:209:58 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:215:25 +Cannot create offset of type int|null, expecting array-key (see https://psalm.dev/115) + [ $pi->switchportid => + [ "name" => $pi->switchPort->name, + "id" => $pi->switchportid, + "type" => $pi->switchPort->type, + "porttype" => $pi->switchPort->type ] + ]; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['switch-port-b'] = $piB->switchportid; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['duplex-b'] = $piB->duplex; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 +Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) + $data['notes-b'] = $piB->notes ?? ''; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/SflowReceiverController.php:112:56 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:144:46 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'custid' => $r->old( 'cust', $cust->id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:199:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'custid' => $r->old( 'custid', $vi->custid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:200:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool|null provided (see https://psalm.dev/004) + 'trunk' => $r->old( 'trunk', $vi->trunk ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:201:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:202:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:204:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:205:70 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mtu' => $r->old( 'mtu', $vi->mtu ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:155:73 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:156:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:157:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:159:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:160:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:163:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:164:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:166:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:167:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:168:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:169:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'as112client' => $r->old( 'as112client', $vli->as112client ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:170:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:172:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:173:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:176:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:177:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:135:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:138:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:139:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:143:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'u_position' => $r->old( 'u_position', $pp->u_position ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:144:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:145:76 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:146:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0 provided (see https://psalm.dev/004) + 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:187:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:189:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:190:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'state' => $r->old( 'state', $ppp->state ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:202:80 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) + $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:263:27 +$pm->peered with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $pm->peered = !$pm->peered; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:268:29 +$pm->rejected with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $pm->rejected = !$pm->rejected; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 +Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) + $user->save(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/MeasurementController.php:194:35 +Argument 1 of IXP\Http\Controllers\RipeAtlas\MeasurementController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/ProbesController.php:152:35 +Argument 1 of IXP\Http\Controllers\RipeAtlas\ProbesController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ): View + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:185:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 1 provided (see https://psalm.dev/004) + 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:247:9 +Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) + CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); + +ERROR: UndefinedMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:272:19 +Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) + } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:144:75 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:151:75 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'asn' => request()->old( 'asn', $router->asn ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:157:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'api_type' => request()->old( 'api_type', $router->api_type ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:159:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'lg_access' => request()->old( 'lg_access', $router->lg_access ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:160:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'quarantine' => request()->old( 'quarantine', $router->quarantine ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:161:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:162:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'rpki' => request()->old( 'rpki', $router->rpki ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:163:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) + 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:164:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:165:81 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + 'pair_id' => request()->old( 'pair_id', $router->pair_id ), + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:236:34 +$router->pause_updates with declared type 'int' cannot be assigned type 'true' (see https://psalm.dev/145) + $router->pause_updates = true; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:55 +Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:65 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:240:47 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:242:47 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) + $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:134 +Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:144 +Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) + 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:64:26 +$this->grapher with declared type 'IXP\Services\Grapher' cannot be assigned type 'Grapher' (see https://psalm.dev/145) + $this->grapher = $grapher; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:70:16 +The declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher is incorrect, got 'IXP\Services\Grapher' (see https://psalm.dev/011) + * @return GrapherService + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:74:16 +The inferred type 'IXP\Services\Grapher' does not match the declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher (see https://psalm.dev/128) + return $this->grapher; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/LookingGlass.php:353:54 +Method IXP\Contracts\LookingGlass::exportRoute does not exist (see https://psalm.dev/181) + 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:91:9 +Instance property IXP\Http\Requests\StatisticsRequest::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:92:9 +Instance property IXP\Http\Requests\StatisticsRequest::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:93:9 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterProtocol( $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:94:9 +Instance property IXP\Http\Requests\StatisticsRequest::$type is not defined (see https://psalm.dev/038) + $r->type = Graph::processParameterType( $r->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:336:13 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::PROTOCOL_ALL; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:339:17 +Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::PROTOCOL_IPV4; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:341:65 +Argument 2 of IXP\Models\Aggregators\VlanInterfaceAggregator::forVlan expects bool, but 'ipv4'|'ipv6' provided (see https://psalm.dev/004) + $targets = VlanInterfaceAggregator::forVlan( $vlan, $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category, true ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 +Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:367:67 +Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) + 'addBySnmp' => request()->old( 'add_by_snnp', false ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:418:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:419:79 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) + 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:429:67 +Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) + 'addBySnmp' => request()->old( 'add_by_snnp', false ), + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:696:13 +Cannot fetch property on non-object $switch of type false (see https://psalm.dev/029) + $switch->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:697:13 +Cannot fetch property on non-object $infra of type false (see https://psalm.dev/029) + $infra->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:698:13 +Cannot fetch property on non-object $location of type false (see https://psalm.dev/029) + $location->id ?? null, + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:700:13 +Cannot fetch property on non-object $vlan of type false (see https://psalm.dev/029) + $vlan->id ?? null, + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchPortController.php:179:35 +Argument 1 of IXP\Http\Controllers\Switches\SwitchPortController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) + public function list( Request $r ) : View + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isCustUser() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 +Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) + $user->refresh(); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:242:17 +The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) + * @return RedirectResponse + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:258:35 +$user->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $user->disabled = !$r->disabled; // input as enable in the view + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:284:16 +The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store (see https://psalm.dev/128) + return redirect( $this->postStoreRedirect() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:312:69 +Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) + 'disabled' => $r->old( 'disabled', !$u->disabled ), + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:346:17 +The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) + * @return RedirectResponse + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:363:31 +$u->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) + $u->disabled = !$r->disabled;// displayed as enabled in the view + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:386:16 +The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update (see https://psalm.dev/128) + return redirect( $this->postStoreRedirect() ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:403:27 +Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isCustUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:476:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:495:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::getUser()->privs() !== $privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 +Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) + if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:63:55 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; + +ERROR: InvalidPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 +Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) + if( $user_priv < $controller::$minimum_privilege ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 +Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) + $r->period = Graph::processParameterPeriod( $r->period ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 +Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) + $r->category = Graph::processParameterCategory( $r->category ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 +Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) + $r->protocol = Graph::processParameterProtocol( $r->protocol ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 +Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) + $r->type = Graph::processParameterType( $r->type ); + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 +Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) + $r->id = 1; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 +Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) + $r->infrastructure = $infra->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 +Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) + $r->vlan = $vlan->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 +Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) + $r->trunkname = $trunkname; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 +Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) + $r->corebundle = $corebundle->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 +Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) + $r->side = $side; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 +Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) + $r->location = $location->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 +Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) + $r->switch = $switch->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 +Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) + $r->physint = $physint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 +Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) + $r->virtint = $virtint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 +Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) + $r->customer = $customer->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 +Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) + $r->vlanint = $vlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 +Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) + $r->vli = $vli; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 +Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) + $r->srcvlanint = $srcvlanint->id; + +ERROR: UndefinedPropertyAssignment +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 +Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) + $r->dstvlanint = $dstvlanint->id; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:40:28 +Class, interface or enum named Fideloper\Proxy\TrustProxies does not exist (see https://psalm.dev/019) +class TrustProxies extends Middleware + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) + return Auth::getUser()->isCustAdmin(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $privs = Auth::getUser()->privs(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::user()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + $isSuperUser = Auth::user()->isSuperUser(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/ForgotUsername.php:57:66 +Argument 1 of IXP\Mail\Auth\ForgotUsername::__construct expects Illuminate\Database\Eloquent\Collection, but array provided (see https://psalm.dev/004) + Mail::to( $e->email )->send( new ForgotPasswordMailable( $e->users ) ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 +Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) + if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Grapher/PortsWithCounts.php:62:27 +$this->category with declared type 'float' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->category = $category; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/User/UserCreated.php:82:24 +$this->token with declared type 'bool' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->token = app('auth.password.broker')->createToken( $this->user ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:42:13 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + * @var SwiftMail SMTP dialog logging + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:44:5 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + /** + * @var SwiftMail SMTP dialog logging + */ + private $logger = null; + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:68:33 +Class, interface or enum named Swift_Plugins_Loggers_ArrayLogger does not exist (see https://psalm.dev/019) + $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:69:57 +Class, interface or enum named Swift_Plugins_LoggerPlugin does not exist (see https://psalm.dev/019) + Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:77:16 +Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) + * @return SwiftMail|null + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:90:23 +Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) + throw new IXP_Exception( 'Invalid protocol' ); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:94:23 +Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) + throw new IXP_Exception( 'Invalid VLAN' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + }); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) + return $q->where( function($query ) use ($speed) { + $query->where( 'pi.speed', $speed ) + ->orWhere( 'pi.rate_limit', $speed ); + } ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 +Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) + ->where( function ($query) use( $switch ) { + $query->where( 'sA.id', $switch->id ) + ->orWhere( 'sB.id', $switch->id ); + }) + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 +The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) + public function contactGroups(): BelongsToMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 +The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) + return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) + ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) + ->orderBy( 'name' ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Customer.php:840:13 +Argument 2 of str_replace expects array|string, but list{null|string, null|string, null|string, ''|int, string, string, string} provided (see https://psalm.dev/004) + [ + $this->name, + $this->abbreviatedName, + $this->shortname, + $as ?: '', + $as ? "[AS{$as}]" : '', + $as ? "AS{$as}" : '', + $as ? " - AS{$as}" : '' + ], + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: NullArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:244:21 +Cannot access value on variable IXP\Models\DocstoreCustomerDirectory::$dirs[null] using null offset (see https://psalm.dev/124) + self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + } elseif( !Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + $builder->where('min_privs', '<=', Auth::getUser()->privs() ); + +ERROR: NullArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreDirectory.php:210:21 +Cannot access value on variable IXP\Models\DocstoreDirectory::$dirs[null] using null offset (see https://psalm.dev/124) + self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 +The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) + public function patchPanelPortFilesPublic(): HasMany + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 +The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) + return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) + ->where( 'is_private', 0 ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Switcher.php:323:35 +$this->mauSupported with declared type 'int|null' cannot be assigned type 'true' (see https://psalm.dev/145) + $this->mauSupported = true; + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Models/VirtualInterface.php:240:20 +The declared return type 'IXP\Models\SwitchPort|bool' for IXP\Models\VirtualInterface::switchPort is not nullable, but the function returns 'mixed|null' (see https://psalm.dev/139) + return $this->physicalInterfaces()->first()->switchPort; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:82:16 +No return statements were found for method IXP\Policies\CustomerPolicy::create but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:95:16 +No return statements were found for method IXP\Policies\CustomerPolicy::update but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:107:16 +No return statements were found for method IXP\Policies\CustomerPolicy::delete but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:119:16 +No return statements were found for method IXP\Policies\CustomerPolicy::restore but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:132:16 +No return statements were found for method IXP\Policies\CustomerPolicy::forceDelete but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/DocstoreLogPolicy.php:58:16 +No return statements were found for method IXP\Policies\DocstoreLogPolicy::viewAny but return type 'mixed' was expected (see https://psalm.dev/011) + * @return mixed + +ERROR: MissingFile +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/BroadcastServiceProvider.php:48:9 +Cannot find file /Users/laszlo/dev/ibn-ixp-manager/routes/channels.php to include (see https://psalm.dev/107) + require base_path('routes/channels.php'); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HelpdeskServiceProvider.php:93:33 +Class, interface or enum named IXP\Providers\arrau does not exist (see https://psalm.dev/019) + public function provides(): arrau + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + return Auth::check() && Auth::getUser()->isSuperUser(); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 +Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) + ->getCompiler(); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/PurifierServiceProvider.php:40:35 +Class, interface or enum named IXP\Providers\LaravelApplication does not exist (see https://psalm.dev/019) + if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if ($this->app->isLocal()) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 +Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) + if( $this->app->isLocal() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 +Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) + $this->userRememberToken = $this->provider->addRememberToken($user); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 +Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) + $this->provider->purgeExpiredRememberTokens( $user ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:31:14 +Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) + /** @var PlatesEngine */ + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:36:25 +$this->engine with declared type 'IXP\Services\PlatesEngine' cannot be assigned type 'Foil\Engine' (see https://psalm.dev/145) + $this->engine = $engine; + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:39:31 +The declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine is incorrect, got 'IXP\Services\PlatesEngine' (see https://psalm.dev/011) + public function engine(): EngineFoil + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:41:16 +The inferred type 'IXP\Services\PlatesEngine' does not match the declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine (see https://psalm.dev/128) + return $this->engine; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:54:16 +Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) + return $this->engine->render( $path, $data ); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher.php:90:30 +$this->cacheLifetime with declared type 'bool' cannot be assigned type '300' (see https://psalm.dev/145) + private $cacheLifetime = 300; + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Mrtg.php:474:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Mrtg::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:206:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:228:20 +The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::rrd does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; // FIXME check handling of this + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:919:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:926:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:937:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:944:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:954:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:961:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:973:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string The verified / sanitised / default value + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:980:16 +The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $v; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->customer()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219:55 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:52:16 +The declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray is incorrect, got 'IXP\Services\Grapher\Graph\IXP&static' (see https://psalm.dev/011) + * @return Grapher Fluid interface + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:57:16 +The inferred type 'IXP\Services\Grapher\Graph\IXP&static' does not match the declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray (see https://psalm.dev/128) + return $this; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->infrastructure()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:96:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:100:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->location()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:97:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:101:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->switch()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:98:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:102:16 +The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return $this->vlan()->name; + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::check() && Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 +Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) + if( Auth::getUser()->isSuperUser() ) { + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:131:68 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return number_format( $v, $decs ) . " " . $formats[$i]; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:135:28 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return $formats[$i]; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:221:26 +$this->totalIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->totalIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:234:27 +$this->totalOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->totalOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:247:24 +$this->curIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->curIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:260:25 +$this->curOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->curOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:273:28 +$this->averageIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->averageIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:286:29 +$this->averageOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->averageOut = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:299:24 +$this->maxIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->maxIn = $v; + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:327:25 +$this->maxOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) + $this->maxOut = $v; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:50:13 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + * @var Zendesk\API\Client + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:74:25 +$this->client with declared type 'IXP\Services\Helpdesk\Zendesk\API\Client' cannot be assigned type 'Zendesk\API\HttpClient' (see https://psalm.dev/145) + $this->client = new ZendeskAPI( $config['subdomain'], $config['email'] ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:91:28 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + $this->debug = $this->client->getDebug(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:96:54 +Argument 1 of json_decode expects string, but array provided (see https://psalm.dev/004) + $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:117:38 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + $this->callApi( function() { $this->client->tickets()->findAll(); } ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:264:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->create( $this->customerEntityToZendeskObject( $cust ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:24 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:109 +Argument 2 of IXP\Services\Helpdesk\Zendesk::customerEntityToZendeskObject expects bool, but int provided (see https://psalm.dev/004) + return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:319:24 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->organizations()->search( $id ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:441:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->create( $this->contactEntityToZendeskObject( $contact, $org_id ) ); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:467:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->update( $helpdeskId, $this->contactEntityToZendeskObject( $contact, null, $helpdeskId ) ); + +ERROR: FalsableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:475:16 +The declared return type 'IXP\Models\Contact' for IXP\Services\Helpdesk\Zendesk::userUpdate does not allow false, but the function returns 'false' (see https://psalm.dev/137) + return false; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:498:20 +Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) + return $this->client->users()->search( [ 'external_id' => $id ] ); + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/IXF.php:95:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: UndefinedVariable +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass.php:67:118 +Cannot find referenced variable $r (see https://psalm.dev/024) + throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); + +ERROR: InvalidClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass/BirdsEye.php:72:49 +Class, interface or enum IXP\Services\LookingGlass\Birdseye has wrong casing (see https://psalm.dev/007) + public function setCacheEnabled( bool $b ): Birdseye + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:133:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: InvalidThrow +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:185:13 +Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) + throw $this->exception; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:86:59 +Argument 2 of IXP\Services\Purifier::addCustomDefinition expects IXP\Services\HTML_Purifier_Config|null, but HTMLPurifier_Config provided (see https://psalm.dev/004) + $this->addCustomDefinition($definitionConfig, $config); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:92:53 +Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomElements($elements, $def); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:99:57 +Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomAttributes($attributes, $def); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:112:15 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + * @param HTML_Purifier_Config $configObject Defaults to using default config + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:114:16 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + * @return HTML_Purifier_Config $configObject + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:124:9 +Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) + $configObject->set('HTML.DefinitionID', $definitionConfig['id']); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:125:9 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + $configObject->set('HTML.DefinitionRev', $definitionConfig['rev']); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:129:13 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + $configObject->set('Cache.DefinitionImpl', null); + +ERROR: UndefinedClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:133:20 +Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) + if ($def = $configObject->maybeGetRawHTMLDefinition()) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:136:77 +Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomAttributes($definitionConfig['attributes'], $def); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:141:73 +Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) + $this->addCustomElements($definitionConfig['elements'], $def); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:152:15 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @param HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:154:16 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:165:13 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addAttribute($onElement, $attrName, $validValues); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:175:15 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @param HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 +No return statements were found for method IXP\Services\Purifier::addCustomElements but return type 'IXP\Services\HTMLPurifier_HTMLDefinition' was expected (see https://psalm.dev/011) + * @return HTMLPurifier_HTMLDefinition $definition + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:190:17 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection, $attributes); + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:192:17 +Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) + $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection); + +ERROR: InvalidReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:145:16 +The declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough is incorrect, got 'int<0, max>' (see https://psalm.dev/011) + * @return bool + +ERROR: InvalidReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:158:16 +The inferred type 'int<0, max>' does not match the declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough (see https://psalm.dev/128) + return count( $path[ 'ixpx' ] ); + +ERROR: UndefinedInterfaceMethod +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 +Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) + return Auth::getUser()->privs() >= $minAuth; + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:97:16 +The declared return type 'string' for ixp_get_client_ip is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:104:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:116:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:126:20 +The declared return type 'string' for ixp_get_client_ip is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return request()->getClientIp(); + +ERROR: ParamNameMismatch +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdateAsnDb.php:95:40 +Argument 1 of IXP\Tasks\Irrdb\UpdateAsnDb::validate has wrong name $asns, expecting $prefixes as defined by IXP\Tasks\Irrdb\UpdateDb::validate (see https://psalm.dev/230) + protected function validate( array $asns, int $protocol ) : array + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 +Argument 1 of IXP\Rules\IPv4Cidr::passes expects string, but array provided (see https://psalm.dev/004) + if( !$validator->passes( [], $p ) ) { + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 +Argument 1 of IXP\Rules\IPv6Cidr::passes expects string, but array provided (see https://psalm.dev/004) + if( !$validator->passes( [], $p ) ) { + +ERROR: UndefinedThisPropertyFetch +at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 +Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) + return Log::entries( self::getClass(), $this->id, $user ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Bgpq3.php:105:83 +Argument 2 of IXP\Utils\Bgpq3::execute cannot be false, int value expected (see https://psalm.dev/004) + $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); + +ERROR: UndefinedConstant +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 +Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) + 'generator' => 'IXP Manager v' . APPLICATION_VERSION, + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:105:27 +Argument 1 of round expects float|int, but array|null|string provided (see https://psalm.dev/004) + return round( $size ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:170:63 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return number_format( $v, $decs ) . ' ' . $formats[ $i ]; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:177:24 +Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) + return $formats[ $i ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: LessSpecificImplementedReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 +The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) + * @return array An array of attributes with the label class + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { + +ERROR: UndefinedDocblockClass +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 +Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) + $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:179:66 +Argument 1 of HtmlObject\Element::addClass expects string, but list{string, string, ''|mixed} provided (see https://psalm.dev/004) + return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); + +ERROR: InvalidNullableReturnType +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:75:16 +The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but 'null|string' contains null (see https://psalm.dev/144) + * @return string + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:81:39 +Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) + foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:89:16 +The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) + return request()->getClientIp(); + +ERROR: InvalidPropertyAssignmentValue +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:65:22 +$this->key with declared type 'array' cannot be assigned type 'string' (see https://psalm.dev/145) + $this->key = $listname; + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:84:69 +Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) + return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "1" ] ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:86:69 +Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) + return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 +Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) + $filtered_users->add( $e ); + +ERROR: InvalidArrayOffset +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:143:13 +Cannot access value on variable $prefs['mailinglist'][$this->key] using a array offset, expecting array-key (see https://psalm.dev/115) + $prefs[ 'mailinglist' ][ $this->key ] = $value; + +ERROR: NullableReturnStatement +at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/View/Alert/Container.php:66:20 +The declared return type 'IXP\Utils\View\Alert\Alert' for IXP\Utils\View\Alert\Container::pop is not nullable, but the function returns 'null' (see https://psalm.dev/139) + return null; + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_03_30_124916_create_atlas_probes.php:28:38 +Argument 2 of Illuminate\Database\Schema\Blueprint::string expects int|null, but '255' provided (see https://psalm.dev/004) + $table->string('status', '255' )->nullable(); + +ERROR: InvalidArgument +at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php:30:28 +Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 255 provided (see https://psalm.dev/004) + $table->string(255)->nullable()->after('host'); + +------------------------------ +504 errors found +------------------------------ +3438 other issues found. +You can display them with --show-info=true +------------------------------ +Psalm can automatically fix 88 of these issues. +Run Psalm again with +--alter --issues=InvalidReturnType,MissingReturnType,InvalidNullableReturnType,MismatchingDocblockParamType,InvalidFalsableReturnType,MissingClosureReturnType,MismatchingDocblockReturnType,LessSpecificReturnType,MissingParamType --dry-run +to see what it can fix. +------------------------------ + +Checks took 16.67 seconds and used 1,550.551MB of memory +Psalm was able to infer types for 80.5983% of the codebase diff --git a/tests/Browser/InfrastructureControllerTest.php b/tests/Browser/InfrastructureControllerTest.php index 9af1271b1..ed140048a 100644 --- a/tests/Browser/InfrastructureControllerTest.php +++ b/tests/Browser/InfrastructureControllerTest.php @@ -75,7 +75,6 @@ public function testAdd(): void $browser->visit( '/infrastructure/create' ) ->assertSee( 'Create Infrastructure' ) - ->waitForText( "Choose the matching IX-F IXP" ) ->waitForText( "Choose the matching IX-F IXP" ); // 1. test add empty inputs diff --git a/tests/Browser/VirtualInterfaceControllerTest.php b/tests/Browser/VirtualInterfaceControllerTest.php index fbd8c146b..426533867 100644 --- a/tests/Browser/VirtualInterfaceControllerTest.php +++ b/tests/Browser/VirtualInterfaceControllerTest.php @@ -117,7 +117,7 @@ private function intTestVi( Browser $browser ): VirtualInterface ->check( 'ipv4monitorrcbgp' ) ->check( 'ipv6monitorrcbgp' ) ->press( 'Create' ) - ->assertSee('Virtual interface created' ); + ->waitForText('Virtual interface created', 10000 ); $url = explode( '/', $browser->driver->getCurrentURL() ); From 267af721f4b359439bd1c3a5e1444bfb41e6c128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 29 May 2024 13:02:27 +0100 Subject: [PATCH 010/145] FileController debug --- .phpunit.cache/test-results | 2 +- app/Http/Controllers/Docstore/FileController.php | 6 +++--- app/Http/Controllers/DocstoreCustomer/FileController.php | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 1a610cb37..cd4aa1129 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.022,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.008,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.011,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.008,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.019,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.008}} \ No newline at end of file diff --git a/app/Http/Controllers/Docstore/FileController.php b/app/Http/Controllers/Docstore/FileController.php index 53d566e44..5737111ca 100644 --- a/app/Http/Controllers/Docstore/FileController.php +++ b/app/Http/Controllers/Docstore/FileController.php @@ -116,7 +116,7 @@ public function store( Request $r ): RedirectResponse 'docstore_directory_id' => $r->docstore_directory_id, 'min_privs' => $r->min_privs, 'path' => $path, - 'sha256' => hash_file( 'sha256', $file->getFilename() ), + 'sha256' => hash_file( 'sha256', $file ), 'created_by' => Auth::id(), 'file_last_updated' => now(), ] ); @@ -180,7 +180,7 @@ public function update( Request $r , DocstoreFile $file ): RedirectResponse $file->update([ 'path' => $path, - 'sha256' => hash_file( 'sha256', $uploadedFile->getFilename() ), + 'sha256' => hash_file( 'sha256', $uploadedFile ), 'file_last_updated' => now(), ]); @@ -321,7 +321,7 @@ private function checkForm( Request $r, ?DocstoreFile $file = null ): void 'uploadedFile' => Rule::requiredIf( function() use ( $r, $file ) { return !$file; }), - 'sha256' => 'nullable|max:64' . ( $r->file( 'uploadedFile' ) ? '|in:' . hash_file( 'sha256', $r->file( 'uploadedFile' )->getFilename() ) : '' ) , + 'sha256' => 'nullable|max:64' . ( $r->file( 'uploadedFile' ) ? '|in:' . hash_file( 'sha256', $r->file( 'uploadedFile' ) ) : '' ) , 'min_privs' => 'required|integer|in:' . implode( ',', array_keys( User::$PRIVILEGES_TEXT_ALL ) ), 'docstore_directory_id' => 'nullable|integer|exists:docstore_directories,id', ] ); diff --git a/app/Http/Controllers/DocstoreCustomer/FileController.php b/app/Http/Controllers/DocstoreCustomer/FileController.php index e2f1b6e38..f1ebd1597 100644 --- a/app/Http/Controllers/DocstoreCustomer/FileController.php +++ b/app/Http/Controllers/DocstoreCustomer/FileController.php @@ -179,7 +179,7 @@ public function store( Request $r, Customer $cust ): RedirectResponse $uploadedFile = $r->file('uploadedFile' ); - $path = $uploadedFile->store( (string) $cust->id, 'docstore_customers' ); + $path = $uploadedFile->store( $cust->id, 'docstore_customers' ); $file = DocstoreCustomerFile::create( [ 'name' => $r->name, @@ -187,7 +187,7 @@ public function store( Request $r, Customer $cust ): RedirectResponse 'cust_id' => $cust->id, 'min_privs' => $r->min_privs, 'path' => $path, - 'sha256' => hash_file( 'sha256', $uploadedFile->getFilename() ), + 'sha256' => hash_file( 'sha256', $uploadedFile ), 'created_by' => $r->user()->id, 'file_last_updated' => now(), 'docstore_customer_directory_id' => $r->docstore_customer_directory_id, @@ -256,7 +256,7 @@ public function update( Request $r, Customer $cust, DocstoreCustomerFile $file ) $file->update([ 'path' => $path, - 'sha256' => hash_file( 'sha256', $uploadedFile->getFilename() ), + 'sha256' => hash_file( 'sha256', $uploadedFile ), 'file_last_updated' => now(), ]); @@ -322,9 +322,10 @@ private function checkForm( Request $r, ?DocstoreCustomerFile $file = null ): vo }), 'sha256' => [ 'nullable', 'max:64', function ( $attribute, $value, $fail ) use( $r ) { - if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' )->getFilename() ) ) { + if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' ) ) ) { return $fail( 'The sha256 checksum calculated on the server does not match the one you provided.' ); } + return null; }, ], 'min_privs' => 'required|integer|in:' . implode( ',', array_keys( User::$PRIVILEGES ) ), From 33c61368c121d3c78da0eafcb4371f206f9dd089 Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Wed, 29 May 2024 13:54:36 +0100 Subject: [PATCH 011/145] No longer needed, now in the Artisan command --- app/Mail/Utils/SmtpTest.php | 83 ------------------------------------- 1 file changed, 83 deletions(-) delete mode 100644 app/Mail/Utils/SmtpTest.php diff --git a/app/Mail/Utils/SmtpTest.php b/app/Mail/Utils/SmtpTest.php deleted file mode 100644 index 363cf8f07..000000000 --- a/app/Mail/Utils/SmtpTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @package IXP\Mail\Utils - * @copyright Copyright (C) 2009 - 2020 Internet Neutral Exchange Association Company Limited By Guarantee - * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 - */ -class SmtpTest extends Mailable -{ - use Queueable, SerializesModels; - - /** - * @var SwiftMail SMTP dialog logging - */ - private $logger = null; - - /** - * @var bool Debug flag to indicate if the SMTP dialog should be recorded - */ - protected $debug; - - /** - * SmtpTest constructor. - * @param bool $debug If true, record the SMTP dialog - */ - public function __construct( bool $debug = false ) - { - $this->debug = $debug; - } - - /** - * Build the message. - * - * @return $this - */ - public function build(): self - { -// if( $this->debug ) { -// $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; -// Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); -// } - - return $this->markdown( 'utils.emails.smtp-test' ) - ->subject( 'SMTP test email from IXP Manager' ); - } - - /** - * @return SwiftMail|null - */ - public function logger() - { - return $this->logger; - } -} From 943ad5075638076029ae9e1f78a50bfee9607acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 29 May 2024 15:10:09 +0100 Subject: [PATCH 012/145] StatisticRequest revert --- .phpunit.cache/test-results | 2 +- app/Http/Requests/StatisticsRequest.php | 18 ------------------ 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index cd4aa1129..63ceab1bd 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.022,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.008,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.011,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.008,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.019,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.008}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.022,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.008,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.011,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.008,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.019,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.013,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.008,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.05,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.014,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.118,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.098,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.076,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.055}} \ No newline at end of file diff --git a/app/Http/Requests/StatisticsRequest.php b/app/Http/Requests/StatisticsRequest.php index d25580096..a4f7b5c62 100644 --- a/app/Http/Requests/StatisticsRequest.php +++ b/app/Http/Requests/StatisticsRequest.php @@ -23,7 +23,6 @@ * http://www.gnu.org/licenses/gpl-2.0.html */ -use AllowDynamicProperties; use Auth; use Illuminate\Foundation\Http\FormRequest; @@ -40,23 +39,6 @@ */ class StatisticsRequest extends FormRequest { - /** - * @var mixed|string - */ - public mixed $period; - /** - * @var mixed|string - */ - public mixed $category; - /** - * @var mixed|string - */ - public mixed $protocol; - /** - * @var mixed|string - */ - public mixed $type; - /** * Determine if the user is authorized to make this request. * From 41ceebef80727362e417583f72e280784068a391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Thu, 6 Jun 2024 17:59:40 +0100 Subject: [PATCH 013/145] writer service class and test - phase 1 --- .env.test | 310 +++++++++++++++++++++++ .phpunit.cache/test-results | 2 +- app/Services/DotEnvWriter.php | 366 ++++++++++++++++++++++++++++ tests/Services/DotEnvWriterTest.php | 58 +++++ 4 files changed, 735 insertions(+), 1 deletion(-) create mode 100644 .env.test create mode 100644 app/Services/DotEnvWriter.php create mode 100644 tests/Services/DotEnvWriterTest.php diff --git a/.env.test b/.env.test new file mode 100644 index 000000000..0656f9a08 --- /dev/null +++ b/.env.test @@ -0,0 +1,310 @@ +####################################################################################### +# +# IXP Manager V4+ configuration. +# +# + +# Run "artisan key:generate" to set the application key: +APP_KEY= + +# Set this to false in production (but change it to true if you have installation or +# other issues running IXP Manager). +APP_DEBUG=false + +# Web address where IXP Manager is accessed. This is a **required** setting. It is +# currently used for generating all URLs within IXP Manager (action, assets, etc.). +# It is also used / required for sending emails via CLI scripts. +# +APP_URL="https://ixp.example.com" + + +# See http://php.net/manual/en/timezones.php for a list of timezones: +APP_TIMEZONE="UTC" + +# Laravel log format (storage/log). See config/log.php and +# https://laravel.com/docs/5.4/errors +APP_LOG="single" + +# info by default, one of: debug, info, notice, warning, error, critical, alert, emergency. +APP_LOG_LEVEL=debug + +# MySQL Connection Details +DB_HOST="127.0.0.1" +DB_DATABASE="ixp" +DB_USERNAME="ixp" +DB_PASSWORD="password" + + +####################################################################################### +### Email Settings. +# +# We use Laravel's mail system - see: https://docs.ixpmanager.org/usage/email/ +# +# The default setting are as follows: +# +# MAIL_MAILER="smtp" +# MAIL_HOST="localhost" +# MAIL_PORT=25 +# MAIL_ENCRYPTION=false + + + +####################################################################################### +### Identity +# +# Used throughout IXP Manager in various ways. +# +# This has grown organically and we intend to clean this up in a coming release and +# documenting where and how each one is spceifically used. + + +# Used in various emails, etc. +IDENTITY_SITENAME="Vagrant IXP Manager" +APP_NAME="${IDENTITY_SITENAME}" +# Shown in title bar of web portal. Defaults to IDENTITY_SITENAME +# IDENTITY_TITLENAME="Vagrant IXP Manager" + +IDENTITY_LEGALNAME="Vagrant City IXP" +IDENTITY_CITY="Dublin" +IDENTITY_COUNTRY="IE" +IDENTITY_ORGNAME="${IDENTITY_LEGALNAME}" + +# As well as uses in other places, emails are sent from the following name/email: +IDENTITY_NAME="${IDENTITY_LEGALNAME}" +IDENTITY_EMAIL="ixp@example.com" + +IDENTITY_TESTEMAIL="${IDENTITY_EMAIL}" + +# Used on some traffic graphs: +IDENTITY_WATERMARK="Vagrant City IXP" + +IDENTITY_SUPPORT_EMAIL="${IDENTITY_EMAIL}" +IDENTITY_SUPPORT_PHONE="+1 111 555 5555" +IDENTITY_SUPPORT_HOURS="24x7" + +IDENTITY_BILLING_EMAIL="${IDENTITY_EMAIL}" +IDENTITY_BILLING_PHONE="+1 111 555 5555" +IDENTITY_BILLING_HOURS="24x7" + +# Web address of your IXP's website. Used in IX-F Export schema, etc. +IDENTITY_CORPORATE_URL="http://www.example.com/" + +# The logo to show on the login page. Should be a URL. +# (the example here works - the leading '//' means the browser should match http/https based on the web page) +IDENTITY_BIGLOGO="//www.ixpmanager.org/images/logos/ixp-manager.png" + +# For some actions (e.g. peering matrix) we need to know what VLAN to show by default. +# This is the vlan.id database entry (i.e. not the VLAN number/tag!) +IDENTITY_DEFAULT_VLAN=1 + + +######################################################################################### +### Member vs. Customer +### +### IXP Manager is an open source project and typically used in member-owned IXPs. +### As such, the language used mostly is 'member'. To change this to 'customer' just +### uncomment the following lines: +# +# IXP_FE_FRONTEND_CUSTOMER_ONE=customer +# IXP_FE_FRONTEND_CUSTOMER_MANY=customers +# IXP_FE_FRONTEND_CUSTOMER_OWNER="customer's" +# IXP_FE_FRONTEND_CUSTOMER_OWNERS="customers'" + + + +####################################################################################### +### Features +# + +# See: http://docs.ixpmanager.org/features/reseller/ +IXP_RESELLER_ENABLED=false + +# See: http://docs.ixpmanager.org/features/as112/ +IXP_AS112_UI_ACTIVE=false + + +####################################################################################### +### Frontend controllers and controller configuration +# +# Some frontend controllers are disabled by default. This is for a variety of reasons +# including: additional configuration may be required, maintain backwards +# compatibility, etc. + +# Allow customers / admins to upload logos for members. Set to false to enabled. +# See: http://docs.ixpmanager.org/usage/customers/#customer-logos +IXP_FE_FRONTEND_DISABLED_LOGO=false + + +# Send email notifications when a customer's billing details are updated. +# See: http://docs.ixpmanager.org/usage/customers/#notification-of-billing-details-changed +# IXP_FE_CUSTOMER_BILLING_UPDATES_NOTIFY="mail@example.com" + + +# Disable links to the peering matrix if you have not set it up (with sflow): +# IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX=true + +# Enable the UI for route server community-based filtering by uncommenting this line: +# IXP_FE_FRONTEND_DISABLED_RS_FILTERS=false + +####################################################################################### +### Graphing - see https://docs.ixpmanager.org/grapher/introduction + +# Enable the backends you have configured. E.g.: +# GRAPHER_BACKENDS="mrtg|sflow|smokeping" + +# On a new installation, we just use placeholders from the dummy backend: +GRAPHER_BACKENDS="dummy" + +# With the cache enabled, IXP Manager does not have to regenerate / reload / reprocess +# log / rrd / image files if we have cached them and they are less than 5mins old. This +# is enabled by default which is the recommended setting. +GRAPHER_CACHE_ENABLED=true + +################################################################################# +## Grapher - Mrtg - see: https://docs.ixpmanager.org/grapher/mrtg/ +## + +# For backwards compatibility, the default is 'log' but 'rrd' is more modern: +GRAPHER_BACKEND_MRTG_DBTYPE="rrd" + +# The defaults for these are '/tmp' to require you to change them to something +# more sensible such as: +# GRAPHER_BACKEND_MRTG_WORKDIR="/srv/mrtg" +# GRAPHER_BACKEND_MRTG_LOGDIR="/srv/mrtg" + +################################################################################# +## Grapher - sflow - see: https://docs.ixpmanager.org/grapher/sflow/ +## + +# GRAPHER_BACKEND_SFLOW_ENABLED=false +# GRAPHER_BACKEND_SFLOW_ROOT="http://sflow-server.example.com/grapher-sflow" + + +################################################################################# +## Grapher - smokeping - see: https://docs.ixpmanager.org/grapher/smokeping/ +## + +# Mark it as enabled (this just affects whether certain UI elements are shown): +# GRAPHER_BACKEND_SMOKEPING_ENABLED=true + +# And set the default location to fetch the Smokeping graphs from: +# GRAPHER_BACKEND_SMOKEPING_URL="http://www.example.com/smokeping" + + +################################################################################# +## IX-F Member Export - see: https://docs.ixpmanager.org/features/ixf-export/ + + +# IXP_API_JSONEXPORTSCHEMA_PUBLIC=true + +# Some variables can be excluded as required. +# See: https://docs.ixpmanager.org/features/ixf-export/ +# +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_SWITCH="model|software" +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_IXP="name|url" +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_MEMBER="asnum|name" +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_INTINFO="mac_addresses|routeserver" + +# Exclude members with certain AS numbers +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_ASNUM="65001|65002|65003" + +# Exclude members with certain tags +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_TAGS="tag1|tag2" + +# Exclude documentation ASNs (64496 - 64511, 65536 - 65551) +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC5398=true + +# Exclude private ASNs (64512 - 65534, 4200000000 - 4294967294) + +# Exclude private ASNs: +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC6996=true + + +####################################################################################### +### Skinning +# +# See https://ixp-manager.readthedocs.io/en/latest/features/skinning.html +# +# VIEW_SKIN="myskin" + + +####################################################################################### +# See config/cache.php +CACHE_DRIVER=array + +####################################################################################### +# Session Lifetimes - standard and remember me. +# +# See https://docs.ixpmanager.org/usage/authentication/ +# +# SESSION_LIFETIME=120 +# AUTH_TOKEN_EXPIRE=43200 + + +####################################################################################### +# PeeringDB Authentication +# +# PeeringDb's API is used, for example, to pre-populate new customer details. If you +# provide a working PeeringDb username/password then these will be used to get more +# complete information. +# +# IXP_API_PEERING_DB_USERNAME=username +# IXP_API_PEERING_DB_PASSWORD=password + + + +####################################################################################### +# Options for updating RIR Objects - see https://docs.ixpmanager.org/features/rir-objects/ + +# Your RIR password to allow the updating of a RIR object by email: +# IXP_API_RIR_PASSWORD=soopersecret + +# Rather than specifiying the destination address on the command line, you can set it here +# (useful for cronjobs and required for use with artisan schedule:run in >=v5.0) +# IXP_API_RIR_EMAIL_TO=test-dbm@ripe.net + +# Rather than specifiying the from address on the command line, you can set it here +# (useful for cronjobs and required for use with artisan schedule:run in >=v5.0) +# IXP_API_RIR_EMAIL_FROM=ixp@example.com + + + +####################################################################################### +# Utility paths + +# See: https://docs.ixpmanager.org/features/irrdb/ +IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 + +# See: https://docs.ixpmanager.org/features/rpki/ +# IXP_RPKI_RTR1_HOST=192.0.2.11 +# IXP_RPKI_RTR1_PORT=3323 +# IXP_RPKI_RTR2_HOST=192.0.2.12 +# IXP_RPKI_RTR2_PORT=3323 + + +######################################################################################### +### Development Helpers +### + +# Disable HTML5 validation to test PHP code based request validators +# FORMER_LIVE_VALIDATION=false + + +######################################################################################### +### PeeringDB OAuth +### +### https://docs.ixpmanager.org/features/peeringdb-oauth/ +### + +# AUTH_PEERINGDB_ENABLED=true + +# PEERINGDB_OAUTH_CLIENT_ID="xxx" +# PEERINGDB_OAUTH_CLIENT_SECRET="xxx" +# PEERINGDB_OAUTH_REDIRECT="https://www.example.com/auth/login/peeringdb/callback" + + +######################################################################################### +### See: https://docs.ixpmanager.org/features/routers/#filtering-known-transit-networks +# IXP_NO_TRANSIT_ASNS_EXCLUDE=65501,65502 +# IXP_NO_TRANSIT_ASNS_OVERRIDE=65501,65502,65503 + diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 839c5dc4b..4b246fe20 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.006}} \ No newline at end of file diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php new file mode 100644 index 000000000..d6114281e --- /dev/null +++ b/app/Services/DotEnvWriter.php @@ -0,0 +1,366 @@ + + * @link https://mirazmac.com + */ +namespace IXP\Services; + +use InvalidArgumentException; +use LogicException; + +class DotEnvWriter +{ + /** + * The .env file content + * + * @var string + */ + protected string $content = ""; + + /** + * Path to the .env file + * + * @var string|null + */ + protected ?string $sourceFile = null; + + /** + * Parsed variables, just for reference, not properly type-casted + * + * @var array + */ + protected array $variables = []; + + /** + * Stores if a change was made todo: Disposable + * + * @var bool + */ + protected bool $changed = false; + + /** + * Constructs a new instance. + * + * @param string|null $sourceFile The environment path + * @throws LogicException If the file is missing + */ + public function __construct(?string $sourceFile = null) + { + if (null !== $sourceFile) { + $this->sourceFile = $sourceFile; + $this->content = file_get_contents($sourceFile); + $this->parse(); + } + } + + /** + * Set the value of an environment variable, updated if exists, added if doesn't todo: Refactor + * + * @param string $key The key + * @param string $value The value + * @param bool $forceQuote By default the whether the value is wrapped + * in double quotes is determined automatically. + * However, you may wish to force quote a value + * + * @throws InvalidArgumentException If a new key contains invalid characters + * @return self + */ + public function set(string $key, string $value, bool $forceQuote = false) : self + { + $originalValue = $value; + + // Quote properly + $value = $this->escapeValue($value, $forceQuote); + + // If the key exists, replace it's value + if ($this->exists($key)) { + $this->content = preg_replace("/^{$key}=.*$/mu", "{$key}={$value}", $this->content); + } else { + // otherwise append to the end + if (!$this->isValidName($key)) { + throw new InvalidArgumentException("Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only."); + } + + $this->content .= "{$key}={$value}" . PHP_EOL; + } + + $this->variables[$key] = $originalValue; + $this->changed = true; + + return $this; + } + + /** + * Set more values at once, downside of this is you can't set "forceQuote" specificly todo: Disposable + * + * @param array $values The values as key => value pairs + * @return self + */ + public function setValues(array $values) : self + { + foreach ($values as $key => $value) { + $this->set($key, $value); + } + + return $this; + } + + /** + * Delete an environment variable if present todo: Refactor + * + * @param string $key The key + * @return self + */ + public function delete(string $key) : self + { + if ($this->exists($key)) { + $this->content = preg_replace("/^{$key}=.*\s{0,1}/mu", '', $this->content); + unset($this->variables[$key]); + $this->changed = true; + } + + return $this; + } + + /** + * Remark an environment variable if present + * + * @param string $key The key + * @return self + */ + public function disable(string $key) : self + { + $lineId = $this->findVariable( $key ); + + if ($lineId !== false) { + if(!$this->variables[$lineId]["changed"]) { + $this->variables[$lineId]["status"] = false; + $this->variables[$lineId]["changed"] = true; + } + } + + return $this; + } + + /** + * Unremarked an environment variable if present + * + * @param string $key The key + * @return self + */ + public function enable(string $key) : self + { + $lineId = $this->findVariable( $key ); + + if ($lineId !== false) { + if($this->variables[$lineId]["changed"]) { + $this->variables[$lineId]["status"] = true; + $this->variables[$lineId]["changed"] = true; + } + } + + return $this; + } + + /** + * States if one or more values has changed todo: Disposable + * + * @return bool + */ + public function hasChanged() : bool + { + return $this->changed; + } + + /** + * Returns the value for a variable is present todo: Refactor + * + * NOTE: This is a writer library so all values are parsed as string. + * Don't use this as an way to read values from dot env files. Instead use something robust like: + * https://github.com/vlucas/phpdotenv + * + * @param string $key The key + * @return string + */ + public function get(string $key): string + { + return $this->exists($key) ? $this->variables[$key] : ''; + } + + /** + * Returns all the variables parsed + * + * @return array + */ + public function getAll(): array + { + return $this->variables; + } + + /** + * Returns the current content + * + * @return string + */ + public function getContent() : string + { + return $this->content; + } + + /** + * Write the contents to the env file todo: Refactor + * + * @param bool $force By default we only write when something has changed, + * but you can force to write the file + * @param string $destFile Destionation file. By default it's the same as $sourceFile is provided + * + * @return bool + */ + public function write(bool $force = false, ?string $destFile = null) : bool + { + if (null === $destFile) { + $destFile = $this->sourceFile; + } + + if (null === $destFile) { + throw new LogicException("No file provided"); + } + + // If nothing is changed don't bother writing unless forced + if (!$this->hasChanged() && !$force) { + return true; + } + + return (false !== file_put_contents($destFile, $this->content, \LOCK_EX) ?? true); + } + + /** + * Check if a variable exists or not todo: Refactor + * + * @param string $key The key + * @return bool + */ + public function exists(string $key): bool + { + return array_key_exists($key, $this->variables); + } + + /** + * Find a variable line id in the $variables array + * + * @param string $key + * @return false|int + */ + protected function findVariable( string $key): false|int + { + return array_search( $key, array_column( $this->variables, 'key' ) ); + } + + /** + * Determines whether the specified key is valid name for .env files. + * + * @param string $key The key + * + * @return bool + */ + protected function isValidName(string $key) : bool + { + return (bool)preg_match( '/^[\w\.]+$/', $key ); + } + + /** + * Parses the environment file line by line and store the variables + */ + protected function parse() : void + { + $lines = preg_split('/\r\n|\r|\n/', $this->content); + + foreach ($lines as $index => $line) { + if (mb_strlen(trim($line)) && !(mb_strpos(trim($line), '#') === 0)) { + [$key, $value] = explode('=', (string) $line); + $this->variables[] = [ + "key" => $key, + "value" => $this->formatValue($value), + "status" => true, + "changed" => false, + ]; + } else { + $unremarkedLine = trim(substr((string) $line, 1)); + $validVariable = preg_match("/^([A-Z_]+)=(.+)$/", $unremarkedLine, $matches); + if ($validVariable) { + $this->variables[] = [ + "key" => $matches[1], + "value" => $this->formatValue($matches[2]), + "status" => false, + "changed" => false, + ]; + } else { + $this->variables[] = [ + "key" => null, + "value" => $line, + "status" => false, + "changed" => false, + ]; + } + } + } + } + + /** + * Strips quotes from the values when reading + * + * @param string $value The value + * @return string + */ + protected function stripQuotes(string $value): string + { + return preg_replace('/^(\'(.*)\'|"(.*)")$/u', '$2$3', $value); + } + + /** + * Formats the value for human friendly output + * + * @param string $value The value + * @return string + */ + protected function formatValue(string $value): string + { + $value = trim(explode('#', trim($value))[0]); + + return stripslashes($this->stripQuotes($value)); + } + + /** + * Escapes the value before writing to the contents + * + * @param string $value The value + * @param bool $forceQuote Whether force quoting is preferred + * @return string + */ + protected function escapeValue(string $value, bool $forceQuote): string + { + if ('' === $value) { + return ''; + } + + // Quote the values if + // it contains white-space or the following characters: " \ = : . $ ( ) + // or simply force quote is enabled + if (preg_match('/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value) || $forceQuote) { + // Replace backslashes with even more backslashes so when writing we can have escaped backslashes + // damn.. that rhymes + $value = str_replace('\\', '\\\\\\\\', $value); + // Wrap the + $value = '"' . addcslashes($value, '"') . '"'; + } + + return $value; + } +} \ No newline at end of file diff --git a/tests/Services/DotEnvWriterTest.php b/tests/Services/DotEnvWriterTest.php new file mode 100644 index 000000000..2dbecd615 --- /dev/null +++ b/tests/Services/DotEnvWriterTest.php @@ -0,0 +1,58 @@ + + * @category IXP + * @package IXP\Tests + * @copyright Copyright (C) 2009 - 2021 Internet Neutral Exchange Association Company Limited By Guarantee + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 + */ +class DotEnvWriterTest extends TestCase +{ + protected string $testFile = '.env.test'; + protected DotEnvWriter $writer; + + /** + * Utility function to get a .env.test file content and variable list + * + */ + public function testReader(): void + { + $this->testFile = base_path($this->testFile); + $this->writer = new DotEnvWriter($this->testFile); + $variables = $this->writer->getAll(); + + info("Variables:\n".var_export($variables,1)); + $this->assertIsArray($variables); + + } + +} From 587ef05a390677eba65d28843accd291c3038b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Fri, 7 Jun 2024 13:28:52 +0100 Subject: [PATCH 014/145] writer service class and test --- .phpunit.cache/test-results | 2 +- app/Services/DotEnvWriter.php | 316 ++++++++++++++++------------ tests/Services/DotEnvWriterTest.php | 73 ++++++- 3 files changed, 252 insertions(+), 139 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 4b246fe20..5616ef3cb 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.006}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8,"Tests\\Services\\DotEnvWriterTest::testSetVariables":8,"Tests\\Services\\DotEnvWriterTest::testWrite":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.004,"Tests\\Services\\DotEnvWriterTest::testSetVariables":0.002,"Tests\\Services\\DotEnvWriterTest::testWrite":0.002}} \ No newline at end of file diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index d6114281e..fd647dce1 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -10,10 +10,13 @@ * @author Miraz Mac * @link https://mirazmac.com */ + namespace IXP\Services; +use Carbon\Carbon; use InvalidArgumentException; use LogicException; +use const LOCK_EX; class DotEnvWriter { @@ -39,7 +42,7 @@ class DotEnvWriter protected array $variables = []; /** - * Stores if a change was made todo: Disposable + * Stores if a change was made * * @var bool */ @@ -48,81 +51,93 @@ class DotEnvWriter /** * Constructs a new instance. * - * @param string|null $sourceFile The environment path + * @param string|null $sourceFile The environment path * @throws LogicException If the file is missing */ - public function __construct(?string $sourceFile = null) + public function __construct( ?string $sourceFile = null ) { - if (null !== $sourceFile) { + if( null !== $sourceFile ) { $this->sourceFile = $sourceFile; - $this->content = file_get_contents($sourceFile); + $this->content = file_get_contents( $sourceFile ); $this->parse(); } } /** - * Set the value of an environment variable, updated if exists, added if doesn't todo: Refactor + * Set the value of an environment variable, + * updated if exists and enabled if disabled, + * added if it doesn't exist * - * @param string $key The key - * @param string $value The value - * @param bool $forceQuote By default the whether the value is wrapped - * in double quotes is determined automatically. - * However, you may wish to force quote a value + * @param string $key The key + * @param string $value The value + * @param string|null $description The description (remarked line before variable, only on new variable) * - * @throws InvalidArgumentException If a new key contains invalid characters * @return self + * @throws InvalidArgumentException If a new key contains invalid characters */ - public function set(string $key, string $value, bool $forceQuote = false) : self + public function set( string $key, string $value, string|null $description = null ): self { - $originalValue = $value; - - // Quote properly - $value = $this->escapeValue($value, $forceQuote); - - // If the key exists, replace it's value - if ($this->exists($key)) { - $this->content = preg_replace("/^{$key}=.*$/mu", "{$key}={$value}", $this->content); + // If the key exists, replace its value + if( $lineId = $this->findVariable( $key ) ) { + $this->variables[ $lineId ][ "value" ] = $this->formatValue( $value ); + $this->variables[ $lineId ][ "status" ] = true; + $this->variables[ $lineId ][ "changed" ] = true; + $this->changed = true; } else { // otherwise append to the end - if (!$this->isValidName($key)) { - throw new InvalidArgumentException("Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only."); + if( !$this->isValidName( $key ) ) { + throw new InvalidArgumentException( "Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only." ); } - $this->content .= "{$key}={$value}" . PHP_EOL; + if( $description ) { + $this->variables[] = [ + "key" => null, + "value" => $description, + "status" => false, + "changed" => true, + ]; + } + $this->variables[] = [ + "key" => $key, + "value" => $this->formatValue( $value ), + "status" => true, + "changed" => true, + ]; + $this->changed = true; } - $this->variables[$key] = $originalValue; - $this->changed = true; - return $this; } /** - * Set more values at once, downside of this is you can't set "forceQuote" specificly todo: Disposable + * Set more values at once * - * @param array $values The values as key => value pairs + * @param array $values The values as key => value pairs * @return self */ - public function setValues(array $values) : self + public function setValues( array $values ): self { - foreach ($values as $key => $value) { - $this->set($key, $value); + foreach( $values as $key => $value ) { + $this->set( $key, $value ); } return $this; } /** - * Delete an environment variable if present todo: Refactor + * Delete an environment variable if present * - * @param string $key The key + * @param string $key The key + * @param bool $removeDescription Remove the description before the variable * @return self */ - public function delete(string $key) : self + public function delete( string $key, bool $removeDescription = false ): self { - if ($this->exists($key)) { - $this->content = preg_replace("/^{$key}=.*\s{0,1}/mu", '', $this->content); - unset($this->variables[$key]); + if( $lineId = $this->findVariable( $key ) ) { + unset( $this->variables[ $lineId ] ); + if( $removeDescription && $this->variables[ $lineId - 1 ][ "key" ] === null ) { + unset( $this->variables[ $lineId - 1 ] ); + } $this->changed = true; } @@ -132,18 +147,15 @@ public function delete(string $key) : self /** * Remark an environment variable if present * - * @param string $key The key + * @param string $key The key * @return self */ - public function disable(string $key) : self + public function disable( string $key ): self { - $lineId = $this->findVariable( $key ); - - if ($lineId !== false) { - if(!$this->variables[$lineId]["changed"]) { - $this->variables[$lineId]["status"] = false; - $this->variables[$lineId]["changed"] = true; - } + if( $lineId = $this->findVariable( $key ) ) { + $this->variables[ $lineId ][ "status" ] = false; + $this->variables[ $lineId ][ "changed" ] = true; + $this->changed = true; } return $this; @@ -152,50 +164,74 @@ public function disable(string $key) : self /** * Unremarked an environment variable if present * - * @param string $key The key + * @param string $key The key * @return self */ - public function enable(string $key) : self + public function enable( string $key ): self { - $lineId = $this->findVariable( $key ); + if( $lineId = $this->findVariable( $key ) ) { + $this->variables[ $lineId ][ "status" ] = true; + $this->variables[ $lineId ][ "changed" ] = true; + $this->changed = true; + } + + return $this; + } - if ($lineId !== false) { - if($this->variables[$lineId]["changed"]) { - $this->variables[$lineId]["status"] = true; - $this->variables[$lineId]["changed"] = true; + /** + * Sanitize the variable collection + * Remove all remarked line + * + * @param bool $leaveRemarkedVariables Don't remove remarked variables if it is true + * + * @return self + */ + public function sanitize( bool $leaveRemarkedVariables = true ): self { + $collection = []; + foreach($this->variables as $variable) { + if($variable["key"] !== null) { + if($variable["status"] || ($variable["status"] === false && $leaveRemarkedVariables)) { + $collection[] = $variable; + } } } - + $this->variables = $collection; return $this; } /** - * States if one or more values has changed todo: Disposable + * States if one or more values has changed * * @return bool */ - public function hasChanged() : bool + public function hasChanged(): bool { return $this->changed; } /** - * Returns the value for a variable is present todo: Refactor + * Returns the id of the variable array or the full content for a variable is present * - * NOTE: This is a writer library so all values are parsed as string. - * Don't use this as an way to read values from dot env files. Instead use something robust like: - * https://github.com/vlucas/phpdotenv - * - * @param string $key The key - * @return string + * @param string $key The key + * @param bool $full Give full content of the found variable + * @return array|int|false */ - public function get(string $key): string + public function get( string $key, bool $full = false ): array|int|false { - return $this->exists($key) ? $this->variables[$key] : ''; + $lineId = $this->findVariable( $key ); + if ($full) { + if($lineId !== false) { + return [$lineId => $this->variables[ $lineId ]]; + } else { + return false; + } + } else { + return $lineId; + } } /** - * Returns all the variables parsed + * Returns all full variable collection parsed * * @return array */ @@ -205,51 +241,61 @@ public function getAll(): array } /** - * Returns the current content - * - * @return string - */ - public function getContent() : string - { - return $this->content; - } - - /** - * Write the contents to the env file todo: Refactor + * Write the contents to the env file + * Without a $destFile it will modify the original file, but it creates a backup with the timestamp and a .bak extension * - * @param bool $force By default we only write when something has changed, - * but you can force to write the file - * @param string $destFile Destionation file. By default it's the same as $sourceFile is provided + * @param bool $force By default, we only write when something has changed, but you can force to write the file + * @param string|null $destFile Destination file. By default it's the same as $sourceFile is provided * - * @return bool + * @return array Array of old and new file. */ - public function write(bool $force = false, ?string $destFile = null) : bool + public function write( bool $force = false, ?string $destFile = null ): array { - if (null === $destFile) { - $destFile = $this->sourceFile; - } + if( $this->hasChanged() || $force ) { + if( is_null($destFile) ) { + $backupFile = $this->sourceFile . Carbon::now()->format("YmdHis") . ".bak"; + if( is_null($this->sourceFile) ) { + throw new LogicException( "No file provided" ); + } + $destFile = $this->sourceFile; + rename($destFile, $backupFile); + } else if (file_exists($destFile)) { + throw new LogicException( "Given destination file already exists." ); + } else { + $backupFile = $this->sourceFile; + } - if (null === $destFile) { - throw new LogicException("No file provided"); - } + $content = ""; + foreach($this->variables as $lineId => $variable) { + if(is_null($variable["key"])) { + $pre = ""; + if( !str_starts_with( $variable[ "value" ], "#") && trim($variable[ "value" ]) !== '' ) { + $pre = "# "; + } + $content .= $pre.$variable["value"]."\n"; + } else if($variable["status"] === false) { + $content .= "# ".$variable["key"]."=".$this->escapeValue($variable["value"])."\n"; + } else { + $content .= $variable["key"]."=".$this->escapeValue($variable["value"])."\n"; + } + } + file_put_contents($destFile, $content, LOCK_EX); - // If nothing is changed don't bother writing unless forced - if (!$this->hasChanged() && !$force) { - return true; + return [$backupFile,$destFile]; + } else { + throw new LogicException( "No change made on source file." ); } - - return (false !== file_put_contents($destFile, $this->content, \LOCK_EX) ?? true); } /** - * Check if a variable exists or not todo: Refactor + * Check if a variable exists or not * - * @param string $key The key + * @param string $key The key * @return bool */ - public function exists(string $key): bool + public function exists( string $key ): bool { - return array_key_exists($key, $this->variables); + return in_array( $key, array_column( $this->variables, 'key' ) ); } /** @@ -258,19 +304,23 @@ public function exists(string $key): bool * @param string $key * @return false|int */ - protected function findVariable( string $key): false|int + protected function findVariable( string $key ): false|int { - return array_search( $key, array_column( $this->variables, 'key' ) ); + $result = false; + foreach($this->variables as $index => $variable) { + if($variable["key"] === $key) { $result = $index; break; } + } + return $result; } /** * Determines whether the specified key is valid name for .env files. * - * @param string $key The key + * @param string $key The key * * @return bool */ - protected function isValidName(string $key) : bool + protected function isValidName( string $key ): bool { return (bool)preg_match( '/^[\w\.]+$/', $key ); } @@ -278,34 +328,33 @@ protected function isValidName(string $key) : bool /** * Parses the environment file line by line and store the variables */ - protected function parse() : void + protected function parse(): void { - $lines = preg_split('/\r\n|\r|\n/', $this->content); + $lines = preg_split( '/\r\n|\r|\n/', $this->content ); - foreach ($lines as $index => $line) { - if (mb_strlen(trim($line)) && !(mb_strpos(trim($line), '#') === 0)) { - [$key, $value] = explode('=', (string) $line); + foreach( $lines as $index => $line ) { + if( mb_strlen( trim( $line ) ) && !( mb_strpos( trim( $line ), '#' ) === 0 ) ) { + [ $key, $value ] = explode( '=', (string)$line ); $this->variables[] = [ - "key" => $key, - "value" => $this->formatValue($value), - "status" => true, + "key" => $key, + "value" => $this->formatValue( $value ), + "status" => true, "changed" => false, ]; } else { - $unremarkedLine = trim(substr((string) $line, 1)); - $validVariable = preg_match("/^([A-Z_]+)=(.+)$/", $unremarkedLine, $matches); - if ($validVariable) { + $validVariable = preg_match( "/^#\s{0,1}(\w+)=(.+)$/", $line, $matches ); + if( $validVariable ) { $this->variables[] = [ - "key" => $matches[1], - "value" => $this->formatValue($matches[2]), - "status" => false, + "key" => $matches[ 1 ], + "value" => $this->formatValue( $matches[ 2 ] ), + "status" => false, "changed" => false, ]; } else { $this->variables[] = [ - "key" => null, - "value" => $line, - "status" => false, + "key" => null, + "value" => $line, + "status" => false, "changed" => false, ]; } @@ -316,49 +365,46 @@ protected function parse() : void /** * Strips quotes from the values when reading * - * @param string $value The value + * @param string $value The value * @return string */ - protected function stripQuotes(string $value): string + protected function stripQuotes( string $value ): string { - return preg_replace('/^(\'(.*)\'|"(.*)")$/u', '$2$3', $value); + return preg_replace( '/^(\'(.*)\'|"(.*)")$/u', '$2$3', $value ); } /** * Formats the value for human friendly output * - * @param string $value The value + * @param string $value The value * @return string */ - protected function formatValue(string $value): string + protected function formatValue( string $value ): string { - $value = trim(explode('#', trim($value))[0]); + $value = trim( explode( '#', trim( $value ) )[ 0 ] ); - return stripslashes($this->stripQuotes($value)); + return stripslashes( $this->stripQuotes( $value ) ); } /** * Escapes the value before writing to the contents * - * @param string $value The value - * @param bool $forceQuote Whether force quoting is preferred + * @param string $value The value * @return string */ - protected function escapeValue(string $value, bool $forceQuote): string + protected function escapeValue( string $value ): string { - if ('' === $value) { + if( '' === $value ) { return ''; } // Quote the values if // it contains white-space or the following characters: " \ = : . $ ( ) // or simply force quote is enabled - if (preg_match('/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value) || $forceQuote) { + if( preg_match( '/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value ) ) { // Replace backslashes with even more backslashes so when writing we can have escaped backslashes - // damn.. that rhymes - $value = str_replace('\\', '\\\\\\\\', $value); - // Wrap the - $value = '"' . addcslashes($value, '"') . '"'; + $value = str_replace( '\\', '\\\\\\\\', $value ); + $value = '"' . addcslashes( $value, '"' ) . '"'; } return $value; diff --git a/tests/Services/DotEnvWriterTest.php b/tests/Services/DotEnvWriterTest.php index 2dbecd615..f47eb1faf 100644 --- a/tests/Services/DotEnvWriterTest.php +++ b/tests/Services/DotEnvWriterTest.php @@ -38,6 +38,8 @@ class DotEnvWriterTest extends TestCase { protected string $testFile = '.env.test'; + protected string $testWriteFile = '.env.test2'; + protected DotEnvWriter $writer; /** @@ -46,13 +48,78 @@ class DotEnvWriterTest extends TestCase */ public function testReader(): void { - $this->testFile = base_path($this->testFile); - $this->writer = new DotEnvWriter($this->testFile); + $testFile = base_path($this->testFile); + $this->writer = new DotEnvWriter($testFile); + $variables = $this->writer->sanitize(false)->getAll(); + + $this->assertIsArray($variables); + } + + /** + * Utility function to set variables to the .env.test file + * + */ + public function testSetVariables(): void + { + $testFile = base_path($this->testFile); + $this->writer = new DotEnvWriter($testFile); + $this->writer->set("APP_LOG","daily","not showing description"); + $this->writer->set("TEST_KEY","Test value","It is a test description"); + $this->writer->enable("MAIL_PORT"); + $this->writer->disable("APP_KEY"); + $this->writer->delete("GRAPHER_BACKEND_MRTG_DBTYPE",true); $variables = $this->writer->getAll(); - info("Variables:\n".var_export($variables,1)); + $mail = $this->writer->get("MAIL_PORT"); + $app = $this->writer->get("APP_KEY"); + $log = $this->writer->get("APP_LOG"); + $test = $this->writer->get("TEST_KEY"); + $testDescription = $test - 1; + $graph = $this->writer->get("GRAPHER_BACKEND_MRTG_DBTYPE"); + $this->assertIsArray($variables); + $this->assertTrue($variables[$mail]["status"]); + $this->assertTrue($variables[$mail]["changed"]); + $this->assertFalse($variables[$app]["status"]); + $this->assertTrue($variables[$app]["changed"]); + $this->assertEquals("daily",$variables[$log]["value"]); + $this->assertTrue($variables[$log]["changed"]); + $this->assertEquals("Test value",$variables[$test]["value"]); + $this->assertTrue($variables[$test]["changed"]); + $this->assertNull($variables[$testDescription]["key"]); + $this->assertEquals("It is a test description",$variables[$testDescription]["value"]); + $this->assertFalse($variables[$testDescription]["status"]); + $this->assertTrue($variables[$testDescription]["changed"]); + $this->assertFalse($graph); } + /** + * Utility function to write the .env.test file content from the variables + * + */ + public function testWrite(): void + { + $testFile = base_path($this->testFile); + $testWriteFile = base_path($this->testWriteFile); + $this->writer = new DotEnvWriter($testFile); + + $this->writer->set("APP_LOG","daily","not showing description"); + $this->writer->enable("MAIL_PORT"); + $this->writer->disable("APP_KEY"); + $this->writer->delete("GRAPHER_BACKEND_MRTG_DBTYPE",true); + + $this->writer->set("TEST_KEY","Test value","It is a test description"); + + $variables = $this->writer->getAll(); + + $created1 = $this->writer->write(false, $testWriteFile); + $created2 = $this->writer->write(); + + $this->assertIsArray($variables); + $this->assertFileExists($created1[0]); // old file + $this->assertFileExists($created1[1]); // new file + $this->assertFileExists($created2[0]); // old file + $this->assertFileExists($created2[1]); // new file + } } From b62a2a58011334d1ed38189ee1837227e7191718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Fri, 7 Jun 2024 16:18:58 +0100 Subject: [PATCH 015/145] writer service class and test --- app/Services/DotEnvWriter.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index fd647dce1..e3b51aef5 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -4,11 +4,6 @@ * https://github.com/MirazMac/DotEnvWriter * * A PHP library to write values to .env files. - * - * Heavily inspired from https://github.com/msztorc/laravel-env - * - * @author Miraz Mac - * @link https://mirazmac.com */ namespace IXP\Services; From a973e5ce3ab88e2245cd26eb7f30090cc7551273 Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Tue, 11 Jun 2024 10:49:55 +0100 Subject: [PATCH 016/145] [CI] review with laszlo --- .phpstorm.meta.php/laravel.meta.php | 33 ++ _ide_helper.php | 26 +- app/Console/Commands/Command.php | 3 +- app/Console/Commands/MailingList/Init.php | 2 + .../Commands/Router/GenerateConfiguration.php | 2 + .../Customer/Note/CustomerNotesController.php | 14 +- composer.json | 6 +- composer.lock | 368 +++++++++--------- psalm.xml | 7 + 9 files changed, 267 insertions(+), 194 deletions(-) diff --git a/.phpstorm.meta.php/laravel.meta.php b/.phpstorm.meta.php/laravel.meta.php index f01a3dad1..54b01e6d4 100644 --- a/.phpstorm.meta.php/laravel.meta.php +++ b/.phpstorm.meta.php/laravel.meta.php @@ -126,6 +126,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -243,6 +245,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -369,6 +372,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -486,6 +491,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -612,6 +618,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -729,6 +737,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -855,6 +864,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -972,6 +983,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1098,6 +1110,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1215,6 +1229,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1341,6 +1356,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1458,6 +1475,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1584,6 +1602,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1701,6 +1721,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1827,6 +1848,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1944,6 +1967,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2070,6 +2094,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -2187,6 +2213,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2313,6 +2340,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -2430,6 +2459,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2556,6 +2586,8 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, + 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, + 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -2673,6 +2705,7 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, + 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, diff --git a/_ide_helper.php b/_ide_helper.php index 3486a74a7..62f378671 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -5,7 +5,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 11.8.0. + * Generated for Laravel 11.10.0. * * This file should not be included in your code, only analyzed by your IDE! * @@ -656,6 +656,26 @@ { /** @var \Illuminate\Foundation\Application $instance */ return $instance->handleCommand($input); + } + /** + * Determine if the framework's base configuration should be merged. + * + * @return bool + * @static + */ public static function shouldMergeFrameworkConfiguration() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->shouldMergeFrameworkConfiguration(); + } + /** + * Indicate that the framework's base configuration should not be merged. + * + * @return \Illuminate\Foundation\Application + * @static + */ public static function dontMergeFrameworkConfiguration() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->dontMergeFrameworkConfiguration(); } /** * Determine if middleware has been disabled for the application. @@ -817,7 +837,7 @@ /** * Get the service providers that have been loaded. * - * @return array + * @return array * @static */ public static function getLoadedProviders() { @@ -24747,7 +24767,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * Insert or update a record matching the attributes, and fill it with values. * * @param array $attributes - * @param array $values + * @param array|callable $values * @return bool * @static */ public static function updateOrInsert($attributes, $values = []) diff --git a/app/Console/Commands/Command.php b/app/Console/Commands/Command.php index 50bb20086..9544ebab8 100644 --- a/app/Console/Commands/Command.php +++ b/app/Console/Commands/Command.php @@ -31,7 +31,8 @@ abstract class Command extends \Illuminate\Console\Command { - /** + + /** * Returns true if verbosity is EXACTLY: VERBOSITY_QUIET * * @return bool diff --git a/app/Console/Commands/MailingList/Init.php b/app/Console/Commands/MailingList/Init.php index 53b474887..5490a1f4a 100644 --- a/app/Console/Commands/MailingList/Init.php +++ b/app/Console/Commands/MailingList/Init.php @@ -25,6 +25,7 @@ use Ds\Set; +use Illuminate\Support\Collection; use IXP\Utils\MailingList as ML; /** @@ -80,6 +81,7 @@ public function handle(): int $ml = new ML( $this->argument('list') ); $stdin = fopen( "php://stdin","r" ); + /** @var Collection $addresses */ $addresses = collect(); while( $address = strtolower( trim( fgets( $stdin ) ) ) ) { diff --git a/app/Console/Commands/Router/GenerateConfiguration.php b/app/Console/Commands/Router/GenerateConfiguration.php index 1046f0ab6..efda253c6 100644 --- a/app/Console/Commands/Router/GenerateConfiguration.php +++ b/app/Console/Commands/Router/GenerateConfiguration.php @@ -70,8 +70,10 @@ public function handle() return -1; } + /** @psalm-suppress InvalidArgument - render() casts as a string, no issue here */ echo ( new RouterConfigurationGenerator( $router ) )->render(); + /** @psalm-suppress UndefinedConstant - LARAVEL_START defined in artisan command line tool */ Log::info( sprintf( "Generated router configuration for %s and used %0.1f MB ( %0.1f MB real) of memory in %0.3f seconds.", $router->handle, memory_get_peak_usage()/1024/1024, memory_get_peak_usage( true )/1024/1024, microtime(true) - LARAVEL_START ) diff --git a/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php b/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php index 7290bfe54..47d601bbb 100644 --- a/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php +++ b/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php @@ -31,10 +31,7 @@ use IXP\Http\Controllers\Controller; -use IXP\Models\{ - Customer, - CustomerNote -}; +use IXP\Models\{Customer, CustomerNote, User}; use Illuminate\Http\{ JsonResponse, @@ -69,6 +66,7 @@ class CustomerNotesController extends Controller */ public function create( Request $r, Customer $cust ): JsonResponse { + /** @var User $user */ $user = Auth::getUser(); $cn = new CustomerNote; @@ -101,6 +99,7 @@ public function create( Request $r, Customer $cust ): JsonResponse */ public function update( Request $r, CustomerNote $cn ): JsonResponse { + /** @var User $user */ $user = Auth::getUser(); $old = clone( $cn ); @@ -131,8 +130,11 @@ public function update( Request $r, CustomerNote $cn ): JsonResponse */ public function get( CustomerNote $cn ): JsonResponse { + /** @var User $user */ + $user = Auth::getUser(); + // these if's could be joined with '&&' but are separated for readability: - if( !Auth::getUser()->isSuperUser() ) { + if( !$user->isSuperUser() ) { if( $cn->private || $cn->customer_id !== Auth::getUser()->custid ) { abort( 403, 'Insufficient Permissions.' ); } @@ -171,6 +173,7 @@ public function delete( CustomerNote $cn ) : JsonResponse */ public function ping( Customer $c = null ): JsonResponse { + /** @var User $u */ $u = Auth::getUser(); if( !$u->isSuperUser() ) { $c = Auth::getUser()->customer; @@ -219,6 +222,7 @@ public function notifyToggleNote( CustomerNote $cn ): JsonResponse */ private function notifyToggle( Customer $cust = null, CustomerNote $cn = null ): JsonResponse { + /** @var User $user */ $user = Auth::getUser(); $prefs = $user->prefs; diff --git a/composer.json b/composer.json index ddc425389..a7d5bc37c 100644 --- a/composer.json +++ b/composer.json @@ -59,11 +59,11 @@ "laravel/sail": "^1.29", "mockery/mockery": "^1.6", "nunomaduro/collision": "^8.1", - "sebastian/diff": "^5.0", "phpunit/phpunit": "^10.5.1", - "vimeo/psalm": "^5.0", "psalm/plugin-laravel": "^2.11", - "staudenmeir/dusk-updater": "^1.5" + "sebastian/diff": "^5.0", + "staudenmeir/dusk-updater": "^1.5", + "vimeo/psalm": "^5.0" }, "support": { "issues": "https://www.ixpmanager.org/support.php", diff --git a/composer.lock b/composer.lock index 794afc709..5c64755b6 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": "442f64447ed9d486f093f10ef22819e8", + "content-hash": "12c84751eb9a9ace513c94150947e01c", "packages": [ { "name": "anahkiasen/former", @@ -788,16 +788,16 @@ }, { "name": "doctrine/event-manager", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", "shasum": "" }, "require": { @@ -807,10 +807,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^10", + "doctrine/coding-standard": "^12", "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.28" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "type": "library", "autoload": { @@ -859,7 +859,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" }, "funding": [ { @@ -875,7 +875,7 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:59:15+00:00" + "time": "2024-05-22T20:47:39+00:00" }, { "name": "doctrine/inflector", @@ -2270,16 +2270,16 @@ }, { "name": "laravel/framework", - "version": "v11.8.0", + "version": "v11.10.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "ceb892a25817c888ef3df4d1a2af9cac53978300" + "reference": "99b4255194912044b75ab72329f8c19e6345720e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/ceb892a25817c888ef3df4d1a2af9cac53978300", - "reference": "ceb892a25817c888ef3df4d1a2af9cac53978300", + "url": "https://api.github.com/repos/laravel/framework/zipball/99b4255194912044b75ab72329f8c19e6345720e", + "reference": "99b4255194912044b75ab72329f8c19e6345720e", "shasum": "" }, "require": { @@ -2471,20 +2471,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-05-21T17:57:45+00:00" + "time": "2024-06-04T13:45:55+00:00" }, { "name": "laravel/horizon", - "version": "v5.24.4", + "version": "v5.24.5", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "8d31ff178bf5493efc2b2629c10612054f31f584" + "reference": "3c359e3a9ebd3e3be012a15eedf2d64ef8b82540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/8d31ff178bf5493efc2b2629c10612054f31f584", - "reference": "8d31ff178bf5493efc2b2629c10612054f31f584", + "url": "https://api.github.com/repos/laravel/horizon/zipball/3c359e3a9ebd3e3be012a15eedf2d64ef8b82540", + "reference": "3c359e3a9ebd3e3be012a15eedf2d64ef8b82540", "shasum": "" }, "require": { @@ -2548,22 +2548,22 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.24.4" + "source": "https://github.com/laravel/horizon/tree/v5.24.5" }, - "time": "2024-05-03T13:34:14+00:00" + "time": "2024-05-31T16:18:41+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.22", + "version": "v0.1.23", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "37f94de71758dbfbccc9d299b0e5eb76e02a40f5" + "reference": "9bc4df7c699b0452c6b815e64a2d84b6d7f99400" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/37f94de71758dbfbccc9d299b0e5eb76e02a40f5", - "reference": "37f94de71758dbfbccc9d299b0e5eb76e02a40f5", + "url": "https://api.github.com/repos/laravel/prompts/zipball/9bc4df7c699b0452c6b815e64a2d84b6d7f99400", + "reference": "9bc4df7c699b0452c6b815e64a2d84b6d7f99400", "shasum": "" }, "require": { @@ -2606,9 +2606,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.22" + "source": "https://github.com/laravel/prompts/tree/v0.1.23" }, - "time": "2024-05-10T19:22:18+00:00" + "time": "2024-05-27T13:53:20+00:00" }, { "name": "laravel/serializable-closure", @@ -3694,16 +3694,16 @@ }, { "name": "nesbot/carbon", - "version": "3.3.1", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "8ff64b92c1b1ec84fcde9f8bb9ff2ca34cb8a77a" + "reference": "415782b7e48223342f1a616c16c45a95b15b2318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8ff64b92c1b1ec84fcde9f8bb9ff2ca34cb8a77a", - "reference": "8ff64b92c1b1ec84fcde9f8bb9ff2ca34cb8a77a", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/415782b7e48223342f1a616c16c45a95b15b2318", + "reference": "415782b7e48223342f1a616c16c45a95b15b2318", "shasum": "" }, "require": { @@ -3721,13 +3721,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.52.1", + "friendsofphp/php-cs-fixer": "^3.57.2", "kylekatarnls/multi-tester": "^2.5.3", "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.10.65", - "phpunit/phpunit": "^10.5.15", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", "squizlabs/php_codesniffer": "^3.9.0" }, "bin": [ @@ -3796,7 +3796,7 @@ "type": "tidelift" } ], - "time": "2024-05-01T06:54:22+00:00" + "time": "2024-06-03T17:25:54+00:00" }, { "name": "nette/schema", @@ -5287,16 +5287,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.3", + "version": "v0.12.4", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", "shasum": "" }, "require": { @@ -5360,9 +5360,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" }, - "time": "2024-04-02T15:57:53+00:00" + "time": "2024-06-10T01:18:23+00:00" }, { "name": "ralouphie/getallheaders", @@ -5917,16 +5917,16 @@ }, { "name": "spatie/ignition", - "version": "1.14.1", + "version": "1.14.2", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "c23cc018c5f423d2f413b99f84655fceb6549811" + "reference": "5e11c11f675bb5251f061491a493e04a1a571532" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/c23cc018c5f423d2f413b99f84655fceb6549811", - "reference": "c23cc018c5f423d2f413b99f84655fceb6549811", + "url": "https://api.github.com/repos/spatie/ignition/zipball/5e11c11f675bb5251f061491a493e04a1a571532", + "reference": "5e11c11f675bb5251f061491a493e04a1a571532", "shasum": "" }, "require": { @@ -5996,7 +5996,7 @@ "type": "github" } ], - "time": "2024-05-03T15:56:16+00:00" + "time": "2024-05-29T08:10:20+00:00" }, { "name": "spatie/laravel-ignition", @@ -6092,16 +6092,16 @@ }, { "name": "symfony/clock", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "2008671acb4a30b01c453de193cf9c80549ebda6" + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/2008671acb4a30b01c453de193cf9c80549ebda6", - "reference": "2008671acb4a30b01c453de193cf9c80549ebda6", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", "shasum": "" }, "require": { @@ -6146,7 +6146,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.0.7" + "source": "https://github.com/symfony/clock/tree/v7.1.1" }, "funding": [ { @@ -6162,20 +6162,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/console", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c981e0e9380ce9f146416bde3150c79197ce9986" + "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c981e0e9380ce9f146416bde3150c79197ce9986", - "reference": "c981e0e9380ce9f146416bde3150c79197ce9986", + "url": "https://api.github.com/repos/symfony/console/zipball/9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", + "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", "shasum": "" }, "require": { @@ -6239,7 +6239,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.0.7" + "source": "https://github.com/symfony/console/tree/v7.1.1" }, "funding": [ { @@ -6255,20 +6255,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/css-selector", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc" + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", - "reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", "shasum": "" }, "require": { @@ -6304,7 +6304,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.0.7" + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" }, "funding": [ { @@ -6320,7 +6320,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6391,16 +6391,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "cf97429887e40480c847bfeb6c3991e1e2c086ab" + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/cf97429887e40480c847bfeb6c3991e1e2c086ab", - "reference": "cf97429887e40480c847bfeb6c3991e1e2c086ab", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", "shasum": "" }, "require": { @@ -6446,7 +6446,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.0.7" + "source": "https://github.com/symfony/error-handler/tree/v7.1.1" }, "funding": [ { @@ -6462,20 +6462,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9", - "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { @@ -6526,7 +6526,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -6542,7 +6542,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -6622,16 +6622,16 @@ }, { "name": "symfony/finder", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4d58f0f4fe95a30d7b538d71197135483560b97c" + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4d58f0f4fe95a30d7b538d71197135483560b97c", - "reference": "4d58f0f4fe95a30d7b538d71197135483560b97c", + "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", "shasum": "" }, "require": { @@ -6666,7 +6666,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.0.7" + "source": "https://github.com/symfony/finder/tree/v7.1.1" }, "funding": [ { @@ -6682,20 +6682,20 @@ "type": "tidelift" } ], - "time": "2024-04-28T11:44:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "0194e064b8bdc29381462f790bab04e1cac8fdc8" + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0194e064b8bdc29381462f790bab04e1cac8fdc8", - "reference": "0194e064b8bdc29381462f790bab04e1cac8fdc8", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa", "shasum": "" }, "require": { @@ -6743,7 +6743,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.0.7" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.1" }, "funding": [ { @@ -6759,25 +6759,26 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "e07bb9bd86e7cd8ba2d3d9c618eec9d1bbe06d25" + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e07bb9bd86e7cd8ba2d3d9c618eec9d1bbe06d25", - "reference": "e07bb9bd86e7cd8ba2d3d9c618eec9d1bbe06d25", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", @@ -6818,9 +6819,9 @@ "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3", "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", + "symfony/property-access": "^7.1", "symfony/routing": "^6.4|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/serializer": "^7.1", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", @@ -6856,7 +6857,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.0.7" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.1" }, "funding": [ { @@ -6872,20 +6873,20 @@ "type": "tidelift" } ], - "time": "2024-04-29T12:20:25+00:00" + "time": "2024-06-04T06:52:15+00:00" }, { "name": "symfony/mailer", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "4ff41a7c7998a88cfdc31b5841ef64d9246fc56a" + "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/4ff41a7c7998a88cfdc31b5841ef64d9246fc56a", - "reference": "4ff41a7c7998a88cfdc31b5841ef64d9246fc56a", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2eaad2e167cae930f25a3d731fec8b2ded5e751e", + "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e", "shasum": "" }, "require": { @@ -6936,7 +6937,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.0.7" + "source": "https://github.com/symfony/mailer/tree/v7.1.1" }, "funding": [ { @@ -6952,20 +6953,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/mime", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "3adbf110c306546f6f00337f421d2edca0e8d3c0" + "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/3adbf110c306546f6f00337f421d2edca0e8d3c0", - "reference": "3adbf110c306546f6f00337f421d2edca0e8d3c0", + "url": "https://api.github.com/repos/symfony/mime/zipball/21027eaacc1a8a20f5e616c25c3580f5dd3a15df", + "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df", "shasum": "" }, "require": { @@ -6978,7 +6979,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<6.4", - "symfony/serializer": "<6.4" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -6988,7 +6989,7 @@ "symfony/process": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -7020,7 +7021,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.0.7" + "source": "https://github.com/symfony/mime/tree/v7.1.1" }, "funding": [ { @@ -7036,7 +7037,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-06-04T06:40:14+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7751,16 +7752,16 @@ }, { "name": "symfony/process", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3839e56b94dd1dbd13235d27504e66baf23faba0" + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3839e56b94dd1dbd13235d27504e66baf23faba0", - "reference": "3839e56b94dd1dbd13235d27504e66baf23faba0", + "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", "shasum": "" }, "require": { @@ -7792,7 +7793,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.0.7" + "source": "https://github.com/symfony/process/tree/v7.1.1" }, "funding": [ { @@ -7808,20 +7809,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/routing", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9f82bf7766ccc9c22ab7aeb9bebb98351483fa5b" + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9f82bf7766ccc9c22ab7aeb9bebb98351483fa5b", - "reference": "9f82bf7766ccc9c22ab7aeb9bebb98351483fa5b", + "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", "shasum": "" }, "require": { @@ -7873,7 +7874,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.0.7" + "source": "https://github.com/symfony/routing/tree/v7.1.1" }, "funding": [ { @@ -7889,7 +7890,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/service-contracts", @@ -7976,16 +7977,16 @@ }, { "name": "symfony/string", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" + "reference": "60bc311c74e0af215101235aa6f471bcbc032df2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", - "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", + "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2", + "reference": "60bc311c74e0af215101235aa6f471bcbc032df2", "shasum": "" }, "require": { @@ -7999,6 +8000,7 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { + "symfony/emoji": "^7.1", "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", @@ -8042,7 +8044,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.7" + "source": "https://github.com/symfony/string/tree/v7.1.1" }, "funding": [ { @@ -8058,20 +8060,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-06-04T06:40:14+00:00" }, { "name": "symfony/translation", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1515e03afaa93e6419aba5d5c9d209159317100b" + "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1515e03afaa93e6419aba5d5c9d209159317100b", - "reference": "1515e03afaa93e6419aba5d5c9d209159317100b", + "url": "https://api.github.com/repos/symfony/translation/zipball/cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", + "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", "shasum": "" }, "require": { @@ -8136,7 +8138,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.0.7" + "source": "https://github.com/symfony/translation/tree/v7.1.1" }, "funding": [ { @@ -8152,7 +8154,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/translation-contracts", @@ -8234,16 +8236,16 @@ }, { "name": "symfony/uid", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "4f3a5d181999e25918586c8369de09e7814e7be2" + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/4f3a5d181999e25918586c8369de09e7814e7be2", - "reference": "4f3a5d181999e25918586c8369de09e7814e7be2", + "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", "shasum": "" }, "require": { @@ -8288,7 +8290,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.0.7" + "source": "https://github.com/symfony/uid/tree/v7.1.1" }, "funding": [ { @@ -8304,20 +8306,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d1627b66fd87c8b4d90cabe5671c29d575690924" + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d1627b66fd87c8b4d90cabe5671c29d575690924", - "reference": "d1627b66fd87c8b4d90cabe5671c29d575690924", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293", "shasum": "" }, "require": { @@ -8371,7 +8373,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.0.7" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.1" }, "funding": [ { @@ -8387,7 +8389,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9188,16 +9190,16 @@ }, { "name": "composer/class-map-generator", - "version": "1.1.1", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "8286a62d243312ed99b3eee20d5005c961adb311" + "reference": "61804f9973685ec7bead0fb7fe022825e3cd418e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8286a62d243312ed99b3eee20d5005c961adb311", - "reference": "8286a62d243312ed99b3eee20d5005c961adb311", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/61804f9973685ec7bead0fb7fe022825e3cd418e", + "reference": "61804f9973685ec7bead0fb7fe022825e3cd418e", "shasum": "" }, "require": { @@ -9241,7 +9243,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.1.1" + "source": "https://github.com/composer/class-map-generator/tree/1.3.3" }, "funding": [ { @@ -9257,20 +9259,20 @@ "type": "tidelift" } ], - "time": "2024-03-15T12:53:41+00:00" + "time": "2024-06-10T11:53:54+00:00" }, { "name": "composer/pcre", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" + "reference": "04229f163664973f68f38f6f73d917799168ef24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", + "reference": "04229f163664973f68f38f6f73d917799168ef24", "shasum": "" }, "require": { @@ -9312,7 +9314,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.3" + "source": "https://github.com/composer/pcre/tree/3.1.4" }, "funding": [ { @@ -9328,7 +9330,7 @@ "type": "tidelift" } ], - "time": "2024-03-19T10:26:25+00:00" + "time": "2024-05-27T13:40:54+00:00" }, { "name": "composer/semver", @@ -10354,16 +10356,16 @@ }, { "name": "orchestra/testbench-core", - "version": "v9.1.0", + "version": "v9.1.6", "source": { "type": "git", "url": "https://github.com/orchestral/testbench-core.git", - "reference": "174eca97e949c15250dc21a4c34835eedab72599" + "reference": "66116144568050cc55a08fc93458b22b60e75740" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/174eca97e949c15250dc21a4c34835eedab72599", - "reference": "174eca97e949c15250dc21a4c34835eedab72599", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/66116144568050cc55a08fc93458b22b60e75740", + "reference": "66116144568050cc55a08fc93458b22b60e75740", "shasum": "" }, "require": { @@ -10439,7 +10441,7 @@ "issues": "https://github.com/orchestral/testbench/issues", "source": "https://github.com/orchestral/testbench-core" }, - "time": "2024-05-21T00:03:19+00:00" + "time": "2024-06-10T10:24:57+00:00" }, { "name": "phar-io/manifest", @@ -10802,16 +10804,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.29.0", + "version": "1.29.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc" + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/536889f2b340489d328f5ffb7b02bb6b183ddedc", - "reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { @@ -10843,9 +10845,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" }, - "time": "2024-05-06T12:04:23+00:00" + "time": "2024-05-31T08:52:43+00:00" }, { "name": "phpunit/php-code-coverage", @@ -12378,22 +12380,24 @@ }, { "name": "symfony/filesystem", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5" + "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/cc168be6fbdcdf3401f50ae863ee3818ed4338f5", - "reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/802e87002f919296c9f606457d9fa327a0b3d6b2", + "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2", "shasum": "" }, "require": { "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { "symfony/process": "^6.4|^7.0" }, "type": "library", @@ -12422,7 +12426,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.0.7" + "source": "https://github.com/symfony/filesystem/tree/v7.1.1" }, "funding": [ { @@ -12438,20 +12442,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/yaml", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0d3916ae69ea28b59d94b60c4f2b50f4e25adb5c" + "reference": "fa34c77015aa6720469db7003567b9f772492bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0d3916ae69ea28b59d94b60c4f2b50f4e25adb5c", - "reference": "0d3916ae69ea28b59d94b60c4f2b50f4e25adb5c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", + "reference": "fa34c77015aa6720469db7003567b9f772492bf2", "shasum": "" }, "require": { @@ -12493,7 +12497,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.0.7" + "source": "https://github.com/symfony/yaml/tree/v7.1.1" }, "funding": [ { @@ -12509,7 +12513,7 @@ "type": "tidelift" } ], - "time": "2024-04-28T11:44:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "theseer/tokenizer", diff --git a/psalm.xml b/psalm.xml index c888c95d3..7ad76ff69 100644 --- a/psalm.xml +++ b/psalm.xml @@ -6,6 +6,13 @@ xmlns="https://getpsalm.org/schema/config" xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd" > + + + + + + + From 2adfd842c700f7ad680ea92d3376372d69be792d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Thu, 6 Jun 2024 17:59:40 +0100 Subject: [PATCH 017/145] writer service class and test - phase 1 --- .env.test | 310 +++++++++++++++++++++++ .phpunit.cache/test-results | 2 +- app/Services/DotEnvWriter.php | 366 ++++++++++++++++++++++++++++ tests/Services/DotEnvWriterTest.php | 58 +++++ 4 files changed, 735 insertions(+), 1 deletion(-) create mode 100644 .env.test create mode 100644 app/Services/DotEnvWriter.php create mode 100644 tests/Services/DotEnvWriterTest.php diff --git a/.env.test b/.env.test new file mode 100644 index 000000000..0656f9a08 --- /dev/null +++ b/.env.test @@ -0,0 +1,310 @@ +####################################################################################### +# +# IXP Manager V4+ configuration. +# +# + +# Run "artisan key:generate" to set the application key: +APP_KEY= + +# Set this to false in production (but change it to true if you have installation or +# other issues running IXP Manager). +APP_DEBUG=false + +# Web address where IXP Manager is accessed. This is a **required** setting. It is +# currently used for generating all URLs within IXP Manager (action, assets, etc.). +# It is also used / required for sending emails via CLI scripts. +# +APP_URL="https://ixp.example.com" + + +# See http://php.net/manual/en/timezones.php for a list of timezones: +APP_TIMEZONE="UTC" + +# Laravel log format (storage/log). See config/log.php and +# https://laravel.com/docs/5.4/errors +APP_LOG="single" + +# info by default, one of: debug, info, notice, warning, error, critical, alert, emergency. +APP_LOG_LEVEL=debug + +# MySQL Connection Details +DB_HOST="127.0.0.1" +DB_DATABASE="ixp" +DB_USERNAME="ixp" +DB_PASSWORD="password" + + +####################################################################################### +### Email Settings. +# +# We use Laravel's mail system - see: https://docs.ixpmanager.org/usage/email/ +# +# The default setting are as follows: +# +# MAIL_MAILER="smtp" +# MAIL_HOST="localhost" +# MAIL_PORT=25 +# MAIL_ENCRYPTION=false + + + +####################################################################################### +### Identity +# +# Used throughout IXP Manager in various ways. +# +# This has grown organically and we intend to clean this up in a coming release and +# documenting where and how each one is spceifically used. + + +# Used in various emails, etc. +IDENTITY_SITENAME="Vagrant IXP Manager" +APP_NAME="${IDENTITY_SITENAME}" +# Shown in title bar of web portal. Defaults to IDENTITY_SITENAME +# IDENTITY_TITLENAME="Vagrant IXP Manager" + +IDENTITY_LEGALNAME="Vagrant City IXP" +IDENTITY_CITY="Dublin" +IDENTITY_COUNTRY="IE" +IDENTITY_ORGNAME="${IDENTITY_LEGALNAME}" + +# As well as uses in other places, emails are sent from the following name/email: +IDENTITY_NAME="${IDENTITY_LEGALNAME}" +IDENTITY_EMAIL="ixp@example.com" + +IDENTITY_TESTEMAIL="${IDENTITY_EMAIL}" + +# Used on some traffic graphs: +IDENTITY_WATERMARK="Vagrant City IXP" + +IDENTITY_SUPPORT_EMAIL="${IDENTITY_EMAIL}" +IDENTITY_SUPPORT_PHONE="+1 111 555 5555" +IDENTITY_SUPPORT_HOURS="24x7" + +IDENTITY_BILLING_EMAIL="${IDENTITY_EMAIL}" +IDENTITY_BILLING_PHONE="+1 111 555 5555" +IDENTITY_BILLING_HOURS="24x7" + +# Web address of your IXP's website. Used in IX-F Export schema, etc. +IDENTITY_CORPORATE_URL="http://www.example.com/" + +# The logo to show on the login page. Should be a URL. +# (the example here works - the leading '//' means the browser should match http/https based on the web page) +IDENTITY_BIGLOGO="//www.ixpmanager.org/images/logos/ixp-manager.png" + +# For some actions (e.g. peering matrix) we need to know what VLAN to show by default. +# This is the vlan.id database entry (i.e. not the VLAN number/tag!) +IDENTITY_DEFAULT_VLAN=1 + + +######################################################################################### +### Member vs. Customer +### +### IXP Manager is an open source project and typically used in member-owned IXPs. +### As such, the language used mostly is 'member'. To change this to 'customer' just +### uncomment the following lines: +# +# IXP_FE_FRONTEND_CUSTOMER_ONE=customer +# IXP_FE_FRONTEND_CUSTOMER_MANY=customers +# IXP_FE_FRONTEND_CUSTOMER_OWNER="customer's" +# IXP_FE_FRONTEND_CUSTOMER_OWNERS="customers'" + + + +####################################################################################### +### Features +# + +# See: http://docs.ixpmanager.org/features/reseller/ +IXP_RESELLER_ENABLED=false + +# See: http://docs.ixpmanager.org/features/as112/ +IXP_AS112_UI_ACTIVE=false + + +####################################################################################### +### Frontend controllers and controller configuration +# +# Some frontend controllers are disabled by default. This is for a variety of reasons +# including: additional configuration may be required, maintain backwards +# compatibility, etc. + +# Allow customers / admins to upload logos for members. Set to false to enabled. +# See: http://docs.ixpmanager.org/usage/customers/#customer-logos +IXP_FE_FRONTEND_DISABLED_LOGO=false + + +# Send email notifications when a customer's billing details are updated. +# See: http://docs.ixpmanager.org/usage/customers/#notification-of-billing-details-changed +# IXP_FE_CUSTOMER_BILLING_UPDATES_NOTIFY="mail@example.com" + + +# Disable links to the peering matrix if you have not set it up (with sflow): +# IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX=true + +# Enable the UI for route server community-based filtering by uncommenting this line: +# IXP_FE_FRONTEND_DISABLED_RS_FILTERS=false + +####################################################################################### +### Graphing - see https://docs.ixpmanager.org/grapher/introduction + +# Enable the backends you have configured. E.g.: +# GRAPHER_BACKENDS="mrtg|sflow|smokeping" + +# On a new installation, we just use placeholders from the dummy backend: +GRAPHER_BACKENDS="dummy" + +# With the cache enabled, IXP Manager does not have to regenerate / reload / reprocess +# log / rrd / image files if we have cached them and they are less than 5mins old. This +# is enabled by default which is the recommended setting. +GRAPHER_CACHE_ENABLED=true + +################################################################################# +## Grapher - Mrtg - see: https://docs.ixpmanager.org/grapher/mrtg/ +## + +# For backwards compatibility, the default is 'log' but 'rrd' is more modern: +GRAPHER_BACKEND_MRTG_DBTYPE="rrd" + +# The defaults for these are '/tmp' to require you to change them to something +# more sensible such as: +# GRAPHER_BACKEND_MRTG_WORKDIR="/srv/mrtg" +# GRAPHER_BACKEND_MRTG_LOGDIR="/srv/mrtg" + +################################################################################# +## Grapher - sflow - see: https://docs.ixpmanager.org/grapher/sflow/ +## + +# GRAPHER_BACKEND_SFLOW_ENABLED=false +# GRAPHER_BACKEND_SFLOW_ROOT="http://sflow-server.example.com/grapher-sflow" + + +################################################################################# +## Grapher - smokeping - see: https://docs.ixpmanager.org/grapher/smokeping/ +## + +# Mark it as enabled (this just affects whether certain UI elements are shown): +# GRAPHER_BACKEND_SMOKEPING_ENABLED=true + +# And set the default location to fetch the Smokeping graphs from: +# GRAPHER_BACKEND_SMOKEPING_URL="http://www.example.com/smokeping" + + +################################################################################# +## IX-F Member Export - see: https://docs.ixpmanager.org/features/ixf-export/ + + +# IXP_API_JSONEXPORTSCHEMA_PUBLIC=true + +# Some variables can be excluded as required. +# See: https://docs.ixpmanager.org/features/ixf-export/ +# +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_SWITCH="model|software" +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_IXP="name|url" +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_MEMBER="asnum|name" +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_INTINFO="mac_addresses|routeserver" + +# Exclude members with certain AS numbers +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_ASNUM="65001|65002|65003" + +# Exclude members with certain tags +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_TAGS="tag1|tag2" + +# Exclude documentation ASNs (64496 - 64511, 65536 - 65551) +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC5398=true + +# Exclude private ASNs (64512 - 65534, 4200000000 - 4294967294) + +# Exclude private ASNs: +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC6996=true + + +####################################################################################### +### Skinning +# +# See https://ixp-manager.readthedocs.io/en/latest/features/skinning.html +# +# VIEW_SKIN="myskin" + + +####################################################################################### +# See config/cache.php +CACHE_DRIVER=array + +####################################################################################### +# Session Lifetimes - standard and remember me. +# +# See https://docs.ixpmanager.org/usage/authentication/ +# +# SESSION_LIFETIME=120 +# AUTH_TOKEN_EXPIRE=43200 + + +####################################################################################### +# PeeringDB Authentication +# +# PeeringDb's API is used, for example, to pre-populate new customer details. If you +# provide a working PeeringDb username/password then these will be used to get more +# complete information. +# +# IXP_API_PEERING_DB_USERNAME=username +# IXP_API_PEERING_DB_PASSWORD=password + + + +####################################################################################### +# Options for updating RIR Objects - see https://docs.ixpmanager.org/features/rir-objects/ + +# Your RIR password to allow the updating of a RIR object by email: +# IXP_API_RIR_PASSWORD=soopersecret + +# Rather than specifiying the destination address on the command line, you can set it here +# (useful for cronjobs and required for use with artisan schedule:run in >=v5.0) +# IXP_API_RIR_EMAIL_TO=test-dbm@ripe.net + +# Rather than specifiying the from address on the command line, you can set it here +# (useful for cronjobs and required for use with artisan schedule:run in >=v5.0) +# IXP_API_RIR_EMAIL_FROM=ixp@example.com + + + +####################################################################################### +# Utility paths + +# See: https://docs.ixpmanager.org/features/irrdb/ +IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 + +# See: https://docs.ixpmanager.org/features/rpki/ +# IXP_RPKI_RTR1_HOST=192.0.2.11 +# IXP_RPKI_RTR1_PORT=3323 +# IXP_RPKI_RTR2_HOST=192.0.2.12 +# IXP_RPKI_RTR2_PORT=3323 + + +######################################################################################### +### Development Helpers +### + +# Disable HTML5 validation to test PHP code based request validators +# FORMER_LIVE_VALIDATION=false + + +######################################################################################### +### PeeringDB OAuth +### +### https://docs.ixpmanager.org/features/peeringdb-oauth/ +### + +# AUTH_PEERINGDB_ENABLED=true + +# PEERINGDB_OAUTH_CLIENT_ID="xxx" +# PEERINGDB_OAUTH_CLIENT_SECRET="xxx" +# PEERINGDB_OAUTH_REDIRECT="https://www.example.com/auth/login/peeringdb/callback" + + +######################################################################################### +### See: https://docs.ixpmanager.org/features/routers/#filtering-known-transit-networks +# IXP_NO_TRANSIT_ASNS_EXCLUDE=65501,65502 +# IXP_NO_TRANSIT_ASNS_OVERRIDE=65501,65502,65503 + diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 839c5dc4b..4b246fe20 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.006}} \ No newline at end of file diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php new file mode 100644 index 000000000..d6114281e --- /dev/null +++ b/app/Services/DotEnvWriter.php @@ -0,0 +1,366 @@ + + * @link https://mirazmac.com + */ +namespace IXP\Services; + +use InvalidArgumentException; +use LogicException; + +class DotEnvWriter +{ + /** + * The .env file content + * + * @var string + */ + protected string $content = ""; + + /** + * Path to the .env file + * + * @var string|null + */ + protected ?string $sourceFile = null; + + /** + * Parsed variables, just for reference, not properly type-casted + * + * @var array + */ + protected array $variables = []; + + /** + * Stores if a change was made todo: Disposable + * + * @var bool + */ + protected bool $changed = false; + + /** + * Constructs a new instance. + * + * @param string|null $sourceFile The environment path + * @throws LogicException If the file is missing + */ + public function __construct(?string $sourceFile = null) + { + if (null !== $sourceFile) { + $this->sourceFile = $sourceFile; + $this->content = file_get_contents($sourceFile); + $this->parse(); + } + } + + /** + * Set the value of an environment variable, updated if exists, added if doesn't todo: Refactor + * + * @param string $key The key + * @param string $value The value + * @param bool $forceQuote By default the whether the value is wrapped + * in double quotes is determined automatically. + * However, you may wish to force quote a value + * + * @throws InvalidArgumentException If a new key contains invalid characters + * @return self + */ + public function set(string $key, string $value, bool $forceQuote = false) : self + { + $originalValue = $value; + + // Quote properly + $value = $this->escapeValue($value, $forceQuote); + + // If the key exists, replace it's value + if ($this->exists($key)) { + $this->content = preg_replace("/^{$key}=.*$/mu", "{$key}={$value}", $this->content); + } else { + // otherwise append to the end + if (!$this->isValidName($key)) { + throw new InvalidArgumentException("Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only."); + } + + $this->content .= "{$key}={$value}" . PHP_EOL; + } + + $this->variables[$key] = $originalValue; + $this->changed = true; + + return $this; + } + + /** + * Set more values at once, downside of this is you can't set "forceQuote" specificly todo: Disposable + * + * @param array $values The values as key => value pairs + * @return self + */ + public function setValues(array $values) : self + { + foreach ($values as $key => $value) { + $this->set($key, $value); + } + + return $this; + } + + /** + * Delete an environment variable if present todo: Refactor + * + * @param string $key The key + * @return self + */ + public function delete(string $key) : self + { + if ($this->exists($key)) { + $this->content = preg_replace("/^{$key}=.*\s{0,1}/mu", '', $this->content); + unset($this->variables[$key]); + $this->changed = true; + } + + return $this; + } + + /** + * Remark an environment variable if present + * + * @param string $key The key + * @return self + */ + public function disable(string $key) : self + { + $lineId = $this->findVariable( $key ); + + if ($lineId !== false) { + if(!$this->variables[$lineId]["changed"]) { + $this->variables[$lineId]["status"] = false; + $this->variables[$lineId]["changed"] = true; + } + } + + return $this; + } + + /** + * Unremarked an environment variable if present + * + * @param string $key The key + * @return self + */ + public function enable(string $key) : self + { + $lineId = $this->findVariable( $key ); + + if ($lineId !== false) { + if($this->variables[$lineId]["changed"]) { + $this->variables[$lineId]["status"] = true; + $this->variables[$lineId]["changed"] = true; + } + } + + return $this; + } + + /** + * States if one or more values has changed todo: Disposable + * + * @return bool + */ + public function hasChanged() : bool + { + return $this->changed; + } + + /** + * Returns the value for a variable is present todo: Refactor + * + * NOTE: This is a writer library so all values are parsed as string. + * Don't use this as an way to read values from dot env files. Instead use something robust like: + * https://github.com/vlucas/phpdotenv + * + * @param string $key The key + * @return string + */ + public function get(string $key): string + { + return $this->exists($key) ? $this->variables[$key] : ''; + } + + /** + * Returns all the variables parsed + * + * @return array + */ + public function getAll(): array + { + return $this->variables; + } + + /** + * Returns the current content + * + * @return string + */ + public function getContent() : string + { + return $this->content; + } + + /** + * Write the contents to the env file todo: Refactor + * + * @param bool $force By default we only write when something has changed, + * but you can force to write the file + * @param string $destFile Destionation file. By default it's the same as $sourceFile is provided + * + * @return bool + */ + public function write(bool $force = false, ?string $destFile = null) : bool + { + if (null === $destFile) { + $destFile = $this->sourceFile; + } + + if (null === $destFile) { + throw new LogicException("No file provided"); + } + + // If nothing is changed don't bother writing unless forced + if (!$this->hasChanged() && !$force) { + return true; + } + + return (false !== file_put_contents($destFile, $this->content, \LOCK_EX) ?? true); + } + + /** + * Check if a variable exists or not todo: Refactor + * + * @param string $key The key + * @return bool + */ + public function exists(string $key): bool + { + return array_key_exists($key, $this->variables); + } + + /** + * Find a variable line id in the $variables array + * + * @param string $key + * @return false|int + */ + protected function findVariable( string $key): false|int + { + return array_search( $key, array_column( $this->variables, 'key' ) ); + } + + /** + * Determines whether the specified key is valid name for .env files. + * + * @param string $key The key + * + * @return bool + */ + protected function isValidName(string $key) : bool + { + return (bool)preg_match( '/^[\w\.]+$/', $key ); + } + + /** + * Parses the environment file line by line and store the variables + */ + protected function parse() : void + { + $lines = preg_split('/\r\n|\r|\n/', $this->content); + + foreach ($lines as $index => $line) { + if (mb_strlen(trim($line)) && !(mb_strpos(trim($line), '#') === 0)) { + [$key, $value] = explode('=', (string) $line); + $this->variables[] = [ + "key" => $key, + "value" => $this->formatValue($value), + "status" => true, + "changed" => false, + ]; + } else { + $unremarkedLine = trim(substr((string) $line, 1)); + $validVariable = preg_match("/^([A-Z_]+)=(.+)$/", $unremarkedLine, $matches); + if ($validVariable) { + $this->variables[] = [ + "key" => $matches[1], + "value" => $this->formatValue($matches[2]), + "status" => false, + "changed" => false, + ]; + } else { + $this->variables[] = [ + "key" => null, + "value" => $line, + "status" => false, + "changed" => false, + ]; + } + } + } + } + + /** + * Strips quotes from the values when reading + * + * @param string $value The value + * @return string + */ + protected function stripQuotes(string $value): string + { + return preg_replace('/^(\'(.*)\'|"(.*)")$/u', '$2$3', $value); + } + + /** + * Formats the value for human friendly output + * + * @param string $value The value + * @return string + */ + protected function formatValue(string $value): string + { + $value = trim(explode('#', trim($value))[0]); + + return stripslashes($this->stripQuotes($value)); + } + + /** + * Escapes the value before writing to the contents + * + * @param string $value The value + * @param bool $forceQuote Whether force quoting is preferred + * @return string + */ + protected function escapeValue(string $value, bool $forceQuote): string + { + if ('' === $value) { + return ''; + } + + // Quote the values if + // it contains white-space or the following characters: " \ = : . $ ( ) + // or simply force quote is enabled + if (preg_match('/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value) || $forceQuote) { + // Replace backslashes with even more backslashes so when writing we can have escaped backslashes + // damn.. that rhymes + $value = str_replace('\\', '\\\\\\\\', $value); + // Wrap the + $value = '"' . addcslashes($value, '"') . '"'; + } + + return $value; + } +} \ No newline at end of file diff --git a/tests/Services/DotEnvWriterTest.php b/tests/Services/DotEnvWriterTest.php new file mode 100644 index 000000000..2dbecd615 --- /dev/null +++ b/tests/Services/DotEnvWriterTest.php @@ -0,0 +1,58 @@ + + * @category IXP + * @package IXP\Tests + * @copyright Copyright (C) 2009 - 2021 Internet Neutral Exchange Association Company Limited By Guarantee + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 + */ +class DotEnvWriterTest extends TestCase +{ + protected string $testFile = '.env.test'; + protected DotEnvWriter $writer; + + /** + * Utility function to get a .env.test file content and variable list + * + */ + public function testReader(): void + { + $this->testFile = base_path($this->testFile); + $this->writer = new DotEnvWriter($this->testFile); + $variables = $this->writer->getAll(); + + info("Variables:\n".var_export($variables,1)); + $this->assertIsArray($variables); + + } + +} From 60f0d6a50ba72450e7d341aad1b37465df10d19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Fri, 7 Jun 2024 13:28:52 +0100 Subject: [PATCH 018/145] writer service class and test --- .phpunit.cache/test-results | 2 +- app/Services/DotEnvWriter.php | 316 ++++++++++++++++------------ tests/Services/DotEnvWriterTest.php | 73 ++++++- 3 files changed, 252 insertions(+), 139 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 4b246fe20..5616ef3cb 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.006}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8,"Tests\\Services\\DotEnvWriterTest::testSetVariables":8,"Tests\\Services\\DotEnvWriterTest::testWrite":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.004,"Tests\\Services\\DotEnvWriterTest::testSetVariables":0.002,"Tests\\Services\\DotEnvWriterTest::testWrite":0.002}} \ No newline at end of file diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index d6114281e..fd647dce1 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -10,10 +10,13 @@ * @author Miraz Mac * @link https://mirazmac.com */ + namespace IXP\Services; +use Carbon\Carbon; use InvalidArgumentException; use LogicException; +use const LOCK_EX; class DotEnvWriter { @@ -39,7 +42,7 @@ class DotEnvWriter protected array $variables = []; /** - * Stores if a change was made todo: Disposable + * Stores if a change was made * * @var bool */ @@ -48,81 +51,93 @@ class DotEnvWriter /** * Constructs a new instance. * - * @param string|null $sourceFile The environment path + * @param string|null $sourceFile The environment path * @throws LogicException If the file is missing */ - public function __construct(?string $sourceFile = null) + public function __construct( ?string $sourceFile = null ) { - if (null !== $sourceFile) { + if( null !== $sourceFile ) { $this->sourceFile = $sourceFile; - $this->content = file_get_contents($sourceFile); + $this->content = file_get_contents( $sourceFile ); $this->parse(); } } /** - * Set the value of an environment variable, updated if exists, added if doesn't todo: Refactor + * Set the value of an environment variable, + * updated if exists and enabled if disabled, + * added if it doesn't exist * - * @param string $key The key - * @param string $value The value - * @param bool $forceQuote By default the whether the value is wrapped - * in double quotes is determined automatically. - * However, you may wish to force quote a value + * @param string $key The key + * @param string $value The value + * @param string|null $description The description (remarked line before variable, only on new variable) * - * @throws InvalidArgumentException If a new key contains invalid characters * @return self + * @throws InvalidArgumentException If a new key contains invalid characters */ - public function set(string $key, string $value, bool $forceQuote = false) : self + public function set( string $key, string $value, string|null $description = null ): self { - $originalValue = $value; - - // Quote properly - $value = $this->escapeValue($value, $forceQuote); - - // If the key exists, replace it's value - if ($this->exists($key)) { - $this->content = preg_replace("/^{$key}=.*$/mu", "{$key}={$value}", $this->content); + // If the key exists, replace its value + if( $lineId = $this->findVariable( $key ) ) { + $this->variables[ $lineId ][ "value" ] = $this->formatValue( $value ); + $this->variables[ $lineId ][ "status" ] = true; + $this->variables[ $lineId ][ "changed" ] = true; + $this->changed = true; } else { // otherwise append to the end - if (!$this->isValidName($key)) { - throw new InvalidArgumentException("Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only."); + if( !$this->isValidName( $key ) ) { + throw new InvalidArgumentException( "Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only." ); } - $this->content .= "{$key}={$value}" . PHP_EOL; + if( $description ) { + $this->variables[] = [ + "key" => null, + "value" => $description, + "status" => false, + "changed" => true, + ]; + } + $this->variables[] = [ + "key" => $key, + "value" => $this->formatValue( $value ), + "status" => true, + "changed" => true, + ]; + $this->changed = true; } - $this->variables[$key] = $originalValue; - $this->changed = true; - return $this; } /** - * Set more values at once, downside of this is you can't set "forceQuote" specificly todo: Disposable + * Set more values at once * - * @param array $values The values as key => value pairs + * @param array $values The values as key => value pairs * @return self */ - public function setValues(array $values) : self + public function setValues( array $values ): self { - foreach ($values as $key => $value) { - $this->set($key, $value); + foreach( $values as $key => $value ) { + $this->set( $key, $value ); } return $this; } /** - * Delete an environment variable if present todo: Refactor + * Delete an environment variable if present * - * @param string $key The key + * @param string $key The key + * @param bool $removeDescription Remove the description before the variable * @return self */ - public function delete(string $key) : self + public function delete( string $key, bool $removeDescription = false ): self { - if ($this->exists($key)) { - $this->content = preg_replace("/^{$key}=.*\s{0,1}/mu", '', $this->content); - unset($this->variables[$key]); + if( $lineId = $this->findVariable( $key ) ) { + unset( $this->variables[ $lineId ] ); + if( $removeDescription && $this->variables[ $lineId - 1 ][ "key" ] === null ) { + unset( $this->variables[ $lineId - 1 ] ); + } $this->changed = true; } @@ -132,18 +147,15 @@ public function delete(string $key) : self /** * Remark an environment variable if present * - * @param string $key The key + * @param string $key The key * @return self */ - public function disable(string $key) : self + public function disable( string $key ): self { - $lineId = $this->findVariable( $key ); - - if ($lineId !== false) { - if(!$this->variables[$lineId]["changed"]) { - $this->variables[$lineId]["status"] = false; - $this->variables[$lineId]["changed"] = true; - } + if( $lineId = $this->findVariable( $key ) ) { + $this->variables[ $lineId ][ "status" ] = false; + $this->variables[ $lineId ][ "changed" ] = true; + $this->changed = true; } return $this; @@ -152,50 +164,74 @@ public function disable(string $key) : self /** * Unremarked an environment variable if present * - * @param string $key The key + * @param string $key The key * @return self */ - public function enable(string $key) : self + public function enable( string $key ): self { - $lineId = $this->findVariable( $key ); + if( $lineId = $this->findVariable( $key ) ) { + $this->variables[ $lineId ][ "status" ] = true; + $this->variables[ $lineId ][ "changed" ] = true; + $this->changed = true; + } + + return $this; + } - if ($lineId !== false) { - if($this->variables[$lineId]["changed"]) { - $this->variables[$lineId]["status"] = true; - $this->variables[$lineId]["changed"] = true; + /** + * Sanitize the variable collection + * Remove all remarked line + * + * @param bool $leaveRemarkedVariables Don't remove remarked variables if it is true + * + * @return self + */ + public function sanitize( bool $leaveRemarkedVariables = true ): self { + $collection = []; + foreach($this->variables as $variable) { + if($variable["key"] !== null) { + if($variable["status"] || ($variable["status"] === false && $leaveRemarkedVariables)) { + $collection[] = $variable; + } } } - + $this->variables = $collection; return $this; } /** - * States if one or more values has changed todo: Disposable + * States if one or more values has changed * * @return bool */ - public function hasChanged() : bool + public function hasChanged(): bool { return $this->changed; } /** - * Returns the value for a variable is present todo: Refactor + * Returns the id of the variable array or the full content for a variable is present * - * NOTE: This is a writer library so all values are parsed as string. - * Don't use this as an way to read values from dot env files. Instead use something robust like: - * https://github.com/vlucas/phpdotenv - * - * @param string $key The key - * @return string + * @param string $key The key + * @param bool $full Give full content of the found variable + * @return array|int|false */ - public function get(string $key): string + public function get( string $key, bool $full = false ): array|int|false { - return $this->exists($key) ? $this->variables[$key] : ''; + $lineId = $this->findVariable( $key ); + if ($full) { + if($lineId !== false) { + return [$lineId => $this->variables[ $lineId ]]; + } else { + return false; + } + } else { + return $lineId; + } } /** - * Returns all the variables parsed + * Returns all full variable collection parsed * * @return array */ @@ -205,51 +241,61 @@ public function getAll(): array } /** - * Returns the current content - * - * @return string - */ - public function getContent() : string - { - return $this->content; - } - - /** - * Write the contents to the env file todo: Refactor + * Write the contents to the env file + * Without a $destFile it will modify the original file, but it creates a backup with the timestamp and a .bak extension * - * @param bool $force By default we only write when something has changed, - * but you can force to write the file - * @param string $destFile Destionation file. By default it's the same as $sourceFile is provided + * @param bool $force By default, we only write when something has changed, but you can force to write the file + * @param string|null $destFile Destination file. By default it's the same as $sourceFile is provided * - * @return bool + * @return array Array of old and new file. */ - public function write(bool $force = false, ?string $destFile = null) : bool + public function write( bool $force = false, ?string $destFile = null ): array { - if (null === $destFile) { - $destFile = $this->sourceFile; - } + if( $this->hasChanged() || $force ) { + if( is_null($destFile) ) { + $backupFile = $this->sourceFile . Carbon::now()->format("YmdHis") . ".bak"; + if( is_null($this->sourceFile) ) { + throw new LogicException( "No file provided" ); + } + $destFile = $this->sourceFile; + rename($destFile, $backupFile); + } else if (file_exists($destFile)) { + throw new LogicException( "Given destination file already exists." ); + } else { + $backupFile = $this->sourceFile; + } - if (null === $destFile) { - throw new LogicException("No file provided"); - } + $content = ""; + foreach($this->variables as $lineId => $variable) { + if(is_null($variable["key"])) { + $pre = ""; + if( !str_starts_with( $variable[ "value" ], "#") && trim($variable[ "value" ]) !== '' ) { + $pre = "# "; + } + $content .= $pre.$variable["value"]."\n"; + } else if($variable["status"] === false) { + $content .= "# ".$variable["key"]."=".$this->escapeValue($variable["value"])."\n"; + } else { + $content .= $variable["key"]."=".$this->escapeValue($variable["value"])."\n"; + } + } + file_put_contents($destFile, $content, LOCK_EX); - // If nothing is changed don't bother writing unless forced - if (!$this->hasChanged() && !$force) { - return true; + return [$backupFile,$destFile]; + } else { + throw new LogicException( "No change made on source file." ); } - - return (false !== file_put_contents($destFile, $this->content, \LOCK_EX) ?? true); } /** - * Check if a variable exists or not todo: Refactor + * Check if a variable exists or not * - * @param string $key The key + * @param string $key The key * @return bool */ - public function exists(string $key): bool + public function exists( string $key ): bool { - return array_key_exists($key, $this->variables); + return in_array( $key, array_column( $this->variables, 'key' ) ); } /** @@ -258,19 +304,23 @@ public function exists(string $key): bool * @param string $key * @return false|int */ - protected function findVariable( string $key): false|int + protected function findVariable( string $key ): false|int { - return array_search( $key, array_column( $this->variables, 'key' ) ); + $result = false; + foreach($this->variables as $index => $variable) { + if($variable["key"] === $key) { $result = $index; break; } + } + return $result; } /** * Determines whether the specified key is valid name for .env files. * - * @param string $key The key + * @param string $key The key * * @return bool */ - protected function isValidName(string $key) : bool + protected function isValidName( string $key ): bool { return (bool)preg_match( '/^[\w\.]+$/', $key ); } @@ -278,34 +328,33 @@ protected function isValidName(string $key) : bool /** * Parses the environment file line by line and store the variables */ - protected function parse() : void + protected function parse(): void { - $lines = preg_split('/\r\n|\r|\n/', $this->content); + $lines = preg_split( '/\r\n|\r|\n/', $this->content ); - foreach ($lines as $index => $line) { - if (mb_strlen(trim($line)) && !(mb_strpos(trim($line), '#') === 0)) { - [$key, $value] = explode('=', (string) $line); + foreach( $lines as $index => $line ) { + if( mb_strlen( trim( $line ) ) && !( mb_strpos( trim( $line ), '#' ) === 0 ) ) { + [ $key, $value ] = explode( '=', (string)$line ); $this->variables[] = [ - "key" => $key, - "value" => $this->formatValue($value), - "status" => true, + "key" => $key, + "value" => $this->formatValue( $value ), + "status" => true, "changed" => false, ]; } else { - $unremarkedLine = trim(substr((string) $line, 1)); - $validVariable = preg_match("/^([A-Z_]+)=(.+)$/", $unremarkedLine, $matches); - if ($validVariable) { + $validVariable = preg_match( "/^#\s{0,1}(\w+)=(.+)$/", $line, $matches ); + if( $validVariable ) { $this->variables[] = [ - "key" => $matches[1], - "value" => $this->formatValue($matches[2]), - "status" => false, + "key" => $matches[ 1 ], + "value" => $this->formatValue( $matches[ 2 ] ), + "status" => false, "changed" => false, ]; } else { $this->variables[] = [ - "key" => null, - "value" => $line, - "status" => false, + "key" => null, + "value" => $line, + "status" => false, "changed" => false, ]; } @@ -316,49 +365,46 @@ protected function parse() : void /** * Strips quotes from the values when reading * - * @param string $value The value + * @param string $value The value * @return string */ - protected function stripQuotes(string $value): string + protected function stripQuotes( string $value ): string { - return preg_replace('/^(\'(.*)\'|"(.*)")$/u', '$2$3', $value); + return preg_replace( '/^(\'(.*)\'|"(.*)")$/u', '$2$3', $value ); } /** * Formats the value for human friendly output * - * @param string $value The value + * @param string $value The value * @return string */ - protected function formatValue(string $value): string + protected function formatValue( string $value ): string { - $value = trim(explode('#', trim($value))[0]); + $value = trim( explode( '#', trim( $value ) )[ 0 ] ); - return stripslashes($this->stripQuotes($value)); + return stripslashes( $this->stripQuotes( $value ) ); } /** * Escapes the value before writing to the contents * - * @param string $value The value - * @param bool $forceQuote Whether force quoting is preferred + * @param string $value The value * @return string */ - protected function escapeValue(string $value, bool $forceQuote): string + protected function escapeValue( string $value ): string { - if ('' === $value) { + if( '' === $value ) { return ''; } // Quote the values if // it contains white-space or the following characters: " \ = : . $ ( ) // or simply force quote is enabled - if (preg_match('/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value) || $forceQuote) { + if( preg_match( '/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value ) ) { // Replace backslashes with even more backslashes so when writing we can have escaped backslashes - // damn.. that rhymes - $value = str_replace('\\', '\\\\\\\\', $value); - // Wrap the - $value = '"' . addcslashes($value, '"') . '"'; + $value = str_replace( '\\', '\\\\\\\\', $value ); + $value = '"' . addcslashes( $value, '"' ) . '"'; } return $value; diff --git a/tests/Services/DotEnvWriterTest.php b/tests/Services/DotEnvWriterTest.php index 2dbecd615..f47eb1faf 100644 --- a/tests/Services/DotEnvWriterTest.php +++ b/tests/Services/DotEnvWriterTest.php @@ -38,6 +38,8 @@ class DotEnvWriterTest extends TestCase { protected string $testFile = '.env.test'; + protected string $testWriteFile = '.env.test2'; + protected DotEnvWriter $writer; /** @@ -46,13 +48,78 @@ class DotEnvWriterTest extends TestCase */ public function testReader(): void { - $this->testFile = base_path($this->testFile); - $this->writer = new DotEnvWriter($this->testFile); + $testFile = base_path($this->testFile); + $this->writer = new DotEnvWriter($testFile); + $variables = $this->writer->sanitize(false)->getAll(); + + $this->assertIsArray($variables); + } + + /** + * Utility function to set variables to the .env.test file + * + */ + public function testSetVariables(): void + { + $testFile = base_path($this->testFile); + $this->writer = new DotEnvWriter($testFile); + $this->writer->set("APP_LOG","daily","not showing description"); + $this->writer->set("TEST_KEY","Test value","It is a test description"); + $this->writer->enable("MAIL_PORT"); + $this->writer->disable("APP_KEY"); + $this->writer->delete("GRAPHER_BACKEND_MRTG_DBTYPE",true); $variables = $this->writer->getAll(); - info("Variables:\n".var_export($variables,1)); + $mail = $this->writer->get("MAIL_PORT"); + $app = $this->writer->get("APP_KEY"); + $log = $this->writer->get("APP_LOG"); + $test = $this->writer->get("TEST_KEY"); + $testDescription = $test - 1; + $graph = $this->writer->get("GRAPHER_BACKEND_MRTG_DBTYPE"); + $this->assertIsArray($variables); + $this->assertTrue($variables[$mail]["status"]); + $this->assertTrue($variables[$mail]["changed"]); + $this->assertFalse($variables[$app]["status"]); + $this->assertTrue($variables[$app]["changed"]); + $this->assertEquals("daily",$variables[$log]["value"]); + $this->assertTrue($variables[$log]["changed"]); + $this->assertEquals("Test value",$variables[$test]["value"]); + $this->assertTrue($variables[$test]["changed"]); + $this->assertNull($variables[$testDescription]["key"]); + $this->assertEquals("It is a test description",$variables[$testDescription]["value"]); + $this->assertFalse($variables[$testDescription]["status"]); + $this->assertTrue($variables[$testDescription]["changed"]); + $this->assertFalse($graph); } + /** + * Utility function to write the .env.test file content from the variables + * + */ + public function testWrite(): void + { + $testFile = base_path($this->testFile); + $testWriteFile = base_path($this->testWriteFile); + $this->writer = new DotEnvWriter($testFile); + + $this->writer->set("APP_LOG","daily","not showing description"); + $this->writer->enable("MAIL_PORT"); + $this->writer->disable("APP_KEY"); + $this->writer->delete("GRAPHER_BACKEND_MRTG_DBTYPE",true); + + $this->writer->set("TEST_KEY","Test value","It is a test description"); + + $variables = $this->writer->getAll(); + + $created1 = $this->writer->write(false, $testWriteFile); + $created2 = $this->writer->write(); + + $this->assertIsArray($variables); + $this->assertFileExists($created1[0]); // old file + $this->assertFileExists($created1[1]); // new file + $this->assertFileExists($created2[0]); // old file + $this->assertFileExists($created2[1]); // new file + } } From 0f479f7c3c3f6336320df786b65e827c4a0bf388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Fri, 7 Jun 2024 16:18:58 +0100 Subject: [PATCH 019/145] writer service class and test --- app/Services/DotEnvWriter.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index fd647dce1..e3b51aef5 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -4,11 +4,6 @@ * https://github.com/MirazMac/DotEnvWriter * * A PHP library to write values to .env files. - * - * Heavily inspired from https://github.com/msztorc/laravel-env - * - * @author Miraz Mac - * @link https://mirazmac.com */ namespace IXP\Services; From 9c81abe4816d6b408ca282e562c1bb467138125f Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Tue, 11 Jun 2024 10:51:43 +0100 Subject: [PATCH 020/145] Do not store phpunit cache in repo --- .phpunit.cache/test-results | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .phpunit.cache/test-results diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results deleted file mode 100644 index 5616ef3cb..000000000 --- a/.phpunit.cache/test-results +++ /dev/null @@ -1 +0,0 @@ -{"version":1,"defects":{"Tests\\Browser\\ContactControllerTest::testAdd":8,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":8,"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":8,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":8,"Tests\\Browser\\ExampleTest::testBasicExample":8,"Tests\\Browser\\InfrastructureControllerTest::testAdd":8,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":8,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":8,"Tests\\Browser\\LocationControllerTest::testAdd":8,"Tests\\Browser\\LoginTest::testExample":8,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":8,"Tests\\Browser\\RouterControllerTest::testAdd":8,"Tests\\Browser\\SwitchControllerTest::testAdd":8,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":8,"Tests\\Browser\\User2FAControllerTest::test":8,"Tests\\Browser\\UserControllerTest::testAdd":8,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":8,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":8,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":8,"Tests\\Browser\\VendorControllerTest::testVendor":8,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":7,"Tests\\Browser\\VlanControllerTest::testAdd":8,"Tests\\Browser\\ApiKeyControllerTest::test":8,"Browser\\CabinetControllerTest::testCabinet":8,"Browser\\ConsoleServerControllerTest::testConsoleServers":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":7,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":8,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":8,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":7,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":7,"Tests\\Services\\DotEnvWriterTest::testReader":8,"Tests\\Services\\DotEnvWriterTest::testSetVariables":8,"Tests\\Services\\DotEnvWriterTest::testWrite":8},"times":{"Tests\\Browser\\CoreBundleControllerTest::testAddWizard":13.345,"Tests\\Browser\\ApiKeyControllerTest::test":2.431,"Browser\\CabinetControllerTest::testCabinet":2.663,"Browser\\ConsoleServerControllerTest::testConsoleServers":6.202,"Tests\\Browser\\ContactControllerTest::testAdd":5.076,"Tests\\Browser\\ContactControllerTest::testAddCustAdmin":2.031,"Tests\\Browser\\CustomerEquipmentControllerTest::testColocatedEquipment":2.41,"Tests\\Browser\\InfrastructureControllerTest::testAdd":6.425,"Tests\\Browser\\IpAddressControllerTest::testIpAddress":7.482,"Tests\\Browser\\IrrdbConfigControllerTest::testIRRDBConfig":2.287,"Tests\\Browser\\LocationControllerTest::testAdd":6.399,"Tests\\Browser\\LoginTest::testExample":0.695,"Tests\\Browser\\PeeringManagerControllerTest::testPeeringManager":3.839,"Tests\\Browser\\RouterControllerTest::testAdd":3.614,"Tests\\Browser\\SwitchControllerTest::testAdd":3.559,"Tests\\Browser\\SwitchPortControllerTest::testSwitchPort":3.497,"Tests\\Browser\\User2FAControllerTest::test":6.804,"Tests\\Browser\\UserControllerTest::testAdd":11.297,"Tests\\Browser\\UserControllerTest::testAddCustAdmin":2.922,"Tests\\Browser\\UserControllerTest::testSuperAdminPrivs":6.887,"Tests\\Browser\\UserRememberTokenControllerTest::testAdd":2.931,"Tests\\Browser\\VendorControllerTest::testVendor":2.244,"Tests\\Browser\\VirtualInterfaceControllerTest::testAddWizard":13.421,"Tests\\Browser\\VlanControllerTest::testAdd":4.451,"Tests\\Browser\\ExampleTest::testBasicExample":0.391,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessPublicUser":0.029,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustUser":0.023,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUploadFormAccessSuperUser":0.028,"Tests\\Docstore\\Controllers\\FileControllerTest::testStorePublicUser":0.015,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreSuperUser":0.018,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutName":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithoutFile":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongSha256":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreWithWrongMinPivs":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdatePublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateWithPostMethod":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testUpdateSuperUser":0.009,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFilePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewNoneViewableFileSuperUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadPublicUser":0.004,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadCustAdmin":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDownloadSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoCustAdmin":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testInfoSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeletePublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustUser":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteCustAdmin":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testDeleteSuperUser":0.007,"Tests\\Docstore\\Controllers\\FileControllerTest::testStoreViewableObject":0.006,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewPublicUser":0.003,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustUser":0.005,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewCustAdmin":0.016,"Tests\\Docstore\\Controllers\\FileControllerTest::testViewSuperUser":0.012,"Tests\\Docstore\\Controllers\\FileControllerTest::testDelete2SuperUser":0.007,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testApiPublicAccess":0.086,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebNonPublicAccess":0.025,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebOwnUserCustUserAccess":0.136,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustUserAccess":0.095,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebCustAdminAccess":0.066,"Tests\\Services\\Grapher\\Graph\\Access\\Web\\CustomerWebAccessTest::testWebSuperuserAccess":0.047,"Tests\\Services\\DotEnvWriterTest::testReader":0.004,"Tests\\Services\\DotEnvWriterTest::testSetVariables":0.002,"Tests\\Services\\DotEnvWriterTest::testWrite":0.002}} \ No newline at end of file From 43683fc0fd9c6878d137a4507215b17d90e1c54a Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Tue, 11 Jun 2024 10:51:58 +0100 Subject: [PATCH 021/145] Do not store phpunit cache in repo --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 77e32c5b6..9c4783033 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ .buildpath .settings/ .vagrant/ +.phpunit.cache/ auth.json /.fleet /vendor/ From e397b74483c96bfa49e8beba9dc209f1d44847a2 Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Tue, 11 Jun 2024 11:16:38 +0100 Subject: [PATCH 022/145] Changes with laszlo --- .idea/IXP-Manager.iml | 1 + app/Services/DotEnvWriter.php | 81 ++++++++++++----------------------- 2 files changed, 28 insertions(+), 54 deletions(-) diff --git a/.idea/IXP-Manager.iml b/.idea/IXP-Manager.iml index 637df9904..63711f952 100644 --- a/.idea/IXP-Manager.iml +++ b/.idea/IXP-Manager.iml @@ -4,6 +4,7 @@ + diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index e3b51aef5..0573dda99 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -47,15 +47,25 @@ class DotEnvWriter * Constructs a new instance. * * @param string|null $sourceFile The environment path - * @throws LogicException If the file is missing + * @throws InvalidArgumentException If the file is missing */ public function __construct( ?string $sourceFile = null ) { - if( null !== $sourceFile ) { - $this->sourceFile = $sourceFile; - $this->content = file_get_contents( $sourceFile ); - $this->parse(); + if( $sourceFile === null ) { + $sourceFile = base_path( '.env' ); } + + if( !file_exists($sourceFile) || !is_readable($sourceFile) ) { + throw new InvalidArgumentException("File '$sourceFile' does not exist or is not readable"); + } + + if( !is_writable($sourceFile) ) { + throw new InvalidArgumentException("File '$sourceFile' is not writable"); + } + + $this->sourceFile = $sourceFile; + $this->content = file_get_contents( $sourceFile ); + $this->parse(); } /** @@ -79,11 +89,6 @@ public function set( string $key, string $value, string|null $description = null $this->variables[ $lineId ][ "changed" ] = true; $this->changed = true; } else { - // otherwise append to the end - if( !$this->isValidName( $key ) ) { - throw new InvalidArgumentException( "Failed to add new key `{$key}`. As it contains invalid characters, please use only ASCII letters, digits and underscores only." ); - } - if( $description ) { $this->variables[] = [ "key" => null, @@ -140,7 +145,7 @@ public function delete( string $key, bool $removeDescription = false ): self } /** - * Remark an environment variable if present + * Comment out an environment variable if present * * @param string $key The key * @return self @@ -157,7 +162,7 @@ public function disable( string $key ): self } /** - * Unremarked an environment variable if present + * Uncomment out an environment variable if present * * @param string $key The key * @return self @@ -173,26 +178,7 @@ public function enable( string $key ): self return $this; } - /** - * Sanitize the variable collection - * Remove all remarked line - * - * @param bool $leaveRemarkedVariables Don't remove remarked variables if it is true - * - * @return self - */ - public function sanitize( bool $leaveRemarkedVariables = true ): self { - $collection = []; - foreach($this->variables as $variable) { - if($variable["key"] !== null) { - if($variable["status"] || ($variable["status"] === false && $leaveRemarkedVariables)) { - $collection[] = $variable; - } - } - } - $this->variables = $collection; - return $this; - } + /** * States if one or more values has changed @@ -244,21 +230,9 @@ public function getAll(): array * * @return array Array of old and new file. */ - public function write( bool $force = false, ?string $destFile = null ): array + public function write( bool $force = false, ?string $destFile = null ): void { if( $this->hasChanged() || $force ) { - if( is_null($destFile) ) { - $backupFile = $this->sourceFile . Carbon::now()->format("YmdHis") . ".bak"; - if( is_null($this->sourceFile) ) { - throw new LogicException( "No file provided" ); - } - $destFile = $this->sourceFile; - rename($destFile, $backupFile); - } else if (file_exists($destFile)) { - throw new LogicException( "Given destination file already exists." ); - } else { - $backupFile = $this->sourceFile; - } $content = ""; foreach($this->variables as $lineId => $variable) { @@ -274,11 +248,7 @@ public function write( bool $force = false, ?string $destFile = null ): array $content .= $variable["key"]."=".$this->escapeValue($variable["value"])."\n"; } } - file_put_contents($destFile, $content, LOCK_EX); - - return [$backupFile,$destFile]; - } else { - throw new LogicException( "No change made on source file." ); + file_put_contents($this->sourceFile, $content, LOCK_EX); } } @@ -327,9 +297,12 @@ protected function parse(): void { $lines = preg_split( '/\r\n|\r|\n/', $this->content ); - foreach( $lines as $index => $line ) { - if( mb_strlen( trim( $line ) ) && !( mb_strpos( trim( $line ), '#' ) === 0 ) ) { - [ $key, $value ] = explode( '=', (string)$line ); + foreach( $lines as $line ) { + + $line = trim($line); + + if( mb_strlen( $line ) && !( mb_strpos( $line, '#' ) === 0 ) ) { + [ $key, $value ] = explode( '=', $line ); $this->variables[] = [ "key" => $key, "value" => $this->formatValue( $value ), @@ -337,7 +310,7 @@ protected function parse(): void "changed" => false, ]; } else { - $validVariable = preg_match( "/^#\s{0,1}(\w+)=(.+)$/", $line, $matches ); + $validVariable = preg_match( "/^#\s{0,}(\w+)=(.+)$/", $line, $matches ); if( $validVariable ) { $this->variables[] = [ "key" => $matches[ 1 ], From 3955e32d711301b391ca48808329d321143333ed Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Tue, 11 Jun 2024 12:27:00 +0100 Subject: [PATCH 023/145] Config schema for laszlo --- config/ixp_fe_config.php | 179 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 config/ixp_fe_config.php diff --git a/config/ixp_fe_config.php b/config/ixp_fe_config.php new file mode 100644 index 000000000..ca9a2b73d --- /dev/null +++ b/config/ixp_fe_config.php @@ -0,0 +1,179 @@ + should be a dropdown of VLANs so we'll need a new select options in the array below: +// 'optionsdb' => [ 'model' => 'Vlan', 'keys' => 'id', 'values' => 'name' ] + +// ixp_api.json_export_schema +// ixp.as112 as part of modules +// ixp.rpki + + + + + +return [ + + 'panels' => [ + + 'frontend_controllers' => [ + 'tabname' => 'Modules', + 'tabdescription' => "These are features that can be enabled or disabled. Some are + disabled by default as they may require extra configuration settings.", + + 'options' => [ + + 'console-server-connection' => [ + + // this via config() will give default value + 'config_key' => 'ixp_fe.frontend.disabled.console-server-connection', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_CONSOLE', + 'type' => 'radio', + 'name' => 'Console Server Connections', + 'docs_url' => 'https://docs.ixpmanager.org/features/console-servers/', // can be null + 'help' => "An IXP would typically have out of band access (for emergencies, firmware upgrades, + etc) to critical infrastructure devices by means of a console server. This + module allows you to record console server port connections.", + + ], + + // 'cust-kit' => env( 'IXP_FE_FRONTEND_DISABLED_CUSTKIT', false ), + // 'docstore' => env( 'IXP_FE_FRONTEND_DISABLED_DOCSTORE', false ), + // 'docstore_customer' => env( 'IXP_FE_FRONTEND_DISABLED_DOCSTORE_CUSTOMER', false ), + // 'filtered-prefixes' => env( 'IXP_FE_FRONTEND_DISABLED_FILTERED_PREFIXES', true ), + // 'logs' => env( 'IXP_FE_FRONTEND_DISABLED_LOGS', false ), + // 'logo' => env( 'IXP_FE_FRONTEND_DISABLED_LOGO', true ), + // 'lg' => env( 'IXP_FE_FRONTEND_DISABLED_LOOKING_GLASS', true ), + // 'net-info' => env( 'IXP_FE_FRONTEND_DISABLED_NETINFO', true ), + // 'peering-manager' => env( 'IXP_FE_FRONTEND_DISABLED_PEERING_MANAGER', false ), + // 'peering-matrix' => env( 'IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX', false ), + // 'phpinfo' => env( 'IXP_FE_FRONTEND_DISABLED_PHPINFO', true ), + // 'ripe-atlas' => true, // not ready for use yet + // 'rs-prefixes' => env( 'IXP_FE_FRONTEND_DISABLED_RS_PREFIXES', true ), + // 'rs-filters' => env( 'IXP_FE_FRONTEND_DISABLED_RS_FILTERS', true ), + + + ] + ], + + + 'auth' => [ + + 'tabname' => 'Authentication', + // 'tabdescription' => "Authentication related options.", + + 'options' => [ + + 'login_history' => [ + + 'config_key' => 'ixp_fe.login_history.enabled', + 'dotenv_key' => 'IXP_FE_LOGIN_HISTORY_ENABLED', + 'type' => 'radio', + 'name' => "Record Login History", + 'help' => 'Record the login history for users. Expunged after six months by default.', + ], + + ], + + ], + + 'third_party' => [ + + 'tabname' => '3rd Parties', + 'tabdescription' => "Configuration options for third party services.", + + 'options' => [ + + 'peeringdb_api_key' => [ + + 'config_key' => 'ixp_api.peeringdb.api_key', + 'dotenv_key' => 'IXP_API_PEERING_DB_API_KEY', + 'type' => 'test', + 'name' => "PeeringDB API Key", + 'docs_url' => 'https://docs.peeringdb.com/howto/api_keys/', + 'help' => "IXP Manager uses information from PeeringDB in a number of places. Setting an API + key is highly recommended so additional information can be accessed and so that + rate limited can be avoided.", + ], + + ], + + ], + + + + 'admin_options' => [ + + 'tabname' => 'Admin', + 'tabdescription' => "Various administrator related options.", + + 'options' => [ + + 'default_graph_period' => [ + + 'config_key' => 'ixp_fe.admin.default_graph_period', + 'dotenv_key' => 'IXP_FE_ADMIN_DASHBOARD_DEFAULT_GRAPH_PERIOD', + 'type' => 'select', + 'options' => IXP\Services\Grapher\Graph::PERIODS, + 'name' => "Admin Dashbaord Graph Period", + 'help' => 'Default graph period on the admin dashboard.', + ], + + + + 'billing-updates-notification' => [ + + 'config_key' => 'ixp_fe.frontend.billing-updates.notification', + 'dotenv_key' => 'IXP_FE_BILLING_UPDATES', + 'type' => 'email', + 'rules' => 'nullable|max:255|email', + 'name' => 'Billing Updates Notification', + 'docs_url' => 'https://docs.ixpmanager.org/usage/customers/#notification-of-billing-details-changed', + 'help' => "If a member edits their billing details in their portal, the changes can be emailed to + this address. If left blank, then no emails will be sent.", + ], + + ], + ], + + + 'misc_options' => [ + + 'tabname' => 'Miscellaneous', + 'tabdescription' => "These are various frontend options which you can tweak as appropriate.", + + 'options' => [ + + 'rs-filters-ttl' => [ + + // this via config() will give default value + 'config_key' => 'ixp_fe.frontend.rs-filters.ttl', + 'dotenv_key' => 'IXP_FE_RS_FILTERS_TIME_TO_LIVE', + 'type' => 'textarea', + 'rules' => 'nullable|max:1024', + 'name' => 'Route Server Update Period', + // 'docs_url' => '' + 'help' => "If you have enabled the route server community filtering via UI option, then your members will + need to know how often you update their configurations. The text you enter here will be + displayed on the route server filters page.", + ], + + + + ] + + ] + + + + ] + + +]; + From 0021a0cbad719388cca14ff5357351279c16c06c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 12 Jun 2024 12:09:10 +0100 Subject: [PATCH 024/145] psalm errors solved --- app/Console/Commands/User/Create.php | 20 +- .../Api/V4/Layer2AddressController.php | 13 +- .../Api/V4/MailingListController.php | 1 + .../Api/V4/Provisioner/YamlController.php | 7 +- .../Controllers/Api/V4/PublicController.php | 1 + .../Controllers/Api/V4/RouterController.php | 1 + .../Api/V4/SflowReceiverController.php | 2 + .../Controllers/Api/V4/SwitchController.php | 6 +- app/Http/Controllers/ApiKeyController.php | 4 +- .../Controllers/Auth/SwitchUserController.php | 4 +- .../Controllers/Contact/ContactController.php | 48 +- app/Http/Controllers/ContentController.php | 8 +- app/Http/Controllers/Controller.php | 5 +- .../Customer/CustomerController.php | 2 +- .../Customer/CustomerNotesController.php | 16 +- .../Controllers/Customer/LogoController.php | 21 +- app/Http/Controllers/DashboardController.php | 11 +- .../Docstore/DirectoryController.php | 5 +- .../Controllers/Docstore/FileController.php | 4 + .../DocstoreCustomer/FileController.php | 6 +- .../FilteredPrefixesController.php | 6 +- app/Http/Controllers/Interfaces/Common.php | 2 + .../Interfaces/CoreBundleController.php | 3 + .../PhysicalInterfaceController.php | 2 +- app/Http/Controllers/IrrdbController.php | 14 +- .../Controllers/Layer2AddressController.php | 12 +- .../Controllers/LoginHistoryController.php | 5 +- .../PatchPanel/Port/PortController.php | 14 +- .../Controllers/PeeringManagerController.php | 1 + .../Controllers/PeeringMatrixController.php | 10 +- app/Http/Controllers/ProfileController.php | 2 + .../Controllers/RipeAtlas/RunController.php | 18 +- app/Http/Controllers/StatisticsController.php | 28 +- .../Controllers/Switches/SwitchController.php | 5 +- .../User/CustomerToUserController.php | 9 +- .../Controllers/User/User2FAController.php | 1 + app/Http/Controllers/User/UserController.php | 34 +- app/Http/Middleware/ApiAuthenticate.php | 15 +- app/Http/Middleware/ApiMaybeAuthenticate.php | 9 +- app/Http/Middleware/AssertUserPrivilege.php | 6 +- app/Http/Middleware/Authenticate.php | 10 +- app/Http/Middleware/Eloquent2Frontend.php | 8 +- app/Http/Middleware/RsPrefixes.php | 9 +- app/Http/Middleware/Services/Grapher.php | 66 +- app/Http/Middleware/Services/LookingGlass.php | 5 +- app/Http/Middleware/TrustProxies.php | 2 +- app/Http/Requests/CoreBundle/Store.php | 9 +- .../Requests/CoreBundle/StoreCoreLink.php | 5 +- .../Requests/Customer/BillingInformation.php | 5 +- app/Http/Requests/Customer/Store.php | 5 +- .../Dashboard/BillingDetailsRequest.php | 5 +- .../Requests/Dashboard/NocDetailsRequest.php | 5 +- app/Http/Requests/EmailPatchPanelPort.php | 5 +- .../Requests/IpAddress/DeleteByNetwork.php | 5 +- app/Http/Requests/IpAddress/Store.php | 5 +- app/Http/Requests/Irrdb.php | 4 +- app/Http/Requests/MovePatchPanelPort.php | 5 +- app/Http/Requests/StatisticsRequest.php | 2 + app/Http/Requests/StorePatchPanel.php | 5 +- app/Http/Requests/StorePatchPanelPort.php | 5 +- app/Http/Requests/StorePhysicalInterface.php | 5 +- app/Http/Requests/StoreRouter.php | 4 +- app/Http/Requests/StoreSflowReceiver.php | 5 +- app/Http/Requests/StoreVirtualInterface.php | 5 +- .../Requests/StoreVirtualInterfaceWizard.php | 5 +- app/Http/Requests/StoreVlanInterface.php | 5 +- app/Http/Requests/Switches/Store.php | 5 +- app/Http/Requests/Switches/StoreBySmtp.php | 5 +- app/Http/Requests/User/CheckEmail.php | 8 +- .../Requests/User/CustomerToUser/Store.php | 10 +- app/Http/Requests/User/Delete.php | 8 +- app/Http/Requests/User/Store.php | 8 +- app/Http/Requests/User/Update.php | 14 +- app/Listeners/Auth/LoginSuccessful.php | 8 +- app/Models/Aggregators/SwitcherAggregator.php | 5 +- app/Models/Contact.php | 2 +- app/Models/CoreBundle.php | 4 +- app/Models/DocstoreCustomerDirectory.php | 7 +- app/Models/DocstoreCustomerFile.php | 7 +- app/Models/PatchPanelPort.php | 1 + app/Providers/HorizonServiceProvider.php | 5 +- app/Providers/IxpServiceProvider.php | 6 +- app/Providers/ParsedownServiceProvider.php | 1 + app/Providers/TelescopeServiceProvider.php | 2 + app/Services/Auth/SessionGuard.php | 1 + app/Services/DotEnvWriter.php | 6 +- app/Services/Grapher/Graph/CoreBundle.php | 7 +- app/Services/Grapher/Graph/Customer.php | 25 +- app/Services/Grapher/Graph/IXP.php | 9 +- app/Services/Grapher/Graph/Infrastructure.php | 7 +- app/Services/Grapher/Graph/Latency.php | 18 +- app/Services/Grapher/Graph/Location.php | 7 +- app/Services/Grapher/Graph/P2p.php | 18 +- .../Grapher/Graph/PhysicalInterface.php | 11 +- app/Services/Grapher/Graph/Switcher.php | 7 +- app/Services/Grapher/Graph/Trunk.php | 7 +- .../Grapher/Graph/VirtualInterface.php | 11 +- app/Services/Grapher/Graph/Vlan.php | 7 +- app/Services/Grapher/Graph/VlanInterface.php | 11 +- app/Support/helpers.php | 5 +- app/Traits/Observable.php | 1 + app/Utils/Export/JsonSchema.php | 1 + .../Former/Framework/TwitterBootstrap4.php | 8 +- app/Utils/MailingList.php | 1 + psalm_errors_ACTUAL.log | 1121 ------- psalm_errors_FULL.log | 2563 ----------------- psalm_errors_WORK.log | 1201 -------- 107 files changed, 579 insertions(+), 5160 deletions(-) delete mode 100644 psalm_errors_ACTUAL.log delete mode 100644 psalm_errors_FULL.log delete mode 100644 psalm_errors_WORK.log diff --git a/app/Console/Commands/User/Create.php b/app/Console/Commands/User/Create.php index 5bec7930f..aa50334d5 100644 --- a/app/Console/Commands/User/Create.php +++ b/app/Console/Commands/User/Create.php @@ -102,7 +102,7 @@ public function handle(): int $sendEmail = $this->option('send-welcome-email'); foreach( $options as $option => $value ){ - ${$option} = $value; + //${$option} = $value; if( $option !== 'send-welcome-email' ){ $validator = \Validator::make( [ $option => $value], [$option => $this->rules[ $option ] ] ); @@ -125,7 +125,7 @@ public function handle(): int ); } - ${$option} = $this->validate_cmd( function() use( $option ) { + $options[$option] = $this->validate_cmd( function() use( $option ) { if( $option === 'password' ){ return $this->secret('Enter '. $option); } @@ -142,21 +142,21 @@ public function handle(): int // Creating the User object $user = new User; $user->creator = 'artisan'; - $user->password = Hash::make( $password ); - $user->name = $name; - $user->authorisedMobile = $mobile; - $user->username = strtolower( $username ); - $user->email = strtolower( $email ); + $user->password = Hash::make( $options['password'] ); + $user->name = $options['name']; + $user->authorisedMobile = $options['mobile']; + $user->username = strtolower( $options['username'] ); + $user->email = strtolower( $options['email'] ); $user->disabled = false; - $user->privs = $priv; - $user->custid = $custid; + $user->privs = (int) $options['priv']; + $user->custid = (int) $options['custid']; $user->save(); // Creating the CustomerToUser object $c2u = new CustomerToUser; $c2u->customer_id = $user->custid; $c2u->user_id = $user->id; - $c2u->privs = $priv; + $c2u->privs = $user->privs; $c2u->extra_attributes = [ "created_by" => [ "type" => "artisan" , "user_id" => $user->id ] ]; $c2u->save(); diff --git a/app/Http/Controllers/Api/V4/Layer2AddressController.php b/app/Http/Controllers/Api/V4/Layer2AddressController.php index a3e5f3db8..050766168 100644 --- a/app/Http/Controllers/Api/V4/Layer2AddressController.php +++ b/app/Http/Controllers/Api/V4/Layer2AddressController.php @@ -70,13 +70,14 @@ class Layer2AddressController extends Controller public function store( Request $r, bool $showFeMessage = false ): JsonResponse { $vli = VlanInterface::findOrFail( $r->vlan_interface_id ); - - if( !Auth::getUser()->isSuperUser() ) { + /** @var User $user */ + $user = Auth::getUser(); + if( !$user->isSuperUser() ) { if( !config( 'ixp_fe.layer2-addresses.customer_can_edit' ) ) { abort( 404 ); } - if( Auth::getUser()->custid !== $vli->virtualInterface->custid ) { + if( $user->custid !== $vli->virtualInterface->custid ) { abort( 403, 'VLI / Customer mismatch' ); } @@ -128,12 +129,14 @@ public function store( Request $r, bool $showFeMessage = false ): JsonResponse */ public function delete( Layer2Address $l2a, bool $showFeMessage = false ): JsonResponse { - if( !Auth::getUser()->isSuperUser() ) { + /** @var User $user */ + $user = Auth::getUser(); + if( !$user->isSuperUser() ) { if( !config( 'ixp_fe.layer2-addresses.customer_can_edit' ) ) { abort( 404 ); } - if( Auth::getUser()->custid !== $l2a->vlanInterface->virtualInterface->custid ) { + if( $user->custid !== $l2a->vlanInterface->virtualInterface->custid ) { abort( 403, 'MAC address / Customer mismatch' ); } diff --git a/app/Http/Controllers/Api/V4/MailingListController.php b/app/Http/Controllers/Api/V4/MailingListController.php index 1f06a3351..7bf1d797e 100644 --- a/app/Http/Controllers/Api/V4/MailingListController.php +++ b/app/Http/Controllers/Api/V4/MailingListController.php @@ -143,6 +143,7 @@ public function init( Request $request, string $listname ): JsonResponse|Respons $addresses = collect(); foreach( explode( "\n", $request->addresses ) as $a ) { + /** @psalm-suppress InvalidArgument - no issue here */ $addresses->add( strtolower( trim( $a ) ) ); } diff --git a/app/Http/Controllers/Api/V4/Provisioner/YamlController.php b/app/Http/Controllers/Api/V4/Provisioner/YamlController.php index 7abf7225e..3546297cd 100644 --- a/app/Http/Controllers/Api/V4/Provisioner/YamlController.php +++ b/app/Http/Controllers/Api/V4/Provisioner/YamlController.php @@ -70,6 +70,7 @@ private function structuredResponse( array $array, string $format ): Response switch ( $format ) { case 'yaml': + /** @psalm-suppress UndefinedConstant */ $output = yaml_emit( $array, YAML_UTF8_ENCODING ); break; case 'json': @@ -443,8 +444,10 @@ public function listCoreBundle( string $format ): Response $entry['preference'] = $cb->preference; $entry['enabled'] = (bool)$cb->enabled; $entry['type'] = $cb->type; - $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; - $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; + /** @psalm-suppress InvalidPropertyFetch */ + $entry['switchsidea'] = $switchSideA !== false ? $switchSideA->name : null; + /** @psalm-suppress InvalidPropertyFetch */ + $entry['switchsideb'] = $switchSideB !== false ? $switchSideB->name : null; $speed = $cb->corelinks()->count() * $cb->speedPi() * 1000000; diff --git a/app/Http/Controllers/Api/V4/PublicController.php b/app/Http/Controllers/Api/V4/PublicController.php index 39ead7c6a..c63030c21 100644 --- a/app/Http/Controllers/Api/V4/PublicController.php +++ b/app/Http/Controllers/Api/V4/PublicController.php @@ -67,6 +67,7 @@ public function test(): Response */ public function ping(): JsonResponse { + /** @psalm-suppress UndefinedConstant */ return response()->json([ 'software' => "IXP Manager", 'version' => APPLICATION_VERSION, diff --git a/app/Http/Controllers/Api/V4/RouterController.php b/app/Http/Controllers/Api/V4/RouterController.php index 92b4dff0c..69cbf8a78 100644 --- a/app/Http/Controllers/Api/V4/RouterController.php +++ b/app/Http/Controllers/Api/V4/RouterController.php @@ -66,6 +66,7 @@ public function genConfig( string $handle ): Response $configView = ( new RouterConfigurationGenerator( $router ) )->render()->render(); + /** @psalm-suppress UndefinedConstant */ \Illuminate\Support\Facades\Log::info( sprintf( "Generated router configuration for %s and used %0.1f MB ( %0.1f MB real) of memory in %0.3f seconds.", $router->handle, memory_get_peak_usage() / 1024 / 1024, memory_get_peak_usage( true ) / 1024 / 1024, microtime( true ) - LARAVEL_START ) diff --git a/app/Http/Controllers/Api/V4/SflowReceiverController.php b/app/Http/Controllers/Api/V4/SflowReceiverController.php index 51eb2bbb6..40cca3a77 100644 --- a/app/Http/Controllers/Api/V4/SflowReceiverController.php +++ b/app/Http/Controllers/Api/V4/SflowReceiverController.php @@ -140,10 +140,12 @@ private function structuredResponse( array $array, string $format ): Response $httpresponse = 200; $array['timestamp'] = now()->format( 'Y-m-d\TH:i:s\Z' ); + /** @psalm-suppress UndefinedConstant */ $array['ixpmanager_version'] = APPLICATION_VERSION; switch ( $format ) { case 'yaml': + /** @psalm-suppress UndefinedConstant */ $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); break; case 'json': diff --git a/app/Http/Controllers/Api/V4/SwitchController.php b/app/Http/Controllers/Api/V4/SwitchController.php index 5835dc6ff..1f82d6db8 100644 --- a/app/Http/Controllers/Api/V4/SwitchController.php +++ b/app/Http/Controllers/Api/V4/SwitchController.php @@ -145,9 +145,11 @@ public function coreBundlesStatus( Switcher $s ): JsonResponse foreach( $s->getCoreBundles() as $cb ) { $switchA = $cb->switchSideX(); - $switchAName = $switchA ? $switchA->name : 'none'; + /** @psalm-suppress InvalidPropertyFetch */ + $switchAName = $switchA !== false ? $switchA->name : 'none'; $switchB = $cb->switchSideX( false ); - $switchBName = $switchB ? $switchB->name : 'none'; + /** @psalm-suppress InvalidPropertyFetch */ + $switchBName = $switchB !== false ? $switchB->name : 'none'; if( $cb->enabled ) { $linksup = count( $cb->coreLinksWithIfOperStateX() ); // with no args this defaults to X = oper state up for enabled links diff --git a/app/Http/Controllers/ApiKeyController.php b/app/Http/Controllers/ApiKeyController.php index d92685eeb..724f9d386 100644 --- a/app/Http/Controllers/ApiKeyController.php +++ b/app/Http/Controllers/ApiKeyController.php @@ -116,8 +116,10 @@ public function feInit(): void // phpunit / artisan trips up here without the cli test: if( PHP_SAPI !== 'cli' ) { + /** @var User $user */ + $user = Auth::getUser(); // custom access controls: - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + switch( Auth::check() ? $user->privs() : User::AUTH_PUBLIC ) { case User::AUTH_SUPERUSER: case User::AUTH_CUSTUSER || User::AUTH_CUSTADMIN: break; diff --git a/app/Http/Controllers/Auth/SwitchUserController.php b/app/Http/Controllers/Auth/SwitchUserController.php index 98b1a478a..edc59e729 100644 --- a/app/Http/Controllers/Auth/SwitchUserController.php +++ b/app/Http/Controllers/Auth/SwitchUserController.php @@ -64,7 +64,9 @@ class SwitchUserController extends Controller */ public function switch( CustomerToUser $c2u ): RedirectResponse { - if( !Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + if( !$us->isSuperUser() ) { AlertContainer::push( "You are not allowed to switch users!", Alert::DANGER ); return redirect()->to( "/" ); } diff --git a/app/Http/Controllers/Contact/ContactController.php b/app/Http/Controllers/Contact/ContactController.php index fb5755058..788829222 100644 --- a/app/Http/Controllers/Contact/ContactController.php +++ b/app/Http/Controllers/Contact/ContactController.php @@ -98,7 +98,9 @@ public function feInit(): void 'viewFolderName' => 'contact', ]; - switch( $privs = Auth::getUser()->privs() ) { + /** @var User $us */ + $us = Auth::getUser(); + switch( $privs = $us->privs() ) { case User::AUTH_SUPERUSER: $this->feParams->listColumns = [ 'customer' => [ @@ -188,7 +190,9 @@ public function feInit(): void */ private function getFeList( stdClass $feParams, int $id = null, int $role = null, int $cgid = null ): array { - $isSuperUser = Auth::getUser()->isSuperUser(); + /** @var User $us */ + $us = Auth::getUser(); + $isSuperUser = $us->isSuperUser(); $query = Contact::select( [ 'contact.*', 'cust.name AS customer', 'cust.id AS custid' ]) ->leftJoin( 'cust', 'cust.id', 'contact.custid' ) ->when( $id , function ( Builder $query, $id ) { @@ -273,7 +277,9 @@ protected function listGetData( ?int $id = null ): array */ protected function preView(): void { - if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + if( $us->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !$us->isSuperUser() ) { $this->unauthorized(); } @@ -335,13 +341,15 @@ protected function createPrepareForm(): array */ public function doStore( Request $r ): bool|RedirectResponse { + /** @var User $us */ + $us = Auth::getUser(); $this->checkForm( $r ); - $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; + $custid = $us->isSuperUser() ? $r->custid : $us->custid; $this->object = Contact::make( array_merge( $r->all(), [ - 'creator' => Auth::getUser()->username, + 'creator' => $us->username, 'lastupdatedby' => Auth::id() ] ) ); @@ -366,11 +374,14 @@ public function doStore( Request $r ): bool|RedirectResponse */ protected function editPrepareForm( int $id ): array { + /** @var User $us */ + $us = Auth::getUser(); + $this->setRedirectSession(); $this->object = Contact::findOrFail( $id ); $data = $this->getContactsData(); - if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ + if( $us->custid !== $this->object->customer->id && !$us->isSuperUser() ){ $this->unauthorized(); } @@ -416,18 +427,21 @@ protected function editPrepareForm( int $id ): array */ public function doUpdate( Request $r, int $id ): bool|RedirectResponse { + /** @var User $us */ + $us = Auth::getUser(); + $this->object = Contact::findOrFail( $id ); $this->checkForm( $r ); - $custid = Auth::getUser()->custid; + $custid = $us->custid; - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { $custid = $r->custid; } $this->object->fill( array_merge( $r->all(), [ - 'creator' => Auth::getUser()->username, + 'creator' => $us->username, 'lastupdatedby' => Auth::id() ] ) ); @@ -458,7 +472,10 @@ public function doUpdate( Request $r, int $id ): bool|RedirectResponse */ protected function postStoreRedirect(): ?string { - if( !Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( !$us->isSuperUser() ) { return route( 'contact@list' ); } @@ -485,11 +502,14 @@ protected function postStoreRedirect(): ?string */ protected function preDelete(): bool { + /** @var User $us */ + $us = Auth::getUser(); + session()->remove( 'ixp_contact_delete_custid' ); - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { // keep the customer ID for redirection on success $this->request->session()->put( "ixp_contact_delete_custid", $this->object->customer->id ); - } elseif( $this->object->customer->id !== Auth::getUser()->custid ) { + } elseif( $this->object->customer->id !== $us->custid ) { AlertContainer::push( 'You are not authorised to delete this contact.', Alert::DANGER ); return false; } @@ -535,7 +555,9 @@ public function checkForm( Request $r ): void 'notes' => 'nullable|string|max:255', ]; - if( Auth::getUser()->isSuperUser() ){ + /** @var User $us */ + $us = Auth::getUser(); + if( $us->isSuperUser() ){ $rules = array_merge( $rules, [ 'custid' => 'required|integer|exists:cust,id' ] ); diff --git a/app/Http/Controllers/ContentController.php b/app/Http/Controllers/ContentController.php index f476fd146..8713d858d 100644 --- a/app/Http/Controllers/ContentController.php +++ b/app/Http/Controllers/ContentController.php @@ -61,9 +61,11 @@ class ContentController extends Controller */ public function index( int $priv, string $page ): View { + /** @var User $us */ + $us = Auth::getUser(); // check privilege: if( $priv !== User::AUTH_PUBLIC ) { - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + if( Auth::guest() || $us->privs() < $priv ) { abort( 403, 'Unauthorized' ); } } @@ -100,10 +102,12 @@ public function public( string $page ): View */ public function members( int $priv, string $page ) { + /** @var User $us */ + $us = Auth::getUser(); // check privilege: if( $priv !== User::AUTH_PUBLIC ) { - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { + if( Auth::guest() || $us->privs() < $priv ) { abort( 403, 'Unauthorized' ); } } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 464965f00..5c9c0fab5 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -120,8 +120,11 @@ protected function getIp(): ?string */ protected function getAllowedPrivs(): array { + /** @var User $us */ + $us = Auth::getUser(); + $privs = User::$PRIVILEGES_TEXT_NONSUPERUSER; - $isSuperUser = Auth::getUser()->isSuperUser(); + $isSuperUser = $us->isSuperUser(); // If we add a user via the customer overview users list if( request()->custid && request()->is( 'user/create*' ) ) { diff --git a/app/Http/Controllers/Customer/CustomerController.php b/app/Http/Controllers/Customer/CustomerController.php index a646aa29b..c667a2eca 100644 --- a/app/Http/Controllers/Customer/CustomerController.php +++ b/app/Http/Controllers/Customer/CustomerController.php @@ -486,7 +486,7 @@ public function loadPeersFrag( Request $r, Customer $cust ): JsonResponse return response()->json( [ 'success' => true, 'htmlFrag' => view('customer/overview-tabs/peers')->with([ - 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false + 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get()->toArray(), [ 4,6 ] ) ?: false ])->render() ] ); } diff --git a/app/Http/Controllers/Customer/CustomerNotesController.php b/app/Http/Controllers/Customer/CustomerNotesController.php index 317499e33..002240979 100644 --- a/app/Http/Controllers/Customer/CustomerNotesController.php +++ b/app/Http/Controllers/Customer/CustomerNotesController.php @@ -37,6 +37,7 @@ Container as AlertContainer }; +use IXP\Models\User; use Illuminate\Http\{ RedirectResponse }; @@ -57,7 +58,10 @@ class CustomerNotesController extends Controller */ public function readAll() : RedirectResponse { - $prefs = Auth::getUser()->prefs; + /** @var User $us */ + $us = Auth::getUser(); + + $prefs = $us->prefs; // Delete all last_read notes prefs if( isset( $prefs[ 'notes' ][ 'last_read' ] ) ) { unset( $prefs[ 'notes' ][ 'last_read' ] ); @@ -66,8 +70,8 @@ public function readAll() : RedirectResponse // Set read_upto at now() $prefs[ 'notes' ][ 'read_upto' ] = now()->format( 'Y-m-d H:i:s' ); - Auth::getUser()->prefs = $prefs; - Auth::getUser()->save(); + $us->prefs = $prefs; + $us->save(); AlertContainer::push( 'All notes have been mark as read.', Alert::SUCCESS ); @@ -81,8 +85,10 @@ public function readAll() : RedirectResponse */ public function unreadNotes() { - $lastRead = Auth::getUser()->prefs[ 'notes' ][ 'last_read' ] ?? []; - $readUpto = Auth::getUser()->prefs[ 'notes' ][ 'read_upto' ] ?? null; + /** @var User $us */ + $us = Auth::getUser(); + $lastRead = $us->prefs[ 'notes' ][ 'last_read' ] ?? []; + $readUpto = $us->prefs[ 'notes' ][ 'read_upto' ] ?? null; $latestNotes = []; $custs = Customer::selectRaw( diff --git a/app/Http/Controllers/Customer/LogoController.php b/app/Http/Controllers/Customer/LogoController.php index 1c2ae765f..7019ab72c 100644 --- a/app/Http/Controllers/Customer/LogoController.php +++ b/app/Http/Controllers/Customer/LogoController.php @@ -36,10 +36,7 @@ use IXP\Http\Controllers\Controller; -use IXP\Models\{ - Customer, - Logo -}; +use IXP\Models\{Customer, Logo, User}; use IXP\Http\Requests\Customer\Logo as LogoRequest; @@ -104,6 +101,8 @@ public function manage( ?int $id ): View */ public function store( LogoRequest $r ): RedirectResponse { + /** @var User $us */ + $us = Auth::getUser(); $c = $this->loadCustomer( $r->id ); if( !$r->hasFile( 'logo' ) ) { @@ -128,7 +127,7 @@ public function store( LogoRequest $r ): RedirectResponse $logo = Logo::make( [ 'original_name' => $file->getClientOriginalName(), 'stored_name' => sha1( $img->getEncoded() ) . '.png', - 'uploaded_by' => Auth::getUser()->username, + 'uploaded_by' => $us->username, 'width' => $img->width(), 'height' => $img->height(), ] ); @@ -145,7 +144,7 @@ public function store( LogoRequest $r ): RedirectResponse $img->save( $saveTo ); AlertContainer::push( "Logo uploaded.", Alert::SUCCESS ); - return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); + return redirect( $us->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); } /** @@ -159,6 +158,9 @@ public function store( LogoRequest $r ): RedirectResponse */ public function delete( int $id ) : RedirectResponse { + /** @var User $us */ + $us = Auth::getUser(); + $c = $this->loadCustomer( $id ); // do we have a logo? @@ -173,7 +175,8 @@ public function delete( int $id ) : RedirectResponse $oldLogo->delete(); AlertContainer::push( "Logo deleted.", Alert::SUCCESS ); - return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); + + return redirect( $us->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); } /** @@ -185,7 +188,9 @@ public function delete( int $id ) : RedirectResponse */ private function loadCustomer( ?int $id ): Customer { - if( Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + if( $us->isSuperUser() ) { return Customer::findOrFail( $id ); } return Customer::find( Auth::getUser()->custid ); diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index addf0bf0b..6f5fd9259 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -40,12 +40,7 @@ BillingDetailsRequest }; -use IXP\Models\{ - Aggregators\RsPrefixAggregator, - Customer, - CustomerNote, - NetworkInfo -}; +use IXP\Models\{Aggregators\RsPrefixAggregator, Customer, CustomerNote, NetworkInfo, User}; use IXP\Utils\View\Alert\{ Alert, @@ -77,8 +72,10 @@ class DashboardController extends Controller */ public function index( Request $r, string $tab = null ): RedirectResponse|View { + /** @var User $us */ + $us = Auth::getUser(); // Redirect Super user - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return redirect( '/'); } diff --git a/app/Http/Controllers/Docstore/DirectoryController.php b/app/Http/Controllers/Docstore/DirectoryController.php index 2abfd7e5b..c56979e4f 100644 --- a/app/Http/Controllers/Docstore/DirectoryController.php +++ b/app/Http/Controllers/Docstore/DirectoryController.php @@ -73,7 +73,10 @@ public function list( DocstoreDirectory $dir = null ): View|RedirectResponse $privs = $user->privs; } - $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; + /** @var User $us */ + $us = optional($user); + + $dirs = DocstoreDirectory::getHierarchyForUserClass( $us->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; $files = DocstoreFile::getListing( $dir, $privs ); $nbTotalDirs = count( DocstoreDirectory::getHierarchyForUserClass( User::AUTH_SUPERUSER )[ $dir->id ?? '' ] ?? [] ); diff --git a/app/Http/Controllers/Docstore/FileController.php b/app/Http/Controllers/Docstore/FileController.php index 5737111ca..6908ea8c3 100644 --- a/app/Http/Controllers/Docstore/FileController.php +++ b/app/Http/Controllers/Docstore/FileController.php @@ -110,6 +110,7 @@ public function store( Request $r ): RedirectResponse $file = $r->file('uploadedFile'); $path = $file->store( '', 'docstore' ); + /** @psalm-suppress InvalidArgument */ $file = DocstoreFile::create( [ 'name' => $r->name, 'description' => $r->description, @@ -178,6 +179,7 @@ public function update( Request $r , DocstoreFile $file ): RedirectResponse $uploadedFile = $r->file('uploadedFile'); $path = $uploadedFile->store( '', 'docstore' ); + /** @psalm-suppress InvalidArgument */ $file->update([ 'path' => $path, 'sha256' => hash_file( 'sha256', $uploadedFile ), @@ -251,6 +253,7 @@ public function download( DocstoreFile $file ): mixed } try { + /** @psalm-suppress UndefinedInterfaceMethod */ return Storage::disk( $file->disk )->download( $file->path, $file->name ); } catch( FilesystemException $e ) { AlertContainer::push( "This file could not be found / downloaded. Please report this error to the support team.", Alert::DANGER ); @@ -316,6 +319,7 @@ public function delete( Request $r , DocstoreFile $file ): RedirectResponse */ private function checkForm( Request $r, ?DocstoreFile $file = null ): void { + /** @psalm-suppress InvalidArgument */ $r->validate( [ 'name' => 'required|max:100', 'uploadedFile' => Rule::requiredIf( function() use ( $r, $file ) { diff --git a/app/Http/Controllers/DocstoreCustomer/FileController.php b/app/Http/Controllers/DocstoreCustomer/FileController.php index f1ebd1597..123191b1b 100644 --- a/app/Http/Controllers/DocstoreCustomer/FileController.php +++ b/app/Http/Controllers/DocstoreCustomer/FileController.php @@ -106,6 +106,7 @@ public function download( Customer $cust, DocstoreCustomerFile $file ) $this->authorize( 'download', $file ); try { + /** @psalm-suppress UndefinedInterfaceMethod */ return Storage::disk( $file->disk )->download( $file->path, $file->name ); } catch( FilesystemException $e ) { AlertContainer::push( "This customer file could not be found / downloaded. Please report this error to the support team.", Alert::DANGER ); @@ -179,8 +180,9 @@ public function store( Request $r, Customer $cust ): RedirectResponse $uploadedFile = $r->file('uploadedFile' ); - $path = $uploadedFile->store( $cust->id, 'docstore_customers' ); + $path = $uploadedFile->store( (string) $cust->id, 'docstore_customers' ); + /** @psalm-suppress InvalidArgument */ $file = DocstoreCustomerFile::create( [ 'name' => $r->name, 'description' => $r->description, @@ -254,6 +256,7 @@ public function update( Request $r, Customer $cust, DocstoreCustomerFile $file ) $uploadedFile = $r->file('uploadedFile'); $path = $uploadedFile->store( $file->customer->id, 'docstore_customers' ); + /** @psalm-suppress InvalidArgument */ $file->update([ 'path' => $path, 'sha256' => hash_file( 'sha256', $uploadedFile ), @@ -322,6 +325,7 @@ private function checkForm( Request $r, ?DocstoreCustomerFile $file = null ): vo }), 'sha256' => [ 'nullable', 'max:64', function ( $attribute, $value, $fail ) use( $r ) { + /** @psalm-suppress InvalidArgument */ if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' ) ) ) { return $fail( 'The sha256 checksum calculated on the server does not match the one you provided.' ); } diff --git a/app/Http/Controllers/FilteredPrefixesController.php b/app/Http/Controllers/FilteredPrefixesController.php index dd8191bec..0c3938b77 100644 --- a/app/Http/Controllers/FilteredPrefixesController.php +++ b/app/Http/Controllers/FilteredPrefixesController.php @@ -32,6 +32,7 @@ use IXP\Jobs\FetchFilteredPrefixesForCustomer; use IXP\Models\Customer; +use IXP\Models\User; /** * Filtered Prefixes Controller @@ -57,10 +58,13 @@ class FilteredPrefixesController extends Controller */ public function list( Request $r, Customer $cust ): View { + /** @var User $us */ + $us = Auth::getUser(); + $this->authorize('view', $cust); // are we busting the cache? - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + if( $r->reset_cache === "1" && $us->isSuperUser() ) { Cache::forget('filtered-prefixes-' . $cust->id ); } diff --git a/app/Http/Controllers/Interfaces/Common.php b/app/Http/Controllers/Interfaces/Common.php index 02dda1202..ed918cd5e 100644 --- a/app/Http/Controllers/Interfaces/Common.php +++ b/app/Http/Controllers/Interfaces/Common.php @@ -149,9 +149,11 @@ public function processFanoutPhysicalInterface( $r, PhysicalInterface $pi, Virtu $relatedInterface = $pi->relatedInterface(); // if the physical interface already has a related physical interface and it's not the same as the fanout physical interface + /** @psalm-suppress InvalidPropertyFetch */ if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { // if fanout does not have a virtual interface, relate it with old fanout port virtual interface. if( !$fnpi->virtualInterface ) { + /** @psalm-suppress InvalidPropertyFetch */ $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; } diff --git a/app/Http/Controllers/Interfaces/CoreBundleController.php b/app/Http/Controllers/Interfaces/CoreBundleController.php index 1ce26af21..b9e630a85 100644 --- a/app/Http/Controllers/Interfaces/CoreBundleController.php +++ b/app/Http/Controllers/Interfaces/CoreBundleController.php @@ -142,6 +142,7 @@ public function storeWizard( Store $r ): RedirectResponse public function edit( Request $r, CoreBundle $cb ): View { $customer = $cb->customer(); + /** @psalm-suppress InvalidPropertyFetch */ $customerId = !$customer ? 0 : $customer->id; // fill the form with the core bundle data @@ -159,8 +160,10 @@ public function edit( Request $r, CoreBundle $cb ): View ] ); $switchSideA = $cb->switchSideX(); + /** @psalm-suppress InvalidPropertyFetch */ $switchSideAId = $switchSideA ? $switchSideA->id : null; $switchSideB = $cb->switchSideX( false ); + /** @psalm-suppress InvalidPropertyFetch */ $switchSideBId = $switchSideB ? $switchSideB->id : null; return view( 'interfaces/core-bundle/edit/edit-wizard' )->with( [ diff --git a/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php b/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php index cc1e2f27e..e7912459d 100644 --- a/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php +++ b/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php @@ -341,7 +341,7 @@ private function mergeCoreLinkDetails( ?PhysicalInterface $pi, array $data ): ar return $data; } - /** @var $piB PhysicalInterface */ + /** @var PhysicalInterface $piB */ $data['switch-b'] = $piB->switchPort->switchid; $data['switch-port-b'] = $piB->switchportid; $data['status-b'] = $piB->status; diff --git a/app/Http/Controllers/IrrdbController.php b/app/Http/Controllers/IrrdbController.php index a463041ea..ad8f1a614 100644 --- a/app/Http/Controllers/IrrdbController.php +++ b/app/Http/Controllers/IrrdbController.php @@ -32,10 +32,7 @@ use IXP\Http\Requests\Irrdb as IrrdbRequest; -use IXP\Models\{ - Aggregators\IrrdbAggregator, - Customer -}; +use IXP\Models\{Aggregators\IrrdbAggregator, Customer, User}; /** * Irrdb Controller @@ -61,10 +58,13 @@ class IrrdbController extends Controller */ public function list( IrrdbRequest $r, Customer $cust, string $type, int $protocol ) : View { + /** @var User $us */ + $us = Auth::getUser(); + $irrdbList = IrrdbAggregator::forCustomerAndProtocol( $cust->id, $protocol, $type ); // are we busting the cache? - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + if( $r->reset_cache === "1" && $us->isSuperUser() ) { Cache::forget('updated-irrdb-' . $type . '-' . $cust->id ); } @@ -90,8 +90,10 @@ public function list( IrrdbRequest $r, Customer $cust, string $type, int $protoc */ public function update( IrrdbRequest $r, Customer $cust, string $type, int $protocol ) : RedirectResponse { + /** @var User $us */ + $us = Auth::getUser(); // are we busting the cache? - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { + if( $r->reset_cache === "1" && $us->isSuperUser() ) { Cache::forget('updated-irrdb-' . $type . '-' . $protocol . '-' . $cust->id ); } diff --git a/app/Http/Controllers/Layer2AddressController.php b/app/Http/Controllers/Layer2AddressController.php index 1066b4ee8..a6ff8c3d7 100644 --- a/app/Http/Controllers/Layer2AddressController.php +++ b/app/Http/Controllers/Layer2AddressController.php @@ -79,6 +79,9 @@ class Layer2AddressController extends EloquentController */ public function feInit(): void { + /** @var User $us */ + $us = Auth::getUser(); + $this->feParams = (object)[ 'model' => Layer2Address::class, 'pagetitle' => 'Configured MAC Addresses', @@ -106,7 +109,7 @@ public function feInit(): void // phpunit / artisan trips up here without the cli test: if( PHP_SAPI !== 'cli' ) { // custom access controls: - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + switch( Auth::check() ? $us->privs() : User::AUTH_PUBLIC ) { case User::AUTH_SUPERUSER: break; case User::AUTH_CUSTUSER || User::AUTH_CUSTADMIN: @@ -189,11 +192,14 @@ protected function listGetData( ?int $id = null ): array */ public function forVlanInterface( VlanInterface $vli ): View|RedirectResponse { - if( Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( $us->isSuperUser() ) { return view( 'layer2-address/vlan-interface' )->with( [ 'vli' => $vli ] ); } - if( config( 'ixp_fe.layer2-addresses.customer_can_edit' ) && Auth::getUser()->custid === $vli->virtualInterface->customer->id ) { + if( config( 'ixp_fe.layer2-addresses.customer_can_edit' ) && $us->custid === $vli->virtualInterface->customer->id ) { return view( 'layer2-address/vlan-interface-cust' )->with( [ 'vli' => $vli ] ); } return redirect(''); diff --git a/app/Http/Controllers/LoginHistoryController.php b/app/Http/Controllers/LoginHistoryController.php index 1314e3db2..ac8ee5162 100644 --- a/app/Http/Controllers/LoginHistoryController.php +++ b/app/Http/Controllers/LoginHistoryController.php @@ -62,6 +62,9 @@ class LoginHistoryController extends EloquentController */ public function feInit(): void { + /** @var User $us */ + $us = Auth::getUser(); + $this->feParams = (object)[ 'model' => UserLoginHistory::class, 'pagetitle' => 'Login History', @@ -95,7 +98,7 @@ public function feInit(): void // phpunit / artisan trips up here without the cli test: if( PHP_SAPI !== 'cli' ) { // custom access controls: - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + switch( Auth::check() ? $us->privs() : User::AUTH_PUBLIC ) { case User::AUTH_SUPERUSER: break; default: diff --git a/app/Http/Controllers/PatchPanel/Port/PortController.php b/app/Http/Controllers/PatchPanel/Port/PortController.php index a1a32c4bc..88876a596 100644 --- a/app/Http/Controllers/PatchPanel/Port/PortController.php +++ b/app/Http/Controllers/PatchPanel/Port/PortController.php @@ -37,16 +37,15 @@ use IXP\Http\Requests\StorePatchPanelPort as StorePatchPanelPortRequest; -use IXP\Models\{ - Aggregators\PatchPanelPortAggregator, +use IXP\Models\{Aggregators\PatchPanelPortAggregator, Cabinet, Customer, Location, PatchPanel, PatchPanelPort, Switcher, - SwitchPort -}; + SwitchPort, + User}; use IXP\Utils\View\Alert\{ Alert, @@ -368,12 +367,15 @@ public function update( StorePatchPanelPortRequest $r, PatchPanelPort $ppp ): Re */ public function view( PatchPanelPort $ppp ): View { + /** @var User $us */ + $us = Auth::getUser(); + $listHistory[] = $ppp->load( [ 'patchPanel', 'duplexSlavePorts', 'switchPort', 'customer' ] ); - if( !Auth::getUser()->isSuperUser() ) { - if( !$ppp->customer || $ppp->customer_id !== Auth::getUser()->custid ) { + if( !$us->isSuperUser() ) { + if( !$ppp->customer || $ppp->customer_id !== $us->custid ) { abort(404); } } else { diff --git a/app/Http/Controllers/PeeringManagerController.php b/app/Http/Controllers/PeeringManagerController.php index 6aa62b7e9..5775533e1 100644 --- a/app/Http/Controllers/PeeringManagerController.php +++ b/app/Http/Controllers/PeeringManagerController.php @@ -85,6 +85,7 @@ public function index(): View|RedirectResponse $protos = [ 4, 6 ]; $c = Customer::find( Auth::getUser()->custid ); $vlans = Vlan::peeringManager()->orderBy( 'number' )->get(); + /** @psalm-suppress InvalidArgument */ $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; if( !count( $peers ) ) { diff --git a/app/Http/Controllers/PeeringMatrixController.php b/app/Http/Controllers/PeeringMatrixController.php index d8bfb7204..b4b4ed35a 100644 --- a/app/Http/Controllers/PeeringMatrixController.php +++ b/app/Http/Controllers/PeeringMatrixController.php @@ -35,11 +35,7 @@ Request }; -use IXP\Models\{ - BgpSession, - Customer, - Vlan -}; +use IXP\Models\{BgpSession, Customer, User, Vlan}; use IXP\Utils\View\Alert\{ Alert, @@ -138,8 +134,10 @@ public function index( Request $r ): View|RedirectResponse } } + /** @var User $us */ + $us = Auth::getUser(); $restrictActivePeeringMatrix = true; - if( Auth::check() && Auth::getUser()->isSuperUser() ){ + if( Auth::check() && $us->isSuperUser() ){ $restrictActivePeeringMatrix = false; } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index e18ccfcb8..6f823e1cb 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -166,6 +166,7 @@ public function updateProfile( ProfileRequest $r ): RedirectResponse */ public function updateNotificationPreference( NotificationRequest $r ) : RedirectResponse { + /** @var User $user */ $user = Auth::getUser(); $prefs = $user->prefs; @@ -190,6 +191,7 @@ public function updateNotificationPreference( NotificationRequest $r ) : Redirec public function updateMailingLists( Request $r ) : RedirectResponse { if( config( 'mailinglists.enabled', false ) ) { + /** @var User $user */ $user = Auth::getUser(); $prefs = $user->prefs; $mailintLists = []; diff --git a/app/Http/Controllers/RipeAtlas/RunController.php b/app/Http/Controllers/RipeAtlas/RunController.php index e94e96931..f62dac654 100644 --- a/app/Http/Controllers/RipeAtlas/RunController.php +++ b/app/Http/Controllers/RipeAtlas/RunController.php @@ -225,28 +225,28 @@ public function addStep2( Request $r ): View /** * Function to do the actual validation and storing of the submitted object. * - * @param Request $request + * @param Request $r * * @return bool|RedirectResponse */ - public function doStore( Request $request ): bool|RedirectResponse + public function doStore( Request $r ): bool|RedirectResponse { - if( !$request->selected_custs || !count( $request->selected_custs ) ) { + if( !$r->selected_custs || !count( $r->selected_custs ) ) { AlertContainer::push( "You need to select at least one " . config( "ixp_fe.lang.customer.one" ) . ".", Alert::DANGER ); return Redirect::back()->withInput(); } - $this->checkForm( $request ); + $this->checkForm( $r ); $this->object = AtlasRun::create( [ - 'protocol' => $request->protocol, - 'scheduled_at' => $request->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ? now() : new Carbon( $request->scheduled_date . $request->scheduled_time ), - 'vlan_id' => $request->vlan_id + 'protocol' => $r->protocol, + 'scheduled_at' => $r->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ? now() : new Carbon( $r->scheduled_date . $r->scheduled_time ), + 'vlan_id' => $r->vlan_id ] ); - CreateMeasurementsJob::dispatchSync( $this->object, $request->selected_custs ); + CreateMeasurementsJob::dispatchSync( $this->object, $r->selected_custs ); - if( (int)$request->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ) { + if( (int)$r->scheduled_at === AtlasRun::SCHEDULED_AT_NOW ) { $this->object->atlasMeasurements()->each( function( $am ) { RunMeasurementsJob::dispatchAfterResponse( $am ); } ); diff --git a/app/Http/Controllers/StatisticsController.php b/app/Http/Controllers/StatisticsController.php index dbb44b455..de486da6a 100644 --- a/app/Http/Controllers/StatisticsController.php +++ b/app/Http/Controllers/StatisticsController.php @@ -49,6 +49,7 @@ Switcher, TrafficDaily, TrafficDailyPhysInt, + User, VirtualInterface, Vlan, VlanInterface}; @@ -541,9 +542,9 @@ public function p2p( Request $request, Customer $customer = null ): RedirectResp } } - $request->category = Graph::processParameterCategory( $request->category, true ); - $request->period = Graph::processParameterPeriod( $request->period ); - $request->protocol = Graph::processParameterRealProtocol( $request->protocol ); + $requestCategory = Graph::processParameterCategory( $request->category, true ); + $requestPeriod = Graph::processParameterPeriod( $request->period ); + $requestProtocol = Graph::processParameterRealProtocol( $request->protocol ); $srcVlis = VlanInterface::select( [ 'vli.*' ] ) ->from( 'vlaninterface AS vli' ) @@ -568,8 +569,8 @@ public function p2p( Request $request, Customer $customer = null ): RedirectResp } // is the requested protocol support? - if( !$srcVli->vlan->private && !$srcVli->ipvxEnabled( $request->protocol ) ) { - AlertContainer::push( Graph::resolveProtocol( $request->protocol ) . " is not supported on the requested VLAN interface.", Alert::WARNING ); + if( !$srcVli->vlan->private && !$srcVli->ipvxEnabled( $requestProtocol ) ) { + AlertContainer::push( Graph::resolveProtocol( $requestProtocol ) . " is not supported on the requested VLAN interface.", Alert::WARNING ); return redirect()->back(); } // Now find the possible other VLAN interfaces that this customer could exchange traffic with @@ -628,19 +629,19 @@ public function p2p( Request $request, Customer $customer = null ): RedirectResp // authenticate on one of the graphs $graph = App::make( Grapher::class ) ->p2p( $srcVli, $dstVli ?: $dstVlis[ $dstVlis->first()->id ]) - ->setProtocol( $request->protocol ) - ->setCategory( $request->category ) - ->setPeriod( $request->period ); + ->setProtocol( $requestProtocol ) + ->setCategory( $requestCategory ) + ->setPeriod( $requestPeriod ); $graph->authorise(); $viewOptions = [ 'c' => $customer, - 'category' => $request->category, + 'category' => $requestCategory, 'dstVlis' => $dstVlis, 'dstVli' => $dstVli, 'graph' => $graph, - 'period' => $request->period, - 'protocol' => $request->protocol, + 'period' => $requestPeriod, + 'protocol' => $requestProtocol, 'showGraphs' => $showGraphs, 'showGraphsOption' => $showGraphsOption, 'srcVlis' => $srcVlis, @@ -705,6 +706,9 @@ public function leagueTable( Request $r ): View */ public function coreBundle( StatisticsRequest $r, CoreBundle $cb ): RedirectResponse|View { + /** @var User $us */ + $us = Auth::getUser(); + $category = Graph::processParameterCategory( $r->input( 'category' ) ); $graph = App::make( Grapher::class ) ->coreBundle( $cb )->setCategory( $category ) @@ -722,7 +726,7 @@ public function coreBundle( StatisticsRequest $r, CoreBundle $cb ): RedirectResp "cb" => $cb, "graph" => $graph, "category" => $category, - "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, + "categories" => Auth::check() && $us && $us->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, ]); } diff --git a/app/Http/Controllers/Switches/SwitchController.php b/app/Http/Controllers/Switches/SwitchController.php index 5ccaf31c0..d0de13180 100644 --- a/app/Http/Controllers/Switches/SwitchController.php +++ b/app/Http/Controllers/Switches/SwitchController.php @@ -87,6 +87,9 @@ class SwitchController extends EloquentController */ public function feInit(): void { + /** @var User $us */ + $us = Auth::getUser(); + $this->feParams = (object)[ 'model' => Switcher::class, 'pagetitle' => 'Switches', @@ -172,7 +175,7 @@ public function feInit(): void // phpunit / artisan trips up here without the cli test: if( PHP_SAPI !== 'cli' ) { // custom access controls: - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { + switch( Auth::check() ? $us->privs() : User::AUTH_PUBLIC ) { case User::AUTH_SUPERUSER: break; case User::AUTH_CUSTUSER || User::AUTH_CUSTADMIN: diff --git a/app/Http/Controllers/User/CustomerToUserController.php b/app/Http/Controllers/User/CustomerToUserController.php index 0f4614b38..67b9524e4 100644 --- a/app/Http/Controllers/User/CustomerToUserController.php +++ b/app/Http/Controllers/User/CustomerToUserController.php @@ -76,7 +76,9 @@ class CustomerToUserController extends Controller */ public function create( Request $r, string $email ): View { - if( Auth::getUser()->isCustUser() ){ + /** @var User $us */ + $us = Auth::getUser(); + if( $us->isCustUser() ){ abort( 403, 'Action no allowed' ); } // search user via email address @@ -140,6 +142,9 @@ public function store( StoreCustomerToUser $r ): RedirectResponse */ public function updatePrivs( Request $r ): JsonResponse { + /** @var User $us */ + $us = Auth::getUser(); + /** @var CustomerToUser $c2u */ $c2u = CustomerToUser::findOrFail( $r->id ); @@ -148,7 +153,7 @@ public function updatePrivs( Request $r ): JsonResponse } if( (int)$r->privs === User::AUTH_SUPERUSER ) { - if( !Auth::user()->isSuperUser() ) { + if( !$us->isSuperUser() ) { return response()->json( [ 'success' => false, 'message' => "You are not allowed to set the super user privilege" ] ); } diff --git a/app/Http/Controllers/User/User2FAController.php b/app/Http/Controllers/User/User2FAController.php index 4a9e339ba..ce13f2299 100644 --- a/app/Http/Controllers/User/User2FAController.php +++ b/app/Http/Controllers/User/User2FAController.php @@ -71,6 +71,7 @@ class User2FAController extends Controller */ public function configure(): View { + /** @var User $user */ $user = Auth::getUser(); if( !$user->user2FA ) { diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php index fea99cfef..1e62caf33 100644 --- a/app/Http/Controllers/User/UserController.php +++ b/app/Http/Controllers/User/UserController.php @@ -246,11 +246,14 @@ public function create( Request $r ): View */ public function store( StoreUser $r ): RedirectResponse|Redirector { + /** @var User $us */ + $us = Auth::getUser(); + $this->authorize( 'any', User::class ); // Creating the User object $user = new User; - $user->creator = Auth::user()->username; + $user->creator = $us->username; $user->password = Hash::make( Str::random(16) ); $user->name = $r->name; $user->authorisedMobile = $r->authorisedMobile; @@ -259,7 +262,7 @@ public function store( StoreUser $r ): RedirectResponse|Redirector $user->disabled = $r->disabled ? 0 : 1; // input as enable in the view $user->lastupdatedby = Auth::id(); $user->privs = $r->privs; - $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; + $user->custid = $us->isSuperUser() ? $r->custid : $us->custid; $user->save(); // Creating the CustomerToUser object @@ -297,9 +300,11 @@ public function store( StoreUser $r ): RedirectResponse|Redirector */ public function edit( Request $r, User $u ): View { + /** @var User $us */ + $us = Auth::user(); $this->authorize( 'access', $u ); - $isSuperUser = Auth::user()->isSuperUser(); + $isSuperUser = $us->isSuperUser(); if( !request()->session()->exists( 'user_post_store_redirect' ) ) { $this->redirectLink(); @@ -350,10 +355,12 @@ public function edit( Request $r, User $u ): View */ public function update( UpdateUser $r, User $u ): RedirectResponse|Redirector { + /** @var User $us */ + $us = Auth::user(); $this->authorize( 'access', $u ); // Superuser OR Logged User edit his own user - if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { + if( ( $isSuperUser = $us->isSuperUser() ) || $u->id === Auth::id() ) { $u->name = $r->name; $u->authorisedMobile = $r->authorisedMobile; } @@ -392,7 +399,10 @@ public function update( UpdateUser $r, User $u ): RedirectResponse|Redirector */ protected function postStoreRedirect() { - if( Auth::user()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::user(); + + if( $us->isSuperUser() ) { $redirect = session( "user_post_store_redirect" ); session()->forget( "user_post_store_redirect" ); @@ -401,7 +411,7 @@ protected function postStoreRedirect() } } - if( Auth::user()->isCustUser() ) { + if( $us->isCustUser() ) { return ''; } @@ -445,6 +455,9 @@ public function view( User $u ): View */ public function delete( DeleteRequest $r, User $u ) : RedirectResponse { + /** @var User $us */ + $us = Auth::user(); + $this->authorize( 'any', User::class ); // delete all the user's API keys @@ -466,7 +479,7 @@ public function delete( DeleteRequest $r, User $u ) : RedirectResponse $u->delete(); AlertContainer::push('User deleted.', Alert::SUCCESS ); - Log::notice( Auth::user()->username." deleted user" . $u->username ); + Log::notice( $us->username." deleted user" . $u->username ); // If the user delete itself and is loggued as the same customer logout if( Auth::id() === $u->id ) { @@ -474,7 +487,7 @@ public function delete( DeleteRequest $r, User $u ) : RedirectResponse return redirect( route( "login@showForm" ) ); } - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + if( $us->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { return redirect( route( "customer@overview", [ 'cust' => $u->custid , "tab" => "users"] ) ); } @@ -490,10 +503,13 @@ public function delete( DeleteRequest $r, User $u ) : RedirectResponse */ public function resendWelcomeEmail( User $u ): RedirectResponse { + /** @var User $us */ + $us = Auth::user(); + Mail::to( $u->email )->send( new UserCreatedeMailable( $u, true ) ); AlertContainer::push( sprintf( 'The welcome email has been resent' ), Alert::SUCCESS ); - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { + if( $us->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { return redirect( route( "customer@overview", [ 'cust' => $u->custid , "tab" => "users"] ) ); } diff --git a/app/Http/Middleware/ApiAuthenticate.php b/app/Http/Middleware/ApiAuthenticate.php index 71520c008..42e4a3a46 100644 --- a/app/Http/Middleware/ApiAuthenticate.php +++ b/app/Http/Middleware/ApiAuthenticate.php @@ -61,7 +61,7 @@ class ApiAuthenticate */ public function handle( Request $r, Closure $next ) { - // are we already logged in? + // are we already logged in? if( !Auth::check() ) { // find API key. Prefer header to URL: @@ -101,10 +101,15 @@ public function handle( Request $r, Closure $next ) 'lastseenAt' => now(), 'lastseenFrom' => ixp_get_client_ip(), ] ); - }elseif( Auth::user()->disabled ){ - return response( 'User is disabled', 403 ); - }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled - return response( ucfirst( config( 'ixp_fe.lang.customer.one' ) ) . ' of the user is disabled', 403 ); + } else { + /** @var User $us */ + $us = Auth::user(); + + if( $us->disabled ){ + return response( 'User is disabled', 403 ); + } elseif( $us->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled + return response( ucfirst( config( 'ixp_fe.lang.customer.one' ) ) . ' of the user is disabled', 403 ); + } } return $next( $r ); diff --git a/app/Http/Middleware/ApiMaybeAuthenticate.php b/app/Http/Middleware/ApiMaybeAuthenticate.php index 4e11c389f..d7b1b5fe9 100644 --- a/app/Http/Middleware/ApiMaybeAuthenticate.php +++ b/app/Http/Middleware/ApiMaybeAuthenticate.php @@ -62,7 +62,10 @@ class ApiMaybeAuthenticate */ public function handle( Request $r, Closure $next ) { - // are we already logged in? + /** @var User $us */ + $us = Auth::user(); + + // are we already logged in? if( !Auth::check() ) { // find API key. Prefer header to URL: $apikey = false; @@ -98,12 +101,12 @@ public function handle( Request $r, Closure $next ) 'lastseenFrom' => ixp_get_client_ip(), ] ); } - } elseif( Auth::user()->disabled ){ + } elseif( $us->disabled ){ return response( 'User is disabled', 403 ); } // Check if default customer is disabled - if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ + if( Auth::check() && $us->customer()->active()->notDeleted()->doesntExist() ){ return response( ucfirst( config( 'ixp_fe.lang.customer.one' ) ) . ' of the user is disabled', 403 ); } diff --git a/app/Http/Middleware/AssertUserPrivilege.php b/app/Http/Middleware/AssertUserPrivilege.php index 0fcb2d01f..9312fa248 100644 --- a/app/Http/Middleware/AssertUserPrivilege.php +++ b/app/Http/Middleware/AssertUserPrivilege.php @@ -26,6 +26,7 @@ use Auth, Closure; use Illuminate\Http\Request; +use IXP\Models\User; /** * Middleware: Assert an authenticated user is of a given privilege @@ -51,7 +52,10 @@ class AssertUserPrivilege */ public function handle( Request $r, Closure $next, int $privilege ) { - if( Auth::getUser()->privs() !== $privilege ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( $us->privs() !== $privilege ) { return response( 'Insufficient permissions', 403 ); } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 5ea1895cc..eb15180eb 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -29,6 +29,7 @@ use Illuminate\Http\Request; use IXP\Models\CustomerToUser; +use IXP\Models\User; use IXP\Utils\View\Alert\Alert; use IXP\Utils\View\Alert\Container as AlertContainer; @@ -73,6 +74,9 @@ public function __construct( Guard $auth ) */ public function handle( Request $r, Closure $next ) { + /** @var User $us */ + $us = Auth::getUser(); + if( $this->auth->guest() ) { if( $r->ajax() ) { return response('Unauthorized.', 401); @@ -81,20 +85,20 @@ public function handle( Request $r, Closure $next ) } // Check if use has at least one customer linked, if not logout - if( !Auth::getUser()->custid || !CustomerToUser::where( [ 'user_id' => Auth::id() ] )->where( [ 'customer_id' => Auth::getUser()->custid ] )->first() ){ + if( !$us->custid || !CustomerToUser::where( [ 'user_id' => Auth::id() ] )->where( [ 'customer_id' => $us->custid ] )->first() ){ Auth::logout(); return redirect()->guest( route( "login@showForm" ) ); } // Check if user is disabled - if( Auth::getUser()->disabled ){ + if( $us->disabled ){ AlertContainer::push( 'You account is disabled.', Alert::DANGER ); Auth::logout(); return redirect()->guest( route( "login@showForm" ) ); } // Check if default customer is disabled - if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ + if( $us->customer()->active()->notDeleted()->doesntExist() ){ Auth::logout(); return redirect()->guest( route( "login@showForm" ) ); } diff --git a/app/Http/Middleware/Eloquent2Frontend.php b/app/Http/Middleware/Eloquent2Frontend.php index 8aaa2d5fe..b0d0e2c4d 100644 --- a/app/Http/Middleware/Eloquent2Frontend.php +++ b/app/Http/Middleware/Eloquent2Frontend.php @@ -57,16 +57,20 @@ class Eloquent2Frontend */ public function handle( Request $r, Closure $next ) { + /** @var User $us */ + $us = Auth::getUser(); + // get the class and method that has been called: [ $controller, $method ] = explode('@', Route::currentRouteAction() ); // what's the user's privilege? - $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; + $user_priv = Auth::check() ? $us->privs() : User::AUTH_PUBLIC; // first check - do we have the necessary privileges to access this? + /** @psalm-suppress InvalidPropertyFetch */ if( $user_priv < $controller::$minimum_privilege ) { AlertContainer::push( "You do not have the required privileges to access this function.", Alert::DANGER ); - Log::info( ( Auth::check() ? Auth::getUser()->username : 'Anonymous user' ) . " tried to access {$controller}@{$method} but does not have the required privileges" ); + Log::info( ( Auth::check() ? $us->username : 'Anonymous user' ) . " tried to access {$controller}@{$method} but does not have the required privileges" ); return redirect( '' ); } diff --git a/app/Http/Middleware/RsPrefixes.php b/app/Http/Middleware/RsPrefixes.php index 7922cc7b8..f826e63c0 100644 --- a/app/Http/Middleware/RsPrefixes.php +++ b/app/Http/Middleware/RsPrefixes.php @@ -60,13 +60,16 @@ class RsPrefixes */ public function handle( Request $r, Closure $next ) { + /** @var User $us */ + $us = Auth::getUser(); + // there are only two routes for rs prefixes - authorise each one as follows: if( $r->is( 'rs-prefixes/list' ) ) { if( (int)config( 'ixp_fe.rs-prefixes.access' ) === User::AUTH_PUBLIC ) { return $next( $r ); } - if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { + if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > $us->privs() ) { AlertContainer::push( "You do not have the required privileges to access this function.", Alert::DANGER ); return redirect( '' ); } @@ -76,11 +79,11 @@ public function handle( Request $r, Closure $next ) } if( Auth::check() ) { - if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { + if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= $us->privs() ) { return $next( $r ); } - if( Auth::getUser()->custid === $r->cust->id ) { + if( $us->custid === $r->cust->id ) { return $next( $r ); } } diff --git a/app/Http/Middleware/Services/Grapher.php b/app/Http/Middleware/Services/Grapher.php index a4a6abe18..b02b25090 100644 --- a/app/Http/Middleware/Services/Grapher.php +++ b/app/Http/Middleware/Services/Grapher.php @@ -104,91 +104,93 @@ private function processParameters( Request $request, GrapherService $grapher ): $target = explode( '/', $request->path() ); $target = array_pop( $target ); - $request->period = Graph::processParameterPeriod( $request->period ); - $request->category = Graph::processParameterCategory( $request->category ); - $request->protocol = Graph::processParameterProtocol( $request->protocol ); - $request->type = Graph::processParameterType( $request->type ); + $parameters = []; + + $parameters["period"] = Graph::processParameterPeriod( $request->period ); + $parameters["category"] = Graph::processParameterCategory( $request->category ); + $parameters["protocol"] = Graph::processParameterProtocol( $request->protocol ); + $parameters["type"] = Graph::processParameterType( $request->type ); switch( $target ) { case 'ixp': - $request->id = 1; - $graph = $grapher->ixp()->setParamsFromArray( $request->all() ); + $parameters["id"] = 1; + $graph = $grapher->ixp()->setParamsFromArray( $parameters ); break; case 'infrastructure': $infra = InfrastructureGraph::processParameterInfrastructure( (int)$request->input( 'id', 0 ) ); - $request->infrastructure = $infra->id; - $graph = $grapher->infrastructure( $infra )->setParamsFromArray( $request->all() ); + $parameters["infrastructure"] = $infra->id; + $graph = $grapher->infrastructure( $infra )->setParamsFromArray( $parameters ); break; case 'vlan': $vlan = VlanGraph::processParameterVlan( (int)$request->input( 'id', 0 ) ); - $request->vlan = $vlan->id; - $graph = $grapher->vlan( $vlan )->setParamsFromArray( $request->all() ); + $parameters["vlan"] = $vlan->id; + $graph = $grapher->vlan( $vlan )->setParamsFromArray( $parameters ); break; case 'trunk': $trunkname = TrunkGraph::processParameterTrunkname( (string)$request->input( 'id', '' ) ); - $request->trunkname = $trunkname; - $graph = $grapher->trunk( $trunkname )->setParamsFromArray( $request->all() ); + $parameters["trunkname"] = $trunkname; + $graph = $grapher->trunk( $trunkname )->setParamsFromArray( $parameters ); break; case 'corebundle': $corebundle = CoreBundleGraph::processParameterCoreBundle( (int)$request->input( 'id', 0 ) ); $side = CoreBundleGraph::processParameterSide( $request->input( 'side', 'a' ) ); - $request->corebundle = $corebundle->id; - $request->side = $side; - $graph = $grapher->coreBundle( $corebundle, $side )->setParamsFromArray( $request->all() ); + $parameters["corebundle"] = $corebundle->id; + $parameters["side"] = $side; + $graph = $grapher->coreBundle( $corebundle, $side )->setParamsFromArray( $parameters ); break; case 'location': $location = LocationGraph::processParameterLocation( (int)$request->input( 'id', 0 ) ); - $request->location = $location->id; - $graph = $grapher->location( $location )->setParamsFromArray( $request->all() ); + $parameters["location"] = $location->id; + $graph = $grapher->location( $location )->setParamsFromArray( $parameters ); break; case 'switch': $switch = SwitchGraph::processParameterSwitch( (int)$request->input( 'id', 0 ) ); - $request->switch = $switch->id; - $graph = $grapher->switch( $switch )->setParamsFromArray( $request->all() ); + $parameters["switch"] = $switch->id; + $graph = $grapher->switch( $switch )->setParamsFromArray( $parameters ); break; case 'physicalinterface': $physint = PhysIntGraph::processParameterPhysicalInterface( (int)$request->input( 'id', 0 ) ); - $request->physint = $physint->id; - $graph = $grapher->physint( $physint )->setParamsFromArray( $request->all() ); + $parameters["physint"] = $physint->id; + $graph = $grapher->physint( $physint )->setParamsFromArray( $parameters ); break; case 'virtualinterface': $virtint = VirtIntGraph::processParameterVirtualInterface( (int)$request->input( 'id', 0 ) ); - $request->virtint = $virtint->id; - $graph = $grapher->virtint( $virtint )->setParamsFromArray( $request->all() ); + $parameters["virtint"] = $virtint->id; + $graph = $grapher->virtint( $virtint )->setParamsFromArray( $parameters ); break; case 'customer': $customer = CustomerGraph::processParameterCustomer( (int)$request->input( 'id', 0 ) ); - $request->customer = $customer->id; - $graph = $grapher->customer( $customer )->setParamsFromArray( $request->all() ); + $parameters["customer"] = $customer->id; + $graph = $grapher->customer( $customer )->setParamsFromArray( $parameters ); break; case 'vlaninterface': $vlanint = VlanIntGraph::processParameterVlanInterface( (int)$request->input( 'id', 0 ) ); - $request->vlanint = $vlanint->id; - $graph = $grapher->vlanint( $vlanint )->setParamsFromArray( $request->all() ); + $parameters["vlanint"] = $vlanint->id; + $graph = $grapher->vlanint( $vlanint )->setParamsFromArray( $parameters ); break; case 'latency': $vli = LatencyGraph::processParameterVlanInterface( (int)$request->input( 'id', 0 ) ); - $request->vli = $vli; - $graph = $grapher->latency( $vli )->setParamsFromArray( $request->all() ); + $parameters["vli"] = $vli; + $graph = $grapher->latency( $vli )->setParamsFromArray( $parameters ); break; case 'p2p': $srcvlanint = P2pGraph::processParameterSourceVlanInterface( (int)$request->input( 'svli', 0 ) ); $dstvlanint = P2pGraph::processParameterDestinationVlanInterface( (int)$request->input( 'dvli', 0 ) ); - $request->srcvlanint = $srcvlanint->id; - $request->dstvlanint = $dstvlanint->id; - $graph = $grapher->p2p( $srcvlanint, $dstvlanint )->setParamsFromArray( $request->all() ); + $parameters["srcvlanint"] = $srcvlanint->id; + $parameters["dstvlanint"] = $dstvlanint->id; + $graph = $grapher->p2p( $srcvlanint, $dstvlanint )->setParamsFromArray( $parameters ); break; default: abort(404, 'No such graph type'); diff --git a/app/Http/Middleware/Services/LookingGlass.php b/app/Http/Middleware/Services/LookingGlass.php index 5ee8d9483..ccbd8bb1a 100644 --- a/app/Http/Middleware/Services/LookingGlass.php +++ b/app/Http/Middleware/Services/LookingGlass.php @@ -148,7 +148,10 @@ public function handle( Request $r, Closure $next ) */ private function authorise( Router $router ): bool { - if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( $router->authorise( Auth::check() ? $us->privs() : User::AUTH_PUBLIC ) ) { return true; } return false; diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 619ca730e..3c67bd126 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -49,7 +49,7 @@ class TrustProxies extends Middleware /** * The current proxy header mappings. * - * @var array + * @var int */ protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | diff --git a/app/Http/Requests/CoreBundle/Store.php b/app/Http/Requests/CoreBundle/Store.php index c07243d54..9bd2f9b38 100644 --- a/app/Http/Requests/CoreBundle/Store.php +++ b/app/Http/Requests/CoreBundle/Store.php @@ -29,10 +29,7 @@ use Illuminate\Validation\Validator; -use IXP\Models\{ - CoreBundle, - SwitchPort -}; +use IXP\Models\{CoreBundle, SwitchPort, User}; use IXP\Utils\View\Alert\{ Alert, @@ -58,8 +55,10 @@ class Store extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/CoreBundle/StoreCoreLink.php b/app/Http/Requests/CoreBundle/StoreCoreLink.php index bdfe1d78f..ec4e36863 100644 --- a/app/Http/Requests/CoreBundle/StoreCoreLink.php +++ b/app/Http/Requests/CoreBundle/StoreCoreLink.php @@ -26,6 +26,7 @@ use Auth; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; /** * Store CoreLink FormRequest @@ -46,8 +47,10 @@ class StoreCoreLink extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/Customer/BillingInformation.php b/app/Http/Requests/Customer/BillingInformation.php index d750f6957..3a3ce7a50 100644 --- a/app/Http/Requests/Customer/BillingInformation.php +++ b/app/Http/Requests/Customer/BillingInformation.php @@ -29,6 +29,7 @@ use IXP\Models\CompanyBillingDetail; +use IXP\Models\User; use Webpatser\Countries\CountriesFacade as Countries; /** @@ -50,7 +51,9 @@ class BillingInformation extends FormRequest */ public function authorize(): bool { - return Auth::getUser()->isSuperUser(); + /** @var User $us */ + $us = Auth::getUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/Customer/Store.php b/app/Http/Requests/Customer/Store.php index 21d3ccb78..e9d88898b 100644 --- a/app/Http/Requests/Customer/Store.php +++ b/app/Http/Requests/Customer/Store.php @@ -29,6 +29,7 @@ use Illuminate\Validation\Validator; use IXP\Models\Customer; +use IXP\Models\User; /** * Customer Store Request @@ -48,8 +49,10 @@ class Store extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/Dashboard/BillingDetailsRequest.php b/app/Http/Requests/Dashboard/BillingDetailsRequest.php index cf0d65353..cd0b71afd 100644 --- a/app/Http/Requests/Dashboard/BillingDetailsRequest.php +++ b/app/Http/Requests/Dashboard/BillingDetailsRequest.php @@ -26,6 +26,7 @@ use Auth, Countries; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; /** * Dashboard Billing Store Request @@ -46,8 +47,10 @@ class BillingDetailsRequest extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures custadmin access only so always authorised here: - return Auth::getUser()->isCustAdmin(); + return $us->isCustAdmin(); } /** diff --git a/app/Http/Requests/Dashboard/NocDetailsRequest.php b/app/Http/Requests/Dashboard/NocDetailsRequest.php index 2379e0f7a..5e4cd9261 100644 --- a/app/Http/Requests/Dashboard/NocDetailsRequest.php +++ b/app/Http/Requests/Dashboard/NocDetailsRequest.php @@ -28,6 +28,7 @@ use Illuminate\Foundation\Http\FormRequest; use IXP\Models\Customer; +use IXP\Models\User; /** * Dashboard Noc details Request @@ -48,8 +49,10 @@ class NocDetailsRequest extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures custadmin access only so always authorised here: - return Auth::getUser()->isCustAdmin(); + return $us->isCustAdmin(); } /** diff --git a/app/Http/Requests/EmailPatchPanelPort.php b/app/Http/Requests/EmailPatchPanelPort.php index a1403cc47..8e7e12307 100644 --- a/app/Http/Requests/EmailPatchPanelPort.php +++ b/app/Http/Requests/EmailPatchPanelPort.php @@ -25,6 +25,7 @@ use Auth; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; class EmailPatchPanelPort extends FormRequest { @@ -35,8 +36,10 @@ class EmailPatchPanelPort extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/IpAddress/DeleteByNetwork.php b/app/Http/Requests/IpAddress/DeleteByNetwork.php index e603e046f..fa81a7edf 100644 --- a/app/Http/Requests/IpAddress/DeleteByNetwork.php +++ b/app/Http/Requests/IpAddress/DeleteByNetwork.php @@ -31,6 +31,7 @@ IP, Network }; +use IXP\Models\User; /** * Delete IP Address Request @@ -51,8 +52,10 @@ class DeleteByNetwork extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/IpAddress/Store.php b/app/Http/Requests/IpAddress/Store.php index 5f82399ad..4303f707f 100644 --- a/app/Http/Requests/IpAddress/Store.php +++ b/app/Http/Requests/IpAddress/Store.php @@ -31,6 +31,7 @@ IP, Network }; +use IXP\Models\User; /** * IP Address Request @@ -51,8 +52,10 @@ class Store extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/Irrdb.php b/app/Http/Requests/Irrdb.php index 96ad397b9..0e196adf9 100644 --- a/app/Http/Requests/Irrdb.php +++ b/app/Http/Requests/Irrdb.php @@ -50,7 +50,9 @@ class Irrdb extends FormRequest */ public function authorize(): bool { - $privs = Auth::getUser()->privs(); + /** @var User $us */ + $us = Auth::getUser(); + $privs = $us->privs(); if( $privs < User::AUTH_CUSTUSER ) { return false; diff --git a/app/Http/Requests/MovePatchPanelPort.php b/app/Http/Requests/MovePatchPanelPort.php index f1edea9b9..24a466ddd 100644 --- a/app/Http/Requests/MovePatchPanelPort.php +++ b/app/Http/Requests/MovePatchPanelPort.php @@ -26,6 +26,7 @@ use Auth; use Illuminate\Foundation\Http\FormRequest; use IXP\Models\PatchPanelPort; +use IXP\Models\User; class MovePatchPanelPort extends FormRequest { @@ -36,8 +37,10 @@ class MovePatchPanelPort extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StatisticsRequest.php b/app/Http/Requests/StatisticsRequest.php index a4f7b5c62..eec705711 100644 --- a/app/Http/Requests/StatisticsRequest.php +++ b/app/Http/Requests/StatisticsRequest.php @@ -39,6 +39,8 @@ */ class StatisticsRequest extends FormRequest { + public string $period, $category, $protocol, $type; + /** * Determine if the user is authorized to make this request. * diff --git a/app/Http/Requests/StorePatchPanel.php b/app/Http/Requests/StorePatchPanel.php index b0ede793f..5ac6670d4 100644 --- a/app/Http/Requests/StorePatchPanel.php +++ b/app/Http/Requests/StorePatchPanel.php @@ -28,6 +28,7 @@ use Illuminate\Foundation\Http\FormRequest; use IXP\Models\PatchPanel; +use IXP\Models\User; /** * Store PatchPanel FormRequest @@ -48,8 +49,10 @@ class StorePatchPanel extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StorePatchPanelPort.php b/app/Http/Requests/StorePatchPanelPort.php index 10c695dd8..6b3f4eb65 100644 --- a/app/Http/Requests/StorePatchPanelPort.php +++ b/app/Http/Requests/StorePatchPanelPort.php @@ -28,6 +28,7 @@ use Illuminate\Foundation\Http\FormRequest; use IXP\Models\PatchPanelPort; +use IXP\Models\User; /** * Store PatchPanelPort FormRequest @@ -48,8 +49,10 @@ class StorePatchPanelPort extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StorePhysicalInterface.php b/app/Http/Requests/StorePhysicalInterface.php index ae711bd67..b9a7e7c8b 100644 --- a/app/Http/Requests/StorePhysicalInterface.php +++ b/app/Http/Requests/StorePhysicalInterface.php @@ -28,6 +28,7 @@ use IXP\Models\PhysicalInterface; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; /** * Store PhysicalInterface FormRequest @@ -48,8 +49,10 @@ class StorePhysicalInterface extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StoreRouter.php b/app/Http/Requests/StoreRouter.php index 203044873..0b3e58526 100644 --- a/app/Http/Requests/StoreRouter.php +++ b/app/Http/Requests/StoreRouter.php @@ -51,8 +51,10 @@ class StoreRouter extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StoreSflowReceiver.php b/app/Http/Requests/StoreSflowReceiver.php index 26fb2155d..c0f415eeb 100644 --- a/app/Http/Requests/StoreSflowReceiver.php +++ b/app/Http/Requests/StoreSflowReceiver.php @@ -26,6 +26,7 @@ use Auth; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; /** * Store SflowReceiver FormRequest @@ -46,8 +47,10 @@ class StoreSflowReceiver extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StoreVirtualInterface.php b/app/Http/Requests/StoreVirtualInterface.php index 9645cea6b..38f928604 100644 --- a/app/Http/Requests/StoreVirtualInterface.php +++ b/app/Http/Requests/StoreVirtualInterface.php @@ -26,6 +26,7 @@ use Auth; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; /** * Store VirtualInterface FormRequest @@ -46,8 +47,10 @@ class StoreVirtualInterface extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StoreVirtualInterfaceWizard.php b/app/Http/Requests/StoreVirtualInterfaceWizard.php index bb1394f1b..3bf2cdd10 100644 --- a/app/Http/Requests/StoreVirtualInterfaceWizard.php +++ b/app/Http/Requests/StoreVirtualInterfaceWizard.php @@ -29,6 +29,7 @@ use IXP\Models\PhysicalInterface; +use IXP\Models\User; use IXP\Rules\IdnValidate; /** @@ -50,8 +51,10 @@ class StoreVirtualInterfaceWizard extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/StoreVlanInterface.php b/app/Http/Requests/StoreVlanInterface.php index e3b46d8b6..d5e54bb73 100644 --- a/app/Http/Requests/StoreVlanInterface.php +++ b/app/Http/Requests/StoreVlanInterface.php @@ -27,6 +27,7 @@ use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; use IXP\Rules\IdnValidate; /** @@ -48,8 +49,10 @@ class StoreVlanInterface extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/Switches/Store.php b/app/Http/Requests/Switches/Store.php index f74b37251..069fe2609 100644 --- a/app/Http/Requests/Switches/Store.php +++ b/app/Http/Requests/Switches/Store.php @@ -28,6 +28,7 @@ use Illuminate\Validation\Validator; use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; use IXP\Rules\IdnValidate; class Store extends FormRequest @@ -39,8 +40,10 @@ class Store extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/Switches/StoreBySmtp.php b/app/Http/Requests/Switches/StoreBySmtp.php index 1919d01a3..923487a49 100644 --- a/app/Http/Requests/Switches/StoreBySmtp.php +++ b/app/Http/Requests/Switches/StoreBySmtp.php @@ -27,6 +27,7 @@ use Illuminate\Foundation\Http\FormRequest; +use IXP\Models\User; use IXP\Rules\IdnValidate; /** @@ -48,8 +49,10 @@ class StoreBySmtp extends FormRequest */ public function authorize(): bool { + /** @var User $us */ + $us = Auth::getUser(); // middleware ensures superuser access only so always authorised here: - return Auth::getUser()->isSuperUser(); + return $us->isSuperUser(); } /** diff --git a/app/Http/Requests/User/CheckEmail.php b/app/Http/Requests/User/CheckEmail.php index 1e5827d76..4a8c13058 100644 --- a/app/Http/Requests/User/CheckEmail.php +++ b/app/Http/Requests/User/CheckEmail.php @@ -78,10 +78,12 @@ public function rules(): array */ public function withValidator( Validator $validator ): void { - $validator->after( function( Validator $validator ) { - if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) + /** @var User $us */ + $us = Auth::user(); + $validator->after( function( Validator $validator ) use ( $us ) { + if( !$us->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) ->where( 'email', $this->email ) - ->where( 'customer_id', Auth::user()->custid )->exists() ) { + ->where( 'customer_id', $us->custid )->exists() ) { AlertContainer::push( "A user already exists with that email address for your company." , Alert::DANGER ); $validator->errors()->add( 'email', " " ); diff --git a/app/Http/Requests/User/CustomerToUser/Store.php b/app/Http/Requests/User/CustomerToUser/Store.php index f32f64cfb..7b6e57fdf 100644 --- a/app/Http/Requests/User/CustomerToUser/Store.php +++ b/app/Http/Requests/User/CustomerToUser/Store.php @@ -67,12 +67,14 @@ public function authorize(): bool */ public function rules(): array { + /** @var User $us */ + $us = Auth::user(); $rules = [ 'user_id' => 'required|integer|exists:user,id', 'privs' => 'required|integer|in:' . implode( ',', array_keys( User::$PRIVILEGES_ALL ) ), ]; - if( Auth::user()->isSuperUser() ) { + if( $us->isSuperUser() ) { $extraRules = [ 'customer_id' => 'required|integer|exists:cust,id', ]; @@ -86,13 +88,15 @@ public function rules(): array */ public function withValidator( Validator $validator ): void { - $validator->after( function( Validator $validator ) { + /** @var User $us */ + $us = Auth::user(); + $validator->after( function( Validator $validator ) use ($us) { if( !$this->user_id ) { AlertContainer::push( "You must select one user from the list." , Alert::DANGER ); return false; } - $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; + $this->cust = $us->isSuperUser() ? Customer::find( $this->customer_id ) : $us->customer; if( CustomerToUser::where( 'customer_id', $this->cust->id )->where( 'user_id', $this->user_id )->get()->isNotEmpty() ) { AlertContainer::push( "This user is already associated with " . $this->cust->name, Alert::DANGER ); diff --git a/app/Http/Requests/User/Delete.php b/app/Http/Requests/User/Delete.php index a76e6772b..4aadcc9ce 100644 --- a/app/Http/Requests/User/Delete.php +++ b/app/Http/Requests/User/Delete.php @@ -82,10 +82,12 @@ public function rules(): array */ public function withValidator( Validator $validator ): bool { - if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { - $validator->after( function( ) { + /** @var User $us */ + $us = Auth::getUser(); + if( !$validator->fails() && !$us->isSuperUser() ) { + $validator->after( function( ) use ($us) { // Check if the custadmin try to delete a user from an other Customer - if( CustomerToUser::where( 'customer_id', Auth::getUser()->custid )->where( 'user_id', $this->u->id )->doesntExist() ) { + if( CustomerToUser::where( 'customer_id', $us->custid )->where( 'user_id', $this->u->id )->doesntExist() ) { Log::notice( Auth::user()->username . " tried to delete other customer user " . $this->u->username ); abort( 401, 'You are not authorised to delete this user. The administrators have been notified.' ); } diff --git a/app/Http/Requests/User/Store.php b/app/Http/Requests/User/Store.php index db68c5fae..648769973 100644 --- a/app/Http/Requests/User/Store.php +++ b/app/Http/Requests/User/Store.php @@ -83,10 +83,12 @@ public function rules(): array */ public function withValidator( Validator $validator ): bool { + /** @var User $us */ + $us = Auth::getUser(); if( !$validator->fails() ) { - $validator->after( function( Validator $validator ) { - $isSuperUser = Auth::getUser()->isSuperUser(); - $cust = $isSuperUser ? Customer::find( $this->custid ) : Auth::user()->customer; + $validator->after( function( Validator $validator ) use( $us ) { + $isSuperUser = $us->isSuperUser(); + $cust = $isSuperUser ? Customer::find( $this->custid ) : $us->customer; if( (int)$this->privs === User::AUTH_SUPERUSER ) { if( !$isSuperUser || ( $isSuperUser && !$cust->typeInternal() ) ) { diff --git a/app/Http/Requests/User/Update.php b/app/Http/Requests/User/Update.php index 4e2266819..b6c6e9e4b 100644 --- a/app/Http/Requests/User/Update.php +++ b/app/Http/Requests/User/Update.php @@ -66,10 +66,12 @@ public function authorize(): bool */ public function rules(): array { - $addUserInfo = []; + /** @var User $us */ + $us = Auth::user(); + $addUserInfo = []; // If its a superuser - if( Auth::user()->isSuperUser() ) { + if( $us->isSuperUser() ) { $infoArray = [ 'name' => 'required|string|max:255', 'username' => 'required|string|min:3|max:255|regex:/^[a-z0-9\-_\.]{3,255}$/|unique:user,username,' . $this->u->id, @@ -100,10 +102,12 @@ public function rules(): array */ public function withValidator( Validator $validator ): bool { - $isSuperUser = Auth::user()->isSuperUser(); + /** @var User $us */ + $us = Auth::user(); + $isSuperUser = $us->isSuperUser(); if( !$validator->fails() && !$isSuperUser ) { - $validator->after( function( Validator $validator ) use ( $isSuperUser ) { - $cust = $isSuperUser ? Customer::find( $this->custid ) : Auth::user()->customer; + $validator->after( function( Validator $validator ) use ( $us, $isSuperUser ) { + $cust = $isSuperUser ? Customer::find( $this->custid ) : $us->customer; if( (int)$this->privs === User::AUTH_SUPERUSER ) { if( !$isSuperUser || ( $isSuperUser && !$cust->typeInternal() ) ) { diff --git a/app/Listeners/Auth/LoginSuccessful.php b/app/Listeners/Auth/LoginSuccessful.php index 158339851..de1093845 100644 --- a/app/Listeners/Auth/LoginSuccessful.php +++ b/app/Listeners/Auth/LoginSuccessful.php @@ -26,6 +26,7 @@ use Illuminate\Auth\Events\Login as LoginEvent; +use IXP\Models\User; use IXP\Models\UserLoginHistory; /** @@ -47,9 +48,12 @@ class LoginSuccessful */ public function handle( LoginEvent $e ): void { - Log::notice( 'Login successful for user "' . $e->user->username. '" from IP ' . ixp_get_client_ip() . '.' ); + /** @var User $user */ + $user = $e->user; - if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { + Log::notice( 'Login successful for user "' . $user->username. '" from IP ' . ixp_get_client_ip() . '.' ); + + if( !session()->exists( "switched_user_from" ) && ( $c2u = $user->currentCustomerToUser() ) ) { $c2u->update( [ 'last_login_date' => now(), 'last_login_from' => ixp_get_client_ip(), diff --git a/app/Models/Aggregators/SwitcherAggregator.php b/app/Models/Aggregators/SwitcherAggregator.php index d92b3e604..689aa43ab 100644 --- a/app/Models/Aggregators/SwitcherAggregator.php +++ b/app/Models/Aggregators/SwitcherAggregator.php @@ -116,6 +116,7 @@ class SwitcherAggregator extends Switcher */ public static function getByLocationInfrastructureSpeed( int $infra = null, int $location = null, int $speed = null ): Collection { + /** @psalm-suppress InvalidArgument - psalm can not recognise eloquent grouped conditions */ return self::select( 'switch.*' ) ->when( $location , function( Builder $q, $location ) { return $q->leftJoin( 'cabinet AS c', 'c.id', 'switch.cabinetid' ) @@ -131,7 +132,7 @@ public static function getByLocationInfrastructureSpeed( int $infra = null, int ->leftjoin( 'vlaninterface AS vli', 'vli.virtualinterfaceid','vi.id' ) ->leftjoin( 'ipv4address AS ipv4', 'ipv4.id', '=', 'vli.ipv4addressid' ) ->leftjoin( 'ipv6address AS ipv6', 'ipv4.id', '=', 'vli.ipv6addressid' ) - ->where( function($query ) use ($speed) { + ->where( function( $query ) use ( $speed ) { $query->where( 'pi.speed', $speed ) ->orWhere( 'pi.rate_limit', $speed ); }); @@ -158,6 +159,7 @@ public static function getConfiguration( int $switchid = null, int $infraid = nu // BUGLET: see https://github.com/inex/IXP-Manager/issues/757 // "Switch configuration port list erroneously lists non-rate limited port as rate limited" + /** @psalm-suppress InvalidArgument - psalm can not recognise eloquent grouped conditions */ return self::selectRaw( 's.name AS switchname, s.id AS switchid, @@ -294,6 +296,7 @@ public static function linkAddr( string $net, string $side, bool $maskneeded = t */ public static function coreBundleNeighbors( Switcher $switch ): array { + /** @psalm-suppress InvalidArgument - psalm can not recognise eloquent grouped conditions */ return self::query()->selectRaw( 'cb.type, cb.ipv4_subnet as cbSubnet, cb.cost, cb.preference, cl.ipv4_subnet as clSubnet, sA.id as sAid, sB.id as sBid, sA.name as sAname , sB.name as sBname, sA.asn as sAasn , diff --git a/app/Models/Contact.php b/app/Models/Contact.php index 56b7e73e4..d6a01beb0 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -131,7 +131,7 @@ public function contactGroups(): BelongsToMany { return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) - ->orderBy( 'name' ); + ->orderBy( 'name' )->withTimestamps(); } /** diff --git a/app/Models/CoreBundle.php b/app/Models/CoreBundle.php index 80cc54ea9..cad0783b0 100644 --- a/app/Models/CoreBundle.php +++ b/app/Models/CoreBundle.php @@ -195,12 +195,12 @@ public function scopeActive( Builder $query ): Builder * * @return Switcher|bool */ - public function switchSideX( bool $sideA = true ) + public function switchSideX( bool $sideA = true ): Switcher|bool { $cl = $this->corelinks->first() ?? false; if( $cl ){ - /** @var CoreInterface $side */ + /** @var Switcher $side */ $side = $sideA ? $cl->coreInterfaceSideA : $cl->coreInterfaceSideB; return $side->physicalinterface->switchPort->switcher; } diff --git a/app/Models/DocstoreCustomerDirectory.php b/app/Models/DocstoreCustomerDirectory.php index 0dcd2da30..653a42dde 100644 --- a/app/Models/DocstoreCustomerDirectory.php +++ b/app/Models/DocstoreCustomerDirectory.php @@ -119,12 +119,15 @@ protected static function boot(): void parent::boot(); static::addGlobalScope('privs', function ( Builder $builder ) { + /** @var User $us */ + $us = Auth::getUser(); + if( !Auth::check() ) { // if public user make sure that no records is returned $builder->where('id', null ); - } elseif( !Auth::getUser()->isSuperUser() ) { + } elseif( !$us->isSuperUser() ) { // if not super user make sure only records from the same customer are returned - $builder->where('cust_id', Auth::getUser()->custid ); + $builder->where('cust_id', $us->custid ); } }); } diff --git a/app/Models/DocstoreCustomerFile.php b/app/Models/DocstoreCustomerFile.php index bd3239653..8ea1a19ba 100644 --- a/app/Models/DocstoreCustomerFile.php +++ b/app/Models/DocstoreCustomerFile.php @@ -129,12 +129,15 @@ protected static function boot(): void parent::boot(); static::addGlobalScope('privs', function ( Builder $builder ) { + /** @var User $us */ + $us = Auth::getUser(); + if( !Auth::check() ) { // if public user make sure that no records is returned $builder->where('id', null ); - } elseif( !Auth::getUser()->isSuperUser() ) { + } elseif( !$us->isSuperUser() ) { // If not super user make sure only allowed files are returned - $builder->where('min_privs', '<=', Auth::getUser()->privs() ); + $builder->where('min_privs', '<=', $us->privs() ); } }); } diff --git a/app/Models/PatchPanelPort.php b/app/Models/PatchPanelPort.php index cc439228d..907ec0240 100644 --- a/app/Models/PatchPanelPort.php +++ b/app/Models/PatchPanelPort.php @@ -341,6 +341,7 @@ public function patchPanelPortHistories(): HasMany /** * Get the public patch panel port files for this patch panel port + * @psalm-suppress all */ public function patchPanelPortFilesPublic(): HasMany { diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php index bbc742380..a2284e5cc 100644 --- a/app/Providers/HorizonServiceProvider.php +++ b/app/Providers/HorizonServiceProvider.php @@ -26,6 +26,7 @@ use Auth; use Illuminate\Support\Facades\Gate; +use IXP\Models\User; use Laravel\Horizon\HorizonApplicationServiceProvider; /** @@ -66,7 +67,9 @@ public function boot(): void protected function gate(): void { Gate::define('viewHorizon', function ( $user ) { - return Auth::check() && Auth::getUser()->isSuperUser(); + /** @var User $us */ + $us = Auth::getUser(); + return Auth::check() && $us->isSuperUser(); }); } } \ No newline at end of file diff --git a/app/Providers/IxpServiceProvider.php b/app/Providers/IxpServiceProvider.php index 8a526f106..9385bf60c 100644 --- a/app/Providers/IxpServiceProvider.php +++ b/app/Providers/IxpServiceProvider.php @@ -27,6 +27,7 @@ use Illuminate\Support\ServiceProvider; use IXP\Models\Customer; +use IXP\Models\User; /** * IXP Service Provider @@ -56,7 +57,10 @@ public function register(): void { $this->app->resolving('view', function( $view ) { View::composer('*', function($view) { - if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( ( Auth::check() && $us->isSuperUser() ) || config( 'IXP_PHPUNIT_RUNNING', false ) ) { // get an array of customer id => names if( !( $customers = Cache::get( 'admin_home_customers' ) ) ) { $customers = Customer::select( [ 'id', 'name' ] )->current()->orderBy( 'name' )->get()->keyBy( 'id' )->toArray(); diff --git a/app/Providers/ParsedownServiceProvider.php b/app/Providers/ParsedownServiceProvider.php index ba3aed8cc..759f7e7a5 100644 --- a/app/Providers/ParsedownServiceProvider.php +++ b/app/Providers/ParsedownServiceProvider.php @@ -35,6 +35,7 @@ public function boot(): void /** * @return BladeCompiler + * @psalm-suppress all */ protected function compiler(): BladeCompiler { diff --git a/app/Providers/TelescopeServiceProvider.php b/app/Providers/TelescopeServiceProvider.php index 244d21e63..4d3b6d001 100644 --- a/app/Providers/TelescopeServiceProvider.php +++ b/app/Providers/TelescopeServiceProvider.php @@ -52,6 +52,7 @@ public function register(): void $this->hideSensitiveRequestDetails(); Telescope::filter( function ( IncomingEntry $entry ) { + /** @psalm-suppress UndefinedInterfaceMethod - Telescope package provides the isLocal method */ if ($this->app->isLocal()) { return true; } @@ -70,6 +71,7 @@ public function register(): void */ protected function hideSensitiveRequestDetails(): void { + /** @psalm-suppress UndefinedInterfaceMethod - Telescope package provides the isLocal method */ if( $this->app->isLocal() ) { return; } diff --git a/app/Services/Auth/SessionGuard.php b/app/Services/Auth/SessionGuard.php index a967f9784..c5be3c4dc 100644 --- a/app/Services/Auth/SessionGuard.php +++ b/app/Services/Auth/SessionGuard.php @@ -148,6 +148,7 @@ public function user() * @param AuthenticatableContract $user * * @return void + * @psalm-suppress UndefinedInterfaceMethod */ protected function ensureRememberTokenIsSet( AuthenticatableContract $user ): void { diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index 0573dda99..acaff488a 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -223,14 +223,12 @@ public function getAll(): array /** * Write the contents to the env file - * Without a $destFile it will modify the original file, but it creates a backup with the timestamp and a .bak extension * * @param bool $force By default, we only write when something has changed, but you can force to write the file - * @param string|null $destFile Destination file. By default it's the same as $sourceFile is provided * - * @return array Array of old and new file. + * @return void */ - public function write( bool $force = false, ?string $destFile = null ): void + public function write( bool $force = false ): void { if( $this->hasChanged() || $force ) { diff --git a/app/Services/Grapher/Graph/CoreBundle.php b/app/Services/Grapher/Graph/CoreBundle.php index c0c29fcf6..91d107d70 100644 --- a/app/Services/Grapher/Graph/CoreBundle.php +++ b/app/Services/Grapher/Graph/CoreBundle.php @@ -161,7 +161,10 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } @@ -174,7 +177,7 @@ public function authorise(): bool return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && $us->privs() >= config( 'grapher.access.trunk' ) ) { return $this->allow(); } diff --git a/app/Services/Grapher/Graph/Customer.php b/app/Services/Grapher/Graph/Customer.php index 66fa1fce7..a4d75b320 100644 --- a/app/Services/Grapher/Graph/Customer.php +++ b/app/Services/Grapher/Graph/Customer.php @@ -121,7 +121,10 @@ public function identifier(): string */ public static function authorisedForAllCustomers(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return true; } @@ -129,7 +132,7 @@ public static function authorisedForAllCustomers(): bool return true; } - return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); + return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && $us->privs() >= config( 'grapher.access.customer' ); } /** @@ -143,6 +146,9 @@ public static function authorisedForAllCustomers(): bool */ public function authorise(): bool { + /** @var User $us */ + $us = Auth::getUser(); + // NB: see above authorisedForAllCustomers() if( is_numeric( config( 'grapher.access.customer' ) ) && config( 'grapher.access.customer' ) === User::AUTH_PUBLIC ) { return $this->allow(); @@ -153,23 +159,23 @@ public function authorise(): bool return false; } - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return $this->allow(); } - if( Auth::getUser()->custid === $this->customer()->id ) { + if( $us->custid === $this->customer()->id ) { return $this->allow(); } if( config( 'grapher.access.customer' ) !== 'own_graphs_only' && is_numeric( config( 'grapher.access.customer' ) ) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + && $us->privs() >= config( 'grapher.access.customer' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [Customer]: user %d::%s tried to access a customer aggregate graph " - . "{$this->customer()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->customer()->id} which is not theirs", Auth::id(), $us->username ) ); $this->deny(); @@ -216,9 +222,12 @@ public function getParamsAsArray(): array */ public static function processParameterCustomer( int $i ): CustomerModel { + /** @var User $us */ + $us = Auth::getUser(); + // if we're not an admin, default to the currently logged in customer - if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { - return CustomerModel::find( Auth::getUser()->custid ); + if( !$i && Auth::check() && !$us->isSuperUser() && !$us->customer->typeAssociate() ) { + return CustomerModel::find( $us->custid ); } return CustomerModel::findOrFail( $i ); diff --git a/app/Services/Grapher/Graph/IXP.php b/app/Services/Grapher/Graph/IXP.php index d10308cf0..fe94101e2 100644 --- a/app/Services/Grapher/Graph/IXP.php +++ b/app/Services/Grapher/Graph/IXP.php @@ -89,23 +89,28 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } if( in_array( $this->category(), [ self::CATEGORY_ERRORS, self::CATEGORY_DISCARDS ], true ) ) { $this->deny(); + return false; } if( is_numeric( config( 'grapher.access.ixp' ) ) && (int)config( 'grapher.access.ixp' ) === User::AUTH_PUBLIC ) { return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && $us->privs() >= config( 'grapher.access.ixp' ) ) { return $this->allow(); } $this->deny(); + return false; } /** diff --git a/app/Services/Grapher/Graph/Infrastructure.php b/app/Services/Grapher/Graph/Infrastructure.php index 311109bc9..1676286ab 100644 --- a/app/Services/Grapher/Graph/Infrastructure.php +++ b/app/Services/Grapher/Graph/Infrastructure.php @@ -125,7 +125,10 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } @@ -138,7 +141,7 @@ public function authorise(): bool return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && $us->privs() >= config( 'grapher.access.infrastructure' ) ) { return $this->allow(); } diff --git a/app/Services/Grapher/Graph/Latency.php b/app/Services/Grapher/Graph/Latency.php index b0f013630..29306355b 100644 --- a/app/Services/Grapher/Graph/Latency.php +++ b/app/Services/Grapher/Graph/Latency.php @@ -201,7 +201,10 @@ public function identifier(): string */ public static function authorisedForAllCustomers(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return true; } @@ -209,7 +212,7 @@ public static function authorisedForAllCustomers(): bool return true; } - return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); + return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && $us->privs() >= config( 'grapher.access.latency' ); } /** @@ -223,6 +226,9 @@ public static function authorisedForAllCustomers(): bool */ public function authorise(): bool { + /** @var User $us */ + $us = Auth::getUser(); + // NB: see above authorisedForAllCustomers() if( is_numeric( config( 'grapher.access.latency' ) ) && config( 'grapher.access.latency' ) === User::AUTH_PUBLIC ) { return $this->allow(); @@ -233,23 +239,23 @@ public function authorise(): bool return false; } - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return $this->allow(); } - if( Auth::getUser()->custid === $this->vli()->virtualInterface->customer->id ) { + if( $us->custid === $this->vli()->virtualInterface->customer->id ) { return $this->allow(); } if( config( 'grapher.access.latency' ) !== 'own_graphs_only' && is_numeric( config( 'grapher.access.latency' ) ) - && Auth::getUser()->privs >= config( 'grapher.access.latency' ) + && $us->privs >= config( 'grapher.access.latency' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [Latency]: user %d::%s tried to access a latency graph for vli " - . "{$this->vli()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->vli()->id} which is not theirs", Auth::id(), $us->username ) ); $this->deny(); diff --git a/app/Services/Grapher/Graph/Location.php b/app/Services/Grapher/Graph/Location.php index 906d7feb0..acc3818cc 100644 --- a/app/Services/Grapher/Graph/Location.php +++ b/app/Services/Grapher/Graph/Location.php @@ -123,7 +123,10 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } @@ -131,7 +134,7 @@ public function authorise(): bool return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && $us->privs() >= (int)config( 'grapher.access.location' ) ) { return $this->allow(); } diff --git a/app/Services/Grapher/Graph/P2p.php b/app/Services/Grapher/Graph/P2p.php index 95142b79e..c35f6cede 100644 --- a/app/Services/Grapher/Graph/P2p.php +++ b/app/Services/Grapher/Graph/P2p.php @@ -159,7 +159,10 @@ public function identifier(): string */ public static function authorisedForAllCustomers(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return true; } @@ -167,7 +170,7 @@ public static function authorisedForAllCustomers(): bool return true; } - return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); + return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && $us->privs() >= config( 'grapher.access.p2p' ); } /** @@ -181,6 +184,9 @@ public static function authorisedForAllCustomers(): bool */ public function authorise(): bool { + /** @var User $us */ + $us = Auth::getUser(); + // NB: see above authorisedForAllCustomers() if( is_numeric( config( 'grapher.access.p2p' ) ) && config( 'grapher.access.p2p' ) === User::AUTH_PUBLIC ) { return $this->allow(); @@ -191,23 +197,23 @@ public function authorise(): bool return false; } - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return $this->allow(); } - if( Auth::getUser()->custid === $this->svli()->virtualInterface->customer->id ) { + if( $us->custid === $this->svli()->virtualInterface->customer->id ) { return $this->allow(); } if( config( 'grapher.access.p2p' ) !== 'own_graphs_only' && is_numeric( config( 'grapher.access.p2p' ) ) - && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) + && $us->privs() >= (int)config( 'grapher.access.p2p' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [Customer]: user %d::%s tried to access a customer p2p vli graph " - . "{$this->svli()->id} with dvli {$this->dvli()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->svli()->id} with dvli {$this->dvli()->id} which is not theirs", Auth::id(), $us->username ) ); $this->deny(); diff --git a/app/Services/Grapher/Graph/PhysicalInterface.php b/app/Services/Grapher/Graph/PhysicalInterface.php index 0a81f2be2..65b3a5b14 100644 --- a/app/Services/Grapher/Graph/PhysicalInterface.php +++ b/app/Services/Grapher/Graph/PhysicalInterface.php @@ -135,6 +135,9 @@ public function identifier(): string */ public function authorise(): bool { + /** @var User $us */ + $us = Auth::getUser(); + if( is_numeric( config( 'grapher.access.customer' ) ) && config( 'grapher.access.customer' ) === User::AUTH_PUBLIC ) { return $this->allow(); } @@ -144,23 +147,23 @@ public function authorise(): bool return false; } - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return $this->allow(); } - if( Auth::getUser()->custid === $this->physicalInterface()->virtualInterface->customer->id ) { + if( $us->custid === $this->physicalInterface()->virtualInterface->customer->id ) { return $this->allow(); } if( config( 'grapher.access.customer' ) !== 'own_graphs_only' && is_numeric( config( 'grapher.access.customer' ) ) - && Auth::getUser()->privs >= config( 'grapher.access.customer' ) + && $us->privs >= config( 'grapher.access.customer' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [PhysicalInterface]: user %d::%s tried to access a physical interface graph " - . "{$this->physicalInterface()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->physicalInterface()->id} which is not theirs", Auth::id(), $us->username ) ); $this->deny(); diff --git a/app/Services/Grapher/Graph/Switcher.php b/app/Services/Grapher/Graph/Switcher.php index 28c30b88f..b7b96174a 100644 --- a/app/Services/Grapher/Graph/Switcher.php +++ b/app/Services/Grapher/Graph/Switcher.php @@ -124,7 +124,10 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } @@ -132,7 +135,7 @@ public function authorise(): bool return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && $us->privs() >= (int)config( 'grapher.access.switch' ) ) { return $this->allow(); } diff --git a/app/Services/Grapher/Graph/Trunk.php b/app/Services/Grapher/Graph/Trunk.php index d6dab787d..a3af8d689 100644 --- a/app/Services/Grapher/Graph/Trunk.php +++ b/app/Services/Grapher/Graph/Trunk.php @@ -126,7 +126,10 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } @@ -134,7 +137,7 @@ public function authorise(): bool return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && $us->privs() >= config( 'grapher.access.trunk' ) ) { return $this->allow(); } diff --git a/app/Services/Grapher/Graph/VirtualInterface.php b/app/Services/Grapher/Graph/VirtualInterface.php index 8f06fcff9..479ce7f6b 100644 --- a/app/Services/Grapher/Graph/VirtualInterface.php +++ b/app/Services/Grapher/Graph/VirtualInterface.php @@ -135,6 +135,9 @@ public function identifier(): string */ public function authorise(): bool { + /** @var User $us */ + $us = Auth::getUser(); + if( is_numeric( config( 'grapher.access.customer' ) ) && config( 'grapher.access.customer' ) === User::AUTH_PUBLIC ) { return $this->allow(); } @@ -144,23 +147,23 @@ public function authorise(): bool return false; } - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return $this->allow(); } - if( Auth::getUser()->custid === $this->virtualInterface()->customer->id ) { + if( $us->custid === $this->virtualInterface()->customer->id ) { return $this->allow(); } if( config( 'grapher.access.customer' ) !== 'own_graphs_only' && is_numeric( config( 'grapher.access.customer' ) ) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + && $us->privs() >= config( 'grapher.access.customer' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [VirtualInterface]: user %d::%s tried to access a virtual interface graph " - . "{$this->virtualInterface()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->virtualInterface()->id} which is not theirs", Auth::id(), $us->username ) ); $this->deny(); diff --git a/app/Services/Grapher/Graph/Vlan.php b/app/Services/Grapher/Graph/Vlan.php index 39ec09f16..a56a81253 100644 --- a/app/Services/Grapher/Graph/Vlan.php +++ b/app/Services/Grapher/Graph/Vlan.php @@ -125,7 +125,10 @@ public function identifier(): string */ public function authorise(): bool { - if( Auth::check() && Auth::getUser()->isSuperUser() ) { + /** @var User $us */ + $us = Auth::getUser(); + + if( Auth::check() && $us->isSuperUser() ) { return $this->allow(); } @@ -139,7 +142,7 @@ public function authorise(): bool return $this->allow(); } - if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { + if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && $us->privs() >= config( 'grapher.access.vlan' ) ) { return $this->allow(); } diff --git a/app/Services/Grapher/Graph/VlanInterface.php b/app/Services/Grapher/Graph/VlanInterface.php index a40ae3dd9..30fc993ec 100644 --- a/app/Services/Grapher/Graph/VlanInterface.php +++ b/app/Services/Grapher/Graph/VlanInterface.php @@ -145,6 +145,9 @@ public function identifier(): string */ public function authorise(): bool { + /** @var User $us */ + $us = Auth::getUser(); + if( is_numeric( config( 'grapher.access.customer' ) ) && (int)config( 'grapher.access.customer' ) === User::AUTH_PUBLIC ) { return $this->allow(); } @@ -154,23 +157,23 @@ public function authorise(): bool return false; } - if( Auth::getUser()->isSuperUser() ) { + if( $us->isSuperUser() ) { return $this->allow(); } - if( Auth::getUser()->custid === $this->vlanInterface()->virtualInterface->customer->id ) { + if( $us->custid === $this->vlanInterface()->virtualInterface->customer->id ) { return $this->allow(); } if( config( 'grapher.access.customer' ) !== 'own_graphs_only' && is_numeric( config( 'grapher.access.customer' ) ) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) + && $us->privs() >= config( 'grapher.access.customer' ) ) { return $this->allow(); } Log::notice( sprintf( "[Grapher] [VlanInterface]: user %d::%s tried to access a vlan interface graph " - . "{$this->vlanInterface()->id} which is not theirs", Auth::id(), Auth::getUser()->username ) + . "{$this->vlanInterface()->id} which is not theirs", Auth::id(), $us->username ) ); $this->deny(); diff --git a/app/Support/helpers.php b/app/Support/helpers.php index 9c08360ab..60c963aa6 100644 --- a/app/Support/helpers.php +++ b/app/Support/helpers.php @@ -81,7 +81,10 @@ function resolve_dns_aaaa( string $hostname ): ?string function ixp_min_auth( int $minAuth ): bool { if( Auth::check() ) { - return Auth::getUser()->privs() >= $minAuth; + /** @var IXP\Models\User $us */ + $us = Auth::getUser(); + + return $us->privs() >= $minAuth; } return $minAuth === 0; } diff --git a/app/Traits/Observable.php b/app/Traits/Observable.php index d67c0b354..11eb67df2 100644 --- a/app/Traits/Observable.php +++ b/app/Traits/Observable.php @@ -145,6 +145,7 @@ public static function logImplodeAssoc(array $attrs): string * @param User|null $user limit the log entries to the actions of this user * * @return Builder + * @psalm-suppress UndefinedThisPropertyFetch */ public function getLogEntries( ?User $user = null ): Builder { diff --git a/app/Utils/Export/JsonSchema.php b/app/Utils/Export/JsonSchema.php index 5efcad272..4bdc7a807 100644 --- a/app/Utils/Export/JsonSchema.php +++ b/app/Utils/Export/JsonSchema.php @@ -89,6 +89,7 @@ public function get( string $version = null, $asArray = false, $detailed = true, $version = $this->sanitiseVersion( $version ); } + /** @psalm-suppress UndefinedConstant */ $output = [ 'version' => $version, 'generator' => 'IXP Manager v' . APPLICATION_VERSION, diff --git a/app/Utils/Former/Framework/TwitterBootstrap4.php b/app/Utils/Former/Framework/TwitterBootstrap4.php index 6357770b5..3c01c9b38 100644 --- a/app/Utils/Former/Framework/TwitterBootstrap4.php +++ b/app/Utils/Former/Framework/TwitterBootstrap4.php @@ -55,6 +55,7 @@ public function __construct( Application $app ) * @param $field * * @return Element A wrapped field + * @psalm-suppress UndefinedDocblockClass - Former Container type confusing psalm */ public function wrapField( $field ): Element { @@ -69,9 +70,9 @@ public function wrapField( $field ): Element /** * Add label classes * - * @return array An array of attributes with the label class + * @psalm-suppress UndefinedDocblockClass - Former Container type confusing psalm */ - public function getLabelClasses(): array + public function getLabelClasses() { $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; @@ -121,6 +122,7 @@ public function placeAround( $item ): Element * Add group classes * * @return string A list of group classes + * @psalm-suppress UndefinedDocblockClass - Former Container type confusing psalm */ public function getGroupClasses(): string { @@ -140,6 +142,7 @@ public function getGroupClasses(): string * Add actions block class * * @return string|null + * @psalm-suppress UndefinedDocblockClass - Former Container type confusing psalm */ public function getActionClasses(): ?string { @@ -166,6 +169,7 @@ public function getActionClasses(): ?string * @param $actions * * @return string A wrapped actions block + * @psalm-suppress UndefinedDocblockClass - Former Container type confusing psalm */ public function wrapActions( $actions ): string { diff --git a/app/Utils/MailingList.php b/app/Utils/MailingList.php index 381282f86..c9a62eb6c 100644 --- a/app/Utils/MailingList.php +++ b/app/Utils/MailingList.php @@ -89,6 +89,7 @@ public function getSubscriberEmails( bool $subscribed = true ): array foreach( $users as $user ) { $email = strtolower( $user->email ); if( !$filtered_users->contains( $email ) && filter_var( $email, FILTER_VALIDATE_EMAIL ) !== false ) { + /** @psalm-suppress InvalidArgument - it is not invalid */ $filtered_users->add( $email ); } } diff --git a/psalm_errors_ACTUAL.log b/psalm_errors_ACTUAL.log deleted file mode 100644 index 65d36c5a5..000000000 --- a/psalm_errors_ACTUAL.log +++ /dev/null @@ -1,1121 +0,0 @@ - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 -Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) - $addresses->add( $address ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 -Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) - echo ( new RouterConfigurationGenerator( $router ) )->render(); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime(true) - LARAVEL_START ) - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 -Cannot find referenced variable $password (see https://psalm.dev/024) - $user->password = Hash::make( $password ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 -Cannot find referenced variable $name (see https://psalm.dev/024) - $user->name = $name; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 -Cannot find referenced variable $mobile (see https://psalm.dev/024) - $user->authorisedMobile = $mobile; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 -Cannot find referenced variable $username (see https://psalm.dev/024) - $user->username = strtolower( $username ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 -Cannot find referenced variable $email (see https://psalm.dev/024) - $user->email = strtolower( $email ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $user->privs = $priv; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 -Cannot find referenced variable $custid (see https://psalm.dev/024) - $user->custid = $custid; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $c2u->privs = $priv; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$u->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $u->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $addresses->add( strtolower( trim( $a ) ) ); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit( $array, YAML_UTF8_ENCODING ); - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:446:55 -Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) - $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:447:55 -Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) - $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'version' => APPLICATION_VERSION, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 -Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) - 'verdate' => APPLICATION_VERDATE, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime( true ) - LARAVEL_START ) - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - $array['ixpmanager_version'] = APPLICATION_VERSION; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:148:39 -Cannot fetch property on non-object $switchA of type true (see https://psalm.dev/029) - $switchAName = $switchA ? $switchA->name : 'none'; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:150:39 -Cannot fetch property on non-object $switchB of type true (see https://psalm.dev/029) - $switchBName = $switchB ? $switchB->name : 'none'; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( $privs = Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:489:85 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - Auth::getUser()->save(); - -ERROR: EmptyArrayAccess -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 -Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) - && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:152:44 -Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) - if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:155:45 -Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) - $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:145:40 -Cannot fetch property on non-object $customer of type true (see https://psalm.dev/029) - $customerId = !$customer ? 0 : $customer->id; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:41 -Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) - $switchSideAId = $switchSideA ? $switchSideA->id : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:164:41 -Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) - $switchSideBId = $switchSideB ? $switchSideB->id : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['switch-port-b'] = $piB->switchportid; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['duplex-b'] = $piB->duplex; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['notes-b'] = $piB->notes ?? ''; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:232:38 -Argument 1 of IXP\Http\Controllers\RipeAtlas\RunController::doStore has wrong name $request, expecting $r as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::doStore (see https://psalm.dev/230) - public function doStore( Request $request ): bool|RedirectResponse - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $request->category = Graph::processParameterCategory( $request->category, true ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $request->period = Graph::processParameterPeriod( $request->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $request->protocol = Graph::processParameterRealProtocol( $request->protocol ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isCustUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 -Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) - $user->refresh(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:262:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:302:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:356:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:395:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:404:27 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isCustUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:477:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:496:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::getUser()->privs() !== $privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:64:55 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:67:26 -Cannot fetch property on non-object $__fake_var_2057 of type string (see https://psalm.dev/029) - if( $user_priv < $controller::$minimum_privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $request->period = Graph::processParameterPeriod( $request->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $request->category = Graph::processParameterCategory( $request->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $request->protocol = Graph::processParameterProtocol( $request->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 -Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) - $request->type = Graph::processParameterType( $request->type ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 -Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) - $request->id = 1; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 -Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) - $request->infrastructure = $infra->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 -Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) - $request->vlan = $vlan->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 -Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) - $request->trunkname = $trunkname; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 -Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) - $request->corebundle = $corebundle->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 -Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) - $request->side = $side; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 -Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) - $request->location = $location->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 -Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) - $request->switch = $switch->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 -Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) - $request->physint = $physint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 -Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) - $request->virtint = $virtint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 -Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) - $request->customer = $customer->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 -Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) - $request->vlanint = $vlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 -Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) - $request->vli = $vli; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 -Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) - $request->srcvlanint = $srcvlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 -Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) - $request->dstvlanint = $dstvlanint->id; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:54:26 -$this->headers with declared type 'array' cannot be assigned type '30' (see https://psalm.dev/145) - protected $headers = Request::HEADER_X_FORWARDED_FOR | - Request::HEADER_X_FORWARDED_HOST | - Request::HEADER_X_FORWARDED_PORT | - Request::HEADER_X_FORWARDED_PROTO | - Request::HEADER_X_FORWARDED_AWS_ELB; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $privs = Auth::getUser()->privs(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 -Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) - if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - }); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - return $q->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - } ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function ($query) use( $switch ) { - $query->where( 'sA.id', $switch->id ) - ->orWhere( 'sB.id', $switch->id ); - }) - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 -The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) - public function contactGroups(): BelongsToMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 -The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) - return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) - ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) - ->orderBy( 'name' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $builder->where('min_privs', '<=', Auth::getUser()->privs() ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 -The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) - public function patchPanelPortFilesPublic(): HasMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 -The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) - return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) - ->where( 'is_private', 0 ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::check() && Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 -Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) - ->getCompiler(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if ($this->app->isLocal()) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if( $this->app->isLocal() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 -Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) - $this->userRememberToken = $this->provider->addRememberToken($user); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 -Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) - $this->provider->purgeExpiredRememberTokens( $user ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:220:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:88:16 -Not all code paths of IXP\Services\Grapher\Graph\IXP::authorise end in a return statement, return type bool expected (see https://psalm.dev/011) - * @return bool - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:104:95 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::getUser()->privs() >= $minAuth; - -ERROR: UndefinedThisPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 -Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) - return Log::entries( self::getClass(), $this->id, $user ); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'generator' => 'IXP Manager v' . APPLICATION_VERSION, - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: LessSpecificImplementedReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 -The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) - * @return array An array of attributes with the label class - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $filtered_users->add( $email ); - ------------------------------- -218 errors found ------------------------------- -3488 other issues found. -You can display them with --show-info=true ------------------------------- -Psalm can automatically fix 68 of these issues. -Run Psalm again with ---alter --issues=MissingReturnType,InvalidReturnType,MissingClosureReturnType,MismatchingDocblockParamType,MismatchingDocblockReturnType,LessSpecificReturnType,MissingParamType --dry-run -to see what it can fix. ------------------------------- - -Checks took 17.84 seconds and used 1,554.291MB of memory -Psalm was able to infer types for 80.5999% of the codebase diff --git a/psalm_errors_FULL.log b/psalm_errors_FULL.log deleted file mode 100644 index 5046c9470..000000000 --- a/psalm_errors_FULL.log +++ /dev/null @@ -1,2563 +0,0 @@ - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Command.php:158:40 -Cannot create offset of type array-key|null, expecting array-key (see https://psalm.dev/115) - $validator = \Validator::make( [key( $rules ) => $value], $rules ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Grapher/EmailPortUtilisation.php:119:109 -Argument 2 of IXP\Mail\Grapher\PortUtilisation::__construct expects float, but array|bool|null|string provided (see https://psalm.dev/004) - Mail::to( explode( ',', $this->argument( 'email' ) ) )->send( new PortUtilisationMail( $excess, $this->option('threshold') ) ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:60:16 -The declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) - * @return array|Builder|Customer - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:68:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return Customer::currentActive( true )->get(); - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:73:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return $c; - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Irrdb/UpdateDb.php:82:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'IXP\Models\Customer|Illuminate\Database\Eloquent\Builder|array' for IXP\Console\Commands\Irrdb\UpdateDb::resolveCustomers (see https://psalm.dev/128) - return $c; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 -Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) - $addresses->add( $address ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/PeeringDB/AsnLookup.php:53:42 -Argument 1 of IXP\Services\PeeringDb::getNetworkByAsn expects int, but array|bool|null|string provided (see https://psalm.dev/004) - if( $net = $pdb->getNetworkByAsn($this->argument('asn')) ) { - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CompleteRequests.php:85:17 -Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) - if( CompleteRequestsJob::dispatchNow( $ar ) && $this->isVerbosityVerbose() ) { - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/CreateMeasurements.php:77:13 -Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - CreateMeasurementsJob::dispatchNow( $ar ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/RunMeasurements.php:91:13 -Method IXP\Jobs\RipeAtlas\RunMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - RunMeasurementsJob::dispatchNow( $am ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/StopAllMeasurements.php:87:17 -Method IXP\Jobs\RipeAtlas\StopAllMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - StopAllMeasurementsJob::dispatchNow( $am->id ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateMeasurements.php:79:13 -Method IXP\Jobs\RipeAtlas\UpdateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - UpdateMeasurementsJob::dispatchNow( $am ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:78:13 -Method IXP\Jobs\RipeAtlas\UpdateProbes::dispatchnow does not exist (see https://psalm.dev/022) - UpdateProbesJob::dispatchNow( $c ); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:95:16 -The declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers is incorrect, got 'Illuminate\Database\Eloquent\Collection|list{non-empty-mixed}' (see https://psalm.dev/011) - * @return array Customer - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:103:20 -The inferred type 'Illuminate\Database\Eloquent\Collection' does not match the declared return type 'array' for IXP\Console\Commands\RipeAtlas\UpdateProbes::resolveCustomers (see https://psalm.dev/128) - return Customer::CurrentActive( true, false, false )->get(); - -ERROR: ParadoxicalCondition -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/RipeAtlas/UpdateProbes.php:112:13 -Condition (($c) && ($cust is numeric)) contradicts a previously-established condition ((!$c) || ($cust is not numeric)) (see https://psalm.dev/089) - if( is_numeric( $cust ) && ( $c = Customer::find( $cust ) ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Rir/GenerateObject.php:87:58 -Isset only works with variables and array elements (see https://psalm.dev/004) - ->from( $this->checkEmail( 'from', ( $this->option( "from" ) ?? config( 'ixp_api.rir.email.from' ) ) ?? config( 'mail.from.address' ) ) ) - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:74:9 -Method IXP\Jobs\FetchFilteredPrefixesForCustomer::dispatchnow does not exist (see https://psalm.dev/022) - FetchFilteredPrefixesForCustomer::dispatchNow( $customer ); - -ERROR: ParadoxicalCondition -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/FilteredPrefixes.php:119:13 -Condition (($c) && ($custarg is numeric)) contradicts a previously-established condition ((!$c) || ($custarg is not numeric)) (see https://psalm.dev/089) - if( is_numeric( $custarg ) && ( $c = Customer::find( $custarg ) ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 -Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) - echo ( new RouterConfigurationGenerator( $router ) )->render(); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime(true) - LARAVEL_START ) - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 -Cannot find referenced variable $password (see https://psalm.dev/024) - $user->password = Hash::make( $password ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 -Cannot find referenced variable $name (see https://psalm.dev/024) - $user->name = $name; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 -Cannot find referenced variable $mobile (see https://psalm.dev/024) - $user->authorisedMobile = $mobile; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 -Cannot find referenced variable $username (see https://psalm.dev/024) - $user->username = strtolower( $username ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 -Cannot find referenced variable $email (see https://psalm.dev/024) - $user->email = strtolower( $email ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $user->privs = $priv; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 -Cannot find referenced variable $custid (see https://psalm.dev/024) - $user->custid = $custid; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $c2u->privs = $priv; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Utils/SmtpMailTest.php:130:26 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - $this->line( $mail->logger()->dump() ); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Events/Auth/ForgotUsername.php:60:28 -$this->users with declared type 'array' cannot be assigned type 'Illuminate\Database\Eloquent\Collection' (see https://psalm.dev/145) - $this->users = $users; - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Exceptions/Handler.php:87:48 -Argument 2 of IXP\Exceptions\Handler::render has wrong name $exception, expecting $e as defined by Illuminate\Contracts\Debug\ExceptionHandler::render (see https://psalm.dev/230) - public function render($request, Throwable $exception) - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Exceptions/Handler.php:87:48 -Argument 2 of IXP\Exceptions\Handler::render has wrong name $exception, expecting $e as defined by Illuminate\Foundation\Exceptions\Handler::render (see https://psalm.dev/230) - public function render($request, Throwable $exception) - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/AdminController.php:85:41 -Argument 2 of Illuminate\Http\Request::query expects array|null|string, but 0 provided (see https://psalm.dev/004) - if( $r->query( 'refresh_cache', 0 ) || !( $cTypes = Cache::get( 'admin_ctypes' ) ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/AdminController.php:267:41 -Argument 2 of Illuminate\Http\Request::query expects array|null|string, but 0 provided (see https://psalm.dev/004) - if( $r->query( 'refresh_cache', 0 ) || !( $graphs = Cache::get( 'admin_stats_'.$period ) ) ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:77:33 -$cn->private with declared type 'int' cannot be assigned type 'bool' (see https://psalm.dev/145) - $cn->private = $r->public ? false : true; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:109:26 -$cn->private with declared type 'int' cannot be assigned type 'bool' (see https://psalm.dev/145) - $cn->private = $r->public ? false : true; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$u->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $u->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $addresses->add( strtolower( trim( $a ) ) ); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit( $array, YAML_UTF8_ENCODING ); - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:443:40 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $entry['switchsidea'] = $cb->switchSideX( true )->name; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:444:40 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $entry['switchsideb'] = $cb->switchSideX( false )->name; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:454:59 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - $prettybandwidth = round( $speed ) . $formats[ $i ]; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'version' => APPLICATION_VERSION, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 -Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) - 'verdate' => APPLICATION_VERDATE, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime( true ) - LARAVEL_START ) - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:83:16 -Not all code paths of IXP\Http\Controllers\Api\V4\RouterController::getCanUpdate end in a return statement, return type Illuminate\Http\JsonResponse expected (see https://psalm.dev/011) - * @return JsonResponse - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - $array['ixpmanager_version'] = APPLICATION_VERSION; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:152:31 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $msgs[] = $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " OK - {$linksup}/${linksenabled} links up"; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:152:72 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $msgs[] = $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " OK - {$linksup}/${linksenabled} links up"; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:155:43 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $msgs[] = 'ISSUE: ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " has {$linksup}/${linksenabled} links up"; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:155:84 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $msgs[] = 'ISSUE: ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . " has {$linksup}/${linksenabled} links up"; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:158:41 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $msgs[] = 'Ignoring ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . ' as core bundle disabled'; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:158:82 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $msgs[] = 'Ignoring ' . $cb->switchSideX( true )->name . ' - ' . $cb->switchSideX( false )->name . ' as core bundle disabled'; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( $privs = Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:234:79 -Argument 1 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, null|string value expected (see https://psalm.dev/004) - $activeGroups = ContactGroupAggregator::getGroupNamesTypeArray( false, false , true); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:234:86 -Argument 2 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, int|null value expected (see https://psalm.dev/004) - $activeGroups = ContactGroupAggregator::getGroupNamesTypeArray( false, false , true); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:388:80 -Argument 1 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, null|string value expected (see https://psalm.dev/004) - $contactGroup = ContactGroupAggregator::getGroupNamesTypeArray( false, $this->object->id ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:392:113 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - $contactGroupDetail[ $gname . '_' . $g[ 'id' ] ] = request()->old( $gname . '_' . $g[ 'id' ] , isset( $contactGroup[ $gname ][ $g[ 'id' ] ] ) ? 1 : 0 ) ; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ){ - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:576:80 -Argument 1 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, null|string value expected (see https://psalm.dev/004) - 'allGroups' => ContactGroupAggregator::getGroupNamesTypeArray( false, false, true ) - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:576:87 -Argument 2 of IXP\Models\Aggregators\ContactGroupAggregator::getGroupNamesTypeArray cannot be false, int|null value expected (see https://psalm.dev/004) - 'allGroups' => ContactGroupAggregator::getGroupNamesTypeArray( false, false, true ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:103:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[$key] ) as $ip ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: InvalidMethodCall -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:219:109 -Cannot call method on non-falsy-string variable $cust->datejoin (see https://psalm.dev/091) - 'datejoin' => $r->old( 'datejoin', !$cust->datejoin ?: $cust->datejoin->format( "Y-m-d" ) ) , - -ERROR: InvalidMethodCall -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:220:111 -Cannot call method on non-falsy-string variable $cust->dateleave (see https://psalm.dev/091) - 'dateleave' => $r->old( 'dateleave', !$cust->dateleave ?: $cust->dateleave->format( "Y-m-d" ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:224:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'autsys' => $r->old( 'autsys', $cust->autsys ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:225:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'maxprefixes' => $r->old( 'maxprefixes', $cust->maxprefixes ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:230:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'irrdb' => $r->old( 'irrdb', $cust->irrdb ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:231:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'activepeeringmatrix' => $r->old( 'activepeeringmatrix', $cust->activepeeringmatrix ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:237:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'isReseller' => $r->old( 'isReseller', $cust->isReseller ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:238:74 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'isResold' => $r->old( 'isResold', ( $this->resellerMode() && $cust->reseller ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:239:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but false|int provided (see https://psalm.dev/004) - 'reseller' => $r->old( 'reseller', ( $this->resellerMode() && $cust->reseller ) ? $cust->reseller : false ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:240:72 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'peeringdb_oauth' => $r->old( 'peeringdb_oauth', $cust->peeringdb_oauth ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:488:85 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - Auth::getUser()->save(); - -ERROR: EmptyArrayAccess -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 -Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) - && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:123:48 -Cannot find referenced variable $rsRoutes (see https://psalm.dev/024) - 'rsRoutes' => $rsRoutes ?? null, - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:87:50 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 3 provided (see https://psalm.dev/004) - 'min_privs' => $r->old( 'min_privs', User::AUTH_SUPERUSER ) - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:119:61 -Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) - 'sha256' => hash_file( 'sha256', $file ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:147:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'min_privs' => $r->old( 'min_privs', $file->min_privs ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:183:65 -Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) - 'sha256' => hash_file( 'sha256', $uploadedFile ), - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:255:18 -Class, interface or enum named League\Flysystem\Exception does not exist (see https://psalm.dev/019) - } catch( FlySystemException $e ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:324:121 -Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) - 'sha256' => 'nullable|max:64' . ( $r->file( 'uploadedFile' ) ? '|in:' . hash_file( 'sha256', $r->file( 'uploadedFile' ) ) : '' ) , - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:110:18 -Class, interface or enum named League\Flysystem\Exception does not exist (see https://psalm.dev/019) - } catch( FlySystemException $e ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:154:50 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 3 provided (see https://psalm.dev/004) - 'min_privs' => $r->old( 'min_privs', User::AUTH_SUPERUSER ) - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:182:39 -Argument 1 of Illuminate\Http\UploadedFile::store expects string, but int provided (see https://psalm.dev/004) - $path = $uploadedFile->store( $cust->id, 'docstore_customers' ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:190:73 -Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) - 'sha256' => hash_file( 'sha256', $uploadedFile ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:221:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'min_privs' => $r->old( 'min_privs', $file->min_privs ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:259:65 -Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) - 'sha256' => hash_file( 'sha256', $uploadedFile ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:325:96 -Argument 2 of hash_file expects string, but Illuminate\Http\UploadedFile|array|null provided (see https://psalm.dev/004) - if( $value && $r->file('uploadedFile' ) && $value !== hash_file( 'sha256', $r->file( 'uploadedFile' ) ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:150:40 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - if( $pi->relatedInterface() && $pi->relatedInterface()->id !== $fnpi->id ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:153:45 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - $fnpi->virtualinterfaceid = $pi->relatedInterface()->virtualinterfaceid; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:384:44 -Cannot find referenced variable $cia (see https://psalm.dev/024) - $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:385:44 -Cannot find referenced variable $cib (see https://psalm.dev/024) - $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'custid' => $r->old('custid', $cb->customer()->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:146:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'custid' => $r->old('custid', $cb->customer()->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:149:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'cost' => $r->old('cost', $cb->cost ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:150:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'preference' => $r->old('preference', $cb->preference ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:151:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'type' => $r->old('type', $cb->type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:153:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'enabled' => $r->old('enabled', $cb->enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:154:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'bfd' => $r->old('bfd', $cb->bfd ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:155:67 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'stp' => $r->old('stp', $cb->stp ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:161:78 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'switchPortsSideA' => SwitcherAggregator::allPorts( $cb->switchSideX( true )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/CoreBundleController.php:162:78 -Cannot fetch property on non-object of type bool (see https://psalm.dev/029) - 'switchPortsSideB' => SwitcherAggregator::allPorts( $cb->switchSideX( false )->id ,[ SwitchPort::TYPE_CORE, SwitchPort::TYPE_UNSET ], notAssignToPI: true ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:204:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'switchportid' => $r->old( 'switchportid', $pi->switchportid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:208:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'rate_limit' => $r->old( 'rate_limit', $pi->rate_limit ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:209:58 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'autoneg' => $r->old( 'autoneg', $pi->autoneg ), - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:215:25 -Cannot create offset of type int|null, expecting array-key (see https://psalm.dev/115) - [ $pi->switchportid => - [ "name" => $pi->switchPort->name, - "id" => $pi->switchportid, - "type" => $pi->switchPort->type, - "porttype" => $pi->switchPort->type ] - ]; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['switch-port-b'] = $piB->switchportid; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['duplex-b'] = $piB->duplex; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['notes-b'] = $piB->notes ?? ''; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/SflowReceiverController.php:112:56 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'dst_port' => $r->old( 'dst_port', $sflr->dst_port ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:144:46 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'custid' => $r->old( 'cust', $cust->id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:199:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'custid' => $r->old( 'custid', $vi->custid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:200:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool|null provided (see https://psalm.dev/004) - 'trunk' => $r->old( 'trunk', $vi->trunk ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:201:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'lag_framing' => $r->old( 'lag_framing', $vi->lag_framing ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:202:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'fastlacp' => $r->old( 'fastlacp', $vi->fastlacp ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:204:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'channelgroup' => $r->old( 'channel-group', $vi->channelgroup ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VirtualInterfaceController.php:205:70 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mtu' => $r->old( 'mtu', $vi->mtu ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:155:73 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'vlanid' => $r->old( 'vlanid', $duplicateTo->id ?? $vli->vlanid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:156:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'irrdbfilter' => $r->old( 'irrdbfilter', $vli->irrdbfilter ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:157:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mcastenabled' => $r->old( 'mcastenabled', $vli->mcastenabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:159:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4enabled' => $r->old( 'ipv4enabled', $vli->ipv4enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:160:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4address' => $r->old( 'ipv4address', $vli->ipv4addressid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:163:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4canping' => $r->old( 'ipv4canping', $vli->ipv4canping ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:164:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', $vli->ipv4monitorrcbgp ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:166:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vli->maxbgpprefix ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:167:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'rsclient' => $r->old( 'rsclient', $vli->rsclient ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:168:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'rsmorespecifics' => $r->old( 'rsmorespecifics', $vli->rsmorespecifics ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:169:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'as112client' => $r->old( 'as112client', $vli->as112client ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:170:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'busyhost' => $r->old( 'busyhost', $vli->busyhost ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:172:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6enabled' => $r->old( 'ipv6enabled', $vli->ipv6enabled ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:173:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6address' => $r->old( 'ipv6address', $vli->ipv6addressid ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:176:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6canping' => $r->old( 'ipv6canping', $vli->ipv6canping ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/VlanInterfaceController.php:177:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', $vli->ipv6monitorrcbgp ), - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:135:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'cabinet_id' => $r->old( 'cabinet_id', $pp->cabinet_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:138:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'cable_type' => $r->old( 'cable_type', $pp->cable_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:139:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'connector_type' => $r->old( 'connector_type', $pp->connector_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:143:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'u_position' => $r->old( 'u_position', $pp->u_position ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:144:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'colo_pp_type' => $r->old( 'colo_pp_type', $pp->colo_pp_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:145:76 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'mounted_at' => $r->old( 'mounted_at', $pp->mounted_at ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/PatchPanelController.php:146:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0 provided (see https://psalm.dev/004) - 'numberOfPorts' => $r->old( 'numberOfPorts',0 ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:187:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'switch_port_id' => $r->old( 'switch_port_id', $ppp->switch_port_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:189:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'customer_id' => $r->old( 'customer_id', $ppp->customer_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:190:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'state' => $r->old( 'state', $ppp->state ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:202:80 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'owned_by' => $r->old( 'owned_by', $ppp->owned_by ), - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:263:27 -$pm->peered with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $pm->peered = !$pm->peered; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:268:29 -$pm->rejected with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $pm->rejected = !$pm->rejected; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/MeasurementController.php:194:35 -Argument 1 of IXP\Http\Controllers\RipeAtlas\MeasurementController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/ProbesController.php:152:35 -Argument 1 of IXP\Http\Controllers\RipeAtlas\ProbesController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ): View - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:185:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 1 provided (see https://psalm.dev/004) - 'scheduled_at' => request()->old( 'scheduled_at', AtlasRun::SCHEDULED_AT_NOW ), - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:247:9 -Method IXP\Jobs\RipeAtlas\CreateMeasurements::dispatchnow does not exist (see https://psalm.dev/022) - CreateMeasurementsJob::dispatchNow( $this->object, $r->selected_custs ); - -ERROR: UndefinedMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RipeAtlas/RunController.php:272:19 -Method IXP\Jobs\RipeAtlas\CompleteRequests::dispatchnow does not exist (see https://psalm.dev/022) - } elseif( CompleteRequestsJob::dispatchNow( $atlasrun ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:144:75 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'vlan_id' => request()->old( 'vlan_id', $router->vlan_id ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:151:75 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'asn' => request()->old( 'asn', $router->asn ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:157:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'api_type' => request()->old( 'api_type', $router->api_type ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:159:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'lg_access' => request()->old( 'lg_access', $router->lg_access ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:160:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'quarantine' => request()->old( 'quarantine', $router->quarantine ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:161:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'bgp_lc' => request()->old( 'bgp_lc', $router->bgp_lc ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:162:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'rpki' => request()->old( 'rpki', $router->rpki ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:163:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int provided (see https://psalm.dev/004) - 'rfc1997_passthru' => request()->old( 'rfc1997_passthru', $router->rfc1997_passthru ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:164:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'skip_md5' => request()->old( 'skip_md5', $router->skip_md5 ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:165:81 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - 'pair_id' => request()->old( 'pair_id', $router->pair_id ), - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RouterController.php:236:34 -$router->pause_updates with declared type 'int' cannot be assigned type 'true' (see https://psalm.dev/145) - $router->pause_updates = true; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:55 -Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:175:65 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:240:47 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - $vlanid = $r->old( 'vlan_id', $rsf->vlan_id ?? null ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:242:47 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but int|null provided (see https://psalm.dev/004) - $peerid = $r->old( 'peer_id', $rsf->peer_id ?? null ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:134 -Argument 1 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/RsFilterController.php:259:144 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getByVlanAndProtocol expects int|null, but array|null|string provided (see https://psalm.dev/004) - 'peers' => array_merge( [ '0' => [ 'id' => '0', 'name' => "All Peers" ] ], CustomerAggregator::getByVlanAndProtocol( $vlanid , $protocol ) ), - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:64:26 -$this->grapher with declared type 'IXP\Services\Grapher' cannot be assigned type 'Grapher' (see https://psalm.dev/145) - $this->grapher = $grapher; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:70:16 -The declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher is incorrect, got 'IXP\Services\Grapher' (see https://psalm.dev/011) - * @return GrapherService - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/Grapher/Api.php:74:16 -The inferred type 'IXP\Services\Grapher' does not match the declared return type 'Grapher' for IXP\Http\Controllers\Services\Grapher\Api::grapher (see https://psalm.dev/128) - return $this->grapher; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Services/LookingGlass.php:353:54 -Method IXP\Contracts\LookingGlass::exportRoute does not exist (see https://psalm.dev/181) - 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:91:9 -Instance property IXP\Http\Requests\StatisticsRequest::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:92:9 -Instance property IXP\Http\Requests\StatisticsRequest::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:93:9 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:94:9 -Instance property IXP\Http\Requests\StatisticsRequest::$type is not defined (see https://psalm.dev/038) - $r->type = Graph::processParameterType( $r->type ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:336:13 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::PROTOCOL_ALL; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:339:17 -Instance property IXP\Http\Requests\StatisticsRequest::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::PROTOCOL_IPV4; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:341:65 -Argument 2 of IXP\Models\Aggregators\VlanInterfaceAggregator::forVlan expects bool, but 'ipv4'|'ipv6' provided (see https://psalm.dev/004) - $targets = VlanInterfaceAggregator::forVlan( $vlan, $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category, true ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:218:35 -Argument 1 of IXP\Http\Controllers\Switches\SwitchController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:367:67 -Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) - 'addBySnmp' => request()->old( 'add_by_snnp', false ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:418:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - 'active' => request()->old( 'active', ( $this->object->active ? 1 : 0 ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:419:79 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but 0|1 provided (see https://psalm.dev/004) - 'poll' => request()->old( 'poll', ( $this->object->poll ? 1 : 0 ) ), - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:429:67 -Argument 2 of Illuminate\Http\Request::old cannot be false, Illuminate\Database\Eloquent\Model|array|null|string value expected (see https://psalm.dev/004) - 'addBySnmp' => request()->old( 'add_by_snnp', false ), - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:696:13 -Cannot fetch property on non-object $switch of type false (see https://psalm.dev/029) - $switch->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:697:13 -Cannot fetch property on non-object $infra of type false (see https://psalm.dev/029) - $infra->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:698:13 -Cannot fetch property on non-object $location of type false (see https://psalm.dev/029) - $location->id ?? null, - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:700:13 -Cannot fetch property on non-object $vlan of type false (see https://psalm.dev/029) - $vlan->id ?? null, - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchPortController.php:179:35 -Argument 1 of IXP\Http\Controllers\Switches\SwitchPortController::list has wrong name $r, expecting $param as defined by IXP\Utils\Http\Controllers\Frontend\EloquentController::list (see https://psalm.dev/230) - public function list( Request $r ) : View - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isCustUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 -Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) - $user->refresh(); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:242:17 -The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) - * @return RedirectResponse - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:258:35 -$user->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $user->disabled = !$r->disabled; // input as enable in the view - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:284:16 -The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::store (see https://psalm.dev/128) - return redirect( $this->postStoreRedirect() ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:312:69 -Argument 2 of Illuminate\Http\Request::old expects Illuminate\Database\Eloquent\Model|array|null|string, but bool provided (see https://psalm.dev/004) - 'disabled' => $r->old( 'disabled', !$u->disabled ), - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:346:17 -The declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update is incorrect, got 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' (see https://psalm.dev/011) - * @return RedirectResponse - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:363:31 -$u->disabled with declared type 'int|null' cannot be assigned type 'bool' (see https://psalm.dev/145) - $u->disabled = !$r->disabled;// displayed as enabled in the view - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:386:16 -The inferred type 'Illuminate\Http\RedirectResponse|Illuminate\Routing\Redirector' does not match the declared return type 'Illuminate\Http\RedirectResponse' for IXP\Http\Controllers\User\UserController::update (see https://psalm.dev/128) - return redirect( $this->postStoreRedirect() ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:403:27 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isCustUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:476:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:495:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::getUser()->privs() !== $privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:63:55 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 -Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) - if( $user_priv < $controller::$minimum_privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 -Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) - $r->type = Graph::processParameterType( $r->type ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 -Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) - $r->id = 1; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 -Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) - $r->infrastructure = $infra->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 -Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) - $r->vlan = $vlan->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 -Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) - $r->trunkname = $trunkname; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 -Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) - $r->corebundle = $corebundle->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 -Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) - $r->side = $side; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 -Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) - $r->location = $location->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 -Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) - $r->switch = $switch->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 -Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) - $r->physint = $physint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 -Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) - $r->virtint = $virtint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 -Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) - $r->customer = $customer->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 -Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) - $r->vlanint = $vlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 -Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) - $r->vli = $vli; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 -Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) - $r->srcvlanint = $srcvlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 -Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) - $r->dstvlanint = $dstvlanint->id; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/TrustProxies.php:40:28 -Class, interface or enum named Fideloper\Proxy\TrustProxies does not exist (see https://psalm.dev/019) -class TrustProxies extends Middleware - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $privs = Auth::getUser()->privs(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/ForgotUsername.php:57:66 -Argument 1 of IXP\Mail\Auth\ForgotUsername::__construct expects Illuminate\Database\Eloquent\Collection, but array provided (see https://psalm.dev/004) - Mail::to( $e->email )->send( new ForgotPasswordMailable( $e->users ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Listeners/Auth/LoginSuccessful.php:52:78 -Method Illuminate\Contracts\Auth\Authenticatable::currentCustomerToUser does not exist (see https://psalm.dev/181) - if( !session()->exists( "switched_user_from" ) && ( $c2u = $e->user->currentCustomerToUser() ) ) { - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Grapher/PortsWithCounts.php:62:27 -$this->category with declared type 'float' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->category = $category; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/User/UserCreated.php:82:24 -$this->token with declared type 'bool' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->token = app('auth.password.broker')->createToken( $this->user ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:42:13 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - * @var SwiftMail SMTP dialog logging - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:44:5 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - /** - * @var SwiftMail SMTP dialog logging - */ - private $logger = null; - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:68:33 -Class, interface or enum named Swift_Plugins_Loggers_ArrayLogger does not exist (see https://psalm.dev/019) - $this->logger = new \Swift_Plugins_Loggers_ArrayLogger; - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:69:57 -Class, interface or enum named Swift_Plugins_LoggerPlugin does not exist (see https://psalm.dev/019) - Mail::getSwiftMailer()->registerPlugin( new \Swift_Plugins_LoggerPlugin($this->logger)); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Mail/Utils/SmtpTest.php:77:16 -Docblock-defined class, interface or enum named IXP\Mail\Utils\SwiftMail does not exist (see https://psalm.dev/200) - * @return SwiftMail|null - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:90:23 -Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) - throw new IXP_Exception( 'Invalid protocol' ); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/BgpSessionDataAggregator.php:94:23 -Class, interface or enum named IXP_Exception does not exist (see https://psalm.dev/019) - throw new IXP_Exception( 'Invalid VLAN' ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - }); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - return $q->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - } ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function ($query) use( $switch ) { - $query->where( 'sA.id', $switch->id ) - ->orWhere( 'sB.id', $switch->id ); - }) - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 -The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) - public function contactGroups(): BelongsToMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 -The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) - return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) - ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) - ->orderBy( 'name' ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Customer.php:840:13 -Argument 2 of str_replace expects array|string, but list{null|string, null|string, null|string, ''|int, string, string, string} provided (see https://psalm.dev/004) - [ - $this->name, - $this->abbreviatedName, - $this->shortname, - $as ?: '', - $as ? "[AS{$as}]" : '', - $as ? "AS{$as}" : '', - $as ? " - AS{$as}" : '' - ], - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: NullArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:244:21 -Cannot access value on variable IXP\Models\DocstoreCustomerDirectory::$dirs[null] using null offset (see https://psalm.dev/124) - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $builder->where('min_privs', '<=', Auth::getUser()->privs() ); - -ERROR: NullArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreDirectory.php:210:21 -Cannot access value on variable IXP\Models\DocstoreDirectory::$dirs[null] using null offset (see https://psalm.dev/124) - self::$dirs[null] = [ 'id' => null, 'name' => 'Root Directory' ]; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 -The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) - public function patchPanelPortFilesPublic(): HasMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 -The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) - return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) - ->where( 'is_private', 0 ); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Switcher.php:323:35 -$this->mauSupported with declared type 'int|null' cannot be assigned type 'true' (see https://psalm.dev/145) - $this->mauSupported = true; - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/VirtualInterface.php:240:20 -The declared return type 'IXP\Models\SwitchPort|bool' for IXP\Models\VirtualInterface::switchPort is not nullable, but the function returns 'mixed|null' (see https://psalm.dev/139) - return $this->physicalInterfaces()->first()->switchPort; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:82:16 -No return statements were found for method IXP\Policies\CustomerPolicy::create but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:95:16 -No return statements were found for method IXP\Policies\CustomerPolicy::update but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:107:16 -No return statements were found for method IXP\Policies\CustomerPolicy::delete but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:119:16 -No return statements were found for method IXP\Policies\CustomerPolicy::restore but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/CustomerPolicy.php:132:16 -No return statements were found for method IXP\Policies\CustomerPolicy::forceDelete but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Policies/DocstoreLogPolicy.php:58:16 -No return statements were found for method IXP\Policies\DocstoreLogPolicy::viewAny but return type 'mixed' was expected (see https://psalm.dev/011) - * @return mixed - -ERROR: MissingFile -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/BroadcastServiceProvider.php:48:9 -Cannot find file /Users/laszlo/dev/ibn-ixp-manager/routes/channels.php to include (see https://psalm.dev/107) - require base_path('routes/channels.php'); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HelpdeskServiceProvider.php:93:33 -Class, interface or enum named IXP\Providers\arrau does not exist (see https://psalm.dev/019) - public function provides(): arrau - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::check() && Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 -Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) - ->getCompiler(); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/PurifierServiceProvider.php:40:35 -Class, interface or enum named IXP\Providers\LaravelApplication does not exist (see https://psalm.dev/019) - if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if ($this->app->isLocal()) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if( $this->app->isLocal() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 -Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) - $this->userRememberToken = $this->provider->addRememberToken($user); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 -Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) - $this->provider->purgeExpiredRememberTokens( $user ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:31:14 -Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) - /** @var PlatesEngine */ - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:36:25 -$this->engine with declared type 'IXP\Services\PlatesEngine' cannot be assigned type 'Foil\Engine' (see https://psalm.dev/145) - $this->engine = $engine; - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:39:31 -The declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine is incorrect, got 'IXP\Services\PlatesEngine' (see https://psalm.dev/011) - public function engine(): EngineFoil - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:41:16 -The inferred type 'IXP\Services\PlatesEngine' does not match the declared return type 'Foil\Engine' for IXP\Services\FoilEngine::engine (see https://psalm.dev/128) - return $this->engine; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/FoilEngine.php:54:16 -Docblock-defined class, interface or enum named IXP\Services\PlatesEngine does not exist (see https://psalm.dev/200) - return $this->engine->render( $path, $data ); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher.php:90:30 -$this->cacheLifetime with declared type 'bool' cannot be assigned type '300' (see https://psalm.dev/145) - private $cacheLifetime = 300; - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Mrtg.php:474:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Mrtg::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:206:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::png does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Backend/Sflow.php:228:20 -The declared return type 'string' for IXP\Services\Grapher\Backend\Sflow::rrd does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; // FIXME check handling of this - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:919:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:926:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterPeriod is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:937:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:944:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:954:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:961:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterRealProtocol is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:973:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string The verified / sanitised / default value - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph.php:980:16 -The declared return type 'string' for IXP\Services\Grapher\Graph::processParameterCategory is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $v; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Customer::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->customer()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:52:16 -The declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray is incorrect, got 'IXP\Services\Grapher\Graph\IXP&static' (see https://psalm.dev/011) - * @return Grapher Fluid interface - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:57:16 -The inferred type 'IXP\Services\Grapher\Graph\IXP&static' does not match the declared return type 'IXP\Services\Grapher' for IXP\Services\Grapher\Graph\IXP::setParamsFromArray (see https://psalm.dev/128) - return $this; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Infrastructure::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->infrastructure()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:96:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:100:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Location::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->location()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:97:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:101:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Switcher::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->switch()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:98:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:102:16 -The declared return type 'string' for IXP\Services\Grapher\Graph\Vlan::name is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return $this->vlan()->name; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:131:68 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return number_format( $v, $decs ) . " " . $formats[$i]; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Renderer/Extensions/Grapher.php:135:28 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return $formats[$i]; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:221:26 -$this->totalIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->totalIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:234:27 -$this->totalOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->totalOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:247:24 -$this->curIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->curIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:260:25 -$this->curOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->curOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:273:28 -$this->averageIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->averageIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:286:29 -$this->averageOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->averageOut = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:299:24 -$this->maxIn with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->maxIn = $v; - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Statistics.php:327:25 -$this->maxOut with declared type 'int' cannot be assigned type 'float' (see https://psalm.dev/145) - $this->maxOut = $v; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:50:13 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - * @var Zendesk\API\Client - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:74:25 -$this->client with declared type 'IXP\Services\Helpdesk\Zendesk\API\Client' cannot be assigned type 'Zendesk\API\HttpClient' (see https://psalm.dev/145) - $this->client = new ZendeskAPI( $config['subdomain'], $config['email'] ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:91:28 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - $this->debug = $this->client->getDebug(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:96:54 -Argument 1 of json_decode expects string, but array provided (see https://psalm.dev/004) - $apie->setErrorDetails( json_decode( $e->getErrorDetails() ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:117:38 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - $this->callApi( function() { $this->client->tickets()->findAll(); } ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:264:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->create( $this->customerEntityToZendeskObject( $cust ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:24 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:290:109 -Argument 2 of IXP\Services\Helpdesk\Zendesk::customerEntityToZendeskObject expects bool, but int provided (see https://psalm.dev/004) - return $this->client->organizations()->update( $this->customerEntityToZendeskObject( $cust, $helpdeskId ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:319:24 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->organizations()->search( $id ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:441:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->create( $this->contactEntityToZendeskObject( $contact, $org_id ) ); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:467:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->update( $helpdeskId, $this->contactEntityToZendeskObject( $contact, null, $helpdeskId ) ); - -ERROR: FalsableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:475:16 -The declared return type 'IXP\Models\Contact' for IXP\Services\Helpdesk\Zendesk::userUpdate does not allow false, but the function returns 'false' (see https://psalm.dev/137) - return false; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Helpdesk/Zendesk.php:498:20 -Docblock-defined class, interface or enum named IXP\Services\Helpdesk\Zendesk\API\Client does not exist (see https://psalm.dev/200) - return $this->client->users()->search( [ 'external_id' => $id ] ); - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/IXF.php:95:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass.php:67:118 -Cannot find referenced variable $r (see https://psalm.dev/024) - throw new ConfigurationException( 'Invalid, no or unimplemented looking glass backend requested: ' . $r->apiType() ); - -ERROR: InvalidClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/LookingGlass/BirdsEye.php:72:49 -Class, interface or enum IXP\Services\LookingGlass\Birdseye has wrong casing (see https://psalm.dev/007) - public function setCacheEnabled( bool $b ): Birdseye - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:133:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: InvalidThrow -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/PeeringDb.php:185:13 -Cannot throw null as it does not extend Exception or implement Throwable (see https://psalm.dev/133) - throw $this->exception; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:86:59 -Argument 2 of IXP\Services\Purifier::addCustomDefinition expects IXP\Services\HTML_Purifier_Config|null, but HTMLPurifier_Config provided (see https://psalm.dev/004) - $this->addCustomDefinition($definitionConfig, $config); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:92:53 -Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomElements($elements, $def); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:99:57 -Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomAttributes($attributes, $def); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:112:15 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - * @param HTML_Purifier_Config $configObject Defaults to using default config - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:114:16 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - * @return HTML_Purifier_Config $configObject - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:124:9 -Docblock-defined class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/200) - $configObject->set('HTML.DefinitionID', $definitionConfig['id']); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:125:9 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - $configObject->set('HTML.DefinitionRev', $definitionConfig['rev']); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:129:13 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - $configObject->set('Cache.DefinitionImpl', null); - -ERROR: UndefinedClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:133:20 -Class, interface or enum named IXP\Services\HTML_Purifier_Config does not exist (see https://psalm.dev/019) - if ($def = $configObject->maybeGetRawHTMLDefinition()) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:136:77 -Argument 2 of IXP\Services\Purifier::addCustomAttributes expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomAttributes($definitionConfig['attributes'], $def); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:141:73 -Argument 2 of IXP\Services\Purifier::addCustomElements expects IXP\Services\HTMLPurifier_HTMLDefinition, but HTMLPurifier_HTMLDefinition provided (see https://psalm.dev/004) - $this->addCustomElements($definitionConfig['elements'], $def); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:152:15 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @param HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:154:16 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:165:13 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addAttribute($onElement, $attrName, $validValues); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:175:15 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @param HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:177:16 -No return statements were found for method IXP\Services\Purifier::addCustomElements but return type 'IXP\Services\HTMLPurifier_HTMLDefinition' was expected (see https://psalm.dev/011) - * @return HTMLPurifier_HTMLDefinition $definition - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:190:17 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection, $attributes); - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Purifier.php:192:17 -Docblock-defined class, interface or enum named IXP\Services\HTMLPurifier_HTMLDefinition does not exist (see https://psalm.dev/200) - $definition->addElement($name, $contentSet, $allowedChildren, $attributeCollection); - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:145:16 -The declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough is incorrect, got 'int<0, max>' (see https://psalm.dev/011) - * @return bool - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/RipeAtlas/Interpretor.php:158:16 -The inferred type 'int<0, max>' does not match the declared return type 'bool' for IXP\Services\RipeAtlas\Interpretor::queryPassesThrough (see https://psalm.dev/128) - return count( $path[ 'ixpx' ] ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::getUser()->privs() >= $minAuth; - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:97:16 -The declared return type 'string' for ixp_get_client_ip is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:104:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:116:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:126:20 -The declared return type 'string' for ixp_get_client_ip is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return request()->getClientIp(); - -ERROR: ParamNameMismatch -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdateAsnDb.php:95:40 -Argument 1 of IXP\Tasks\Irrdb\UpdateAsnDb::validate has wrong name $asns, expecting $prefixes as defined by IXP\Tasks\Irrdb\UpdateDb::validate (see https://psalm.dev/230) - protected function validate( array $asns, int $protocol ) : array - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 -Argument 1 of IXP\Rules\IPv4Cidr::passes expects string, but array provided (see https://psalm.dev/004) - if( !$validator->passes( [], $p ) ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Tasks/Irrdb/UpdatePrefixDb.php:109:38 -Argument 1 of IXP\Rules\IPv6Cidr::passes expects string, but array provided (see https://psalm.dev/004) - if( !$validator->passes( [], $p ) ) { - -ERROR: UndefinedThisPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 -Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) - return Log::entries( self::getClass(), $this->id, $user ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Bgpq3.php:105:83 -Argument 2 of IXP\Utils\Bgpq3::execute cannot be false, int value expected (see https://psalm.dev/004) - $json = $this->execute( '-3j -l pl -f 999 ' . escapeshellarg( $asmacro ), false ); - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'generator' => 'IXP Manager v' . APPLICATION_VERSION, - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:105:27 -Argument 1 of round expects float|int, but array|null|string provided (see https://psalm.dev/004) - return round( $size ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:170:63 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return number_format( $v, $decs ) . ' ' . $formats[ $i ]; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Foil/Extensions/IXP.php:177:24 -Cannot access value on variable $formats using a int<0, max> offset, expecting int<0, 4> (see https://psalm.dev/115) - return $formats[ $i ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: LessSpecificImplementedReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 -The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) - * @return array An array of attributes with the label class - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:179:66 -Argument 1 of HtmlObject\Element::addClass expects string, but list{string, string, ''|mixed} provided (see https://psalm.dev/004) - return Element::create('div', $actions )->addClass( [ $this->fieldOffset, $this->fieldWidth , $class ]); - -ERROR: InvalidNullableReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:75:16 -The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but 'null|string' contains null (see https://psalm.dev/144) - * @return string - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:81:39 -Argument 2 of explode expects string, but non-empty-list|scalar provided (see https://psalm.dev/004) - foreach( explode(',', $_SERVER[ $key ] ) as $ip ) { - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/IpAddress.php:89:16 -The declared return type 'string' for IXP\Utils\IpAddress::getIp is not nullable, but the function returns 'null|string' (see https://psalm.dev/139) - return request()->getClientIp(); - -ERROR: InvalidPropertyAssignmentValue -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:65:22 -$this->key with declared type 'array' cannot be assigned type 'string' (see https://psalm.dev/145) - $this->key = $listname; - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:84:69 -Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) - return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "1" ] ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:86:69 -Cannot create offset of type array, expecting array-key (see https://psalm.dev/115) - return $query->whereJsonContains( 'prefs->mailinglist', [ $this->key => "0" ] ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $filtered_users->add( $e ); - -ERROR: InvalidArrayOffset -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:143:13 -Cannot access value on variable $prefs['mailinglist'][$this->key] using a array offset, expecting array-key (see https://psalm.dev/115) - $prefs[ 'mailinglist' ][ $this->key ] = $value; - -ERROR: NullableReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/View/Alert/Container.php:66:20 -The declared return type 'IXP\Utils\View\Alert\Alert' for IXP\Utils\View\Alert\Container::pop is not nullable, but the function returns 'null' (see https://psalm.dev/139) - return null; - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_03_30_124916_create_atlas_probes.php:28:38 -Argument 2 of Illuminate\Database\Schema\Blueprint::string expects int|null, but '255' provided (see https://psalm.dev/004) - $table->string('status', '255' )->nullable(); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/database/migrations/2021_09_17_144421_modernise_irrdb_conf_table.php:30:28 -Argument 1 of Illuminate\Database\Schema\Blueprint::string expects string, but 255 provided (see https://psalm.dev/004) - $table->string(255)->nullable()->after('host'); - ------------------------------- -504 errors found ------------------------------- -3438 other issues found. -You can display them with --show-info=true ------------------------------- -Psalm can automatically fix 88 of these issues. -Run Psalm again with ---alter --issues=InvalidReturnType,MissingReturnType,InvalidNullableReturnType,MismatchingDocblockParamType,InvalidFalsableReturnType,MissingClosureReturnType,MismatchingDocblockReturnType,LessSpecificReturnType,MissingParamType --dry-run -to see what it can fix. ------------------------------- - -Checks took 16.67 seconds and used 1,550.551MB of memory -Psalm was able to infer types for 80.5983% of the codebase diff --git a/psalm_errors_WORK.log b/psalm_errors_WORK.log deleted file mode 100644 index d91dfbe75..000000000 --- a/psalm_errors_WORK.log +++ /dev/null @@ -1,1201 +0,0 @@ -# package wrong variable type declarations - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/MailingList/Init.php:87:34 -Argument 1 of Illuminate\Support\Collection::add expects never, but non-empty-lowercase-string provided (see https://psalm.dev/004) - $addresses->add( $address ); - - -# I am not sure what is the goal here, but the echo doesn't work like this - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:73:14 -Argument 1 of echo expects string, but Illuminate\Contracts\View\View provided (see https://psalm.dev/004) - echo ( new RouterConfigurationGenerator( $router ) )->render(); - - -# superglobal defined elsewhere - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/Router/GenerateConfiguration.php:77:35 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime(true) - LARAVEL_START ) - - -# false positive - check line #128 - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:145:47 -Cannot find referenced variable $password (see https://psalm.dev/024) - $user->password = Hash::make( $password ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:146:35 -Cannot find referenced variable $name (see https://psalm.dev/024) - $user->name = $name; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:147:35 -Cannot find referenced variable $mobile (see https://psalm.dev/024) - $user->authorisedMobile = $mobile; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:148:47 -Cannot find referenced variable $username (see https://psalm.dev/024) - $user->username = strtolower( $username ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:149:47 -Cannot find referenced variable $email (see https://psalm.dev/024) - $user->email = strtolower( $email ); - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:151:35 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $user->privs = $priv; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:152:35 -Cannot find referenced variable $custid (see https://psalm.dev/024) - $user->custid = $custid; - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Console/Commands/User/Create.php:159:31 -Cannot find referenced variable $priv (see https://psalm.dev/024) - $c2u->privs = $priv; - - - - -# false alarm for existing interface methods - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:85:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:116:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:135:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:175:18 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$u->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:183:13 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $u->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Customer/Note/CustomerNotesController.php:245:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:74:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Layer2AddressController.php:131:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - - - -# not invalid, weirdly declared... - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/MailingListController.php:146:30 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $addresses->add( strtolower( trim( $a ) ) ); - - -# declared in php.jar - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:73:46 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit( $array, YAML_UTF8_ENCODING ); - - -# don't see the issues in those - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:446:55 -Cannot fetch property on non-object $switchSideA of type true (see https://psalm.dev/029) - $entry['switchsidea'] = $switchSideA ? $switchSideA->name : null; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/Provisioner/YamlController.php:447:55 -Cannot fetch property on non-object $switchSideB of type true (see https://psalm.dev/029) - $entry['switchsideb'] = $switchSideB ? $switchSideB->name : null; - - - -# declared in version.php - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:72:27 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'version' => APPLICATION_VERSION, - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/PublicController.php:73:27 -Const APPLICATION_VERDATE is not defined (see https://psalm.dev/020) - 'verdate' => APPLICATION_VERDATE, - - -# declared in public/index.php - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/RouterController.php:71:37 -Const LARAVEL_START is not defined (see https://psalm.dev/020) - microtime( true ) - LARAVEL_START ) - - -# declarations exists - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:143:43 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - $array['ixpmanager_version'] = APPLICATION_VERSION; - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SflowReceiverController.php:147:47 -Const YAML_UTF8_ENCODING is not defined (see https://psalm.dev/020) - $output = yaml_emit ( $array, YAML_UTF8_ENCODING ); - - -# no issues here - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:148:39 -Cannot fetch property on non-object $switchA of type true (see https://psalm.dev/029) - $switchAName = $switchA ? $switchA->name : 'none'; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Api/V4/SwitchController.php:150:39 -Cannot fetch property on non-object $switchB of type true (see https://psalm.dev/029) - $switchBName = $switchB ? $switchB->name : 'none'; - - - -# false alarm for existing interface methods - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ApiKeyController.php:120:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Auth/SwitchUserController.php:67:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:101:43 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( $privs = Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:191:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -\ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:276:102 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== (int)$this->data[ 'item' ][ 'custid' ] && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:340:36 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $custid = Auth::getUser()->isSuperUser() ? $r->custid : Auth::getUser()->custid; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:373:90 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->custid !== $this->object->customer->id && !Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:424:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:461:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:489:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Contact/ContactController.php:538:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:66:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ContentController.php:106:51 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || Auth::getUser()->privs() < $priv ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Controller.php:124:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - - -# I don't see issue here - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerController.php:488:85 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - 'peers' => CustomerAggregator::getPeeringManagerArrayByType( $cust, Vlan::peeringManager()->orderBy( 'number' )->get(), [ 4,6 ] ) ?: false - - - - -# false alarm for existing interface methods - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:70:26 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - Auth::getUser()->save(); - - -# I don't see any issue here - -ERROR: EmptyArrayAccess -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/CustomerNotesController.php:96:58 -Cannot access value on empty array variable $lastRead (see https://psalm.dev/100) - && ( !isset( $lastRead[ $c['cid'] ] ) || $lastRead[ $c[ 'cid' ] ] < $c['latest'] ) ) { - - - -# false alarm for existing interface methods - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:148:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( "customer@overview" , [ 'cust' => $c->id ] ) : route( "dashboard@index" ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:176:43 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return redirect( Auth::getUser()->isSuperUser() ? route( 'customer@overview', [ 'cust' => $c->id ] ) : route( 'dashboard@index' ) ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Customer/LogoController.php:188:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DashboardController.php:81:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/DirectoryController.php:76:83 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $dirs = DocstoreDirectory::getHierarchyForUserClass( optional( $user )->privs() ?? 0 )[ $dir->id ?? '' ] ?? []; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Docstore/FileController.php:254:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/DocstoreCustomer/FileController.php:109:50 -Method Illuminate\Contracts\Filesystem\Filesystem::download does not exist (see https://psalm.dev/181) - return Storage::disk( $file->disk )->download( $file->path, $file->name ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/FilteredPrefixesController.php:63:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - - -# don't see issues here - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:152:44 -Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) - if( $relatedInterface !== false && $relatedInterface->id !== $fnpi->id ) { - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:155:45 -Cannot fetch property on non-object $relatedInterface of type true (see https://psalm.dev/029) - $fnpi->virtualinterfaceid = $relatedInterface->virtualinterfaceid; - - -# weirdly declared variables - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:384:44 -Cannot find referenced variable $cia (see https://psalm.dev/024) - $cl->core_interface_sidea_id = $cia->id;/** @var $cia CoreInterface */ - -ERROR: UndefinedVariable -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/Common.php:385:44 -Cannot find referenced variable $cib (see https://psalm.dev/024) - $cl->core_interface_sideb_id = $cib->id;/** @var $cib CoreInterface */ - - -# don't see issues here - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:346:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['switch-port-b'] = $piB->switchportid; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:349:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['duplex-b'] = $piB->duplex; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:350:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['autoneg-label-b'] = $piB->autoneg ? 1 : 0; - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Interfaces/PhysicalInterfaceController.php:351:36 -Cannot fetch property on non-object $piB of type true (see https://psalm.dev/029) - $data['notes-b'] = $piB->notes ?? ''; - - -# false alarm for existing interface methods - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:67:58 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/IrrdbController.php:94:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( $r->reset_cache === "1" && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:109:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Layer2AddressController.php:192:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/LoginHistoryController.php:98:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PatchPanel/Port/PortController.php:375:31 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::getUser()->isSuperUser() ) { - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringManagerController.php:88:74 -Argument 2 of IXP\Models\Aggregators\CustomerAggregator::getPeeringManagerArrayByType expects array, but Illuminate\Database\Eloquent\Collection provided (see https://psalm.dev/004) - $peers = CustomerAggregator::getPeeringManagerArrayByType( $c , $vlans, $protos ) ?? []; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/PeeringMatrixController.php:142:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:175:16 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/ProfileController.php:203:20 -Method Illuminate\Contracts\Auth\Authenticatable::save does not exist (see https://psalm.dev/181) - $user->save(); - -# I don't see issue here - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:544:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category, true ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:545:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:546:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterRealProtocol( $r->protocol ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/StatisticsController.php:725:93 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - "categories" => Auth::check() && Auth::getUser() && Auth::getUser()->isSuperUser() ? Graph::CATEGORY_DESCS : Graph::CATEGORIES_BITS_PKTS_DESCS, - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/Switches/SwitchController.php:175:54 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - switch( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:79:30 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isCustUser() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/CustomerToUserController.php:151:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/User2FAController.php:79:20 -Method Illuminate\Contracts\Auth\Authenticatable::refresh does not exist (see https://psalm.dev/181) - $user->refresh(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:261:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $user->custid = Auth::user()->isSuperUser() ? $r->custid : Auth::user()->custid; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:301:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:355:44 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( $isSuperUser = Auth::user()->isSuperUser() ) || $u->id === Auth::id() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:394:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:403:27 -Method Illuminate\Contracts\Auth\Authenticatable::isCustUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isCustUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:476:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Controllers/User/UserController.php:495:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() && strpos( request()->headers->get('referer', "" ), "customer/overview" ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiAuthenticate.php:106:32 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - }elseif( Auth::user()->customer()->active()->notDeleted()->doesntExist() ){// Check if default customer is disabled - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/ApiMaybeAuthenticate.php:106:44 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::user()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/AssertUserPrivilege.php:54:30 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::getUser()->privs() !== $privilege ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Authenticate.php:97:30 -Method Illuminate\Contracts\Auth\Authenticatable::customer does not exist (see https://psalm.dev/181) - if( Auth::getUser()->customer()->active()->notDeleted()->doesntExist() ){ - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:63:55 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $user_priv = Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC; - -# false positive error - -ERROR: InvalidPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Eloquent2Frontend.php:66:26 -Cannot fetch property on non-object $__fake_var_2005 of type string (see https://psalm.dev/029) - if( $user_priv < $controller::$minimum_privilege ) { - -# Auth::getUser() provide a Model that has the Method -> false positive - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:69:91 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::guest() || config( 'ixp_fe.rs-prefixes.access' ) > Auth::getUser()->privs() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/RsPrefixes.php:79:84 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( (int)config( 'ixp_fe.rs-prefixes.access' ) <= Auth::getUser()->privs() ) { - -# I don't see issue here (Grapher got weird methods) - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:107:9 -Instance property Illuminate\Http\Request::$period is not defined (see https://psalm.dev/038) - $r->period = Graph::processParameterPeriod( $r->period ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:108:9 -Instance property Illuminate\Http\Request::$category is not defined (see https://psalm.dev/038) - $r->category = Graph::processParameterCategory( $r->category ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:109:9 -Instance property Illuminate\Http\Request::$protocol is not defined (see https://psalm.dev/038) - $r->protocol = Graph::processParameterProtocol( $r->protocol ); - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:110:9 -Instance property Illuminate\Http\Request::$type is not defined (see https://psalm.dev/038) - $r->type = Graph::processParameterType( $r->type ); - -# false positive, the properties existence depends on the target - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:114:17 -Instance property Illuminate\Http\Request::$id is not defined (see https://psalm.dev/038) - $r->id = 1; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:120:17 -Instance property Illuminate\Http\Request::$infrastructure is not defined (see https://psalm.dev/038) - $r->infrastructure = $infra->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:126:17 -Instance property Illuminate\Http\Request::$vlan is not defined (see https://psalm.dev/038) - $r->vlan = $vlan->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:132:17 -Instance property Illuminate\Http\Request::$trunkname is not defined (see https://psalm.dev/038) - $r->trunkname = $trunkname; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:139:17 -Instance property Illuminate\Http\Request::$corebundle is not defined (see https://psalm.dev/038) - $r->corebundle = $corebundle->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:140:17 -Instance property Illuminate\Http\Request::$side is not defined (see https://psalm.dev/038) - $r->side = $side; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:146:17 -Instance property Illuminate\Http\Request::$location is not defined (see https://psalm.dev/038) - $r->location = $location->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:152:17 -Instance property Illuminate\Http\Request::$switch is not defined (see https://psalm.dev/038) - $r->switch = $switch->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:158:17 -Instance property Illuminate\Http\Request::$physint is not defined (see https://psalm.dev/038) - $r->physint = $physint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:164:17 -Instance property Illuminate\Http\Request::$virtint is not defined (see https://psalm.dev/038) - $r->virtint = $virtint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:170:17 -Instance property Illuminate\Http\Request::$customer is not defined (see https://psalm.dev/038) - $r->customer = $customer->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:176:17 -Instance property Illuminate\Http\Request::$vlanint is not defined (see https://psalm.dev/038) - $r->vlanint = $vlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:182:17 -Instance property Illuminate\Http\Request::$vli is not defined (see https://psalm.dev/038) - $r->vli = $vli; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:189:17 -Instance property Illuminate\Http\Request::$srcvlanint is not defined (see https://psalm.dev/038) - $r->srcvlanint = $srcvlanint->id; - -ERROR: UndefinedPropertyAssignment -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/Grapher.php:190:17 -Instance property Illuminate\Http\Request::$dstvlanint is not defined (see https://psalm.dev/038) - $r->dstvlanint = $dstvlanint->id; - -# Auth::getUser() provide a Model that has the Method -> false positive - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Middleware/Services/LookingGlass.php:151:66 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( $router->authorise( Auth::check() ? Auth::getUser()->privs() : User::AUTH_PUBLIC ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/Store.php:62:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/CoreBundle/StoreCoreLink.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/BillingInformation.php:53:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Customer/Store.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/BillingDetailsRequest.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Dashboard/NocDetailsRequest.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isCustAdmin does not exist (see https://psalm.dev/181) - return Auth::getUser()->isCustAdmin(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/EmailPatchPanelPort.php:39:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/DeleteByNetwork.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/IpAddress/Store.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Irrdb.php:53:35 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $privs = Auth::getUser()->privs(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/MovePatchPanelPort.php:40:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanel.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePatchPanelPort.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StorePhysicalInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreRouter.php:55:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreSflowReceiver.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterface.php:50:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVirtualInterfaceWizard.php:54:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/StoreVlanInterface.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/Store.php:43:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/Switches/StoreBySmtp.php:52:33 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CheckEmail.php:82:32 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !Auth::user()->isSuperUser() && User::leftJoin( 'customer_to_users AS c2u', 'c2u.user_id', 'user.id' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:75:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/CustomerToUser/Store.php:95:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $this->cust = Auth::user()->isSuperUser() ? Customer::find( $this->customer_id ) : Auth::user()->customer; - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Delete.php:85:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$validator->fails() && !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Store.php:88:49 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:72:27 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::user()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Http/Requests/User/Update.php:103:38 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - $isSuperUser = Auth::user()->isSuperUser(); - -# I didn't see issues here - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:134:30 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - }); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:199:35 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but pure-Closure(static):void provided (see https://psalm.dev/004) - return $q->where( function($query ) use ($speed) { - $query->where( 'pi.speed', $speed ) - ->orWhere( 'pi.rate_limit', $speed ); - } ); - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Aggregators/SwitcherAggregator.php:311:22 -Argument 1 of Illuminate\Database\Eloquent\Builder::where expects Closure(Illuminate\Database\Eloquent\Builder):Illuminate\Database\Eloquent\Builder|Closure(Illuminate\Database\Eloquent\Builder):void|Illuminate\Contracts\Database\Query\Expression|array|string, but impure-Closure(static):void provided (see https://psalm.dev/004) - ->where( function ($query) use( $switch ) { - $query->where( 'sA.id', $switch->id ) - ->orWhere( 'sB.id', $switch->id ); - }) - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:130:38 -The declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups is incorrect, got 'Illuminate\Database\Eloquent\Builder&static' (see https://psalm.dev/011) - public function contactGroups(): BelongsToMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/Contact.php:132:16 -The inferred type 'Illuminate\Database\Eloquent\Builder&static' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\BelongsToMany' for IXP\Models\Contact::contactGroups (see https://psalm.dev/128) - return $this->belongsToMany(ContactGroup::class, 'contact_to_group', 'contact_id' ) - ->where( 'type', '!=', ContactGroup::TYPE_ROLE ) - ->orderBy( 'name' ); - -# Auth::getUser() provide a Model that has the Method -> false positive - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerDirectory.php:125:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:135:41 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - } elseif( !Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/DocstoreCustomerFile.php:137:69 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - $builder->where('min_privs', '<=', Auth::getUser()->privs() ); - -# I don't see issues here - -ERROR: InvalidReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:345:50 -The declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic is incorrect, got 'Illuminate\Database\Eloquent\Builder' (see https://psalm.dev/011) - public function patchPanelPortFilesPublic(): HasMany - -ERROR: InvalidReturnStatement -at /Users/laszlo/dev/ibn-ixp-manager/app/Models/PatchPanelPort.php:347:16 -The inferred type 'Illuminate\Database\Eloquent\Builder' does not match the declared return type 'Illuminate\Database\Eloquent\Relations\HasMany' for IXP\Models\PatchPanelPort::patchPanelPortFilesPublic (see https://psalm.dev/128) - return $this->hasMany(PatchPanelPortFile::class, 'patch_panel_port_id' ) - ->where( 'is_private', 0 ); - -# Auth::getUser() provide a Model that has the Method -> false positive - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/HorizonServiceProvider.php:69:54 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - return Auth::check() && Auth::getUser()->isSuperUser(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/IxpServiceProvider.php:59:57 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( ( Auth::check() && Auth::getUser()->isSuperUser() ) || env( 'IXP_PHPUNIT_RUNNING', false ) ) { - -# I don't see issues here - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/ParsedownServiceProvider.php:44:15 -Method Illuminate\Contracts\View\Engine::getCompiler does not exist (see https://psalm.dev/181) - ->getCompiler(); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:55:29 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if ($this->app->isLocal()) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Providers/TelescopeServiceProvider.php:73:25 -Method Illuminate\Contracts\Foundation\Application::isLocal does not exist (see https://psalm.dev/181) - if( $this->app->isLocal() ) { - -# false positive, it is a polymorphic call - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:156:57 -Method Illuminate\Contracts\Auth\UserProvider::addRememberToken does not exist (see https://psalm.dev/181) - $this->userRememberToken = $this->provider->addRememberToken($user); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Auth/SessionGuard.php:157:30 -Method Illuminate\Contracts\Auth\UserProvider::purgeExpiredRememberTokens does not exist (see https://psalm.dev/181) - $this->provider->purgeExpiredRememberTokens( $user ); - -# Auth::getUser() provide a Model that has the Method -> false positive - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:164:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/CoreBundle.php:177:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:124:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:132:103 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.customer' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.customer' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:156:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:166:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Customer.php:219:55 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( !$i && Auth::check() && !Auth::getUser()->isSuperUser() && !Auth::getUser()->customer->typeAssociate() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:92:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/IXP.php:105:95 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.ixp' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.ixp' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Infrastructure.php:141:106 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.infrastructure' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.infrastructure' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:204:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:212:102 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.latency' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.latency' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Latency.php:236:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:126:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Location.php:134:100 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.location' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.location' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:162:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:170:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::check() && is_numeric( config( 'grapher.access.p2p' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.p2p' ); - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:194:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/P2p.php:204:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= (int)config( 'grapher.access.p2p' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/PhysicalInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:127:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Switcher.php:135:98 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.switch' ) ) && Auth::getUser()->privs() >= (int)config( 'grapher.access.switch' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:129:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Trunk.php:137:97 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.trunk' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.trunk' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:147:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VirtualInterface.php:157:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:128:47 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::check() && Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/Vlan.php:142:96 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - if( Auth::check() && is_numeric( config( 'grapher.access.vlan' ) ) && Auth::getUser()->privs() >= config( 'grapher.access.vlan' ) ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:157:30 -Method Illuminate\Contracts\Auth\Authenticatable::isSuperUser does not exist (see https://psalm.dev/181) - if( Auth::getUser()->isSuperUser() ) { - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Services/Grapher/Graph/VlanInterface.php:167:33 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - && Auth::getUser()->privs() >= config( 'grapher.access.customer' ) - -ERROR: UndefinedInterfaceMethod -at /Users/laszlo/dev/ibn-ixp-manager/app/Support/helpers.php:84:37 -Method Illuminate\Contracts\Auth\Authenticatable::privs does not exist (see https://psalm.dev/181) - return Auth::getUser()->privs() >= $minAuth; - -# Not really known what this method does, it is unused. It is callable as polymrophic - -ERROR: UndefinedThisPropertyFetch -at /Users/laszlo/dev/ibn-ixp-manager/app/Traits/Observable.php:151:48 -Instance property IXP\Models\CustomerToCustomerTag::$id is not defined (see https://psalm.dev/041) - return Log::entries( self::getClass(), $this->id, $user ); - - -# global variable defined in version.php - -ERROR: UndefinedConstant -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Export/JsonSchema.php:94:46 -Const APPLICATION_VERSION is not defined (see https://psalm.dev/020) - 'generator' => 'IXP Manager v' . APPLICATION_VERSION, - - -# issue inside the Former package - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:61:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-input-width-class' ] ?? $this->fieldWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:63:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - - -# it isn't error... - -ERROR: LessSpecificImplementedReturnType -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:72:16 -The inherited return type 'array' for Former\Framework\TwitterBootstrap4::getLabelClasses is more specific than the implemented return type for IXP\Utils\Former\Framework\TwitterBootstrap4::getlabelclasses 'array' (see https://psalm.dev/166) - * @return array An array of attributes with the label class - - -# issue inside the Former package - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:76:18 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $width = $this->app[ 'former.form' ]->getAttributes()[ 'custom-label-width-class' ] ?? $this->labelWidth; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:78:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:81:14 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if ( $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:128:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:132:20 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-position' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:133:25 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app['former.form']->getAttributes()[ 'inputs-position' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:146:70 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) || $this->app[ 'former.form' ]->isOfType( 'inline' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:149:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ] ) ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:150:29 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $classes .= $this->app[ 'former.form' ]->getAttributes()[ 'inputs-positions' ]; - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:24 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:153:108 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( isset( $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ) && $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] === "grey-box" ){ - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:173:13 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - if( $this->app[ 'former.form' ]->isOfType( 'horizontal' ) ) { - -ERROR: UndefinedDocblockClass -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/Former/Framework/TwitterBootstrap4.php:174:22 -Docblock-defined class, interface or enum named Former\Traits\Container does not exist (see https://psalm.dev/200) - $class = $this->app[ 'former.form' ]->getAttributes()[ 'action-buttons-custom-class' ] ?? ""; - -# issue of the package: variable type wrong declared (no errors caused) - -ERROR: InvalidArgument -at /Users/laszlo/dev/ibn-ixp-manager/app/Utils/MailingList.php:92:39 -Argument 1 of Illuminate\Support\Collection::add expects never, but lowercase-string provided (see https://psalm.dev/004) - $filtered_users->add( $e ); - - - ------------------------------- -503 errors found ------------------------------- -3433 other issues found. -You can display them with --show-info=true ------------------------------- - -Checks took 0.19 seconds and used 33.183MB of memory -No files analyzed -Psalm was able to infer types for 80.5560% of the codebase From 2c65d08be30eec8ef05c703a3f5b49bd5bdcc11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Wed, 12 Jun 2024 16:21:25 +0100 Subject: [PATCH 025/145] DotEnvWriter debug, testing hashed values --- .env.example | 1 + .env.test | 80 +++++++++++++++-------------- app/Services/DotEnvWriter.php | 17 ++---- tests/Services/DotEnvWriterTest.php | 45 +++++++++++----- 4 files changed, 79 insertions(+), 64 deletions(-) diff --git a/.env.example b/.env.example index 0656f9a08..b1db6136a 100644 --- a/.env.example +++ b/.env.example @@ -308,3 +308,4 @@ IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 # IXP_NO_TRANSIT_ASNS_EXCLUDE=65501,65502 # IXP_NO_TRANSIT_ASNS_OVERRIDE=65501,65502,65503 +# Full slash 'description' with /slashes\ and "quotes" diff --git a/.env.test b/.env.test index 0656f9a08..9c9e93176 100644 --- a/.env.test +++ b/.env.test @@ -5,11 +5,11 @@ # # Run "artisan key:generate" to set the application key: -APP_KEY= +# APP_KEY= # Set this to false in production (but change it to true if you have installation or # other issues running IXP Manager). -APP_DEBUG=false +APP_DEBUG="false" # Web address where IXP Manager is accessed. This is a **required** setting. It is # currently used for generating all URLs within IXP Manager (action, assets, etc.). @@ -23,10 +23,10 @@ APP_TIMEZONE="UTC" # Laravel log format (storage/log). See config/log.php and # https://laravel.com/docs/5.4/errors -APP_LOG="single" +APP_LOG="daily" # info by default, one of: debug, info, notice, warning, error, critical, alert, emergency. -APP_LOG_LEVEL=debug +APP_LOG_LEVEL="debug" # MySQL Connection Details DB_HOST="127.0.0.1" @@ -44,8 +44,8 @@ DB_PASSWORD="password" # # MAIL_MAILER="smtp" # MAIL_HOST="localhost" -# MAIL_PORT=25 -# MAIL_ENCRYPTION=false +MAIL_PORT="25" +# MAIL_ENCRYPTION="false" @@ -95,7 +95,7 @@ IDENTITY_BIGLOGO="//www.ixpmanager.org/images/logos/ixp-manager.png" # For some actions (e.g. peering matrix) we need to know what VLAN to show by default. # This is the vlan.id database entry (i.e. not the VLAN number/tag!) -IDENTITY_DEFAULT_VLAN=1 +IDENTITY_DEFAULT_VLAN="1" ######################################################################################### @@ -105,8 +105,8 @@ IDENTITY_DEFAULT_VLAN=1 ### As such, the language used mostly is 'member'. To change this to 'customer' just ### uncomment the following lines: # -# IXP_FE_FRONTEND_CUSTOMER_ONE=customer -# IXP_FE_FRONTEND_CUSTOMER_MANY=customers +# IXP_FE_FRONTEND_CUSTOMER_ONE="customer" +# IXP_FE_FRONTEND_CUSTOMER_MANY="customers" # IXP_FE_FRONTEND_CUSTOMER_OWNER="customer's" # IXP_FE_FRONTEND_CUSTOMER_OWNERS="customers'" @@ -117,10 +117,10 @@ IDENTITY_DEFAULT_VLAN=1 # # See: http://docs.ixpmanager.org/features/reseller/ -IXP_RESELLER_ENABLED=false +IXP_RESELLER_ENABLED="false" # See: http://docs.ixpmanager.org/features/as112/ -IXP_AS112_UI_ACTIVE=false +IXP_AS112_UI_ACTIVE="false" ####################################################################################### @@ -132,7 +132,7 @@ IXP_AS112_UI_ACTIVE=false # Allow customers / admins to upload logos for members. Set to false to enabled. # See: http://docs.ixpmanager.org/usage/customers/#customer-logos -IXP_FE_FRONTEND_DISABLED_LOGO=false +IXP_FE_FRONTEND_DISABLED_LOGO="false" # Send email notifications when a customer's billing details are updated. @@ -141,10 +141,10 @@ IXP_FE_FRONTEND_DISABLED_LOGO=false # Disable links to the peering matrix if you have not set it up (with sflow): -# IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX=true +# IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX="true" # Enable the UI for route server community-based filtering by uncommenting this line: -# IXP_FE_FRONTEND_DISABLED_RS_FILTERS=false +# IXP_FE_FRONTEND_DISABLED_RS_FILTERS="false" ####################################################################################### ### Graphing - see https://docs.ixpmanager.org/grapher/introduction @@ -158,14 +158,12 @@ GRAPHER_BACKENDS="dummy" # With the cache enabled, IXP Manager does not have to regenerate / reload / reprocess # log / rrd / image files if we have cached them and they are less than 5mins old. This # is enabled by default which is the recommended setting. -GRAPHER_CACHE_ENABLED=true +GRAPHER_CACHE_ENABLED="true" ################################################################################# ## Grapher - Mrtg - see: https://docs.ixpmanager.org/grapher/mrtg/ ## -# For backwards compatibility, the default is 'log' but 'rrd' is more modern: -GRAPHER_BACKEND_MRTG_DBTYPE="rrd" # The defaults for these are '/tmp' to require you to change them to something # more sensible such as: @@ -176,7 +174,7 @@ GRAPHER_BACKEND_MRTG_DBTYPE="rrd" ## Grapher - sflow - see: https://docs.ixpmanager.org/grapher/sflow/ ## -# GRAPHER_BACKEND_SFLOW_ENABLED=false +# GRAPHER_BACKEND_SFLOW_ENABLED="false" # GRAPHER_BACKEND_SFLOW_ROOT="http://sflow-server.example.com/grapher-sflow" @@ -185,7 +183,7 @@ GRAPHER_BACKEND_MRTG_DBTYPE="rrd" ## # Mark it as enabled (this just affects whether certain UI elements are shown): -# GRAPHER_BACKEND_SMOKEPING_ENABLED=true +# GRAPHER_BACKEND_SMOKEPING_ENABLED="true" # And set the default location to fetch the Smokeping graphs from: # GRAPHER_BACKEND_SMOKEPING_URL="http://www.example.com/smokeping" @@ -195,7 +193,7 @@ GRAPHER_BACKEND_MRTG_DBTYPE="rrd" ## IX-F Member Export - see: https://docs.ixpmanager.org/features/ixf-export/ -# IXP_API_JSONEXPORTSCHEMA_PUBLIC=true +# IXP_API_JSONEXPORTSCHEMA_PUBLIC="true" # Some variables can be excluded as required. # See: https://docs.ixpmanager.org/features/ixf-export/ @@ -212,12 +210,12 @@ GRAPHER_BACKEND_MRTG_DBTYPE="rrd" # IXP_API_JSONEXPORTSCHEMA_EXCLUDE_TAGS="tag1|tag2" # Exclude documentation ASNs (64496 - 64511, 65536 - 65551) -# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC5398=true +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC5398="true" # Exclude private ASNs (64512 - 65534, 4200000000 - 4294967294) # Exclude private ASNs: -# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC6996=true +# IXP_API_JSONEXPORTSCHEMA_EXCLUDE_RFC6996="true" ####################################################################################### @@ -230,15 +228,15 @@ GRAPHER_BACKEND_MRTG_DBTYPE="rrd" ####################################################################################### # See config/cache.php -CACHE_DRIVER=array +CACHE_DRIVER="array" ####################################################################################### # Session Lifetimes - standard and remember me. # # See https://docs.ixpmanager.org/usage/authentication/ # -# SESSION_LIFETIME=120 -# AUTH_TOKEN_EXPIRE=43200 +# SESSION_LIFETIME="120" +# AUTH_TOKEN_EXPIRE="43200" ####################################################################################### @@ -248,8 +246,8 @@ CACHE_DRIVER=array # provide a working PeeringDb username/password then these will be used to get more # complete information. # -# IXP_API_PEERING_DB_USERNAME=username -# IXP_API_PEERING_DB_PASSWORD=password +# IXP_API_PEERING_DB_USERNAME="username" +# IXP_API_PEERING_DB_PASSWORD="password" @@ -257,15 +255,15 @@ CACHE_DRIVER=array # Options for updating RIR Objects - see https://docs.ixpmanager.org/features/rir-objects/ # Your RIR password to allow the updating of a RIR object by email: -# IXP_API_RIR_PASSWORD=soopersecret +# IXP_API_RIR_PASSWORD="soopersecret" # Rather than specifiying the destination address on the command line, you can set it here # (useful for cronjobs and required for use with artisan schedule:run in >=v5.0) -# IXP_API_RIR_EMAIL_TO=test-dbm@ripe.net +# IXP_API_RIR_EMAIL_TO="test-dbm@ripe.net" # Rather than specifiying the from address on the command line, you can set it here # (useful for cronjobs and required for use with artisan schedule:run in >=v5.0) -# IXP_API_RIR_EMAIL_FROM=ixp@example.com +# IXP_API_RIR_EMAIL_FROM="ixp@example.com" @@ -273,13 +271,13 @@ CACHE_DRIVER=array # Utility paths # See: https://docs.ixpmanager.org/features/irrdb/ -IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 +IXP_IRRDB_BGPQ3_PATH="/usr/bin/bgpq3" # See: https://docs.ixpmanager.org/features/rpki/ -# IXP_RPKI_RTR1_HOST=192.0.2.11 -# IXP_RPKI_RTR1_PORT=3323 -# IXP_RPKI_RTR2_HOST=192.0.2.12 -# IXP_RPKI_RTR2_PORT=3323 +# IXP_RPKI_RTR1_HOST="192.0.2.11" +# IXP_RPKI_RTR1_PORT="3323" +# IXP_RPKI_RTR2_HOST="192.0.2.12" +# IXP_RPKI_RTR2_PORT="3323" ######################################################################################### @@ -287,7 +285,7 @@ IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 ### # Disable HTML5 validation to test PHP code based request validators -# FORMER_LIVE_VALIDATION=false +# FORMER_LIVE_VALIDATION="false" ######################################################################################### @@ -296,7 +294,7 @@ IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 ### https://docs.ixpmanager.org/features/peeringdb-oauth/ ### -# AUTH_PEERINGDB_ENABLED=true +# AUTH_PEERINGDB_ENABLED="true" # PEERINGDB_OAUTH_CLIENT_ID="xxx" # PEERINGDB_OAUTH_CLIENT_SECRET="xxx" @@ -305,6 +303,10 @@ IXP_IRRDB_BGPQ3_PATH=/usr/bin/bgpq3 ######################################################################################### ### See: https://docs.ixpmanager.org/features/routers/#filtering-known-transit-networks -# IXP_NO_TRANSIT_ASNS_EXCLUDE=65501,65502 -# IXP_NO_TRANSIT_ASNS_OVERRIDE=65501,65502,65503 +# IXP_NO_TRANSIT_ASNS_EXCLUDE="65501,65502" +# IXP_NO_TRANSIT_ASNS_OVERRIDE="65501,65502,65503" +# Full slash 'description' with /slashes\ and "quotes" + +# It is a test 'description' with /slashes\ and "quotes" +TEST_KEY="Test value" diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index acaff488a..14d4ded98 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -92,7 +92,7 @@ public function set( string $key, string $value, string|null $description = null if( $description ) { $this->variables[] = [ "key" => null, - "value" => $description, + "value" => "# " . $description, "status" => false, "changed" => true, ]; @@ -349,7 +349,7 @@ protected function formatValue( string $value ): string { $value = trim( explode( '#', trim( $value ) )[ 0 ] ); - return stripslashes( $this->stripQuotes( $value ) ); + return htmlspecialchars($this->stripQuotes( $value ), ENT_QUOTES, 'UTF-8'); } /** @@ -360,17 +360,8 @@ protected function formatValue( string $value ): string */ protected function escapeValue( string $value ): string { - if( '' === $value ) { - return ''; - } - - // Quote the values if - // it contains white-space or the following characters: " \ = : . $ ( ) - // or simply force quote is enabled - if( preg_match( '/\s|"|\\\\|=|:|\.|\$|\(|\)/u', $value ) ) { - // Replace backslashes with even more backslashes so when writing we can have escaped backslashes - $value = str_replace( '\\', '\\\\\\\\', $value ); - $value = '"' . addcslashes( $value, '"' ) . '"'; + if( $value !== '' ) { + $value = '"' . htmlspecialchars_decode( $value ) . '"'; } return $value; diff --git a/tests/Services/DotEnvWriterTest.php b/tests/Services/DotEnvWriterTest.php index f47eb1faf..ff16fa5ba 100644 --- a/tests/Services/DotEnvWriterTest.php +++ b/tests/Services/DotEnvWriterTest.php @@ -37,8 +37,8 @@ */ class DotEnvWriterTest extends TestCase { + protected string $originalFile = '.env.example'; protected string $testFile = '.env.test'; - protected string $testWriteFile = '.env.test2'; protected DotEnvWriter $writer; @@ -48,9 +48,14 @@ class DotEnvWriterTest extends TestCase */ public function testReader(): void { + $originalFile = base_path($this->originalFile); $testFile = base_path($this->testFile); + + @unlink($testFile); + copy($originalFile, $testFile); + $this->writer = new DotEnvWriter($testFile); - $variables = $this->writer->sanitize(false)->getAll(); + $variables = $this->writer->getAll(); $this->assertIsArray($variables); } @@ -73,6 +78,7 @@ public function testSetVariables(): void $mail = $this->writer->get("MAIL_PORT"); $app = $this->writer->get("APP_KEY"); $log = $this->writer->get("APP_LOG"); + $logDescription = $log - 1; $test = $this->writer->get("TEST_KEY"); $testDescription = $test - 1; $graph = $this->writer->get("GRAPHER_BACKEND_MRTG_DBTYPE"); @@ -85,10 +91,11 @@ public function testSetVariables(): void $this->assertTrue($variables[$app]["changed"]); $this->assertEquals("daily",$variables[$log]["value"]); $this->assertTrue($variables[$log]["changed"]); + $this->assertNotEquals("# not showing description",$variables[$logDescription]["value"]); $this->assertEquals("Test value",$variables[$test]["value"]); $this->assertTrue($variables[$test]["changed"]); $this->assertNull($variables[$testDescription]["key"]); - $this->assertEquals("It is a test description",$variables[$testDescription]["value"]); + $this->assertEquals("# It is a test description",$variables[$testDescription]["value"]); $this->assertFalse($variables[$testDescription]["status"]); $this->assertTrue($variables[$testDescription]["changed"]); $this->assertFalse($graph); @@ -101,7 +108,6 @@ public function testSetVariables(): void public function testWrite(): void { $testFile = base_path($this->testFile); - $testWriteFile = base_path($this->testWriteFile); $this->writer = new DotEnvWriter($testFile); $this->writer->set("APP_LOG","daily","not showing description"); @@ -109,17 +115,32 @@ public function testWrite(): void $this->writer->disable("APP_KEY"); $this->writer->delete("GRAPHER_BACKEND_MRTG_DBTYPE",true); - $this->writer->set("TEST_KEY","Test value","It is a test description"); + $this->writer->set("TEST_KEY","Test value","It is a test 'description' with /slashes\ and \"quotes\""); - $variables = $this->writer->getAll(); + $this->writer->write(); - $created1 = $this->writer->write(false, $testWriteFile); - $created2 = $this->writer->write(); + // reload file + $_newEnv = new DotEnvWriter($testFile); + $variables = $_newEnv->getAll(); $this->assertIsArray($variables); - $this->assertFileExists($created1[0]); // old file - $this->assertFileExists($created1[1]); // new file - $this->assertFileExists($created2[0]); // old file - $this->assertFileExists($created2[1]); // new file + + $log = $_newEnv->get("APP_LOG"); + $logDescription = $log - 1; + $mail = $_newEnv->get("MAIL_PORT"); + $app = $_newEnv->get("APP_KEY"); + $test = $_newEnv->get("TEST_KEY"); + $testDescription = $test - 1; + $graph = $_newEnv->get("GRAPHER_BACKEND_MRTG_DBTYPE"); + + $this->assertEquals("daily",$variables[$log]["value"]); + $this->assertNotEquals("# not showing description",$variables[$logDescription]["value"]); + $this->assertTrue($variables[$mail]["status"]); + $this->assertFalse($variables[$app]["status"]); + $this->assertEquals("Test value",$variables[$test]["value"]); + $this->assertNull($variables[$testDescription]["key"]); + $this->assertEquals("# It is a test 'description' with /slashes\ and \"quotes\"",$variables[$testDescription]["value"]); + $this->assertFalse($variables[$testDescription]["status"]); + $this->assertFalse($graph); } } From 9e2791f6ebdda7dd2246cf2a8686b7bcee7982a5 Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Thu, 13 Jun 2024 21:05:48 +0100 Subject: [PATCH 026/145] Review islandbridgenetworks/ibn-ixp-manager#8 re pslam --- .idea/IXP-Manager.iml | 2 + .idea/php.xml | 1 + .phpstorm.meta.php/laravel.meta.php | 22 +-- _ide_helper.php | 4 +- app/Console/Commands/Command.php | 23 +++ app/Console/Commands/Contact/ExportGroup.php | 2 +- app/Console/Commands/User/SetPassword.php | 63 ++----- app/Console/Commands/Utils/SmtpMailTest.php | 17 +- app/Contracts/LookingGlass.php | 11 ++ .../Controllers/Api/V4/RouterController.php | 16 -- app/Http/Controllers/DashboardController.php | 1 - .../Interfaces/VlanInterfaceController.php | 117 ++++++------- .../Controllers/Services/LookingGlass.php | 2 +- app/Mail/Utils/SmtpTest.php | 51 ++++++ app/Services/Grapher/Graph.php | 2 - app/Services/IXF.php | 10 +- app/Services/PeeringDb.php | 18 +- app/Tasks/Irrdb/UpdateAsnDb.php | 10 +- app/Tasks/Irrdb/UpdateDb.php | 4 +- app/Tasks/Irrdb/UpdatePrefixDb.php | 10 +- composer.lock | 162 +++++++++++++----- config/telescope.php | 2 +- ...06_01_143931_database_schema_at_end_v5.php | 2 - psalm.xml | 9 +- psalmhelp.log | 158 ----------------- 25 files changed, 336 insertions(+), 383 deletions(-) create mode 100644 app/Mail/Utils/SmtpTest.php delete mode 100644 psalmhelp.log diff --git a/.idea/IXP-Manager.iml b/.idea/IXP-Manager.iml index 63711f952..dc2e7e8a1 100644 --- a/.idea/IXP-Manager.iml +++ b/.idea/IXP-Manager.iml @@ -21,6 +21,8 @@ + + diff --git a/.idea/php.xml b/.idea/php.xml index 6898004af..68d2d55fe 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -261,6 +261,7 @@ + diff --git a/.phpstorm.meta.php/laravel.meta.php b/.phpstorm.meta.php/laravel.meta.php index 54b01e6d4..ebaea8fe8 100644 --- a/.phpstorm.meta.php/laravel.meta.php +++ b/.phpstorm.meta.php/laravel.meta.php @@ -179,10 +179,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -425,10 +425,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -671,10 +671,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -917,10 +917,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -1163,10 +1163,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -1409,10 +1409,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -1655,10 +1655,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -1901,10 +1901,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -2147,10 +2147,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -2393,10 +2393,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, @@ -2639,10 +2639,10 @@ 'Laravel\Telescope\Contracts\EntriesRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'Laravel\Telescope\Contracts\PrunableRepository' => \Laravel\Telescope\Storage\DatabaseEntriesRepository::class, 'SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface' => \SocialiteProviders\Manager\Helpers\ConfigRetriever::class, + 'Spatie\ErrorSolutions\Contracts\SolutionProviderRepository' => \Spatie\ErrorSolutions\SolutionProviderRepository::class, 'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class, 'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class, 'Spatie\Ignition\Contracts\ConfigManager' => \Spatie\Ignition\Config\FileConfigManager::class, - 'Spatie\Ignition\Contracts\SolutionProviderRepository' => \Spatie\LaravelIgnition\Solutions\SolutionProviders\SolutionProviderRepository::class, 'Spatie\Ignition\Ignition' => \Spatie\Ignition\Ignition::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\DumpRecorder::class, 'Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler' => \Spatie\LaravelIgnition\Recorders\DumpRecorder\MultiDumpHandler::class, diff --git a/_ide_helper.php b/_ide_helper.php index 62f378671..5e6402d59 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -21119,10 +21119,10 @@ * * * @static - */ public static function withStackFrameArguments($withStackFrameArguments = true) + */ public static function withStackFrameArguments($withStackFrameArguments = true, $forcePHPIniSetting = false) { /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->withStackFrameArguments($withStackFrameArguments); + return $instance->withStackFrameArguments($withStackFrameArguments, $forcePHPIniSetting); } /** * diff --git a/app/Console/Commands/Command.php b/app/Console/Commands/Command.php index 9544ebab8..36590b3ca 100644 --- a/app/Console/Commands/Command.php +++ b/app/Console/Commands/Command.php @@ -148,4 +148,27 @@ protected function validate_cmd( mixed $method, array $rules ): mixed return $value; } + + /** + * Simple validator function for validating a single value against a given rule + * and error and exit it if fails. + * + * @param string $rule The Laravel validator rule e.g. 'required|string|min:8|max:255' + * @param string $name The parameter name for output in error messages + * @param mixed $value The value to validate against $rule + * + * @return bool + * @throws \Exception + */ + protected function validateOrExit( string $rule, string $name, string $value ): bool + { + $validator = \Validator::make( [ $name => $value ], [ $name => $rule ] ); + + if ($validator->fails()) { + $this->error( $validator->errors()->first( $name ) ); + exit -1; + } + + return true; + } } \ No newline at end of file diff --git a/app/Console/Commands/Contact/ExportGroup.php b/app/Console/Commands/Contact/ExportGroup.php index b7590baf6..ee1c47f1b 100644 --- a/app/Console/Commands/Contact/ExportGroup.php +++ b/app/Console/Commands/Contact/ExportGroup.php @@ -70,7 +70,7 @@ public function handle(): int $type = $this->option('type'); $name = $this->option('name'); // Imported from Zend Framework with little change on 2017-11 - if( ( is_null($type) && is_null($name) ) || ( !is_null($type) && !is_null($name) ) ) { + if( !( $type && $name ) || ( $type && $name ) ) { $this->error( "Group name or type must be set (and not both)." ); return -1; } diff --git a/app/Console/Commands/User/SetPassword.php b/app/Console/Commands/User/SetPassword.php index 5bbe101b3..00f4452cc 100644 --- a/app/Console/Commands/User/SetPassword.php +++ b/app/Console/Commands/User/SetPassword.php @@ -3,7 +3,7 @@ namespace IXP\Console\Commands\User; /* - * Copyright (C) 2009 - 2021 Internet Neutral Exchange Association Company Limited By Guarantee. + * Copyright (C) 2009 - 2024 Internet Neutral Exchange Association Company Limited By Guarantee. * All Rights Reserved. * * This file is part of IXP Manager. @@ -61,22 +61,14 @@ class SetPassword extends Command 'password' => 'required|string|min:8|max:255', 'confirm_password' => 'required|same:password', ]; - /** - * Create a new command instance. - * - * @return void - */ - public function __construct() - { - parent::__construct(); - } /** * Execute the console command. * * @return int + * @throws \Exception */ - public function handle() + public function handle(): int { $search = $this->option('search' ); $uid = $this->option('uid' ); @@ -84,10 +76,10 @@ public function handle() if( ( !$search && !$uid ) || ( $search && $uid ) ){ $this->error( "Search or UID must be set (and not both)." ); - return 0; + return -1; } - if( $search ){// Display result the --search parameter + if( $search ){ // Display result the --search parameter $this->table( ['ID', 'Name', 'Username', 'Email', 'Customers', 'Privs'], $u = $this->usersViaUsernameOrEmail( $search ) @@ -98,32 +90,26 @@ public function handle() if( !$user = User::find( $uid ) ){ $this->error( "UID does not exist !" ); - return 0; + return -1; } - $validate = $this->validateInput( 'password', $password ); - if( $password && $validate !== true ){ - $this->error( $validate ); - return 0; - } - - if( !$password ){// --password option not specified, ask for password + if( !$password ){ // --password option not specified, ask for password $password = $this->secret( 'Password or (return to have one generated)' ); - if( $password ){// if the user type a password - $validate = $this->validateInput( 'password', $password ); - if( $validate !== true ){ - $this->error( $validate ); - return 0; - } - $confirmPassword = $this->secret( 'Confirm password' ); + if( $password ){ // if the user type a password + $pw_valid = $this->validateOrExit( $this->rules['password'], 'password', $password ); + + $confirmPassword = $this->secret( 'Confirm password' ); + if( $password !== $confirmPassword ){// check if password match $this->error( "The passwords does not match!" ); - return 0; + return -1; } } else {// if the user type return generate password $password = Str::random(16 ); $this->info( "Generated password: " . $password ); } + } else { + $this->validateOrExit( $this->rules['password'], 'password', $password ); } $user->password = Hash::make( $password ); @@ -134,23 +120,4 @@ public function handle() return 0; } - /** - * @param array $rules - * @param mixed $value - * - * @return bool|string - */ - private function validateInput( string $rule, string $value ): bool|string - { - if( !isset( $this->rules[$rule] ) ) { - throw new \Exception('Non-existent rule - coding error'); - } - - $validator = \Validator::make( [ $rule => $value ], $this->rules ); - - if ($validator->fails()) { - return $validator->errors()->first( $rule ); - } - return true; - } } \ No newline at end of file diff --git a/app/Console/Commands/Utils/SmtpMailTest.php b/app/Console/Commands/Utils/SmtpMailTest.php index 75162cbbd..7a54cc62f 100644 --- a/app/Console/Commands/Utils/SmtpMailTest.php +++ b/app/Console/Commands/Utils/SmtpMailTest.php @@ -25,6 +25,7 @@ use Illuminate\Support\Facades\Mail; use IXP\Console\Commands\Command as IXPCommand; +use IXP\Mail\Utils\SmtpTest; /** * Class SmtpMailTest - test sending emails @@ -92,10 +93,7 @@ public function handle() $this->info( "Trying to send email...\n" ); - $mail = (object) [ - "markdown" => 'utils.emails.smtp-test', - "subject" =>'SMTP test email from IXP Manager' - ]; + $mail = new SmtpTest(); try { Mail::to( $email )->send( $mail ); @@ -113,18 +111,7 @@ public function handle() if( $this->getOutput()->isVerbose() ) { echo $e->getTraceAsString(); - } else { - $this->warn( "If you plan to request support from the IXP Manager team, please rerun this test with the -v (verbose) " - . "option and paste the complete output to an online pastebin such as https://pastebin.ibn.ie/. Please also ensure " - . "you have read the documentation for configuring email at https://docs.ixpmanager.org/usage/email/. Lastly, if " - . "you have configured a username and password, PLEASE remove these before pasting online!" - ); } } - - if( $this->getOutput()->isVerbose() ) { - $this->line( "\n\n" . str_repeat( '=', 40 ) . "\nSMTP Dialog:\n\n" ); - $this->line( $mail->logger()->dump() ); - } } } \ No newline at end of file diff --git a/app/Contracts/LookingGlass.php b/app/Contracts/LookingGlass.php index 4e5cb998c..83a6c61ea 100644 --- a/app/Contracts/LookingGlass.php +++ b/app/Contracts/LookingGlass.php @@ -121,6 +121,17 @@ public function routesForExport( string $protocol ): string; */ public function protocolRoute( string $protocol, string $network, int $mask ): string; + /** + * Get details for a specific route in a named protocol export + * + * @param string $protocol Protocol name + * @param string $network The route to lookup + * @param int $mask The mask of the route to look up + * + * @return string + */ + public function exportRoute( string $protocol, string $network, int $mask ): string; + /** * Get details for a specific route in a named table (vrf) * diff --git a/app/Http/Controllers/Api/V4/RouterController.php b/app/Http/Controllers/Api/V4/RouterController.php index 69cbf8a78..05a0a368a 100644 --- a/app/Http/Controllers/Api/V4/RouterController.php +++ b/app/Http/Controllers/Api/V4/RouterController.php @@ -77,22 +77,6 @@ public function genConfig( string $handle ): Response } - /** - * - * @param string $handle Handle of the router that we want - * - * @return JsonResponse - */ - public function getCanUpdate( string $handle ) : JsonResponse - { - if( !( $r = Router::whereHandle( $handle )->first() ) ) { - abort( 404, "Unknown router handle" ); - } - - return response()->json(); - //return response()->json( $this->lastUpdatedArray( $r ) ); - } - /** * Get 'last_updated' for the router with the handle provided * diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 6f5fd9259..01c5cd03c 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -117,7 +117,6 @@ public function index( Request $r, string $tab = null ): RedirectResponse|View 'recentMembers' => Customer::getConnected( true, true, 'datejoin', 'desc' )->take( 5 ), 'crossConnects' => $c->patchPanelPorts()->masterPort()->get(), 'notesInfo' => CustomerNote::analyseForUser( $cns, $c, Auth::getUser() ), - //'rsRoutes' => $rsRoutes ?? null, /* undeclared variable */ 'resoldCustomer' => $resoldCustomer ?? null, 'netInfo' => $netinfo ?? null, 'c' => $c->load( [ diff --git a/app/Http/Controllers/Interfaces/VlanInterfaceController.php b/app/Http/Controllers/Interfaces/VlanInterfaceController.php index 54694b617..fb5fab1d5 100644 --- a/app/Http/Controllers/Interfaces/VlanInterfaceController.php +++ b/app/Http/Controllers/Interfaces/VlanInterfaceController.php @@ -69,62 +69,62 @@ class VlanInterfaceController extends Common */ public function list(): View { - return view( 'interfaces/vlan/list' )->with([ - 'vlis' => VlanInterface::with( 'virtualInterface.customer' ) + return view( 'interfaces/vlan/list' )->with( [ + 'vlis' => VlanInterface::with( 'virtualInterface.customer' ) ->with( 'vlan' ) ->with( 'ipv4address' ) ->with( 'ipv6address' ) - ->get() - ]); + ->get(), + ] ); } /** * Duplicate a VLAN interface * - * @param VlanInterface $vli VLI that we will get the information from - * @param Vlan $v vlan where we will create the new VLI + * @param VlanInterface $vli VLI that we will get the information from + * @param Vlan $v vlan where we will create the new VLI * * @return View */ public function duplicateForm( VlanInterface $vli, Vlan $v ): View { - return $this->edit( request(), $vli, null , $v ); + return $this->edit( request(), $vli, null, $v ); } /** * Display the form to edit a VLAM interface * - * @param Request $r - * @param VirtualInterface $vi The virtual interface to add this VLI to + * @param Request $r + * @param VirtualInterface $vi The virtual interface to add this VLI to * * @return View */ public function create( Request $r, VirtualInterface $vi ): View { - Former::populate([ - 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vi->customer->maxprefixes ), - ]); - - return view( 'interfaces/vlan/edit' )->with([ - 'vlans' => Vlan::orderBy('number')->get(), - 'vli' => false, - 'vi' => $vi, - 'redirect2vi' => $vi ? true : false, - 'duplicateTo' => false - ]); + Former::populate( [ + 'maxbgpprefix' => $r->old( 'maxbgpprefix', $vi->customer->maxprefixes ), + ] ); + + return view( 'interfaces/vlan/edit' )->with( [ + 'vlans' => Vlan::orderBy( 'number' )->get(), + 'vli' => false, + 'vi' => $vi, + 'redirect2vi' => $vi ? true : false, + 'duplicateTo' => false, + ] ); } /** * Create a vlan interface * - * @param StoreVlanInterface $r instance of the current HTTP request + * @param StoreVlanInterface $r instance of the current HTTP request * * @return RedirectResponse */ public function store( StoreVlanInterface $r ): RedirectResponse { - $vli = VlanInterface::make( $r->all() ); - $v = Vlan::find( $r->vlanid ); + $vli = VlanInterface::make( $r->all() ); + $v = Vlan::find( $r->vlanid ); if( !$this->setIp( $r, $v, $vli, false ) || !$this->setIp( $r, $v, $vli, true ) ) { return Redirect::back()->withInput( $r->all() ); @@ -142,34 +142,31 @@ public function store( StoreVlanInterface $r ): RedirectResponse /** * Display the form to edit a VLAN interface * - * @param Request $r - * @param VlanInterface $vli The VLAN interface - * @param VirtualInterface|null $vi The virtual interface to add this VLI to - * @param Vlan|null $duplicateTo The ID of the vlan Interface that will receive the data of the the other vli ( $id ) + * @param Request $r + * @param VlanInterface $vli The VLAN interface + * @param VirtualInterface|null $vi The virtual interface to add this VLI to + * @param Vlan|null $duplicateTo The ID of the vlan Interface that will receive the data of the the other vli ( $id ) * * @return View */ - public function edit( Request $r, VlanInterface $vli, VirtualInterface $vi = null, Vlan $duplicateTo = null ): View + public function edit( Request $r, VlanInterface $vli, VirtualInterface $vi = null, Vlan $duplicateTo = null ): View { $vlanId = $duplicateTo->id ?? $vli->vlanid; Former::populate( [ - 'vlanid' => $r->old( 'vlanid', (string)$vlanId ), - 'irrdbfilter' => $r->old( 'irrdbfilter', (string)$vli->irrdbfilter ), - 'mcastenabled' => $r->old( 'mcastenabled', (string)$vli->mcastenabled ), - + 'vlanid' => $r->old( 'vlanid', (string)$vlanId ), + 'irrdbfilter' => $r->old( 'irrdbfilter', (string)$vli->irrdbfilter ), + 'mcastenabled' => $r->old( 'mcastenabled', (string)$vli->mcastenabled ), 'ipv4enabled' => $r->old( 'ipv4enabled', (string)$vli->ipv4enabled ), 'ipv4address' => $r->old( 'ipv4address', (string)$vli->ipv4addressid ), 'ipv4hostname' => $r->old( 'ipv4hostname', $vli->ipv4hostname ), 'ipv4bgpmd5secret' => $r->old( 'ipv4bgpmd5secret', $vli->ipv4bgpmd5secret ), 'ipv4canping' => $r->old( 'ipv4canping', (string)$vli->ipv4canping ), 'ipv4monitorrcbgp' => $r->old( 'ipv4monitorrcbgp', (string)$vli->ipv4monitorrcbgp ), - - 'maxbgpprefix' => $r->old( 'maxbgpprefix', (string)$vli->maxbgpprefix ), - 'rsclient' => $r->old( 'rsclient', (string)$vli->rsclient ), - 'rsmorespecifics' => $r->old( 'rsmorespecifics', (string)$vli->rsmorespecifics ), - 'as112client' => $r->old( 'as112client', (string)$vli->as112client ), - 'busyhost' => $r->old( 'busyhost', (string)$vli->busyhost ), - + 'maxbgpprefix' => $r->old( 'maxbgpprefix', (string)$vli->maxbgpprefix ), + 'rsclient' => $r->old( 'rsclient', (string)$vli->rsclient ), + 'rsmorespecifics' => $r->old( 'rsmorespecifics', (string)$vli->rsmorespecifics ), + 'as112client' => $r->old( 'as112client', (string)$vli->as112client ), + 'busyhost' => $r->old( 'busyhost', (string)$vli->busyhost ), 'ipv6enabled' => $r->old( 'ipv6enabled', (string)$vli->ipv6enabled ), 'ipv6address' => $r->old( 'ipv6address', (string)$vli->ipv6addressid ), 'ipv6hostname' => $r->old( 'ipv6hostname', $vli->ipv6hostname ), @@ -178,25 +175,25 @@ public function edit( Request $r, VlanInterface $vli, VirtualInterface $vi = nu 'ipv6monitorrcbgp' => $r->old( 'ipv6monitorrcbgp', (string)$vli->ipv6monitorrcbgp ), ] ); - $redirect2vi = (bool) $vi; - if( !$vi ){ + $redirect2vi = (bool)$vi; + if( !$vi ) { $vi = $vli->virtualInterface; } - return view( 'interfaces/vlan/edit' )->with([ - 'vlans' => Vlan:: orderBy('number')->get(), - 'vli' => $vli, - 'vi' => $vi ?: false, - 'duplicateTo' => $duplicateTo ?: false, - 'redirect2vi' => $redirect2vi - ]); + return view( 'interfaces/vlan/edit' )->with( [ + 'vlans' => Vlan:: orderBy( 'number' )->get(), + 'vli' => $vli, + 'vi' => $vi ?: false, + 'duplicateTo' => $duplicateTo ?: false, + 'redirect2vi' => $redirect2vi, + ] ); } /** * Update a vlan interface * - * @param StoreVlanInterface $r instance of the current HTTP request - * @param VlanInterface $vli + * @param StoreVlanInterface $r instance of the current HTTP request + * @param VlanInterface $vli * * @return RedirectResponse * @@ -223,8 +220,8 @@ public function update( StoreVlanInterface $r, VlanInterface $vli ): RedirectRes /** * Duplicate a vlan interface * - * @param StoreVlanInterface $r instance of the current HTTP request - * @param VlanInterface $vli + * @param StoreVlanInterface $r instance of the current HTTP request + * @param VlanInterface $vli * * @return RedirectResponse * @@ -237,7 +234,7 @@ public function duplicate( StoreVlanInterface $r, VlanInterface $vli ): Redirect $v = Vlan::find( $r->vlanid ); DB::beginTransaction(); - $vli = VlanInterface::make(); + $vli = VlanInterface::make(); if( !$this->setIp( $r, $v, $vli, false ) || !$this->setIp( $r, $v, $vli, true ) ) { // Rollback if there is issue to avoid to insert the data created above @@ -252,7 +249,7 @@ public function duplicate( StoreVlanInterface $r, VlanInterface $vli ): Redirect Layer2Address::create( [ 'vlan_interface_id' => $vli->id, - 'mac' => $l2a->mac + 'mac' => $l2a->mac, ] ); } @@ -276,15 +273,15 @@ public function duplicate( StoreVlanInterface $r, VlanInterface $vli ): Redirect */ public function view( VlanInterface $vli ): View { - return view( 'interfaces/vlan/view' )->with([ - 'vli' => $vli - ]); + return view( 'interfaces/vlan/view' )->with( [ + 'vli' => $vli, + ] ); } /** * Delete a VLAN Interface and the Layer2Address associated * - * @param VlanInterface $vli + * @param VlanInterface $vli * * @return RedirectResponse * @@ -297,9 +294,9 @@ public function delete( VlanInterface $vli ): RedirectResponse AlertContainer::push( 'VLAN Interface deleted.', Alert::SUCCESS ); - if( $_SERVER[ "HTTP_REFERER" ] === route( 'vlan-interface@list' ) ){ + if( $_SERVER[ "HTTP_REFERER" ] === route( 'vlan-interface@list' ) ) { return redirect( route( 'vlan-interface@list' ) ); } - return redirect( route( 'virtual-interface@edit' , [ 'vi' => $vli->virtualinterfaceid ] ) ); + return redirect( route( 'virtual-interface@edit', [ 'vi' => $vli->virtualinterfaceid ] ) ); } } \ No newline at end of file diff --git a/app/Http/Controllers/Services/LookingGlass.php b/app/Http/Controllers/Services/LookingGlass.php index 3aec4439f..15811a457 100644 --- a/app/Http/Controllers/Services/LookingGlass.php +++ b/app/Http/Controllers/Services/LookingGlass.php @@ -350,7 +350,7 @@ public function routeTable( string $handle, string $network, string $mask, strin public function routeExport( string $handle, string $network, string $mask, string $protocol ): View { return view('services/lg/route' )->with([ - 'content' => json_decode( $this->lg()->protocolRoute( $protocol, $network, (int)$mask ), false ), + 'content' => json_decode( $this->lg()->exportRoute( $protocol, $network, (int)$mask ), false ), 'source' => 'export', 'name' => $protocol, 'lg' => $this->lg(), diff --git a/app/Mail/Utils/SmtpTest.php b/app/Mail/Utils/SmtpTest.php new file mode 100644 index 000000000..b5d702b5b --- /dev/null +++ b/app/Mail/Utils/SmtpTest.php @@ -0,0 +1,51 @@ + + * @package IXP\Mail\Utils + * @copyright Copyright (C) 2009 - 2020 Internet Neutral Exchange Association Company Limited By Guarantee + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 + */ +class SmtpTest extends Mailable +{ + use Queueable, SerializesModels; + + /** + * Build the message. + * + * @return $this + */ + public function build(): self + { + return $this->markdown( 'utils.emails.smtp-test' ) + ->subject( 'SMTP test email from IXP Manager' ); + } +} diff --git a/app/Services/Grapher/Graph.php b/app/Services/Grapher/Graph.php index 291158cf0..1094b0c0e 100644 --- a/app/Services/Grapher/Graph.php +++ b/app/Services/Grapher/Graph.php @@ -662,8 +662,6 @@ public function key(): string * In it's default incarnation, this will **always** fail. You need to explicitly * allow graph access based on your own requirements. * - * UNFINISHED METHOD! - * * @return bool * * @throws diff --git a/app/Services/IXF.php b/app/Services/IXF.php index 6001ff88a..5ff6ba1d1 100644 --- a/app/Services/IXF.php +++ b/app/Services/IXF.php @@ -39,7 +39,7 @@ * @copyright Copyright (C) 2009 - 2024 Internet Neutral Exchange Association Company Limited By Guarantee * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 */ -class IXF extends Exception +class IXF { /** @const Cache key for IXs */ @@ -59,7 +59,7 @@ class IXF extends Exception /** * @var Exception If the api call threw an exception, it is caught and stored here. */ - public Exception $exception; + public ?Exception $exception = null; @@ -93,7 +93,11 @@ public function ixps( ?array $fields = null ): array $ixs = $this->execute( config( 'ixp_api.IXPDB.ixp_api' ) ); if( $ixs === null ) { - throw $this->exception; + if( $this->exception ) { + throw $this->exception; + } else { + throw new Exception( 'IXF ixps error' ); + } } foreach( $ixs->json() as $ix ) { diff --git a/app/Services/PeeringDb.php b/app/Services/PeeringDb.php index 45c6487a3..2b1f6d29c 100644 --- a/app/Services/PeeringDb.php +++ b/app/Services/PeeringDb.php @@ -40,7 +40,7 @@ * @copyright Copyright (C) 2009 - 2024 Internet Neutral Exchange Association Company Limited By Guarantee * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 */ -class PeeringDb extends Exception +class PeeringDb { /** @const Cache key for IXs */ @@ -60,9 +60,9 @@ class PeeringDb extends Exception public int $status = 0; /** - * @var Exception If the api call threw an exception, it is caught and stored here. + * @var ?Exception If the api call threw an exception, it is caught and stored here. */ - public Exception $exception; + public ?Exception $exception; @@ -130,7 +130,11 @@ public function ixps( ?array $fields = null ): array ); if( $ixs === null ) { - throw $this->exception; + if( $this->exception ) { + throw $this->exception; + } else { + throw new Exception( 'Failed to retrieve peering db data' ); + } } foreach( $ixs->json()['data'] as $ix ) { @@ -182,7 +186,11 @@ public function facilities( ?array $fields = null ): array ); if( $facs === null ) { - throw $this->exception; + if( $this->exception ) { + throw $this->exception; + } else { + throw new Exception( 'Failed to retrieve peering db data' ); + } } foreach( $facs->json()['data'] as $fac ) { diff --git a/app/Tasks/Irrdb/UpdateAsnDb.php b/app/Tasks/Irrdb/UpdateAsnDb.php index 944c3ccfc..01f8e7a54 100644 --- a/app/Tasks/Irrdb/UpdateAsnDb.php +++ b/app/Tasks/Irrdb/UpdateAsnDb.php @@ -87,19 +87,19 @@ public function update(): array * Validate a given array of CIDR formatted prefixes for the given protocol and * remove (and alert on) any elements failing validation. * - * @param array $prefixes ASNs from IRRDB + * @param array $entries ASNs from IRRDB * @param int $protocol Either 4/6 * * @return array Valid ASNs */ - protected function validate( array $prefixes, int $protocol ) : array + protected function validate( array $entries, int $protocol ) : array { - foreach( $prefixes as $key => $value ) { + foreach( $entries as $key => $value ) { if( !is_numeric( $value ) || $value <= 0 || $value > 4294967294 ) { - unset( $prefixes[ $key ] ); + unset( $entries[ $key ] ); Log::alert( 'IRRDB CLI action - removing invalid ASN ' . $value . ' from IRRDB result set!' ); } } - return $prefixes; + return $entries; } } diff --git a/app/Tasks/Irrdb/UpdateDb.php b/app/Tasks/Irrdb/UpdateDb.php index 006353f80..701f183ab 100644 --- a/app/Tasks/Irrdb/UpdateDb.php +++ b/app/Tasks/Irrdb/UpdateDb.php @@ -324,10 +324,10 @@ protected function updateDb( array $fromIrrdb, int $protocol, $type = 'prefix' ) /** * Validate ASNs/prefixes. Implement in subclasses. * - * @param array $prefixes + * @param array $entries * @param int $protocol * * @return array */ - abstract protected function validate( array $prefixes, int $protocol ): array; + abstract protected function validate( array $entries, int $protocol ): array; } \ No newline at end of file diff --git a/app/Tasks/Irrdb/UpdatePrefixDb.php b/app/Tasks/Irrdb/UpdatePrefixDb.php index da29c8491..f3f079ef3 100644 --- a/app/Tasks/Irrdb/UpdatePrefixDb.php +++ b/app/Tasks/Irrdb/UpdatePrefixDb.php @@ -92,12 +92,12 @@ public function update(): array * Validate a given array of CIDR formatted prefixes for the given protocol and * remove (and alert on) any elements failing validation. * - * @param array $prefixes Prefixes in CIDR notation + * @param array $entries Prefixes in CIDR notation * @param int $protocol Either 4/6 * * @return array Valid prefixes */ - protected function validate( array $prefixes, int $protocol ): array + protected function validate( array $entries, int $protocol ): array { if( $protocol === 4 ) { $validator = new ValidateIPv4Cidr; @@ -105,13 +105,13 @@ protected function validate( array $prefixes, int $protocol ): array $validator = new ValidateIPv6Cidr; } - foreach( $prefixes as $key => $prefix ) { + foreach( $entries as $key => $prefix ) { if( !$validator->passes( '', $prefix ) ) { - unset( $prefixes[$key] ); + unset( $entries[$key] ); Log::alert( 'IRRDB CLI action - removing invalid prefix ' . $prefix . ' from IRRDB result set!' ); } } - return $prefixes; + return $entries; } } diff --git a/composer.lock b/composer.lock index 5c64755b6..7ea5b4fea 100644 --- a/composer.lock +++ b/composer.lock @@ -628,16 +628,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.4", + "version": "3.8.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd" + "reference": "0e3536ba088a749985c8801105b6b3ac6c1280b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b05e48a745f722801f55408d0dbd8003b403dbbd", - "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0e3536ba088a749985c8801105b6b3ac6c1280b6", + "reference": "0e3536ba088a749985c8801105b6b3ac6c1280b6", "shasum": "" }, "require": { @@ -653,12 +653,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.58", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.16", + "phpstan/phpstan": "1.11.1", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.19", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.9.0", + "squizlabs/php_codesniffer": "3.9.2", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" @@ -721,7 +721,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.4" + "source": "https://github.com/doctrine/dbal/tree/3.8.5" }, "funding": [ { @@ -737,7 +737,7 @@ "type": "tidelift" } ], - "time": "2024-04-25T07:04:44+00:00" + "time": "2024-06-08T17:49:56+00:00" }, { "name": "doctrine/deprecations", @@ -5846,24 +5846,98 @@ ], "time": "2024-04-24T13:22:11+00:00" }, + { + "name": "spatie/error-solutions", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/error-solutions.git", + "reference": "202108314a6988ede156fba1b3ea80a784c1734a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/202108314a6988ede156fba1b3ea80a784c1734a", + "reference": "202108314a6988ede156fba1b3ea80a784c1734a", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/broadcasting": "^10.0|^11.0", + "illuminate/cache": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "livewire/livewire": "^2.11|^3.3.5", + "openai-php/client": "^0.10.1", + "orchestra/testbench": "^7.0|8.22.3|^9.0", + "pestphp/pest": "^2.20", + "phpstan/phpstan": "^1.11", + "psr/simple-cache": "^3.0", + "psr/simple-cache-implementation": "^3.0", + "spatie/ray": "^1.28", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "legacy/ignition", + "Spatie\\ErrorSolutions\\": "src", + "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "This is my package error-solutions", + "homepage": "https://github.com/spatie/error-solutions", + "keywords": [ + "error-solutions", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/error-solutions/issues", + "source": "https://github.com/spatie/error-solutions/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/Spatie", + "type": "github" + } + ], + "time": "2024-06-12T14:49:54+00:00" + }, { "name": "spatie/flare-client-php", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "220a7c8745e9fa427d54099f47147c4b97fe6462" + "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/220a7c8745e9fa427d54099f47147c4b97fe6462", - "reference": "220a7c8745e9fa427d54099f47147c4b97fe6462", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/097040ff51e660e0f6fc863684ac4b02c93fa234", + "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234", "shasum": "" }, "require": { "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", "php": "^8.0", - "spatie/backtrace": "^1.5.2", + "spatie/backtrace": "^1.6.1", "symfony/http-foundation": "^5.2|^6.0|^7.0", "symfony/mime": "^5.2|^6.0|^7.0", "symfony/process": "^5.2|^6.0|^7.0", @@ -5905,7 +5979,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.6.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.7.0" }, "funding": [ { @@ -5913,28 +5987,28 @@ "type": "github" } ], - "time": "2024-05-22T09:45:39+00:00" + "time": "2024-06-12T14:39:14+00:00" }, { "name": "spatie/ignition", - "version": "1.14.2", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "5e11c11f675bb5251f061491a493e04a1a571532" + "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/5e11c11f675bb5251f061491a493e04a1a571532", - "reference": "5e11c11f675bb5251f061491a493e04a1a571532", + "url": "https://api.github.com/repos/spatie/ignition/zipball/e3a68e137371e1eb9edc7f78ffa733f3b98991d2", + "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "php": "^8.0", - "spatie/backtrace": "^1.5.3", - "spatie/flare-client-php": "^1.4.0", + "spatie/error-solutions": "^1.0", + "spatie/flare-client-php": "^1.7", "symfony/console": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, @@ -5996,20 +6070,20 @@ "type": "github" } ], - "time": "2024-05-29T08:10:20+00:00" + "time": "2024-06-12T14:55:22+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57" + "reference": "3c067b75bfb50574db8f7e2c3978c65eed71126c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f52124d50122611e8a40f628cef5c19ff6cc5b57", - "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/3c067b75bfb50574db8f7e2c3978c65eed71126c", + "reference": "3c067b75bfb50574db8f7e2c3978c65eed71126c", "shasum": "" }, "require": { @@ -6018,8 +6092,7 @@ "ext-mbstring": "*", "illuminate/support": "^10.0|^11.0", "php": "^8.1", - "spatie/flare-client-php": "^1.5", - "spatie/ignition": "^1.14", + "spatie/ignition": "^1.15", "symfony/console": "^6.2.3|^7.0", "symfony/var-dumper": "^6.2.3|^7.0" }, @@ -6088,7 +6161,7 @@ "type": "github" } ], - "time": "2024-05-02T13:42:49+00:00" + "time": "2024-06-12T15:01:18+00:00" }, { "name": "symfony/clock", @@ -9190,16 +9263,16 @@ }, { "name": "composer/class-map-generator", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "61804f9973685ec7bead0fb7fe022825e3cd418e" + "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/61804f9973685ec7bead0fb7fe022825e3cd418e", - "reference": "61804f9973685ec7bead0fb7fe022825e3cd418e", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", + "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", "shasum": "" }, "require": { @@ -9243,7 +9316,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.3.3" + "source": "https://github.com/composer/class-map-generator/tree/1.3.4" }, "funding": [ { @@ -9259,7 +9332,7 @@ "type": "tidelift" } ], - "time": "2024-06-10T11:53:54+00:00" + "time": "2024-06-12T14:13:04+00:00" }, { "name": "composer/pcre", @@ -10149,16 +10222,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -10166,11 +10239,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -10196,7 +10270,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -10204,7 +10278,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "netresearch/jsonmapper", diff --git a/config/telescope.php b/config/telescope.php index 2beed6e29..67784992d 100644 --- a/config/telescope.php +++ b/config/telescope.php @@ -62,7 +62,7 @@ | */ - 'enabled' => env('TELESCOPE_ENABLED', true), + 'enabled' => env('TELESCOPE_ENABLED', false), /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2020_06_01_143931_database_schema_at_end_v5.php b/database/migrations/2020_06_01_143931_database_schema_at_end_v5.php index b4121adfe..2bb7ab83e 100644 --- a/database/migrations/2020_06_01_143931_database_schema_at_end_v5.php +++ b/database/migrations/2020_06_01_143931_database_schema_at_end_v5.php @@ -22,8 +22,6 @@ public function up() echo "*** Importing base IXP Manager schema...\n"; DB::connection()->getPdo()->exec( file_get_contents( database_path('schema/2021-as-at-end-v5.sql') ) ); - Artisan::call('update:reset-mysql-views' ); - } /** diff --git a/psalm.xml b/psalm.xml index 7ad76ff69..4f84a18c7 100644 --- a/psalm.xml +++ b/psalm.xml @@ -2,6 +2,8 @@ - + + + + + + diff --git a/psalmhelp.log b/psalmhelp.log deleted file mode 100644 index 75bc86cfd..000000000 --- a/psalmhelp.log +++ /dev/null @@ -1,158 +0,0 @@ -Usage: - psalm [options] [file...] - -Basic configuration: - -c, --config=psalm.xml - Path to a psalm.xml configuration file. Run psalm --init to create one. - - --use-ini-defaults - Use PHP-provided ini defaults for memory and error display - - --memory-limit=LIMIT - Use a specific memory limit. Cannot be combined with --use-ini-defaults - - --disable-extension=[extension] - Used to disable certain extensions while Psalm is running. - - --threads=INT - If greater than one, Psalm will run analysis on multiple threads, speeding things up. - - --no-diff - Turns off Psalm’s diff mode, checks all files regardless of whether they’ve changed. - - --php-version=PHP_VERSION - Explicitly set PHP version to analyse code against. - - --error-level=ERROR_LEVEL - Set the error reporting level - -Surfacing issues: - --show-info[=BOOLEAN] - Show non-exception parser findings (defaults to false). - - --show-snippet[=true] - Show code snippets with errors. Options are 'true' or 'false' - - --find-dead-code[=auto] - --find-unused-code[=auto] - Look for unused code. Options are 'auto' or 'always'. If no value is specified, default is 'auto' - - --find-unused-psalm-suppress - Finds all @psalm-suppress annotations that aren’t used - - --find-references-to=[class|method|property] - Searches the codebase for references to the given fully-qualified class or method, - where method is in the format class::methodName - - --no-suggestions - Hide suggestions - - --taint-analysis - Run Psalm in taint analysis mode – see https://psalm.dev/docs/security_analysis for more info - - --dump-taint-graph=OUTPUT_PATH - Output the taint graph using the DOT language – requires --taint-analysis - -Issue baselines: - --set-baseline=PATH - Save all current error level issues to a file, to mark them as info in subsequent runs - - Add --include-php-versions to also include a list of PHP extension versions - - --use-baseline=PATH - Allows you to use a baseline other than the default baseline provided in your config - - --ignore-baseline - Ignore the error baseline - - --update-baseline - Update the baseline by removing fixed issues. This will not add new issues to the baseline - - Add --include-php-versions to also include a list of PHP extension versions - -Plugins: - --plugin=PATH - Executes a plugin, an alternative to using the Psalm config - -Output: - -m, --monochrome - Enable monochrome output - - --output-format=console - Changes the output format. - Available formats: compact, console, text, emacs, json, pylint, xml, checkstyle, junit, sonarqube, - github, phpstorm, codeclimate, by-issue-level - - --no-progress - Disable the progress indicator - - --long-progress - Use a progress indicator suitable for Continuous Integration logs - - --stats - Shows a breakdown of Psalm’s ability to infer types in the codebase - -Reports: - --report=PATH - The path where to output report file. The output format is based on the file extension. - (Currently supported formats: ".json", ".xml", ".txt", ".emacs", ".pylint", ".console", - ".sarif", "checkstyle.xml", "sonarqube.json", "codeclimate.json", "summary.json", "junit.xml") - - --report-show-info[=BOOLEAN] - Whether the report should include non-errors in its output (defaults to true) - -Caching: - --clear-cache - Clears all cache files that Psalm uses for this specific project - - --clear-global-cache - Clears all cache files that Psalm uses for all projects - - --no-cache - Runs Psalm without using cache - - --no-reflection-cache - Runs Psalm without using cached representations of unchanged classes and files. - Useful if you want the afterClassLikeVisit plugin hook to run every time you visit a file. - - --no-file-cache - Runs Psalm without using caching every single file for later diffing. - This reduces the space Psalm uses on disk and file I/O. - -Miscellaneous: - -h, --help - Display this help message - - -v, --version - Display the Psalm version - - -i, --init [source_dir=src] [level=3] - Create a psalm config file in the current directory that points to [source_dir] - at the required level, from 1, most strict, to 8, most permissive. - - --debug - Debug information - - --debug-by-line - Debug information on a line-by-line level - - --debug-emitted-issues - Print a php backtrace to stderr when emitting issues. - - -r, --root - If running Psalm globally you’ll need to specify a project root. Defaults to cwd - - --generate-json-map=PATH - Generate a map of node references and types in JSON format, saved to the given path. - - --generate-stubs=PATH - Generate stubs for the project and dump the file in the given path - - --shepherd[=endpoint] - Send analysis statistics to Shepherd (shepherd.dev) or your server. - - --alter - Run Psalter - - --language-server - Run Psalm Language Server From 99128d419beb7bdcc0a44ad6e010dcfc6f26b5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Fri, 14 Jun 2024 15:55:33 +0100 Subject: [PATCH 027/145] debug some --- app/Http/Middleware/Authenticate.php | 2 +- app/Http/Middleware/Eloquent2Frontend.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index eb15180eb..2de4fdd05 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -75,7 +75,7 @@ public function __construct( Guard $auth ) public function handle( Request $r, Closure $next ) { /** @var User $us */ - $us = Auth::getUser(); + $us = $this->auth->user(); if( $this->auth->guest() ) { if( $r->ajax() ) { diff --git a/app/Http/Middleware/Eloquent2Frontend.php b/app/Http/Middleware/Eloquent2Frontend.php index b0d0e2c4d..24993f898 100644 --- a/app/Http/Middleware/Eloquent2Frontend.php +++ b/app/Http/Middleware/Eloquent2Frontend.php @@ -58,7 +58,7 @@ class Eloquent2Frontend public function handle( Request $r, Closure $next ) { /** @var User $us */ - $us = Auth::getUser(); + $us = Auth::user(); // get the class and method that has been called: [ $controller, $method ] = explode('@', Route::currentRouteAction() ); From 784749ee0762562be396b8759296247a689b123f Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Fri, 14 Jun 2024 21:35:50 +0100 Subject: [PATCH 028/145] [CI] Fix / revert a previous psalm fix Auth::getUser() returns a cached user if authentication has already happened. ->guest() takes care of this. Auth::user() will return a cached user like getUser() if authentication has already happened or else to the heavy lifting. Unsurpriseingly this only matters in the Authenicate middleware. --- app/Http/Middleware/Authenticate.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 2de4fdd05..28af6e1b7 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -74,9 +74,6 @@ public function __construct( Guard $auth ) */ public function handle( Request $r, Closure $next ) { - /** @var User $us */ - $us = $this->auth->user(); - if( $this->auth->guest() ) { if( $r->ajax() ) { return response('Unauthorized.', 401); @@ -84,7 +81,10 @@ public function handle( Request $r, Closure $next ) return redirect()->guest(route( "login@showForm" ) ); } - // Check if use has at least one customer linked, if not logout + /** @var User $us */ + $us = Auth::user(); + + // Check if use has at least one customer linked, if not logout if( !$us->custid || !CustomerToUser::where( [ 'user_id' => Auth::id() ] )->where( [ 'customer_id' => $us->custid ] )->first() ){ Auth::logout(); return redirect()->guest( route( "login@showForm" ) ); From 773dc3cbbd39e889fd939acdb9147a9e7c50a8a4 Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Fri, 14 Jun 2024 23:05:52 +0100 Subject: [PATCH 029/145] [CI] Refactor for psalm changes --- app/Http/Middleware/Services/Grapher.php | 55 +++++++++--------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/app/Http/Middleware/Services/Grapher.php b/app/Http/Middleware/Services/Grapher.php index b02b25090..121a962ab 100644 --- a/app/Http/Middleware/Services/Grapher.php +++ b/app/Http/Middleware/Services/Grapher.php @@ -104,97 +104,82 @@ private function processParameters( Request $request, GrapherService $grapher ): $target = explode( '/', $request->path() ); $target = array_pop( $target ); - $parameters = []; - - $parameters["period"] = Graph::processParameterPeriod( $request->period ); - $parameters["category"] = Graph::processParameterCategory( $request->category ); - $parameters["protocol"] = Graph::processParameterProtocol( $request->protocol ); - $parameters["type"] = Graph::processParameterType( $request->type ); - switch( $target ) { case 'ixp': - $parameters["id"] = 1; - $graph = $grapher->ixp()->setParamsFromArray( $parameters ); + $graph = $grapher->ixp(); break; case 'infrastructure': $infra = InfrastructureGraph::processParameterInfrastructure( (int)$request->input( 'id', 0 ) ); - $parameters["infrastructure"] = $infra->id; - $graph = $grapher->infrastructure( $infra )->setParamsFromArray( $parameters ); + $graph = $grapher->infrastructure( $infra ); break; case 'vlan': $vlan = VlanGraph::processParameterVlan( (int)$request->input( 'id', 0 ) ); - $parameters["vlan"] = $vlan->id; - $graph = $grapher->vlan( $vlan )->setParamsFromArray( $parameters ); + $graph = $grapher->vlan( $vlan ); break; case 'trunk': $trunkname = TrunkGraph::processParameterTrunkname( (string)$request->input( 'id', '' ) ); - $parameters["trunkname"] = $trunkname; - $graph = $grapher->trunk( $trunkname )->setParamsFromArray( $parameters ); + $graph = $grapher->trunk( $trunkname ); break; case 'corebundle': $corebundle = CoreBundleGraph::processParameterCoreBundle( (int)$request->input( 'id', 0 ) ); $side = CoreBundleGraph::processParameterSide( $request->input( 'side', 'a' ) ); - $parameters["corebundle"] = $corebundle->id; - $parameters["side"] = $side; - $graph = $grapher->coreBundle( $corebundle, $side )->setParamsFromArray( $parameters ); + $graph = $grapher->coreBundle( $corebundle, $side ); break; case 'location': $location = LocationGraph::processParameterLocation( (int)$request->input( 'id', 0 ) ); - $parameters["location"] = $location->id; - $graph = $grapher->location( $location )->setParamsFromArray( $parameters ); + $graph = $grapher->location( $location ); break; case 'switch': $switch = SwitchGraph::processParameterSwitch( (int)$request->input( 'id', 0 ) ); - $parameters["switch"] = $switch->id; - $graph = $grapher->switch( $switch )->setParamsFromArray( $parameters ); + $graph = $grapher->switch( $switch ); break; case 'physicalinterface': $physint = PhysIntGraph::processParameterPhysicalInterface( (int)$request->input( 'id', 0 ) ); - $parameters["physint"] = $physint->id; - $graph = $grapher->physint( $physint )->setParamsFromArray( $parameters ); + $graph = $grapher->physint( $physint ); break; case 'virtualinterface': $virtint = VirtIntGraph::processParameterVirtualInterface( (int)$request->input( 'id', 0 ) ); - $parameters["virtint"] = $virtint->id; - $graph = $grapher->virtint( $virtint )->setParamsFromArray( $parameters ); + $graph = $grapher->virtint( $virtint ); break; case 'customer': $customer = CustomerGraph::processParameterCustomer( (int)$request->input( 'id', 0 ) ); - $parameters["customer"] = $customer->id; - $graph = $grapher->customer( $customer )->setParamsFromArray( $parameters ); + $graph = $grapher->customer( $customer ); break; case 'vlaninterface': $vlanint = VlanIntGraph::processParameterVlanInterface( (int)$request->input( 'id', 0 ) ); - $parameters["vlanint"] = $vlanint->id; - $graph = $grapher->vlanint( $vlanint )->setParamsFromArray( $parameters ); + $graph = $grapher->vlanint( $vlanint ); break; case 'latency': $vli = LatencyGraph::processParameterVlanInterface( (int)$request->input( 'id', 0 ) ); - $parameters["vli"] = $vli; - $graph = $grapher->latency( $vli )->setParamsFromArray( $parameters ); + $graph = $grapher->latency( $vli ); break; case 'p2p': $srcvlanint = P2pGraph::processParameterSourceVlanInterface( (int)$request->input( 'svli', 0 ) ); $dstvlanint = P2pGraph::processParameterDestinationVlanInterface( (int)$request->input( 'dvli', 0 ) ); - $parameters["srcvlanint"] = $srcvlanint->id; - $parameters["dstvlanint"] = $dstvlanint->id; - $graph = $grapher->p2p( $srcvlanint, $dstvlanint )->setParamsFromArray( $parameters ); + $graph = $grapher->p2p( $srcvlanint, $dstvlanint ); break; + default: abort(404, 'No such graph type'); } + + $graph->processParameterPeriod( $request->period ); + $graph->processParameterCategory( $request->category ); + $graph->processParameterProtocol( $request->protocol ); + $graph->processParameterType( $request->type ); + /** @var Graph $graph */ return $graph; } From 0626988ec4e8dd65e2b81c05d35bb720f64f86db Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Fri, 14 Jun 2024 23:06:26 +0100 Subject: [PATCH 030/145] [CI] Set default files --- app/Http/Requests/StatisticsRequest.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/StatisticsRequest.php b/app/Http/Requests/StatisticsRequest.php index eec705711..c92614614 100644 --- a/app/Http/Requests/StatisticsRequest.php +++ b/app/Http/Requests/StatisticsRequest.php @@ -39,7 +39,10 @@ */ class StatisticsRequest extends FormRequest { - public string $period, $category, $protocol, $type; + public ?string $period = null; + public ?string $category = null; + public ?string $protocol = null; + public ?string $type = null; /** * Determine if the user is authorized to make this request. From 9295213eb5b39e42035409962f153f8993db3d9b Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Fri, 14 Jun 2024 23:06:44 +0100 Subject: [PATCH 031/145] [DB] restore database fixes from v6.4 --- 2024_05_29_102028_reset-views.php | 28 ++++++++++++++++++++++++++++ data/ci/ci_test_db.sql | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 2024_05_29_102028_reset-views.php diff --git a/2024_05_29_102028_reset-views.php b/2024_05_29_102028_reset-views.php new file mode 100644 index 000000000..0caab0f2f --- /dev/null +++ b/2024_05_29_102028_reset-views.php @@ -0,0 +1,28 @@ + Date: Fri, 14 Jun 2024 23:07:02 +0100 Subject: [PATCH 032/145] [CI] If changing function param name, route param also needs to match --- routes/web.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 8ec3f3ebf..e26a3aec4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -96,8 +96,8 @@ Route::get( 'trunk/{trunk?}/{category?}', 'StatisticsController@trunk' )->name( 'statistics@trunk' ); Route::get( 'members', 'StatisticsController@members' ); Route::post( 'members', 'StatisticsController@members' )->name( 'statistics@members' ); - Route::get( 'p2p/{cust}', 'StatisticsController@p2p' )->name( 'statistics@p2p-get' ); - Route::post( 'p2p/{cust}', 'StatisticsController@p2p' )->name( 'statistics@p2p' ); + Route::get( 'p2p/{customer?}', 'StatisticsController@p2p' )->name( 'statistics@p2p-get' ); + Route::post( 'p2p/{customer?}', 'StatisticsController@p2p' )->name( 'statistics@p2p' ); Route::get( 'member/{cust?}', 'StatisticsController@member' )->name( 'statistics@member' ); Route::get( 'member-drilldown/{type}/{typeid}', 'StatisticsController@memberDrilldown' )->name( 'statistics@member-drilldown' ); Route::get( 'latency/{vli}/{protocol}', 'StatisticsController@latency' )->name( 'statistics@latency' ); From 739b6badabe344f000ff72d5215f2099cadc7e8b Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Fri, 14 Jun 2024 23:08:21 +0100 Subject: [PATCH 033/145] [CI] Add psalm --- .github/workflows/ci-ex-dusk.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci-ex-dusk.yml b/.github/workflows/ci-ex-dusk.yml index 8ed6c259d..8d1232a95 100644 --- a/.github/workflows/ci-ex-dusk.yml +++ b/.github/workflows/ci-ex-dusk.yml @@ -32,4 +32,6 @@ jobs: php ./artisan serve &>php-built-in.log & - name: Execute tests (Unit and Feature tests) via PHPUnit run: vendor/bin/phpunit --testsuite 'Docstore Test Suite,IXP Manager Test Suite' + - name: Static code analysis + run: vendor/bin/psalm From e10c83433add2c2be4798f52005b8ea04a50f9ac Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Sun, 16 Jun 2024 14:11:44 +0100 Subject: [PATCH 034/145] Update api-reconfigure-example-birdv2.sh to add --fail to success curl call back --- tools/runtime/route-servers/api-reconfigure-example-birdv2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/runtime/route-servers/api-reconfigure-example-birdv2.sh b/tools/runtime/route-servers/api-reconfigure-example-birdv2.sh index bae962616..687bc26bd 100755 --- a/tools/runtime/route-servers/api-reconfigure-example-birdv2.sh +++ b/tools/runtime/route-servers/api-reconfigure-example-birdv2.sh @@ -279,7 +279,7 @@ fi ########################################################################################### # tell IXP Manager the router has been updated: -cmd="curl -s -X POST -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_DONE}/${handle} >/dev/null" +cmd="curl --fail -s -X POST -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_DONE}/${handle} >/dev/null" if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi until eval $cmd; do From b83e2448217fb851fc24006d393dfc673ad6c612 Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Sun, 16 Jun 2024 14:12:18 +0100 Subject: [PATCH 035/145] Update reconfigure-rc-bird2.sh to add curl --fail to the success callback --- tools/runtime/route-collectors/reconfigure-rc-bird2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/runtime/route-collectors/reconfigure-rc-bird2.sh b/tools/runtime/route-collectors/reconfigure-rc-bird2.sh index 2513a5633..964137083 100644 --- a/tools/runtime/route-collectors/reconfigure-rc-bird2.sh +++ b/tools/runtime/route-collectors/reconfigure-rc-bird2.sh @@ -255,7 +255,7 @@ for handle in $HANDLES; do ### Tell IXP Manager that the config is complete and release the lock # tell IXP Manager the router has been updated: - cmd="curl -s -X POST -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_DONE}/${handle} >/dev/null" + cmd="curl --fail -s -X POST -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_DONE}/${handle} >/dev/null" if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi until eval $cmd; do From 6e297c94987127f87bbf7ae6d4602c7630e79eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20L=C3=A1szl=C3=B3?= Date: Tue, 18 Jun 2024 17:49:52 +0100 Subject: [PATCH 036/145] Env Configurator Controller and view --- .phpstorm.meta.php/laravel.meta.php | 33 - _ide_helper.php | 44 +- app/Http/Controllers/Controller.php | 16 + app/Http/Controllers/EnvConfigController.php | 197 + app/Services/DotEnvWriter.php | 16 + composer.lock | 26 +- config/ixp_fe_config.php | 381 +- package-lock.json | 1184 +- public/css/ixp-manager.css | 69 + public/css/ixp-pack.css | 4848 ++- public/css/tailwind.css | 1579 +- public/js/ixp-manager.js | 9 + public/js/ixp-pack.js | 28123 +++++++++++++++- public/mix-manifest.json | 6 +- resources/views/env-config/index.foil.php | 23 + resources/views/layouts/ixpv4.foil.php | 3 +- .../views/layouts/menus/superuser.foil.php | 4 + routes/web-auth-superuser.php | 6 + 18 files changed, 35851 insertions(+), 716 deletions(-) create mode 100644 app/Http/Controllers/EnvConfigController.php create mode 100644 resources/views/env-config/index.foil.php diff --git a/.phpstorm.meta.php/laravel.meta.php b/.phpstorm.meta.php/laravel.meta.php index ebaea8fe8..68280c414 100644 --- a/.phpstorm.meta.php/laravel.meta.php +++ b/.phpstorm.meta.php/laravel.meta.php @@ -126,8 +126,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -245,7 +243,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -372,8 +369,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -491,7 +486,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -618,8 +612,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -737,7 +729,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -864,8 +855,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -983,7 +972,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1110,8 +1098,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1229,7 +1215,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1356,8 +1341,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1475,7 +1458,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1602,8 +1584,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1721,7 +1701,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -1848,8 +1827,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1967,7 +1944,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2094,8 +2070,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -2213,7 +2187,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2340,8 +2313,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -2459,7 +2430,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, @@ -2586,8 +2556,6 @@ 'Illuminate\Foundation\Console\ViewCacheCommand' => \Illuminate\Foundation\Console\ViewCacheCommand::class, 'Illuminate\Foundation\Console\ViewClearCommand' => \Illuminate\Foundation\Console\ViewClearCommand::class, 'Illuminate\Foundation\Console\ViewMakeCommand' => \Illuminate\Foundation\Console\ViewMakeCommand::class, - 'Illuminate\Foundation\Exceptions\Renderer\Listener' => \Illuminate\Foundation\Exceptions\Renderer\Listener::class, - 'Illuminate\Foundation\Exceptions\Renderer\Renderer' => \Illuminate\Foundation\Exceptions\Renderer\Renderer::class, 'Illuminate\Foundation\MaintenanceModeManager' => \Illuminate\Foundation\MaintenanceModeManager::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -2705,7 +2673,6 @@ 'queue.worker' => \Illuminate\Queue\Worker::class, 'redirect' => \Illuminate\Routing\Redirector::class, 'redis' => \Illuminate\Redis\RedisManager::class, - 'redis.connection' => \Illuminate\Redis\Connections\PhpRedisConnection::class, 'router' => \Illuminate\Routing\Router::class, 'session' => \Illuminate\Session\SessionManager::class, 'session.store' => \Illuminate\Session\EncryptedStore::class, diff --git a/_ide_helper.php b/_ide_helper.php index 5e6402d59..7b8c21e86 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -4131,6 +4131,26 @@ { /** @var \Illuminate\Cache\Repository $instance */ return $instance->macroCall($method, $parameters); + } + /** + * Remove all items from the cache. + * + * @return bool + * @static + */ public static function flush() + { + /** @var \Illuminate\Cache\ArrayStore $instance */ + return $instance->flush(); + } + /** + * Get the cache key prefix. + * + * @return string + * @static + */ public static function getPrefix() + { + /** @var \Illuminate\Cache\ArrayStore $instance */ + return $instance->getPrefix(); } /** * Get a lock instance. @@ -4142,7 +4162,7 @@ * @static */ public static function lock($name, $seconds = 0, $owner = null) { - /** @var \Illuminate\Cache\NullStore $instance */ + /** @var \Illuminate\Cache\ArrayStore $instance */ return $instance->lock($name, $seconds, $owner); } /** @@ -4154,28 +4174,8 @@ * @static */ public static function restoreLock($name, $owner) { - /** @var \Illuminate\Cache\NullStore $instance */ + /** @var \Illuminate\Cache\ArrayStore $instance */ return $instance->restoreLock($name, $owner); - } - /** - * Remove all items from the cache. - * - * @return bool - * @static - */ public static function flush() - { - /** @var \Illuminate\Cache\NullStore $instance */ - return $instance->flush(); - } - /** - * Get the cache key prefix. - * - * @return string - * @static - */ public static function getPrefix() - { - /** @var \Illuminate\Cache\NullStore $instance */ - return $instance->getPrefix(); } } /** diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 5c9c0fab5..aaae19002 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -139,4 +139,20 @@ protected function getAllowedPrivs(): array } return $privs; } + + /** + * create an option list for a select input element + * @param array $data array of query data eg. ["model" => 'User', "keys" => 'id', "values" => 'name'] + * @return array + */ + protected function getSelectOptions( array $data): array { + $modelName = "IXP\\Models\\" . $data["model"]; + $model = new $modelName; + $rawList = $model::select($data["keys"],$data["values"])->get(); + $list = []; + foreach($rawList as $raw) { + $list[$raw[$data["keys"]]] = $raw[$data["values"]]; + } + return $list; + } } \ No newline at end of file diff --git a/app/Http/Controllers/EnvConfigController.php b/app/Http/Controllers/EnvConfigController.php new file mode 100644 index 000000000..146d608ce --- /dev/null +++ b/app/Http/Controllers/EnvConfigController.php @@ -0,0 +1,197 @@ + + * @author Barry O'Donovan + * @author Yann Robin + * @category IXP + * @package IXP\Http\Controllers + * @copyright Copyright (C) 2009 - 2021 Internet Neutral Exchange Association Company Limited By Guarantee + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU GPL V2.0 + */ +class EnvConfigController extends Controller +{ + protected DotEnvWriter $envWriter; + protected Former $former; + protected array $panelConfig; + + /** + * The minimum privileges required to access this controller. + * + * If you set this to less than the superuser, you need to manage privileges and access + * within your own implementation yourself. + * + * @var int + */ + public static $minimum_privilege = User::AUTH_SUPERUSER; + + public function __construct(Former $former, DotEnvWriter $envWriter) { + $this->middleware('auth'); + $this->envWriter = $envWriter; + $this->former = $former; + $this->panelConfig = include(config_path('ixp_fe_config.php')); + } + + /** + * Display the form to update the .env + */ + protected function createForm() + { + $envConfig = new $this->envWriter(); + $envValues = $envConfig->getVariables(); + + $form = $this->former::open()->method('POST') + ->id('envForm') + ->action(route('env_config@update')) + ->customInputWidthClass( 'col-8' ) + ->customLabelWidthClass( 'col-4' ) + ->actionButtonsCustomClass( "grey-box"); + $form .= '
    '; + $first = true; + $tabContents = []; + foreach($this->panelConfig["panels"] as $panel => $content) { + $form .= '
  • ' + .'
  • '; + + $tab = '
    '; + + if(isset($content["description"]) && $content["description"] !== "") { + $tab .= '

    '.$content["description"].'

    '; + } + + if(isset($content["fields"]) && count($content["fields"]) > 0) { + foreach($content["fields"] as $field => $param) { + $title = $param["name"]; + if(isset($param["docs_url"]) && $param["docs_url"]) { + $title .= ''; + } + + $value = null; + if(isset($envValues[$param['dotenv_key']])) { + $value = $envValues[$param['dotenv_key']]["value"]; + } + //info($field.': '.var_export($value,1)); + + switch($param["type"]) { + case 'radio': + $input = Former::checkbox($field)->label(' ')->text($title)->check( $value === 'true' ); + break; + case 'select': + if($param["options"]["type"] === 'array') { + $options = $param["options"]["list"]; + } else { + $options = $this->getSelectOptions($param["options"]["list"]); + } + + $input = Former::select($field)->label($title)->options($options,$value)->placeholder('Select an Option')->addClass( 'chzn-select' ); + break; + default: // text + // check value: if it is points to another value grab that and replace it + preg_match_all('/\${([\w\.]+)}/',$value,$matches); + if (count($matches) > 0) { + $search = $matches[0]; + $replace = []; + foreach($matches[1] as $key) { + $replace[] = $envValues[$key]["value"] ?: ''; + } + $value = str_replace($search,$replace,$value); + } + + $input = Former::text($field)->label($title)->value($value); + } + + $tab .= '
    '.$input; + if(isset($param["help"]) && $param["help"] !== '') { + $tab .= '
    '.$param["help"].'
    '; + } + $tab .= '
    '; + } + } + $tab .= '
    '; + $tabContents[] = $tab; + $first = false; + } + + + $form .= '
'; + $form .= implode('',$tabContents).'
'; + $form .= $this->former::actions( + Former::primary_submit( 'Save Changes' )->class( "mb-2 mb-sm-0" ) + ); + $form .= $this->former::close(); + return $form; + } + + + /** + * Display the form to edit an object + */ + protected function index() + { + //AlertContainer::push("test alert",Alert::SUCCESS); + + return view( 'env-config.index' )->with( [ + 'form' => $this->createForm(), + ] ); + } + + /** + * Function to do the actual validation and storing of the submitted object. + * + * @param Request $request + * + * @return bool|RedirectResponse + * + * @throws + */ + public function update( Request $request ) + { + $changes = $request->all(); + info("Changes:\n".var_export($changes, true)); + return true; + } + +} diff --git a/app/Services/DotEnvWriter.php b/app/Services/DotEnvWriter.php index 14d4ded98..9c9accdc3 100644 --- a/app/Services/DotEnvWriter.php +++ b/app/Services/DotEnvWriter.php @@ -221,6 +221,22 @@ public function getAll(): array return $this->variables; } + /** + * Returns the variable collection without empty lines, key as env key + * + * @return array + */ + public function getVariables(): array + { + $varList = []; + foreach($this->variables as $var) { + if(!is_null($var["key"])) { + $varList[$var["key"]] = ["value" => $var["value"], "status" => $var["status"]]; + } + } + return $varList; + } + /** * Write the contents to the env file * diff --git a/composer.lock b/composer.lock index 7ea5b4fea..74095e47f 100644 --- a/composer.lock +++ b/composer.lock @@ -4474,20 +4474,20 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.37", + "version": "3.0.38", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" + "reference": "b18b8788e51156c4dd97b7f220a31149a0052067" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b18b8788e51156c4dd97b7f220a31149a0052067", + "reference": "b18b8788e51156c4dd97b7f220a31149a0052067", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1|^2", + "paragonie/constant_time_encoding": "^1|^2|^3", "paragonie/random_compat": "^1.4|^2.0|^9.99.99", "php": ">=5.6.1" }, @@ -4564,7 +4564,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.38" }, "funding": [ { @@ -4580,7 +4580,7 @@ "type": "tidelift" } ], - "time": "2024-03-03T02:14:58+00:00" + "time": "2024-06-17T10:11:32+00:00" }, { "name": "pimple/pimple", @@ -11246,16 +11246,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.20", + "version": "10.5.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + "reference": "ac837816fa52078f7a5e17ed774f256a72a51af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ac837816fa52078f7a5e17ed774f256a72a51af6", + "reference": "ac837816fa52078f7a5e17ed774f256a72a51af6", "shasum": "" }, "require": { @@ -11327,7 +11327,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.21" }, "funding": [ { @@ -11343,7 +11343,7 @@ "type": "tidelift" } ], - "time": "2024-04-24T06:32:35+00:00" + "time": "2024-06-15T09:13:15+00:00" }, { "name": "psalm/plugin-laravel", diff --git a/config/ixp_fe_config.php b/config/ixp_fe_config.php index ca9a2b73d..dd7ed3013 100644 --- a/config/ixp_fe_config.php +++ b/config/ixp_fe_config.php @@ -15,60 +15,340 @@ // ixp.rpki - - - return [ 'panels' => [ 'frontend_controllers' => [ - 'tabname' => 'Modules', - 'tabdescription' => "These are features that can be enabled or disabled. Some are + 'title' => 'Modules', + 'description' => "These are features that can be enabled or disabled. Some are disabled by default as they may require extra configuration settings.", - 'options' => [ + 'fields' => [ 'console-server-connection' => [ - - // this via config() will give default value 'config_key' => 'ixp_fe.frontend.disabled.console-server-connection', 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_CONSOLE', 'type' => 'radio', 'name' => 'Console Server Connections', 'docs_url' => 'https://docs.ixpmanager.org/features/console-servers/', // can be null - 'help' => "An IXP would typically have out of band access (for emergencies, firmware upgrades, + 'help' => 'An IXP would typically have out of band access (for emergencies, firmware upgrades, etc) to critical infrastructure devices by means of a console server. This - module allows you to record console server port connections.", - + module allows you to record console server port connections.', + ], + 'cust-kit' => [ + 'config_key' => 'ixp_fe.frontend.disabled.cust-kit', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_CUSTKIT', + 'type' => 'radio', + 'name' => 'Customer Kit', + 'docs_url' => null, + 'help' => '', + ], + 'docstore' => [ + 'config_key' => 'ixp_fe.frontend.disabled.docstore', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_DOCSTORE', + 'type' => 'radio', + 'name' => 'Document Store', + 'docs_url' => null, + 'help' => '', + ], + 'docstore_customer' => [ + 'config_key' => 'ixp_fe.frontend.disabled.docstore_customer', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_DOCSTORE_CUSTOMER', + 'type' => 'radio', + 'name' => 'Customer Document Store', + 'docs_url' => null, + 'help' => '', + ], + 'filtered-prefixes' => [ + 'config_key' => 'ixp_fe.frontend.disabled.filtered-prefixes', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_FILTERED_PREFIXES', + 'type' => 'radio', + 'name' => 'Filtered Prefixes', + 'docs_url' => null, + 'help' => '', + ], + 'logs' => [ + 'config_key' => 'ixp_fe.frontend.disabled.logs', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_LOGS', + 'type' => 'radio', + 'name' => 'Logs', + 'docs_url' => null, + 'help' => '', + ], + 'logo' => [ + 'config_key' => 'ixp_fe.frontend.disabled.logo', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_LOGO', + 'type' => 'radio', + 'name' => 'Logo', + 'docs_url' => null, + 'help' => '', + ], + 'lg' => [ + 'config_key' => 'ixp_fe.frontend.disabled.lg', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_LOOKING_GLASS', + 'type' => 'radio', + 'name' => 'Looking Glass', + 'docs_url' => null, + 'help' => '', + ], + 'net-info' => [ + 'config_key' => 'ixp_fe.frontend.disabled.net-info', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_NETINFO', + 'type' => 'radio', + 'name' => 'Net Information', + 'docs_url' => null, + 'help' => '', + ], + 'peering-manager' => [ + 'config_key' => 'ixp_fe.frontend.disabled.peering-manager', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_PEERING_MANAGER', + 'type' => 'radio', + 'name' => 'Peering Manager', + 'docs_url' => null, + 'help' => '', ], + 'peering-matrix' => [ + 'config_key' => 'ixp_fe.frontend.disabled.peering-matrix', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX', + 'type' => 'radio', + 'name' => 'Peering Matrix', + 'docs_url' => null, + 'help' => '', + ], + 'phpinfo' => [ + 'config_key' => 'ixp_fe.frontend.disabled.phpinfo', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_PHPINFO', + 'type' => 'radio', + 'name' => 'PHP Information', + 'docs_url' => null, + 'help' => '', + ], + 'rs-prefixes' => [ + 'config_key' => 'ixp_fe.frontend.disabled.rs-prefixes', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_RS_PREFIXES', + 'type' => 'radio', + 'name' => 'RS Prefixes', + 'docs_url' => null, + 'help' => '', + ], + 'rs-filters' => [ + 'config_key' => 'ixp_fe.frontend.disabled.rs-filters', + 'dotenv_key' => 'IXP_FE_FRONTEND_DISABLED_RS_FILTERS', + 'type' => 'radio', + 'name' => 'RS Filters', + 'docs_url' => null, + 'help' => '', + ], + ], + ], - // 'cust-kit' => env( 'IXP_FE_FRONTEND_DISABLED_CUSTKIT', false ), - // 'docstore' => env( 'IXP_FE_FRONTEND_DISABLED_DOCSTORE', false ), - // 'docstore_customer' => env( 'IXP_FE_FRONTEND_DISABLED_DOCSTORE_CUSTOMER', false ), - // 'filtered-prefixes' => env( 'IXP_FE_FRONTEND_DISABLED_FILTERED_PREFIXES', true ), - // 'logs' => env( 'IXP_FE_FRONTEND_DISABLED_LOGS', false ), - // 'logo' => env( 'IXP_FE_FRONTEND_DISABLED_LOGO', true ), - // 'lg' => env( 'IXP_FE_FRONTEND_DISABLED_LOOKING_GLASS', true ), - // 'net-info' => env( 'IXP_FE_FRONTEND_DISABLED_NETINFO', true ), - // 'peering-manager' => env( 'IXP_FE_FRONTEND_DISABLED_PEERING_MANAGER', false ), - // 'peering-matrix' => env( 'IXP_FE_FRONTEND_DISABLED_PEERING_MATRIX', false ), - // 'phpinfo' => env( 'IXP_FE_FRONTEND_DISABLED_PHPINFO', true ), - // 'ripe-atlas' => true, // not ready for use yet - // 'rs-prefixes' => env( 'IXP_FE_FRONTEND_DISABLED_RS_PREFIXES', true ), - // 'rs-filters' => env( 'IXP_FE_FRONTEND_DISABLED_RS_FILTERS', true ), + 'identity' => [ - ] - ], + 'title' => 'IXP Identity', + 'description' => 'IXP Identity Information.', + + 'fields' => [ + 'legalname' => [ + 'config_key' => 'identity.legalname', + 'dotenv_key' => 'IDENTITY_LEGALNAME', + 'type' => 'text', + 'rules' => '', + 'name' => 'Legal Name', + 'docs_url' => null, + 'help' => '', + ], + 'location.city' => [ + 'config_key' => 'identity.location.city', + 'dotenv_key' => 'IDENTITY_CITY', + 'type' => 'text', + 'rules' => '', + 'name' => 'Location: City', + 'docs_url' => null, + 'help' => '', + ], + 'locationcountry' => [ + 'config_key' => 'identity.location.country', + 'dotenv_key' => 'IDENTITY_COUNTRY', + 'type' => 'text', + 'rules' => '', + 'name' => 'Location: Country', + 'docs_url' => null, + 'help' => '', + ], + 'orgname' => [ + 'config_key' => 'identity.orgname', + 'dotenv_key' => 'IDENTITY_ORGNAME', + 'type' => 'text', + 'rules' => '', + 'name' => 'Organisation Name', + 'docs_url' => null, + 'help' => '', + ], + 'name' => [ + 'config_key' => 'identity.name', + 'dotenv_key' => 'IDENTITY_NAME', + 'type' => 'text', + 'rules' => '', + 'name' => 'Name', + 'docs_url' => null, + 'help' => '', + ], + 'email' => [ + 'config_key' => 'identity.email', + 'dotenv_key' => 'IDENTITY_EMAIL', + 'type' => 'text', + 'rules' => 'nullable|max:255|email', + 'name' => 'Email Address', + 'docs_url' => null, + 'help' => '', + ], + 'testemail' => [ + 'config_key' => 'identity.testemail', + 'dotenv_key' => 'IDENTITY_TESTEMAIL', + 'type' => 'text', + 'rules' => 'nullable|max:255|email', + 'name' => 'Test Email Address', + 'docs_url' => null, + 'help' => '', + ], + 'rsvpemail' => [ + 'config_key' => 'identity.rsvpemail', + 'dotenv_key' => 'IDENTITY_RSVPEMAIL', + 'type' => 'text', + 'rules' => 'nullable|max:255|email', + 'name' => 'RSVP Email Address', + 'docs_url' => null, + 'help' => '', + ], + 'watermark' => [ + 'config_key' => 'identity.watermark', + 'dotenv_key' => 'IDENTITY_WATERMARK', + 'type' => 'text', + 'rules' => '', + 'name' => 'Watermark', + 'docs_url' => null, + 'help' => '', + ], + 'support_email' => [ + 'config_key' => 'identity.support_email', + 'dotenv_key' => 'IDENTITY_SUPPORT_EMAIL', + 'type' => 'text', + 'rules' => 'nullable|max:255|email', + 'name' => 'Support Email Address', + 'docs_url' => null, + 'help' => '', + ], + 'support_phone' => [ + 'config_key' => 'identity.support_phone', + 'dotenv_key' => 'IDENTITY_SUPPORT_PHONE', + 'type' => 'text', + 'rules' => '', + 'name' => 'Support Phone Number', + 'docs_url' => null, + 'help' => '', + ], + 'support_hours' => [ + 'config_key' => 'identity.support_hours', + 'dotenv_key' => 'IDENTITY_SUPPORT_HOURS', + 'type' => 'text', + 'rules' => '', + 'name' => 'Support Hours', + 'docs_url' => null, + 'help' => '', + ], + 'billing_email' => [ + 'config_key' => 'identity.billing_email', + 'dotenv_key' => 'IDENTITY_BILLING_EMAIL', + 'type' => 'text', + 'rules' => 'nullable|max:255|email', + 'name' => 'Billing Email Address', + 'docs_url' => null, + 'help' => '', + ], + 'billing_phone' => [ + 'config_key' => 'identity.billing_phone', + 'dotenv_key' => 'IDENTITY_BILLING_PHONE', + 'type' => 'text', + 'rules' => '', + 'name' => 'Billing Phone Number', + 'docs_url' => null, + 'help' => '', + ], + 'billing_hours' => [ + 'config_key' => 'identity.billing_hours', + 'dotenv_key' => 'IDENTITY_BILLING_HOURS', + 'type' => 'text', + 'rules' => '', + 'name' => 'Billing Hours', + 'docs_url' => null, + 'help' => '', + ], + 'sitename' => [ + 'config_key' => 'identity.sitename', + 'dotenv_key' => 'IDENTITY_SITENAME', + 'type' => 'text', + 'rules' => '', + 'name' => 'Site Name', + 'docs_url' => null, + 'help' => '', + ], + 'titlename' => [ + 'config_key' => 'identity.titlename', + 'dotenv_key' => 'IDENTITY_TITLENAME', + 'type' => 'text', + 'rules' => '', + 'name' => 'Site Title', + 'docs_url' => null, + 'help' => '', + ], + 'corporate_url' => [ + 'config_key' => 'identity.corporate_url', + 'dotenv_key' => 'IDENTITY_CORPORATE_URL', + 'type' => 'text', + 'rules' => '', + 'name' => 'Corporate Url Address', + 'docs_url' => null, + 'help' => '', + ], + 'url' => [ + 'config_key' => 'identity.url', + 'dotenv_key' => 'APP_URL', + 'type' => 'text', + 'rules' => '', + 'name' => 'Url Address', + 'docs_url' => null, + 'help' => '', + ], + 'biglogo' => [ + 'config_key' => 'identity.biglogo', + 'dotenv_key' => 'IDENTITY_BIGLOGO', + 'type' => 'text', + 'rules' => '', + 'name' => 'Big Logo', + 'docs_url' => null, + 'help' => '', + ], + 'vlans.default' => [ + 'config_key' => 'identity.vlans.default', + 'dotenv_key' => 'IDENTITY_DEFAULT_VLAN', + 'type' => 'select', + 'options' => ['type' => 'collection', 'list' => [ 'model' => 'Vlan', 'keys' => 'id', 'values' => 'name' ]], + 'name' => 'Default Vlans', + 'docs_url' => null, + 'help' => '', + ], + ], + ], 'auth' => [ - 'tabname' => 'Authentication', - // 'tabdescription' => "Authentication related options.", + 'title' => 'Authentication', + // 'description' => "Authentication related options.", - 'options' => [ + 'fields' => [ 'login_history' => [ @@ -85,16 +365,16 @@ 'third_party' => [ - 'tabname' => '3rd Parties', - 'tabdescription' => "Configuration options for third party services.", + 'title' => '3rd Parties', + 'description' => "Configuration options for third party services.", - 'options' => [ + 'fields' => [ 'peeringdb_api_key' => [ 'config_key' => 'ixp_api.peeringdb.api_key', 'dotenv_key' => 'IXP_API_PEERING_DB_API_KEY', - 'type' => 'test', + 'type' => 'text', 'name' => "PeeringDB API Key", 'docs_url' => 'https://docs.peeringdb.com/howto/api_keys/', 'help' => "IXP Manager uses information from PeeringDB in a number of places. Setting an API @@ -107,31 +387,29 @@ ], - 'admin_options' => [ - 'tabname' => 'Admin', - 'tabdescription' => "Various administrator related options.", + 'title' => 'Admin', + 'description' => "Various administrator related options.", - 'options' => [ + 'fields' => [ 'default_graph_period' => [ 'config_key' => 'ixp_fe.admin.default_graph_period', 'dotenv_key' => 'IXP_FE_ADMIN_DASHBOARD_DEFAULT_GRAPH_PERIOD', 'type' => 'select', - 'options' => IXP\Services\Grapher\Graph::PERIODS, + 'options' => ['type' => 'array', 'list' => IXP\Services\Grapher\Graph::PERIODS], 'name' => "Admin Dashbaord Graph Period", 'help' => 'Default graph period on the admin dashboard.', ], - 'billing-updates-notification' => [ 'config_key' => 'ixp_fe.frontend.billing-updates.notification', 'dotenv_key' => 'IXP_FE_BILLING_UPDATES', - 'type' => 'email', + 'type' => 'text', 'rules' => 'nullable|max:255|email', 'name' => 'Billing Updates Notification', 'docs_url' => 'https://docs.ixpmanager.org/usage/customers/#notification-of-billing-details-changed', @@ -145,34 +423,27 @@ 'misc_options' => [ - 'tabname' => 'Miscellaneous', - 'tabdescription' => "These are various frontend options which you can tweak as appropriate.", + 'title' => 'Miscellaneous', + 'description' => "These are various frontend options which you can tweak as appropriate.", - 'options' => [ + 'fields' => [ 'rs-filters-ttl' => [ - // this via config() will give default value 'config_key' => 'ixp_fe.frontend.rs-filters.ttl', 'dotenv_key' => 'IXP_FE_RS_FILTERS_TIME_TO_LIVE', 'type' => 'textarea', 'rules' => 'nullable|max:1024', 'name' => 'Route Server Update Period', - // 'docs_url' => '' + //'docs_url' => '', 'help' => "If you have enabled the route server community filtering via UI option, then your members will need to know how often you update their configurations. The text you enter here will be displayed on the route server filters page.", ], + ], + ], - - - ] - - ] - - - - ] + ], ]; diff --git a/package-lock.json b/package-lock.json index a5edaf32a..90b28d5bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "ixpm-inex", + "name": "ibn-ixp-manager", "version": "1.7.1", "lockfileVersion": 3, "requires": true, @@ -66,11 +66,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", - "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.24.6", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -78,28 +78,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", - "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", - "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helpers": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/traverse": "^7.24.6", - "@babel/types": "^7.24.6", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -115,11 +115,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", - "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dependencies": { - "@babel/types": "^7.24.6", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -129,34 +129,35 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", - "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", - "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", - "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -166,18 +167,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", - "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-member-expression-to-functions": "^7.24.6", - "@babel/helper-optimise-call-expression": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -188,11 +189,11 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", - "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -219,68 +220,73 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", - "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", - "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", - "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", - "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", - "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", - "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -290,32 +296,32 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", - "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", - "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", - "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-wrap-function": "^7.24.6" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -325,13 +331,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", - "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-member-expression-to-functions": "^7.24.6", - "@babel/helper-optimise-call-expression": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -341,93 +347,96 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", - "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", - "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", - "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", - "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", - "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", - "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", - "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dependencies": { - "@babel/helper-function-name": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", - "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", - "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -437,9 +446,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", - "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -448,12 +457,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", - "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -463,11 +472,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", - "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -477,13 +486,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", - "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", - "@babel/plugin-transform-optional-chaining": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -493,12 +502,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", - "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -646,11 +655,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.6.tgz", - "integrity": "sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -660,11 +669,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", - "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -674,11 +683,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", - "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -710,11 +719,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz", - "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -818,11 +827,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz", - "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -847,11 +856,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", - "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -861,13 +870,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", - "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-remap-async-to-generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -878,13 +887,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", - "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dependencies": { - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-remap-async-to-generator": "^7.24.6" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -894,11 +903,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", - "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -908,11 +917,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", - "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -922,12 +931,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", - "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -937,12 +946,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", - "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -953,17 +962,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", - "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -974,12 +983,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", - "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/template": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -989,11 +998,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", - "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1003,12 +1012,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", - "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1018,11 +1027,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", - "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1032,11 +1041,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", - "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1047,12 +1056,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", - "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1062,11 +1071,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", - "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1077,12 +1086,12 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.6.tgz", - "integrity": "sha512-1l8b24NoCpaQ13Vi6FtLG1nv6kNoi8PWvQb1AYO7GHZDpFfBYc3lbXArx1lP2KRt8b4pej1eWc/zrRmsQTfOdQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz", + "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-flow": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-flow": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1092,12 +1101,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", - "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1107,13 +1116,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", - "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1123,11 +1132,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", - "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1138,11 +1147,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", - "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1152,11 +1161,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", - "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1167,11 +1176,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", - "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1181,12 +1190,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", - "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1196,13 +1205,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", - "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1212,14 +1221,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", - "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dependencies": { - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1229,12 +1238,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", - "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1244,12 +1253,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", - "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1259,11 +1268,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", - "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1273,11 +1282,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", - "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1288,11 +1297,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", - "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1303,14 +1312,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", - "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.6" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1320,12 +1329,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", - "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1335,11 +1344,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", - "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1350,12 +1359,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", - "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1366,11 +1375,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", - "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1380,12 +1389,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", - "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1395,13 +1404,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", - "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1412,11 +1421,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", - "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1426,11 +1435,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", - "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1441,11 +1450,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", - "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1455,13 +1464,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.6.tgz", - "integrity": "sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1475,11 +1484,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", - "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1489,12 +1498,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", - "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1504,11 +1513,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", - "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1518,11 +1527,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", - "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1532,11 +1541,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", - "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1546,14 +1555,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz", - "integrity": "sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-typescript": "^7.24.6" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1563,11 +1572,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", - "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1577,12 +1586,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", - "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1592,12 +1601,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", - "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1607,12 +1616,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", - "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1622,26 +1631,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", - "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", - "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.6", - "@babel/plugin-syntax-import-attributes": "^7.24.6", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1653,54 +1662,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.6", - "@babel/plugin-transform-async-generator-functions": "^7.24.6", - "@babel/plugin-transform-async-to-generator": "^7.24.6", - "@babel/plugin-transform-block-scoped-functions": "^7.24.6", - "@babel/plugin-transform-block-scoping": "^7.24.6", - "@babel/plugin-transform-class-properties": "^7.24.6", - "@babel/plugin-transform-class-static-block": "^7.24.6", - "@babel/plugin-transform-classes": "^7.24.6", - "@babel/plugin-transform-computed-properties": "^7.24.6", - "@babel/plugin-transform-destructuring": "^7.24.6", - "@babel/plugin-transform-dotall-regex": "^7.24.6", - "@babel/plugin-transform-duplicate-keys": "^7.24.6", - "@babel/plugin-transform-dynamic-import": "^7.24.6", - "@babel/plugin-transform-exponentiation-operator": "^7.24.6", - "@babel/plugin-transform-export-namespace-from": "^7.24.6", - "@babel/plugin-transform-for-of": "^7.24.6", - "@babel/plugin-transform-function-name": "^7.24.6", - "@babel/plugin-transform-json-strings": "^7.24.6", - "@babel/plugin-transform-literals": "^7.24.6", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", - "@babel/plugin-transform-member-expression-literals": "^7.24.6", - "@babel/plugin-transform-modules-amd": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/plugin-transform-modules-systemjs": "^7.24.6", - "@babel/plugin-transform-modules-umd": "^7.24.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", - "@babel/plugin-transform-new-target": "^7.24.6", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", - "@babel/plugin-transform-numeric-separator": "^7.24.6", - "@babel/plugin-transform-object-rest-spread": "^7.24.6", - "@babel/plugin-transform-object-super": "^7.24.6", - "@babel/plugin-transform-optional-catch-binding": "^7.24.6", - "@babel/plugin-transform-optional-chaining": "^7.24.6", - "@babel/plugin-transform-parameters": "^7.24.6", - "@babel/plugin-transform-private-methods": "^7.24.6", - "@babel/plugin-transform-private-property-in-object": "^7.24.6", - "@babel/plugin-transform-property-literals": "^7.24.6", - "@babel/plugin-transform-regenerator": "^7.24.6", - "@babel/plugin-transform-reserved-words": "^7.24.6", - "@babel/plugin-transform-shorthand-properties": "^7.24.6", - "@babel/plugin-transform-spread": "^7.24.6", - "@babel/plugin-transform-sticky-regex": "^7.24.6", - "@babel/plugin-transform-template-literals": "^7.24.6", - "@babel/plugin-transform-typeof-symbol": "^7.24.6", - "@babel/plugin-transform-unicode-escapes": "^7.24.6", - "@babel/plugin-transform-unicode-property-regex": "^7.24.6", - "@babel/plugin-transform-unicode-regex": "^7.24.6", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1716,13 +1725,13 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.6.tgz", - "integrity": "sha512-huoe0T1Qs9fQhMWbmqE/NHUeZbqmHDsN6n/jYvPcUUHfuKiPV32C9i8tDhMbQ1DEKTjbBP7Rjm3nSLwlB2X05g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", + "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-transform-flow-strip-types": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1745,15 +1754,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.6.tgz", - "integrity": "sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-syntax-jsx": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/plugin-transform-typescript": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1786,9 +1795,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", - "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1797,31 +1806,31 @@ } }, "node_modules/@babel/template": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", - "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", - "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1830,12 +1839,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", - "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2130,9 +2139,9 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "20.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", "dependencies": { "undici-types": "~5.26.4" } @@ -3681,9 +3690,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "funding": [ { "type": "opencollective", @@ -3699,10 +3708,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -3784,6 +3793,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -3943,9 +3953,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001621", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", - "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", "funding": [ { "type": "opencollective", @@ -4028,9 +4038,9 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "engines": { "node": ">=6.0" } @@ -5168,9 +5178,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -5756,9 +5766,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.782", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.782.tgz", - "integrity": "sha512-JUfU61e8tr+i5Y1FKXcKs+Xe+rJ+CEqm4cgv1kMihPE2EvYHmYyVr3Im/+1+Z5B29Be2EEGCZCwAc6Tazdl1Yg==" + "version": "1.4.805", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", + "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==" }, "node_modules/elliptic": { "version": "6.5.5", @@ -6795,9 +6805,9 @@ } }, "node_modules/flow-parser": { - "version": "0.236.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.236.0.tgz", - "integrity": "sha512-0OEk9Gr+Yj7wjDW2KgaNYUypKau71jAfFyeLQF5iVtxqc6uJHag/MT7pmaEApf4qM7u86DkBcd4ualddYMfbLw==", + "version": "0.238.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.238.0.tgz", + "integrity": "sha512-VE7XSv1epljsIN2YeBnxCmGJihpNIAnLLu/pPOdA+Gkso7qDltJwUi6vfHjgxdBbjSdAuPGnhuOHJUQG+yYwIg==", "engines": { "node": ">=0.4.0" } @@ -6857,9 +6867,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -7243,6 +7253,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8943,9 +8954,9 @@ } }, "node_modules/jackspeak": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", - "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -9081,9 +9092,9 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -9101,9 +9112,9 @@ "dev": true }, "node_modules/jquery-ui-dist": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.13.2.tgz", - "integrity": "sha512-oVDRd1NLtTbBwpRKAYdIRgpWVDzeBhfy7Gu0RmY6JEaZtmBq6kDn1pm5SgDiAotrnDS+RoTRXO6xvcNTxA9tOA==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.13.3.tgz", + "integrity": "sha512-qeTR3SOSQ0jgxaNXSFU6+JtxdzNUSJKgp8LCzVrVKntM25+2YBJW1Ea8B2AwjmmSHfPLy2dSlZxJQN06OfVFhg==", "dev": true, "dependencies": { "jquery": ">=1.8.0 <4.0.0" @@ -10802,9 +10813,9 @@ } }, "node_modules/nan": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", - "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", "optional": true }, "node_modules/nanoid": { @@ -13421,6 +13432,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, "engines": { "node": ">=0.6.0", @@ -14164,6 +14176,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -14295,9 +14308,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.77.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", - "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -15708,9 +15721,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -15949,9 +15962,9 @@ } }, "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" @@ -16382,9 +16395,9 @@ "dev": true }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tty-browserify": { "version": "0.0.0", @@ -18145,9 +18158,9 @@ } }, "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "dependencies": { "async-limiter": "~1.0.0" @@ -18172,9 +18185,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", - "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -18576,6 +18589,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, diff --git a/public/css/ixp-manager.css b/public/css/ixp-manager.css index 1171765d6..c8fb6be7c 100644 --- a/public/css/ixp-manager.css +++ b/public/css/ixp-manager.css @@ -688,3 +688,72 @@ td a:hover{ opacity: 1; /* Firefox */ } + + +/***** Tab Panels START *****/ +.tabNavMenu{ + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; + border-bottom: 1px solid rgba(0,0,0,.125); +} +.tabButton { + margin-bottom: -1px; + padding: .5rem 1rem; + background-color: transparent; + border: 1px solid transparent; + border-bottom: 0; + border-top-left-radius: .5rem; + border-top-right-radius: .5rem; + color: #718096; + font-size: .85em; + margin-right: .25rem; +} +.tabButton:hover { + border-color: rgba(0,0,0,.075); +} +.tabButton.active { + color: #4a5568; + background-color: #fff; + border-color: rgba(0,0,0,.125); +} +.tabContent {} +.tabContent .tabPanel { + overflow: hidden; + box-sizing: border-box; + padding: 0; + height: 0; + border: none; + border-bottom-left-radius: .5rem; + border-bottom-right-radius: .5rem; + opacity: 0; + transition: opacity 500ms; +} +.tabContent .tabPanel.active { + opacity: 1; + border: 1px solid rgba(0,0,0,.125); + border-top: none; + height: auto; + padding: 1rem 1.5rem; +} +.tabContent .tabPanel .description { + font-size: 0.9rem; + color: #718096; +} +.inputWrapper { + margin-bottom: 2rem; +} +.inputWrapper .form-group { + margin-bottom: 0; +} +.inputWrapper .form-group .form-check label { + display: block; + font-size: .875rem; + font-weight: 700; + color: rgb(96 111 123); +} +/***** Tab Panels END *******/ diff --git a/public/css/ixp-pack.css b/public/css/ixp-pack.css index 63383359e..d08976e5f 100644 --- a/public/css/ixp-pack.css +++ b/public/css/ixp-pack.css @@ -3,7 +3,4851 @@ * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:.875em;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentcolor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}:root{--dt-row-selected:2,117,216;--dt-row-selected-text:255,255,255;--dt-row-selected-link:9,10,11;--dt-row-stripe:0,0,0;--dt-row-hover:0,0,0;--dt-column-ordering:0,0,0;--dt-html-background:white}:root.dark{--dt-html-background:rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0,0,0,.5);content:"▶"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}:root[data-bs-theme=dark] table.dataTable td.dt-control:before,html.dark table.dataTable td.dt-control:before{color:rgba(255,255,255,.5)}:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255,255,255,.5)}table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_desc_disabled,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after{opacity:.6}table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after{display:none}table.dataTable thead>tr>td:active,table.dataTable thead>tr>th:active{outline:0}div.dataTables_scrollBody>table.dataTable>thead>tr>td:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>th:before{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px;z-index:10}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0275d8;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}table.dataTable.nowrap td,table.dataTable.nowrap th{white-space:nowrap}table.dataTable td.dt-left,table.dataTable th.dt-left{text-align:left}table.dataTable td.dataTables_empty,table.dataTable td.dt-center,table.dataTable th.dt-center{text-align:center}table.dataTable td.dt-right,table.dataTable th.dt-right{text-align:right}table.dataTable td.dt-justify,table.dataTable th.dt-justify{text-align:justify}table.dataTable td.dt-nowrap,table.dataTable th.dt-nowrap{white-space:nowrap}table.dataTable tfoot td,table.dataTable tfoot th,table.dataTable thead td,table.dataTable thead th{text-align:left}table.dataTable tfoot td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable thead th.dt-head-left{text-align:left}table.dataTable tfoot td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable thead th.dt-head-center{text-align:center}table.dataTable tfoot td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable thead th.dt-head-right{text-align:right}table.dataTable tfoot td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable thead th.dt-head-justify{text-align:justify}table.dataTable tfoot td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable thead th.dt-head-nowrap{white-space:nowrap}table.dataTable tbody td.dt-body-left,table.dataTable tbody th.dt-body-left{text-align:left}table.dataTable tbody td.dt-body-center,table.dataTable tbody th.dt-body-center{text-align:center}table.dataTable tbody td.dt-body-right,table.dataTable tbody th.dt-body-right{text-align:right}table.dataTable tbody td.dt-body-justify,table.dataTable tbody th.dt-body-justify{text-align:justify}table.dataTable tbody td.dt-body-nowrap,table.dataTable tbody th.dt-body-nowrap{white-space:nowrap}table.dataTable{clear:both;margin-top:6px!important;margin-bottom:6px!important;max-width:none!important;border-collapse:separate!important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap td,table.dataTable.nowrap th{white-space:nowrap}table.dataTable.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0275d8;box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable.table-striped>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.05)}table.dataTable.table-striped>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(2,117,216,.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.95)}table.dataTable.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.075)}table.dataTable.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(2,117,216,.975);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.975)}div.dataTables_wrapper div.dataTables_length label{font-weight:400;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:400;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_scrollHead table.dataTable{margin-bottom:0!important}div.dataTables_scrollBody>table{border-top:none;margin-top:0!important;margin-bottom:0!important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:after,div.dataTables_scrollBody>table>thead .sorting_desc:before{display:none}div.dataTables_scrollBody>table>tbody tr:first-child td,div.dataTables_scrollBody>table>tbody tr:first-child th{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0!important;border-top:none}@media screen and (max-width:767px){div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center!important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable td,table.table-bordered.dataTable th{border-left-width:0}table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable th:last-child{border-right-width:1px}table.table-bordered.dataTable tbody td,table.table-bordered.dataTable tbody th{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}/*! + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:.875em;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentcolor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ +:root{--dt-row-selected: 2, 117, 216;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"▶"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px;z-index:10}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(2, 117, 216);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgb(2, 117, 216);box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable.table-striped>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.05)}table.dataTable.table-striped>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95)}table.dataTable.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.075)}table.dataTable.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.975);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.975)}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:before,div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody tr:first-child th,div.dataTables_scrollBody>table>tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} + +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} + +/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.7.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}:root{--dt-row-selected:2,117,216;--dt-row-selected-text:255,255,255;--dt-row-selected-link:9,10,11;--dt-row-stripe:0,0,0;--dt-row-hover:0,0,0;--dt-column-ordering:0,0,0;--dt-html-background:white}:root.dark{--dt-html-background:rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0,0,0,.5);content:"▶"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}:root[data-bs-theme=dark] table.dataTable td.dt-control:before,html.dark table.dataTable td.dt-control:before{color:rgba(255,255,255,.5)}:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255,255,255,.5)}table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_desc_disabled,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after{opacity:.6}table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after{display:none}table.dataTable thead>tr>td:active,table.dataTable thead>tr>th:active{outline:0}div.dataTables_scrollBody>table.dataTable>thead>tr>td:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>th:before{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px;z-index:10}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0275d8;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}table.dataTable.nowrap td,table.dataTable.nowrap th{white-space:nowrap}table.dataTable td.dt-left,table.dataTable th.dt-left{text-align:left}table.dataTable td.dataTables_empty,table.dataTable td.dt-center,table.dataTable th.dt-center{text-align:center}table.dataTable td.dt-right,table.dataTable th.dt-right{text-align:right}table.dataTable td.dt-justify,table.dataTable th.dt-justify{text-align:justify}table.dataTable td.dt-nowrap,table.dataTable th.dt-nowrap{white-space:nowrap}table.dataTable tfoot td,table.dataTable tfoot th,table.dataTable thead td,table.dataTable thead th{text-align:left}table.dataTable tfoot td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable thead th.dt-head-left{text-align:left}table.dataTable tfoot td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable thead th.dt-head-center{text-align:center}table.dataTable tfoot td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable thead th.dt-head-right{text-align:right}table.dataTable tfoot td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable thead th.dt-head-justify{text-align:justify}table.dataTable tfoot td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable thead th.dt-head-nowrap{white-space:nowrap}table.dataTable tbody td.dt-body-left,table.dataTable tbody th.dt-body-left{text-align:left}table.dataTable tbody td.dt-body-center,table.dataTable tbody th.dt-body-center{text-align:center}table.dataTable tbody td.dt-body-right,table.dataTable tbody th.dt-body-right{text-align:right}table.dataTable tbody td.dt-body-justify,table.dataTable tbody th.dt-body-justify{text-align:justify}table.dataTable tbody td.dt-body-nowrap,table.dataTable tbody th.dt-body-nowrap{white-space:nowrap}table.dataTable{clear:both;margin-top:6px!important;margin-bottom:6px!important;max-width:none!important;border-collapse:separate!important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap td,table.dataTable.nowrap th{white-space:nowrap}table.dataTable.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0275d8;box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable.table-striped>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.05)}table.dataTable.table-striped>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(2,117,216,.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.95)}table.dataTable.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.075)}table.dataTable.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(2,117,216,.975);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.975)}div.dataTables_wrapper div.dataTables_length label{font-weight:400;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:400;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_scrollHead table.dataTable{margin-bottom:0!important}div.dataTables_scrollBody>table{border-top:none;margin-top:0!important;margin-bottom:0!important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:after,div.dataTables_scrollBody>table>thead .sorting_desc:before{display:none}div.dataTables_scrollBody>table>tbody tr:first-child td,div.dataTables_scrollBody>table>tbody tr:first-child th{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0!important;border-top:none}@media screen and (max-width:767px){div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center!important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable td,table.table-bordered.dataTable th{border-left-width:0}table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable th:last-child{border-right-width:1px}table.table-bordered.dataTable tbody td,table.table-bordered.dataTable tbody th{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child{cursor:default!important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before{display:none!important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control{cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before{margin-right:.5em;display:inline-block;color:rgba(0,0,0,.5);content:"►"}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control.arrow-right::before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control.arrow-right::before{content:"◄"}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th.dtr-control:before{content:"▼"}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th.dtr-control{padding-left:.333em}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>td.dtr-control,table.dataTable.dtr-column>tbody>tr>th.control,table.dataTable.dtr-column>tbody>tr>th.dtr-control{cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>td.dtr-control:before,table.dataTable.dtr-column>tbody>tr>th.control:before,table.dataTable.dtr-column>tbody>tr>th.dtr-control:before{display:inline-block;color:rgba(0,0,0,.5);content:"►"}table.dataTable.dtr-column>tbody>tr>td.control.arrow-right::before,table.dataTable.dtr-column>tbody>tr>td.dtr-control.arrow-right::before,table.dataTable.dtr-column>tbody>tr>th.control.arrow-right::before,table.dataTable.dtr-column>tbody>tr>th.dtr-control.arrow-right::before{content:"◄"}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent td.dtr-control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before,table.dataTable.dtr-column>tbody>tr.parent th.dtr-control:before{content:"▼"}table.dataTable>tbody>tr.child{padding:.5em 1em}table.dataTable>tbody>tr.child:hover{background:0 0!important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:1px solid #efefef;padding:.5em 0}table.dataTable>tbody>tr.child ul.dtr-details>li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details>li:last-child{padding-bottom:0;border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:700}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:fit-content;max-height:75%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid #000;border-radius:.5em;box-shadow:0 12px 30px rgba(0,0,0,.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:2.5em}div.dtr-modal div.dtr-modal-content h2{margin-top:0}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,.6)}@media screen and (max-width:767px){div.dtr-modal div.dtr-modal-display{width:95%}}html.dark table.dataTable>tbody>tr>td.dtr-control:before{color:rgba(255,255,255,.5)!important}html.dark table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom-color:#404346}html.dark div.dtr-modal div.dtr-modal-display{background-color:#212529;border:1px solid rgba(255,255,255,.15)}div.dtr-bs-modal table.table tr:first-child td{border-top:none}#navbarSupportedContent a{font-size:15px}@media (max-width:768px){#side-navbar{display:block;margin-left:-220px;width:220px!important;height:96%;overflow:scroll;transition:all .3s ease}#side-navbar.active{margin-left:0;z-index:200;position:absolute;display:block!important}#slide-reveal-overlay{position:fixed;left:0;height:100%;width:100%;z-index:100;background-color:rgba(0,0,0,.5)}}@media (max-width:992px){#side-navbar .nav-item a{font-size:.9rem}#side-navbar h6{font-size:.9rem}}@media (min-width:992px){#navbarSupportedContent a{font-size:14px}#div-header-select-customer{width:150px}}@media (min-width:992px) and (max-width:1205px){.navbar-expand-lg #navbarSupportedContent .navbar-nav .nav-link{padding-right:.3rem;padding-left:.3rem}}@media (min-width:1200px){#div-header-select-customer{width:175px}}.former-help-text{display:none}.form-check input[type=checkbox]{margin-right:10px!important}.reset-button-well{float:right;position:absolute;margin-left:55%}.table_view_info{border-collapse:separate;border-spacing:15px 15px}.table_view_info tr td{vertical-align:top}.dropdown-submenu{position:relative!important}.dropdown-submenu .dropdown-menu-l{top:0;left:-163px;margin-top:-1px}.former-input-col-sm-6 .form-group>div{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.former-label-col-sm-6 .form-group>label{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.fa-facebook:hover{color:#3b5998}.fa-twitter:hover{color:#4099ff}.fa-linkedin:hover{color:#007bb5}.fa-github:hover,.fa-globe:hover{color:grey}.dropup .dropdown-toggle:after{margin-top:4px}.error-border-select{border:1px solid #dc3545!important}.valid-border-select{border:1px solid #28a745!important}.a-disabled{pointer-events:none;cursor:default;opacity:.6}.cursor-pointer{cursor:pointer}.center-dd-caret:after{margin-bottom:auto;margin-top:auto}.cursor-default{pointer-events:none;cursor:default}.dataTable .dropdown-item:focus,.dropdown-item:hover{width:auto;color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active:hover{background-color:#005bc3!important;color:#fff!important}@media (max-width:576px){.h2{font-size:1.6rem}}@media (min-width:768px){#div-header-select-customer{width:300px}}.no-padding{padding:0!important}.padding-10{padding:10px 15px!important}.mono{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.ixpm-select-input-xs{height:20px;line-height:20px}.page-content{background-color:#fff!important;padding:20px;margin:0 -20px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15);-moz-box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:0 1px 2px rgba(0,0,0,.15)}.list_preamble_container{display:block}.list_preamble{display:block;text-align:right}.pm-table{margin-bottom:18px;margin-left:auto;margin-right:auto}.pm-table th{padding:0;text-align:center;vertical-align:bottom;border:1px solid #ddd;border-bottom-width:2px;border-top:none;font-weight:700}.pm-table th.asn{cursor:hand;cursor:pointer}.pm-table th:last-child{border-right-width:2px}.pm-table td{text-align:center;vertical-align:top;border:1px solid #ddd}.pm-table td.peering{cursor:hand;cursor:pointer}.pm-table td.zoom1{padding:0 1px;font-size:8px;line-height:12px}.pm-table td.zoom2{padding:2px 4px;font-size:11px;line-height:15px}.pm-table td.zoom3{padding:4px 8px;font-size:13px;line-height:18px}.pm-table td.zoom4{padding:6px 10px;font-size:15px;line-height:20px}.pm-table td.zoom5{padding:8px 12px;font-size:18px;line-height:24px}.pm-table th.zoom1{font-size:8px;line-height:12px}.pm-table th.zoom2{font-size:11px;line-height:15px}.pm-table th.zoom3{font-size:13px;line-height:18px}.pm-table th.zoom4{font-size:15px;line-height:20px}.pm-table th.zoom5{font-size:18px;line-height:24px}.pm-table td:last-child{border-right-width:2px}.pm-table th.name{border-left:none;border-right:none;border-top:none}.pm-table th.asn{border-left:none;border-top:none;border-right-width:2px}.pm-table td.name{text-align:left;border-left:none;border-right:none;font-weight:700}.pm-table td.asn{text-align:right;border-left:none;border-right-width:2px;font-weight:700}.pm-table tr:last-child{border-bottom-width:2px}.pm-table td.peered{background-color:#0c0;width:10px}.pm-table td.not-peered{background-color:#d63030;width:10px}.pm-table td.bilateral-rs{width:10px}.pm-table td.rs-only{width:10px}.pm-table td.bilateral-only{width:10px}.pm-table colgroup.hover,.pm-table td.hover,.pm-table tr.hover{background-color:#eee;border-left:2px solid #555;border-right:2px solid #555}.pm-table td.hover2{border-left:1px solid #555;border-right:1px solid #555}.pm-table td.highlight,.pm-table th.highlight{background-color:#fcf6cf}.pm-table td.highlight2,.pm-table th.highlight2{background-color:#eee}.controls-fieldset-bordered{margin-left:90px}.legend-fieldset-bordered{font-size:14px;line-height:20px;margin-bottom:0;border-style:none none none;width:none;padding:5px}.fieldset-bordered{border:1px solid #ccc;padding:10px;border-radius:4px 4px 4px 4px;transition:border .2s linear 0s,box-shadow .2s linear 0s}.info_box .title{position:relative;top:-30px;margin-left:0;padding:2px 7px;display:inline;font-size:1em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:1px solid #ddd;background-color:#fafafa;background-color:#f9f9f9;background-image:-moz-linear-gradient(top,#fff,#f0f0f0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f0f0f0));background-image:-webkit-linear-gradient(top,#fff,#f0f0f0);background-image:-o-linear-gradient(top,#fff,#f0f0f0);background-image:linear-gradient(to bottom,#fff,#f0f0f0);background-repeat:repeat-x}.info_box .title a{color:#555;text-decoration:none}.info_box .content{margin-top:-10px}.dropdown-menu li{display:block}.droppable{border:#ccc 1px solid;border-radius:8px;background:#eee;color:#666;padding:20px;margin:10px;clear:both;text-align:center}.droppable.hover{background:#ddd}.uploadList{margin:0;padding:0;list-style:none}.uploadItem{overflow:hidden;border-bottom:#bcbcbc 1px solid;margin:0 20px;padding:3px}.uploadItem span{overflow:hidden;width:150px;float:left;display:block}.uploadItem a,a.addInputRow,a.delInputRow{display:inline-block;background:url(add.png) no-repeat;height:16px;width:16px;text-indent:-999px}.uploadItem a{float:left;display:block;padding-left:20px;background-image:url(delete.png)}a.delInputRow{background-image:url(delete.png)}.progress{margin:5px 0;height:15px;border-radius:3px;background:#545a74}.upperCase{text-transform:uppercase}.lowerCase{text-transform:lowercase}td a:hover{text-decoration:none}.lb-sm{font-size:12px}.lb-md{font-size:16px}.lb-lg{font-size:20px}.asn-table{margin-left:30px;font-family:'Courier New',Courier,monospace}.asn-table tr td{padding:1px;padding-left:5px}.scrollable-dropdown{height:auto;max-height:200px;overflow-x:hidden}.table-no-border>tbody>tr>td,.table-no-border>tbody>tr>th,.table-no-border>tfoot>tr>td,.table-no-border>tfoot>tr>th,.table-no-border>thead>tr>td,.table-no-border>thead>tr>th{border:none!important}.page-content .page-header li.pull-right{list-style-type:none!important}.loader{border:6px solid #f3f3f3;border-radius:50%;border-top:6px solid #3498db;width:30px;height:30px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.wrap{-ms-word-break:break-all;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.form-control::placeholder{font-weight:lighter;opacity:1}/*! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:system-ui,BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#cbd5e0}input::placeholder,textarea::placeholder{opacity:1;color:#cbd5e0}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(66,153,225,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent}::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(66,153,225,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent}h1{font-size:2.4rem;line-height:1;color:#1a202c;font-weight:300;margin-bottom:1rem}h2{font-size:2rem;margin-bottom:.5rem;font-weight:500;line-height:1.2}h3{font-size:1.75rem;line-height:1.2}h3,h4{margin-bottom:.5rem;font-weight:300;color:#1a202c}h4{font-size:1.5rem;line-height:1}h5{font-size:1.25rem;font-weight:400}h5,h6{margin-bottom:.5rem;line-height:1.2}h6{font-size:1rem;font-weight:500}p{margin-bottom:1rem}li{display:list-item}ol{list-style-type:decimal}ol,ul{display:block;margin:1em 0;padding-left:40px}ul{list-style-type:disc}dl{margin:1em 0}dl,dt{display:block}code,pre{font-size:.9em}pre{display:block;font-family:monospace;white-space:pre;margin:1em 0}hr{margin-bottom:10px}a{color:rgb(66 153 225/var(--tw-text-opacity))}a:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.tw-border-t-1{border-top-width:1px}.tw-border-b-1{border-bottom-width:1px}.tw-border-1{border-width:1px}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}#side-navbar,.shadow{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}#side-navbar{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding-right:0;--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}#side-navbar ol,#side-navbar ul{list-style:none;margin:0;padding:0}#side-navbar h6{margin:0;border-right-width:4px;--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));padding:1rem 1rem 1rem .25rem}#side-navbar h6,.nav-link{display:block;--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.nav-link{padding:.5rem .5rem .5rem .75rem;font-size:.875rem;-webkit-text-decoration-line:none;text-decoration-line:none}#side-navbar li,.nav-link:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}#side-navbar li{display:block;border-right-width:4px;--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));padding:0;font-weight:500}#side-navbar li.active{font-weight:700!important}#side-navbar li.active,#side-navbar li:hover{--tw-border-opacity:1;border-color:rgb(56 161 105/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}#side-navbar li:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.nav-sub-menu-item{margin-left:2rem}.ixpm-table a{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity));-webkit-text-decoration-line:none;text-decoration-line:none}.ixpm-table a:hover{--tw-text-opacity:1;color:rgb(66 153 225/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.btn{border-radius:.125rem;font-weight:700}.btn,.btn:hover{border-color:transparent}.btn-primary{--tw-bg-opacity:1;background-color:rgb(66 153 225/var(--tw-bg-opacity));font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(39 121 189/var(--tw-bg-opacity))}.btn-success{--tw-bg-opacity:1;background-color:rgb(72 187 120/var(--tw-bg-opacity));font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-success:hover{--tw-bg-opacity:1;background-color:rgb(31 157 85/var(--tw-bg-opacity))}.btn-secondary{--tw-bg-opacity:1;background-color:rgb(135 149 161/var(--tw-bg-opacity));font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-secondary:hover{--tw-bg-opacity:1;background-color:rgb(96 111 123/var(--tw-bg-opacity))}.btn-outline-secondary{border-radius:.125rem;--tw-border-opacity:1;border-color:rgb(184 194 204/var(--tw-border-opacity));background-color:transparent;font-weight:600;--tw-text-opacity:1;color:rgb(184 194 204/var(--tw-text-opacity));border-width:1px}.btn-outline-secondary:hover{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.btn-white{border-radius:.125rem;--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));font-weight:600;--tw-text-opacity:1;color:rgb(61 72 82/var(--tw-text-opacity));--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.btn-white,.btn-white:hover{border-color:rgb(218 225 231/var(--tw-border-opacity));border-width:1px}.btn-white:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.btn-info{border-radius:.125rem;--tw-border-opacity:1;border-color:rgb(56 178 172/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));font-weight:600;--tw-text-opacity:1;color:rgb(56 178 172/var(--tw-text-opacity));--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.btn-info,.btn-info:hover{border-width:1px}.btn-info:hover{--tw-border-opacity:1;border-color:rgb(218 225 231/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(56 178 172/var(--tw-bg-opacity))}input.form-control{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.125rem;padding:.5rem 1rem;--tw-text-opacity:1;border-width:1px;--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}input.form-control,input.form-control:focus{line-height:1.25;color:rgb(96 111 123/var(--tw-text-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}input.form-control:focus{--tw-text-opacity:1;--tw-shadow:0 0 0 3px rgba(52,144,220,0.5);--tw-shadow-colored:0 0 0 3px var(--tw-shadow-color);outline:2px solid transparent;outline-offset:2px}.input-group-append .btn{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);border-color:#ced4da}label.control-label,label.form-check-label{display:block;font-size:.875rem;font-weight:700;--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.badge{border-radius:9999px;padding:.25rem .75rem;font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.badge-info{--tw-bg-opacity:1;background-color:rgb(56 178 172/var(--tw-bg-opacity))}.badge-success{--tw-bg-opacity:1;background-color:rgb(72 187 120/var(--tw-bg-opacity))}.badge-secondary{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.badge-warning{--tw-bg-opacity:1;background-color:rgb(246 173 85/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.card{border-color:#dae1e7;border-radius:.125rem;--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.card .card-header{border-top-left-radius:.125rem;border-top-right-radius:.125rem;border-bottom-width:0}a{display:inline-block;vertical-align:baseline;font-weight:700;color:rgb(108 178 235/var(--tw-text-opacity))}a,a:hover{--tw-text-opacity:1}a:hover{color:rgb(39 121 189/var(--tw-text-opacity));-webkit-text-decoration-line:none;text-decoration-line:none}.table-light td,.table-light thead th{border-color:#ced4da}.docstore table{width:100%;table-layout:auto}.docstore td{border-color:rgb(226 232 240/var(--tw-border-opacity));border-top-width:1px}.docstore td,.docstore td.top{--tw-border-opacity:1;padding:.5rem}.docstore td.top{border-top-width:2px;border-color:rgb(226 232 240/var(--tw-border-opacity))}.docstore td.meta{display:none;width:.25rem;white-space:nowrap}@media (min-width:1024px){.docstore td.meta{display:table-cell;width:.25rem;white-space:nowrap}}.docstore td.icon{margin-right:1rem;width:.25rem;white-space:nowrap;padding:.5rem;text-align:center}.tw-collapse{visibility:collapse}.tw-relative{position:relative}.tw-float-right{float:right}.tw-m-0{margin:0}.tw-m-2{margin:.5rem}.tw-mx-3{margin-left:.75rem;margin-right:.75rem}.tw-mx-4{margin-left:1rem;margin-right:1rem}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-my-0{margin-top:0;margin-bottom:0}.tw-my-1{margin-top:.25rem;margin-bottom:.25rem}.tw-my-10{margin-top:2.5rem;margin-bottom:2.5rem}.tw-my-12{margin-top:3rem;margin-bottom:3rem}.tw-my-4{margin-top:1rem;margin-bottom:1rem}.tw-my-6{margin-top:1.5rem;margin-bottom:1.5rem}.tw-my-8{margin-top:2rem;margin-bottom:2rem}.tw-mb-0{margin-bottom:0}.tw-mb-16{margin-bottom:4rem}.tw-mb-2{margin-bottom:.5rem}.tw-mb-6{margin-bottom:1.5rem}.tw-mb-8{margin-bottom:2rem}.tw-ml-12{margin-left:3rem}.tw-ml-2{margin-left:.5rem}.tw-ml-4{margin-left:1rem}.tw-ml-6{margin-left:1.5rem}.tw-ml-8{margin-left:2rem}.tw-mr-2{margin-right:.5rem}.tw-mr-3{margin-right:.75rem}.tw-mr-4{margin-right:1rem}.tw-mr-6{margin-right:1.5rem}.tw-mt-1{margin-top:.25rem}.tw-mt-16{margin-top:4rem}.tw-mt-2{margin-top:.5rem}.tw-mt-4{margin-top:1rem}.tw-mt-6{margin-top:1.5rem}.tw-mt-8{margin-top:2rem}.tw-block{display:block}.tw-inline-block{display:inline-block}.tw-inline{display:inline}.tw-flex{display:flex}.tw-hidden{display:none}.tw-h-24{height:6rem}.tw-w-6{width:1.5rem}.tw-w-auto{width:auto}.tw-w-full{width:100%}.tw-min-w-full{min-width:100%}.tw-max-w-lg{max-width:50rem}.tw-max-w-md{max-width:40rem}.tw-max-w-sm{max-width:30rem}.tw-flex-1{flex:1 1 0%}.tw-cursor-pointer{cursor:pointer}.tw-list-none{list-style-type:none}.tw-flex-wrap{flex-wrap:wrap}.tw-items-center{align-items:center}.tw-justify-between{justify-content:space-between}.tw-self-center{align-self:center}.tw-overflow-hidden{overflow:hidden}.tw-rounded-full{border-radius:9999px}.tw-rounded-lg{border-radius:.5rem}.tw-rounded-sm{border-radius:.125rem}.tw-border-2{border-width:2px}.tw-border-b-2{border-bottom-width:2px}.tw-border-l-4{border-left-width:4px}.tw-border-r-4{border-right-width:4px}.tw-border-t-2{border-top-width:2px}.tw-border-blue-500{--tw-border-opacity:1;border-color:rgb(66 153 225/var(--tw-border-opacity))}.tw-border-gray-200{--tw-border-opacity:1;border-color:rgb(237 242 247/var(--tw-border-opacity))}.tw-border-gray-300{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.tw-border-gray-400{--tw-border-opacity:1;border-color:rgb(203 213 224/var(--tw-border-opacity))}.tw-border-gray-500{--tw-border-opacity:1;border-color:rgb(160 174 192/var(--tw-border-opacity))}.tw-border-gray-600{--tw-border-opacity:1;border-color:rgb(113 128 150/var(--tw-border-opacity))}.tw-border-green-500{--tw-border-opacity:1;border-color:rgb(72 187 120/var(--tw-border-opacity))}.tw-border-grey-light{--tw-border-opacity:1;border-color:rgb(218 225 231/var(--tw-border-opacity))}.tw-border-grey-lighter{--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity))}.tw-border-orange-500{--tw-border-opacity:1;border-color:rgb(237 137 54/var(--tw-border-opacity))}.tw-border-red-500{--tw-border-opacity:1;border-color:rgb(245 101 101/var(--tw-border-opacity))}.tw-border-red-lighter{--tw-border-opacity:1;border-color:rgb(249 172 170/var(--tw-border-opacity))}.tw-bg-blue-100{--tw-bg-opacity:1;background-color:rgb(235 248 255/var(--tw-bg-opacity))}.tw-bg-blue-lightest{--tw-bg-opacity:1;background-color:rgb(239 248 255/var(--tw-bg-opacity))}.tw-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(247 250 252/var(--tw-bg-opacity))}.tw-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(237 242 247/var(--tw-bg-opacity))}.tw-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(160 174 192/var(--tw-bg-opacity))}.tw-bg-green-100{--tw-bg-opacity:1;background-color:rgb(240 255 244/var(--tw-bg-opacity))}.tw-bg-grey-lighter{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.tw-bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 250 240/var(--tw-bg-opacity))}.tw-bg-red-100{--tw-bg-opacity:1;background-color:rgb(255 245 245/var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.tw-p-0{padding:0}.tw-p-1{padding:.25rem}.tw-p-2{padding:.5rem}.tw-p-4{padding:1rem}.tw-p-5{padding:1.25rem}.tw-p-6{padding:1.5rem}.tw-px-1{padding-left:.25rem;padding-right:.25rem}.tw-px-10{padding-left:2.5rem;padding-right:2.5rem}.tw-px-3{padding-left:.75rem;padding-right:.75rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.tw-px-8{padding-left:2rem;padding-right:2rem}.tw-py-0{padding-top:0;padding-bottom:0}.tw-py-1{padding-top:.25rem;padding-bottom:.25rem}.tw-py-2{padding-top:.5rem;padding-bottom:.5rem}.tw-py-20{padding-top:5rem;padding-bottom:5rem}.tw-py-4{padding-top:1rem;padding-bottom:1rem}.tw-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.tw-pb-2{padding-bottom:.5rem}.tw-pb-8{padding-bottom:2rem}.tw-pl-0{padding-left:0}.tw-pl-16{padding-left:4rem}.tw-pl-2{padding-left:.5rem}.tw-pl-4{padding-left:1rem}.tw-pr-4{padding-right:1rem}.tw-pt-0{padding-top:0}.tw-pt-4{padding-top:1rem}.tw-pt-6{padding-top:1.5rem}.tw-text-center{text-align:center}.tw-text-right{text-align:right}.tw-align-middle{vertical-align:middle}.tw-font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.tw-text-base{font-size:1rem}.tw-text-lg{font-size:1.125rem}.tw-text-sm{font-size:.875rem}.tw-text-xl{font-size:1.25rem}.tw-text-xs{font-size:.75rem}.tw-font-bold{font-weight:700}.tw-font-normal{font-weight:400}.tw-font-semibold{font-weight:600}.tw-uppercase{text-transform:uppercase}.tw-italic{font-style:italic}.tw-leading-tight{line-height:1.25}.tw-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.tw-text-blue-700{--tw-text-opacity:1;color:rgb(43 108 176/var(--tw-text-opacity))}.tw-text-blue-dark{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity))}.tw-text-gray-500{--tw-text-opacity:1;color:rgb(160 174 192/var(--tw-text-opacity))}.tw-text-gray-600{--tw-text-opacity:1;color:rgb(113 128 150/var(--tw-text-opacity))}.tw-text-gray-700{--tw-text-opacity:1;color:rgb(74 85 104/var(--tw-text-opacity))}.tw-text-green-500{--tw-text-opacity:1;color:rgb(72 187 120/var(--tw-text-opacity))}.tw-text-green-600{--tw-text-opacity:1;color:rgb(56 161 105/var(--tw-text-opacity))}.tw-text-green-700{--tw-text-opacity:1;color:rgb(47 133 90/var(--tw-text-opacity))}.tw-text-green-dark{--tw-text-opacity:1;color:rgb(31 157 85/var(--tw-text-opacity))}.tw-text-grey-dark{--tw-text-opacity:1;color:rgb(135 149 161/var(--tw-text-opacity))}.tw-text-grey-darker{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.tw-text-grey-darkest{--tw-text-opacity:1;color:rgb(61 72 82/var(--tw-text-opacity))}.tw-text-orange-500{--tw-text-opacity:1;color:rgb(237 137 54/var(--tw-text-opacity))}.tw-text-orange-700{--tw-text-opacity:1;color:rgb(192 86 33/var(--tw-text-opacity))}.tw-text-red-500{--tw-text-opacity:1;color:rgb(245 101 101/var(--tw-text-opacity))}.tw-text-red-600{--tw-text-opacity:1;color:rgb(229 62 62/var(--tw-text-opacity))}.tw-text-red-700{--tw-text-opacity:1;color:rgb(197 48 48/var(--tw-text-opacity))}.tw-text-red-lighter{--tw-text-opacity:1;color:rgb(249 172 170/var(--tw-text-opacity))}.tw-line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.tw-shadow-lg{--tw-shadow:0 15px 30px 0 rgba(0,0,0,0.11),0 5px 15px 0 rgba(0,0,0,0.08);--tw-shadow-colored:0 15px 30px 0 var(--tw-shadow-color),0 5px 15px 0 var(--tw-shadow-color)}.tw-shadow-lg,.tw-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.tw-shadow-md{--tw-shadow:0 4px 8px 0 rgba(0,0,0,0.12),0 2px 4px 0 rgba(0,0,0,0.08);--tw-shadow-colored:0 4px 8px 0 var(--tw-shadow-color),0 2px 4px 0 var(--tw-shadow-color)}.\[a-f0-9\:\\\.\\-\]{a-f0-9:\.\-}.hover\:tw-bg-grey-lighter:hover{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.hover\:tw-no-underline:hover{-webkit-text-decoration-line:none;text-decoration-line:none}@media (min-width:768px){.md\:tw-mt-0{margin-top:0}.md\:tw-inline{display:inline}.md\:tw-table-cell{display:table-cell}.md\:tw-text-left{text-align:left}.md\:tw-text-right{text-align:right}}@media (min-width:1024px){.lg\:tw-inline-block{display:inline-block}.lg\:tw-inline{display:inline}.lg\:tw-table-cell{display:table-cell}} + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +:root{--dt-row-selected: 2, 117, 216;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"▶"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px;z-index:10}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(2, 117, 216);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgb(2, 117, 216);box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable.table-striped>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.05)}table.dataTable.table-striped>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95)}table.dataTable.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.075)}table.dataTable.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.975);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.975)}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:before,div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody tr:first-child th,div.dataTables_scrollBody>table>tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} + +table.dataTable.dtr-inline.collapsed > tbody > tr > td.child, +table.dataTable.dtr-inline.collapsed > tbody > tr > th.child, +table.dataTable.dtr-inline.collapsed > tbody > tr > td.dataTables_empty { + cursor: default !important; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td.child:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th.child:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > td.dataTables_empty:before { + display: none !important; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control, +table.dataTable.dtr-inline.collapsed > tbody > tr > th.dtr-control { + cursor: pointer; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th.dtr-control:before { + margin-right: 0.5em; + display: inline-block; + color: rgba(0, 0, 0, 0.5); + content: "►"; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control.arrow-right::before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th.dtr-control.arrow-right::before { + content: "◄"; +} +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td.dtr-control:before, +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th.dtr-control:before { + content: "▼"; +} +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td.dtr-control, +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th.dtr-control { + padding-left: 0.333em; +} +table.dataTable.dtr-column > tbody > tr > td.dtr-control, +table.dataTable.dtr-column > tbody > tr > th.dtr-control, +table.dataTable.dtr-column > tbody > tr > td.control, +table.dataTable.dtr-column > tbody > tr > th.control { + cursor: pointer; +} +table.dataTable.dtr-column > tbody > tr > td.dtr-control:before, +table.dataTable.dtr-column > tbody > tr > th.dtr-control:before, +table.dataTable.dtr-column > tbody > tr > td.control:before, +table.dataTable.dtr-column > tbody > tr > th.control:before { + display: inline-block; + color: rgba(0, 0, 0, 0.5); + content: "►"; +} +table.dataTable.dtr-column > tbody > tr > td.dtr-control.arrow-right::before, +table.dataTable.dtr-column > tbody > tr > th.dtr-control.arrow-right::before, +table.dataTable.dtr-column > tbody > tr > td.control.arrow-right::before, +table.dataTable.dtr-column > tbody > tr > th.control.arrow-right::before { + content: "◄"; +} +table.dataTable.dtr-column > tbody > tr.parent td.dtr-control:before, +table.dataTable.dtr-column > tbody > tr.parent th.dtr-control:before, +table.dataTable.dtr-column > tbody > tr.parent td.control:before, +table.dataTable.dtr-column > tbody > tr.parent th.control:before { + content: "▼"; +} +table.dataTable > tbody > tr.child { + padding: 0.5em 1em; +} +table.dataTable > tbody > tr.child:hover { + background: transparent !important; +} +table.dataTable > tbody > tr.child ul.dtr-details { + display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; +} +table.dataTable > tbody > tr.child ul.dtr-details > li { + border-bottom: 1px solid #efefef; + padding: 0.5em 0; +} +table.dataTable > tbody > tr.child ul.dtr-details > li:first-child { + padding-top: 0; +} +table.dataTable > tbody > tr.child ul.dtr-details > li:last-child { + padding-bottom: 0; + border-bottom: none; +} +table.dataTable > tbody > tr.child span.dtr-title { + display: inline-block; + min-width: 75px; + font-weight: bold; +} + +div.dtr-modal { + position: fixed; + box-sizing: border-box; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 100; + padding: 10em 1em; +} +div.dtr-modal div.dtr-modal-display { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + width: 50%; + height: fit-content; + max-height: 75%; + overflow: auto; + margin: auto; + z-index: 102; + overflow: auto; + background-color: #f5f5f7; + border: 1px solid black; + border-radius: 0.5em; + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.6); +} +div.dtr-modal div.dtr-modal-content { + position: relative; + padding: 2.5em; +} +div.dtr-modal div.dtr-modal-content h2 { + margin-top: 0; +} +div.dtr-modal div.dtr-modal-close { + position: absolute; + top: 6px; + right: 6px; + width: 22px; + height: 22px; + text-align: center; + border-radius: 3px; + cursor: pointer; + z-index: 12; +} +div.dtr-modal div.dtr-modal-background { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 101; + background: rgba(0, 0, 0, 0.6); +} + +@media screen and (max-width: 767px) { + div.dtr-modal div.dtr-modal-display { + width: 95%; + } +} +html.dark table.dataTable > tbody > tr > td.dtr-control:before { + color: rgba(255, 255, 255, 0.5) !important; +} +html.dark table.dataTable > tbody > tr.child ul.dtr-details > li { + border-bottom-color: #404346; +} +html.dark div.dtr-modal div.dtr-modal-display { + background-color: #212529; + border: 1px solid rgba(255, 255, 255, 0.15); +} + +div.dtr-bs-modal table.table tr:first-child td { + border-top: none; +} + +@CHARSET "UTF-8"; + + + + + + + +/* +* BEGIN CSS used for Bootstrap 4 +*/ + + + + +/***********************************************************************************/ +/************************************* NAV BAR *************************************/ +/***********************************************************************************/ + + +#navbarSupportedContent a { + font-size: 15px; +} + +@media (max-width: 768px) { + #side-navbar { + display: block; + margin-left: -220px; + width: 220px !important; + height: 96%; + overflow: scroll; + transition: all 0.3s ease; + } + + #side-navbar.active { + margin-left: 0; + z-index: 200; + position: absolute; + display: block !important; + } + + #slide-reveal-overlay{ + position: fixed; + left: 0px; + height: 100%; + width: 100%; + z-index: 100; + background-color: rgba(0, 0, 0, 0.5); + } +} + +@media (max-width: 992px) { + #side-navbar .nav-item a{ + font-size: 0.9rem; + } + + #side-navbar h6{ + font-size: 0.9rem; + } +} + + +/* +:::::::::::::::::::::::::::::::::::::::::::::::::::: +COL-LG +*/ + +/* Large devices (desktops, 992px and up) */ +@media (min-width: 992px) { + #navbarSupportedContent a{ + font-size: 14px; + } + + #div-header-select-customer{ + width: 150px; + } + +} + +/* Large devices (desktops, 992px and up) */ +@media (min-width: 992px ) and (max-width: 1205px) { + + .navbar-expand-lg #navbarSupportedContent .navbar-nav .nav-link{ + padding-right:.3rem; + padding-left:.3rem + } +} + +/* +:::::::::::::::::::::::::::::::::::::::::::::::::::: +COL-XL +*/ +/* Extra large devices (large desktops, 1200px and up) */ +@media (min-width: 1200px) { + #div-header-select-customer{ + width: 175px; + } +} + + .former-help-text { + display: none; + } + + .form-check input[type="checkbox"]{ + margin-right: 10px !important; + } + + .reset-button-well{ + float: right; + position: absolute; + margin-left: 55%; + } + + .table_view_info{ + border-collapse: separate; + border-spacing: 15px 15px; + } + + .table_view_info tr td{ + vertical-align: top; + } + + .dropdown-submenu { + position: relative !important; + } + + .dropdown-submenu .dropdown-menu-l { + top: 0; + left: -163px; + margin-top: -1px; + } + + .former-input-col-sm-6 .form-group > div{ + -ms-flex:0 0 50%; + flex:0 0 50%; + max-width:50%; + } + + .former-label-col-sm-6 .form-group > label{ + -ms-flex:0 0 33.333333%; + flex:0 0 33.333333%; + max-width:33.333333%; + } + + + .fa-facebook:hover { + color: #3B5998; + + } + + .fa-twitter:hover { + color: #4099FF; + + } + + .fa-linkedin:hover { + color: #007bb5; + + } + + .fa-globe:hover, .fa-github:hover { + color: grey; + + } + + .dropup .dropdown-toggle:after{ + margin-top : 4px; + } + + .error-border-select{ + border: 1px solid #dc3545 !important; + } + + .valid-border-select{ + border: 1px solid #28a745 !important; + } + + .a-disabled { + pointer-events: none; + cursor: default; + opacity: 0.6; + } + + .cursor-pointer { + cursor: pointer; + } + + .center-dd-caret:after{ + margin-bottom: auto; + margin-top: auto; + } + + .cursor-default{ + pointer-events: none; + cursor: default; + } + + .dataTable .dropdown-item:focus, .dropdown-item:hover{ + width: auto; + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; + } + + .dropdown-item.active:hover { + background-color: #005BC3!important; + color: white!important; + } + /* + #################################################### + M E D I A Q U E R I E S + #################################################### + */ + + /* + :::::::::::::::::::::::::::::::::::::::::::::::::::: + Bootstrap 4 breakpoints + */ + + + /* + :::::::::::::::::::::::::::::::::::::::::::::::::::: + COL-SM + */ + /* Small devices (landscape phones, 544px and up) */ + @media (max-width: 576px) { + .h2 {font-size: 1.6rem} + } + + + + /* + :::::::::::::::::::::::::::::::::::::::::::::::::::: + COL-MD + */ + /* Medium devices (tablets, 768px and up) */ + @media (min-width: 768px) { + #div-header-select-customer{ + width: 300px; + } + } + + +/* +* END CSS used for Bootstrap 4 +*/ + +.no-padding{ + padding: 0!important; +} + +.padding-10{ + padding: 10px 15px!important; +} + + +.mono { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + /* font-size: 12px; */ +} + +.ixpm-select-input-xs { + height: 20px; + line-height: 20px; +} + + + +/* The white background content wrapper */ +.page-content { + background-color: #fff !important; + padding: 20px; + margin: 0 -20px; /* negative indent the amount of the padding to maintain the grid system */ + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,.15); + box-shadow: 0 1px 2px rgba(0,0,0,.15); +} + + +.list_preamble_container { + display: block; +} + +.list_preamble { + display: block; + text-align: right; +} + + + + + + +.pm-table { + margin-bottom: 18px; + margin-left: auto; + margin-right: auto; +} + + +.pm-table th { + padding: 0px; + text-align: center; + vertical-align: bottom; + border: 1px solid #dddddd; + border-bottom-width: 2px; + border-top: none; + font-weight: bold; +} + +.pm-table th.asn { + cursor: hand; + cursor: pointer; +} + +.pm-table th:last-child { + border-right-width: 2px; +} + +.pm-table td { + text-align: center; + vertical-align: top; + border: 1px solid #dddddd; +} + +.pm-table td.peering { + cursor: hand; + cursor: pointer; +} + +.pm-table td.zoom1 { + padding: 0px 1px; + font-size: 8px; + line-height: 12px; +} + +.pm-table td.zoom2 { + padding: 2px 4px; + font-size: 11px; + line-height: 15px; +} + +.pm-table td.zoom3 { + padding: 4px 8px; + font-size: 13px; + line-height: 18px; +} + +.pm-table td.zoom4 { + padding: 6px 10px; + font-size: 15px; + line-height: 20px; +} + +.pm-table td.zoom5 { + padding: 8px 12px; + font-size: 18px; + line-height: 24px; +} + +.pm-table th.zoom1 { + font-size: 8px; + line-height: 12px; +} + +.pm-table th.zoom2 { + font-size: 11px; + line-height: 15px; +} + +.pm-table th.zoom3 { + font-size: 13px; + line-height: 18px; +} + +.pm-table th.zoom4 { + font-size: 15px; + line-height: 20px; +} + +.pm-table th.zoom5 { + font-size: 18px; + line-height: 24px; +} + +.pm-table td:last-child { + border-right-width: 2px; +} + + + +.pm-table th.name { + border-left: none; + border-right: none; + border-top: none; +} + +.pm-table th.asn { + border-left: none; + border-top: none; + border-right-width: 2px; +} + +.pm-table td.name { + text-align: left; + border-left: none; + border-right: none; + font-weight: bold; +} + +.pm-table td.asn { + text-align: right; + border-left: none; + border-right-width: 2px; + font-weight: bold; +} + +.pm-table tr:last-child { + border-bottom-width: 2px; +} + + +.pm-table td.peered { + background-color: #00cc00; + width: 10px; +} + +.pm-table td.not-peered { + background-color: #d63030; + width: 10px; +} + +.pm-table td.bilateral-rs { + width: 10px; +} + +.pm-table td.rs-only { + width: 10px; +} + +.pm-table td.bilateral-only { + width: 10px; +} + + +.pm-table tr.hover, .pm-table colgroup.hover, .pm-table td.hover { + background-color: #eee; + border-left: 2px solid #555; + border-right: 2px solid #555; +} + +.pm-table td.hover2 { + border-left: 1px solid #555; + border-right: 1px solid #555; +} + + +.pm-table th.highlight, .pm-table td.highlight { + background-color: #fcf6cf; +} + +.pm-table th.highlight2, .pm-table td.highlight2 { + background-color: #eee; +} + +.controls-fieldset-bordered { + margin-left: 90px; +} + +.legend-fieldset-bordered { + font-size: 14px; + line-height: 20px; + margin-bottom: 0px; + border-style: none none none; + width: none; + padding: 5px; +} + +.fieldset-bordered { + border: 1px solid #CCCCCC; + padding: 10px; + border-radius: 4px 4px 4px 4px; + transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; +} + +.info_box .title { + position: relative; + top: -30px; + margin-left: 0em; + padding: 2px 7px; + display: inline; + font-size: 1em; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: 1px solid #dddddd; + background-color: #fafafa; + background-color: #f9f9f9; + background-image: -moz-linear-gradient( top, #ffffff, #f0f0f0 ); + background-image: -webkit-gradient( linear, 0 0, 0 100%, from(#ffffff), to(#f0f0f0) ); + background-image: -webkit-linear-gradient(top, #ffffff, #f0f0f0); + background-image: -o-linear-gradient(top, #ffffff, #f0f0f0); + background-image: linear-gradient(to bottom, #ffffff, #f0f0f0); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff0f0f0', GradientType=0); +} + +.info_box .title a{ + color:#555555; + text-decoration:none; +} +.info_box .content{ + margin-top:-10px; +} + + +/* Bootstrap Dropdowns in Breadcrumbs: + http://stackoverflow.com/questions/12194573/bootstrap-dropdown-within-breadcrumb */ +.dropdown-menu li { + display: block; +} + + + + + + +.droppable { + border: #ccc 1px solid; + border-radius: 8px; + background: #eee; + color: #666; + padding: 20px; + margin: 10px; + clear: both; + text-align: center; +} + +.droppable.hover { + background: #ddd; +} + +.uploadList { + margin: 0; + padding: 0; + list-style: none; +} + +.uploadItem { + overflow: hidden; + border-bottom: #BCBCBC 1px solid; + margin: 0 20px; + padding: 3px; +} + +.uploadItem span { + overflow: hidden; + width: 150px; + float: left; + display: block; +} + +a.addInputRow, +a.delInputRow, +.uploadItem a { + display: inline-block; + background: url(add.png) no-repeat; + height: 16px; + width: 16px; + text-indent: -999px; +} + +.uploadItem a { + float: left; + display: block; + padding-left: 20px; + background-image: url(delete.png); +} + +a.delInputRow { + background-image: url(delete.png); +} + +.progress { + margin: 5px 0; + height: 15px; + border-radius: 3px; + background: #545A74; +} + +.upperCase { + text-transform:uppercase; +} + +.lowerCase { + text-transform:lowercase; +} + + + +td a:hover{ + text-decoration: none; +} + + +.lb-sm { + font-size: 12px; +} + +.lb-md { + font-size: 16px; +} + +.lb-lg { + font-size: 20px; +} + +.asn-table{ + margin-left: 30px; + font-family: 'Courier New', Courier, monospace; +} + +.asn-table tr td{ + padding : 1px; + padding-left: 5px; +} + +.scrollable-dropdown { + height: auto; + max-height: 200px; + overflow-x: hidden; +} + +.table-no-border > thead > tr > th, +.table-no-border > tbody > tr > th, +.table-no-border > tfoot > tr > th, +.table-no-border > thead > tr > td, +.table-no-border > tbody > tr > td, +.table-no-border > tfoot > tr > td { + border: none !important; +} + +.page-content .page-header li.pull-right { + list-style-type: none !important; +} + +.loader { + border: 6px solid #f3f3f3; + border-radius: 50%; + border-top: 6px solid #3498db; + width: 30px; + height: 30px; + -webkit-animation: spin 2s linear infinite; /* Safari */ + animation: spin 2s linear infinite; +} + +/* Safari */ +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.wrap { + -ms-word-break: break-all; + word-break: break-all; + + /* Non standard for webkit */ + word-break: break-word; + + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; +} + + + +.form-control::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ + font-weight: lighter; + opacity: 1; /* Firefox */ +} + + + +/***** Tab Panels START *****/ +.tabNavMenu{ + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; + border-bottom: 1px solid rgba(0,0,0,.125); +} +.tabButton { + margin-bottom: -1px; + padding: .5rem 1rem; + background-color: transparent; + border: 1px solid transparent; + border-bottom: 0; + border-top-left-radius: .5rem; + border-top-right-radius: .5rem; + color: #718096; + font-size: .85em; + margin-right: .25rem; +} +.tabButton:hover { + border-color: rgba(0,0,0,.075); +} +.tabButton.active { + color: #4a5568; + background-color: #fff; + border-color: rgba(0,0,0,.125); +} +.tabContent {} +.tabContent .tabPanel { + overflow: hidden; + box-sizing: border-box; + padding: 0; + height: 0; + border: none; + border-bottom-left-radius: .5rem; + border-bottom-right-radius: .5rem; + opacity: 0; + transition: opacity 500ms; +} +.tabContent .tabPanel.active { + opacity: 1; + border: 1px solid rgba(0,0,0,.125); + border-top: none; + height: auto; + padding: 1rem 1.5rem; +} +.tabContent .tabPanel .description { + font-size: 0.9rem; + color: #718096; +} +.inputWrapper { + margin-bottom: 2rem; +} +.inputWrapper .form-group { + margin-bottom: 0; +} +.inputWrapper .form-group .form-check label { + display: block; + font-size: .875rem; + font-weight: 700; + color: rgb(96 111 123); +} +/***** Tab Panels END *******/ + +/** + * This injects Tailwind's base styles, which is a combination of + * Normalize.css and some additional base styles. + * + * You can see the styles here: + * https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css + * + * If using `postcss-import`, use this import instead: + * + * @import "tailwindcss/preflight"; + */ +/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com + */ +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: currentColor; /* 2 */ +} +::before, +::after { + --tw-content: ''; +} +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ +html, +:host { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + -o-tab-size: 4; + tab-size: 4; /* 3 */ + font-family: system-ui, BlinkMacSystemFont, -apple-system, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +/* +Remove the default font size and weight for headings. +*/ +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ +a { + color: inherit; + text-decoration: inherit; +} +/* +Add the correct font weight in Edge and Safari. +*/ +b, +strong { + font-weight: bolder; +} +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ +code, +kbd, +samp, +pre { + font-family: Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; /* 1 */ + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; /* 3 */ + font-size: 1em; /* 4 */ +} +/* +Add the correct font size in all browsers. +*/ +small { + font-size: 80%; +} +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + letter-spacing: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ +button, +select { + text-transform: none; +} +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} +/* +Use the modern Firefox focus style for all focusable elements. +*/ +:-moz-focusring { + outline: auto; +} +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ +:-moz-ui-invalid { + box-shadow: none; +} +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ +progress { + vertical-align: baseline; +} +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} +/* +Add the correct display in Chrome and Safari. +*/ +summary { + display: list-item; +} +/* +Removes the default spacing and border for appropriate elements. +*/ +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} +fieldset { + margin: 0; + padding: 0; +} +legend { + padding: 0; +} +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} +/* +Reset default styling for dialogs. +*/ +dialog { + padding: 0; +} +/* +Prevent resizing textareas horizontally by default. +*/ +textarea { + resize: vertical; +} +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; /* 1 */ + color: #cbd5e0; /* 2 */ +} +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #cbd5e0; /* 2 */ +} +/* +Set the default cursor for buttons. +*/ +button, +[role="button"] { + cursor: pointer; +} +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled { + cursor: default; +} +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ +img, +video { + max-width: 100%; + height: auto; +} +/* Make elements with the HTML hidden attribute stay hidden by default */ +[hidden] { + display: none; +} +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(66 153 225 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(66 153 225 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +/** + * This injects any component classes registered by plugins. + * + * If using `postcss-import`, use this import instead: + * + * @import "tailwindcss/components"; + */ +/** + * Here you would add any of your custom component classes; stuff that you'd + * want loaded *before* the utilities so that the utilities could still + * override them. + * + * Example: + * + * .btn { ... } + * .form-input { ... } + * + * Or if using a preprocessor or `postcss-import`: + * + * @import "components/buttons"; + * @import "components/forms"; + */ +/**************************************************************************************** + **** Reset headings to ~ Bootstrap4 defaults + ****************************************************************************************/ +h1 { + font-size: 2.4rem; + line-height: 1; + color: #1a202c; + font-weight: 300; + margin-bottom: 1rem; +} + +h2 { + font-size: 2rem; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h3 { + font-size: 1.75rem; + margin-bottom: 0.5rem; + font-weight: 300; + line-height: 1.2; + color: #1a202c; +} + +h4 { + font-size: 1.5rem; + margin-bottom: 0.5rem; + font-weight: 300; + color: #1a202c; + line-height: 1; +} + +h5 { + font-size: 1.25rem; + margin-bottom: 0.5rem; + font-weight: 400; + line-height: 1.2; +} + +h6 { + font-size: 1rem; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +p { + margin-bottom: 1rem; +} + +li { + display: list-item; +} + +ol { + display: block; + list-style-type: decimal; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + padding-left: 40px; +} + +ul { + display: block; + list-style-type: disc; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + padding-left: 40px; +} + +dl { + display: block; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; +} + +dt { + display: block; +} + +code { + font-size: 0.9em; +} + +pre { + display: block; + font-family: monospace; + white-space: pre; + margin: 1em 0; + font-size: 0.9em; +} + +hr { + margin-bottom: 10px; +} + +/**************************************************************************************** + **** Reset anchors + ****************************************************************************************/ +a { + --tw-text-opacity: 1; + color: rgb(66 153 225 / var(--tw-text-opacity)); +} + +a:hover { + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +.tw-border-t-1 { + border-top-width: 1px; +} + +.tw-border-b-1 { + border-bottom-width: 1px; +} + +.tw-border-1 { + border-width: 1px; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +/**************************************************************************************** + **** LHS Menu in IXP Manager + + +
+ +
+ + + ****************************************************************************************/ +#side-navbar { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + padding-right: 0; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +#side-navbar ul, #side-navbar ol { + list-style: none; + margin: 0; + padding: 0; +} + +#side-navbar h6 { + margin: 0; + display: block; + border-right-width: 4px; + --tw-border-opacity: 1; + border-color: rgb(241 245 248 / var(--tw-border-opacity)); + padding: 1rem; + padding-left: 0.25rem; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +.nav-link { + display: block; + padding: 0.5rem; + padding-left: 0.75rem; + font-size: .875rem; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); + -webkit-text-decoration-line: none; + text-decoration-line: none; +} + +.nav-link:hover { + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +#side-navbar li { + display: block; + border-right-width: 4px; + --tw-border-opacity: 1; + border-color: rgb(241 245 248 / var(--tw-border-opacity)); + padding: 0; + font-weight: 500; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +#side-navbar li.active { + --tw-border-opacity: 1; + border-color: rgb(56 161 105 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); + font-weight: 700 !important; +} + +#side-navbar li:hover { + --tw-border-opacity: 1; + border-color: rgb(56 161 105 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +.nav-sub-menu-item { + margin-left: 2rem; +} + +.ixpm-table a { + --tw-text-opacity: 1; + color: rgb(39 121 189 / var(--tw-text-opacity)); + -webkit-text-decoration-line: none; + text-decoration-line: none; +} + +.ixpm-table a:hover { + --tw-text-opacity: 1; + color: rgb(66 153 225 / var(--tw-text-opacity)); + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +/**************************************************************************************** + **** Buttons + ****************************************************************************************/ +.btn { + border-radius: .125rem; + border-color: transparent; + font-weight: 700; +} + +.btn:hover { + border-color: transparent; +} + +.btn-primary { + --tw-bg-opacity: 1; + background-color: rgb(66 153 225 / var(--tw-bg-opacity)); + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.btn-primary:hover { + --tw-bg-opacity: 1; + background-color: rgb(39 121 189 / var(--tw-bg-opacity)); +} + +.btn-success { + --tw-bg-opacity: 1; + background-color: rgb(72 187 120 / var(--tw-bg-opacity)); + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.btn-success:hover { + --tw-bg-opacity: 1; + background-color: rgb(31 157 85 / var(--tw-bg-opacity)); +} + +.btn-secondary { + --tw-bg-opacity: 1; + background-color: rgb(135 149 161 / var(--tw-bg-opacity)); + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.btn-secondary:hover { + --tw-bg-opacity: 1; + background-color: rgb(96 111 123 / var(--tw-bg-opacity)); +} + +.btn-outline-secondary { + border-radius: .125rem; + --tw-border-opacity: 1; + border-color: rgb(184 194 204 / var(--tw-border-opacity)); + background-color: transparent; + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(184 194 204 / var(--tw-text-opacity)); + border-width: 1px; +} + +.btn-outline-secondary:hover { + --tw-bg-opacity: 1; + background-color: rgb(184 194 204 / var(--tw-bg-opacity)); +} + +.btn-white { + border-radius: .125rem; + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(61 72 82 / var(--tw-text-opacity)); + border-width: 1px; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +.btn-white:hover { + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); + border-width: 1px; +} + +.btn-info { + border-radius: .125rem; + --tw-border-opacity: 1; + border-color: rgb(56 178 172 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(56 178 172 / var(--tw-text-opacity)); + border-width: 1px; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +.btn-info:hover { + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(56 178 172 / var(--tw-bg-opacity)); + border-width: 1px; +} + +/****************************************************************************************ea + **** Inputs + ****************************************************************************************/ +input.form-control { + width: 100%; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: .125rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + line-height: 1.25; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); + border-width: 1px; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +input.form-control:focus { + line-height: 1.25; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); + --tw-shadow: 0 0 0 3px rgba(52,144,220,0.5); + --tw-shadow-colored: 0 0 0 3px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + outline: 2px solid transparent; + outline-offset: 2px; +} + +.input-group-append .btn { + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); + border-color: #ced4da; +} + +label.control-label, label.form-check-label { + display: block; + font-size: .875rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +/**************************************************************************************** + **** Badge + ****************************************************************************************/ +.badge { + border-radius: 9999px; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.75rem; + padding-right: 0.75rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.badge-info { + --tw-bg-opacity: 1; + background-color: rgb(56 178 172 / var(--tw-bg-opacity)); +} + +.badge-success { + --tw-bg-opacity: 1; + background-color: rgb(72 187 120 / var(--tw-bg-opacity)); +} + +.badge-secondary { + --tw-bg-opacity: 1; + background-color: rgb(184 194 204 / var(--tw-bg-opacity)); +} + +.badge-warning { + --tw-bg-opacity: 1; + background-color: rgb(246 173 85 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +/**************************************************************************************** + **** Card + ****************************************************************************************/ +.card { + border-color: #dae1e7; + border-radius: .125rem; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +.card .card-header { + border-top-left-radius: .125rem; + border-top-right-radius: .125rem; + border-bottom-width: 0; +} + +a { + display: inline-block; + vertical-align: baseline; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(108 178 235 / var(--tw-text-opacity)); +} + +a:hover { + --tw-text-opacity: 1; + color: rgb(39 121 189 / var(--tw-text-opacity)); + -webkit-text-decoration-line: none; + text-decoration-line: none; +} + +/**************************************************************************************** + **** table + ****************************************************************************************/ +.table-light td, .table-light thead th { + border-color: #ced4da; +} + +/**************************************************************************************** + **** Docstore + ****************************************************************************************/ +.docstore table { + width: 100%; + table-layout: auto; +} + +.docstore td { + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + border-top-width: 1px; +} + +.docstore td.top { + border-top-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.docstore td.meta { + display: none; + width: 0.25rem; + white-space: nowrap; +} + +@media (min-width: 1024px) { + .docstore td.meta { + display: table-cell; + width: 0.25rem; + white-space: nowrap; + } +} +.docstore td.icon { + margin-right: 1rem; + width: 0.25rem; + white-space: nowrap; + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + text-align: center; +} + +/** + * This injects all of Tailwind's utility classes, generated based on your + * config file. + * + * If using `postcss-import`, use this import instead: + * + * @import "tailwindcss/utilities"; + */ +.tw-collapse { + visibility: collapse; +} +.tw-relative { + position: relative; +} +.tw-float-right { + float: right; +} +.tw-m-0 { + margin: 0; +} +.tw-m-2 { + margin: 0.5rem; +} +.tw-mx-3 { + margin-left: 0.75rem; + margin-right: 0.75rem; +} +.tw-mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} +.tw-mx-auto { + margin-left: auto; + margin-right: auto; +} +.tw-my-0 { + margin-top: 0; + margin-bottom: 0; +} +.tw-my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} +.tw-my-10 { + margin-top: 2.5rem; + margin-bottom: 2.5rem; +} +.tw-my-12 { + margin-top: 3rem; + margin-bottom: 3rem; +} +.tw-my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.tw-my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} +.tw-my-8 { + margin-top: 2rem; + margin-bottom: 2rem; +} +.tw-mb-0 { + margin-bottom: 0; +} +.tw-mb-16 { + margin-bottom: 4rem; +} +.tw-mb-2 { + margin-bottom: 0.5rem; +} +.tw-mb-6 { + margin-bottom: 1.5rem; +} +.tw-mb-8 { + margin-bottom: 2rem; +} +.tw-ml-12 { + margin-left: 3rem; +} +.tw-ml-2 { + margin-left: 0.5rem; +} +.tw-ml-4 { + margin-left: 1rem; +} +.tw-ml-6 { + margin-left: 1.5rem; +} +.tw-ml-8 { + margin-left: 2rem; +} +.tw-mr-2 { + margin-right: 0.5rem; +} +.tw-mr-3 { + margin-right: 0.75rem; +} +.tw-mr-4 { + margin-right: 1rem; +} +.tw-mr-6 { + margin-right: 1.5rem; +} +.tw-mt-1 { + margin-top: 0.25rem; +} +.tw-mt-16 { + margin-top: 4rem; +} +.tw-mt-2 { + margin-top: 0.5rem; +} +.tw-mt-4 { + margin-top: 1rem; +} +.tw-mt-6 { + margin-top: 1.5rem; +} +.tw-mt-8 { + margin-top: 2rem; +} +.tw-block { + display: block; +} +.tw-inline-block { + display: inline-block; +} +.tw-inline { + display: inline; +} +.tw-flex { + display: flex; +} +.tw-hidden { + display: none; +} +.tw-h-24 { + height: 6rem; +} +.tw-w-6 { + width: 1.5rem; +} +.tw-w-auto { + width: auto; +} +.tw-w-full { + width: 100%; +} +.tw-min-w-full { + min-width: 100%; +} +.tw-max-w-lg { + max-width: 50rem; +} +.tw-max-w-md { + max-width: 40rem; +} +.tw-max-w-sm { + max-width: 30rem; +} +.tw-flex-1 { + flex: 1 1 0%; +} +.tw-cursor-pointer { + cursor: pointer; +} +.tw-list-none { + list-style-type: none; +} +.tw-flex-wrap { + flex-wrap: wrap; +} +.tw-items-center { + align-items: center; +} +.tw-justify-between { + justify-content: space-between; +} +.tw-self-center { + align-self: center; +} +.tw-overflow-hidden { + overflow: hidden; +} +.tw-rounded-full { + border-radius: 9999px; +} +.tw-rounded-lg { + border-radius: .5rem; +} +.tw-rounded-sm { + border-radius: .125rem; +} +.tw-border-2 { + border-width: 2px; +} +.tw-border-b-2 { + border-bottom-width: 2px; +} +.tw-border-l-4 { + border-left-width: 4px; +} +.tw-border-r-4 { + border-right-width: 4px; +} +.tw-border-t-0 { + border-top-width: 0; +} +.tw-border-t-2 { + border-top-width: 2px; +} +.tw-border-blue-500 { + --tw-border-opacity: 1; + border-color: rgb(66 153 225 / var(--tw-border-opacity)); +} +.tw-border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(237 242 247 / var(--tw-border-opacity)); +} +.tw-border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity)); +} +.tw-border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(203 213 224 / var(--tw-border-opacity)); +} +.tw-border-gray-500 { + --tw-border-opacity: 1; + border-color: rgb(160 174 192 / var(--tw-border-opacity)); +} +.tw-border-gray-600 { + --tw-border-opacity: 1; + border-color: rgb(113 128 150 / var(--tw-border-opacity)); +} +.tw-border-green-500 { + --tw-border-opacity: 1; + border-color: rgb(72 187 120 / var(--tw-border-opacity)); +} +.tw-border-grey-light { + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); +} +.tw-border-grey-lighter { + --tw-border-opacity: 1; + border-color: rgb(241 245 248 / var(--tw-border-opacity)); +} +.tw-border-orange-500 { + --tw-border-opacity: 1; + border-color: rgb(237 137 54 / var(--tw-border-opacity)); +} +.tw-border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(245 101 101 / var(--tw-border-opacity)); +} +.tw-border-red-lighter { + --tw-border-opacity: 1; + border-color: rgb(249 172 170 / var(--tw-border-opacity)); +} +.tw-bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(235 248 255 / var(--tw-bg-opacity)); +} +.tw-bg-blue-lightest { + --tw-bg-opacity: 1; + background-color: rgb(239 248 255 / var(--tw-bg-opacity)); +} +.tw-bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(247 250 252 / var(--tw-bg-opacity)); +} +.tw-bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(237 242 247 / var(--tw-bg-opacity)); +} +.tw-bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(160 174 192 / var(--tw-bg-opacity)); +} +.tw-bg-green-100 { + --tw-bg-opacity: 1; + background-color: rgb(240 255 244 / var(--tw-bg-opacity)); +} +.tw-bg-grey-lighter { + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); +} +.tw-bg-orange-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 250 240 / var(--tw-bg-opacity)); +} +.tw-bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 245 245 / var(--tw-bg-opacity)); +} +.tw-bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.tw-p-0 { + padding: 0; +} +.tw-p-1 { + padding: 0.25rem; +} +.tw-p-2 { + padding: 0.5rem; +} +.tw-p-4 { + padding: 1rem; +} +.tw-p-5 { + padding: 1.25rem; +} +.tw-p-6 { + padding: 1.5rem; +} +.tw-px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.tw-px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; +} +.tw-px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} +.tw-px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.tw-px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.tw-px-8 { + padding-left: 2rem; + padding-right: 2rem; +} +.tw-py-0 { + padding-top: 0; + padding-bottom: 0; +} +.tw-py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} +.tw-py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.tw-py-20 { + padding-top: 5rem; + padding-bottom: 5rem; +} +.tw-py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.tw-py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} +.tw-pb-2 { + padding-bottom: 0.5rem; +} +.tw-pb-8 { + padding-bottom: 2rem; +} +.tw-pl-0 { + padding-left: 0; +} +.tw-pl-16 { + padding-left: 4rem; +} +.tw-pl-2 { + padding-left: 0.5rem; +} +.tw-pl-4 { + padding-left: 1rem; +} +.tw-pr-4 { + padding-right: 1rem; +} +.tw-pt-0 { + padding-top: 0; +} +.tw-pt-4 { + padding-top: 1rem; +} +.tw-pt-6 { + padding-top: 1.5rem; +} +.tw-text-center { + text-align: center; +} +.tw-text-right { + text-align: right; +} +.tw-align-middle { + vertical-align: middle; +} +.tw-font-mono { + font-family: Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; +} +.tw-text-base { + font-size: 1rem; +} +.tw-text-lg { + font-size: 1.125rem; +} +.tw-text-sm { + font-size: .875rem; +} +.tw-text-xl { + font-size: 1.25rem; +} +.tw-text-xs { + font-size: .75rem; +} +.tw-font-bold { + font-weight: 700; +} +.tw-font-normal { + font-weight: 400; +} +.tw-font-semibold { + font-weight: 600; +} +.tw-uppercase { + text-transform: uppercase; +} +.tw-italic { + font-style: italic; +} +.tw-leading-tight { + line-height: 1.25; +} +.tw-text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} +.tw-text-blue-700 { + --tw-text-opacity: 1; + color: rgb(43 108 176 / var(--tw-text-opacity)); +} +.tw-text-blue-dark { + --tw-text-opacity: 1; + color: rgb(39 121 189 / var(--tw-text-opacity)); +} +.tw-text-gray-500 { + --tw-text-opacity: 1; + color: rgb(160 174 192 / var(--tw-text-opacity)); +} +.tw-text-gray-600 { + --tw-text-opacity: 1; + color: rgb(113 128 150 / var(--tw-text-opacity)); +} +.tw-text-gray-700 { + --tw-text-opacity: 1; + color: rgb(74 85 104 / var(--tw-text-opacity)); +} +.tw-text-green-500 { + --tw-text-opacity: 1; + color: rgb(72 187 120 / var(--tw-text-opacity)); +} +.tw-text-green-600 { + --tw-text-opacity: 1; + color: rgb(56 161 105 / var(--tw-text-opacity)); +} +.tw-text-green-700 { + --tw-text-opacity: 1; + color: rgb(47 133 90 / var(--tw-text-opacity)); +} +.tw-text-green-dark { + --tw-text-opacity: 1; + color: rgb(31 157 85 / var(--tw-text-opacity)); +} +.tw-text-grey-dark { + --tw-text-opacity: 1; + color: rgb(135 149 161 / var(--tw-text-opacity)); +} +.tw-text-grey-darker { + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} +.tw-text-grey-darkest { + --tw-text-opacity: 1; + color: rgb(61 72 82 / var(--tw-text-opacity)); +} +.tw-text-orange-500 { + --tw-text-opacity: 1; + color: rgb(237 137 54 / var(--tw-text-opacity)); +} +.tw-text-orange-700 { + --tw-text-opacity: 1; + color: rgb(192 86 33 / var(--tw-text-opacity)); +} +.tw-text-red-500 { + --tw-text-opacity: 1; + color: rgb(245 101 101 / var(--tw-text-opacity)); +} +.tw-text-red-600 { + --tw-text-opacity: 1; + color: rgb(229 62 62 / var(--tw-text-opacity)); +} +.tw-text-red-700 { + --tw-text-opacity: 1; + color: rgb(197 48 48 / var(--tw-text-opacity)); +} +.tw-text-red-lighter { + --tw-text-opacity: 1; + color: rgb(249 172 170 / var(--tw-text-opacity)); +} +.tw-line-through { + -webkit-text-decoration-line: line-through; + text-decoration-line: line-through; +} +.tw-shadow-lg { + --tw-shadow: 0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08); + --tw-shadow-colored: 0 15px 30px 0 var(--tw-shadow-color), 0 5px 15px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.tw-shadow-md { + --tw-shadow: 0 4px 8px 0 rgba(0,0,0,0.12), 0 2px 4px 0 rgba(0,0,0,0.08); + --tw-shadow-colored: 0 4px 8px 0 var(--tw-shadow-color), 0 2px 4px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.\[a-f0-9\:\\\.\\-\] { + a-f0-9: \.\-; +} +.\[id\:\%d\] { + id: %d; +} +/** + * Here you would add any custom utilities you need that don't come out of the + * box with Tailwind. + * + * Example : + * + * .bg-pattern-graph-paper { ... } + * .skew-45 { ... } + * + * Or if using a preprocessor or `postcss-import`: + * + * @import "utilities/background-patterns"; + * @import "utilities/skew-transforms"; + */ +.hover\:tw-bg-grey-lighter:hover { + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); +} +.hover\:tw-no-underline:hover { + -webkit-text-decoration-line: none; + text-decoration-line: none; +} +@media (min-width: 768px) { + .md\:tw-mt-0 { + margin-top: 0; + } + .md\:tw-inline { + display: inline; + } + .md\:tw-table-cell { + display: table-cell; + } + .md\:tw-text-left { + text-align: left; + } + .md\:tw-text-right { + text-align: right; + } +} +@media (min-width: 1024px) { + .lg\:tw-inline-block { + display: inline-block; + } + .lg\:tw-inline { + display: inline; + } + .lg\:tw-table-cell { + display: table-cell; + } +} \ No newline at end of file diff --git a/public/css/tailwind.css b/public/css/tailwind.css index 5b62a0560..6fd8bb553 100644 --- a/public/css/tailwind.css +++ b/public/css/tailwind.css @@ -1 +1,1578 @@ -/*! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:system-ui,BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#cbd5e0}input::placeholder,textarea::placeholder{opacity:1;color:#cbd5e0}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(66,153,225,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(66,153,225,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }h1{font-size:2.4rem;line-height:1;color:#1a202c;font-weight:300;margin-bottom:1rem}h2{font-size:2rem;margin-bottom:.5rem;font-weight:500;line-height:1.2}h3{font-size:1.75rem;line-height:1.2}h3,h4{margin-bottom:.5rem;font-weight:300;color:#1a202c}h4{font-size:1.5rem;line-height:1}h5{font-size:1.25rem;font-weight:400}h5,h6{margin-bottom:.5rem;line-height:1.2}h6{font-size:1rem;font-weight:500}p{margin-bottom:1rem}li{display:list-item}ol{list-style-type:decimal}ol,ul{display:block;margin:1em 0;padding-left:40px}ul{list-style-type:disc}dl{margin:1em 0}dl,dt{display:block}code,pre{font-size:.9em}pre{display:block;font-family:monospace;white-space:pre;margin:1em 0}hr{margin-bottom:10px}a{color:rgb(66 153 225/var(--tw-text-opacity))}a:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.tw-border-t-1{border-top-width:1px}.tw-border-b-1{border-bottom-width:1px}.tw-border-1{border-width:1px}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}#side-navbar,.shadow{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}#side-navbar{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding-right:0;--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}#side-navbar ol,#side-navbar ul{list-style:none;margin:0;padding:0}#side-navbar h6{margin:0;border-right-width:4px;--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));padding:1rem 1rem 1rem .25rem}#side-navbar h6,.nav-link{display:block;--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.nav-link{padding:.5rem .5rem .5rem .75rem;font-size:.875rem;-webkit-text-decoration-line:none;text-decoration-line:none}#side-navbar li,.nav-link:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}#side-navbar li{display:block;border-right-width:4px;--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));padding:0;font-weight:500}#side-navbar li.active{font-weight:700!important}#side-navbar li.active,#side-navbar li:hover{--tw-border-opacity:1;border-color:rgb(56 161 105/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}#side-navbar li:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.nav-sub-menu-item{margin-left:2rem}.ixpm-table a{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity));-webkit-text-decoration-line:none;text-decoration-line:none}.ixpm-table a:hover{--tw-text-opacity:1;color:rgb(66 153 225/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.btn{border-radius:.125rem;font-weight:700}.btn,.btn:hover{border-color:transparent}.btn-primary{--tw-bg-opacity:1;background-color:rgb(66 153 225/var(--tw-bg-opacity));font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(39 121 189/var(--tw-bg-opacity))}.btn-success{--tw-bg-opacity:1;background-color:rgb(72 187 120/var(--tw-bg-opacity));font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-success:hover{--tw-bg-opacity:1;background-color:rgb(31 157 85/var(--tw-bg-opacity))}.btn-secondary{--tw-bg-opacity:1;background-color:rgb(135 149 161/var(--tw-bg-opacity));font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-secondary:hover{--tw-bg-opacity:1;background-color:rgb(96 111 123/var(--tw-bg-opacity))}.btn-outline-secondary{border-radius:.125rem;--tw-border-opacity:1;border-color:rgb(184 194 204/var(--tw-border-opacity));background-color:transparent;font-weight:600;--tw-text-opacity:1;color:rgb(184 194 204/var(--tw-text-opacity));border-width:1px}.btn-outline-secondary:hover{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.btn-white{border-radius:.125rem;--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));font-weight:600;--tw-text-opacity:1;color:rgb(61 72 82/var(--tw-text-opacity));--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.btn-white,.btn-white:hover{border-color:rgb(218 225 231/var(--tw-border-opacity));border-width:1px}.btn-white:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.btn-info{border-radius:.125rem;--tw-border-opacity:1;border-color:rgb(56 178 172/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));font-weight:600;--tw-text-opacity:1;color:rgb(56 178 172/var(--tw-text-opacity));--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.btn-info,.btn-info:hover{border-width:1px}.btn-info:hover{--tw-border-opacity:1;border-color:rgb(218 225 231/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(56 178 172/var(--tw-bg-opacity))}input.form-control{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.125rem;padding:.5rem 1rem;--tw-text-opacity:1;border-width:1px;--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}input.form-control,input.form-control:focus{line-height:1.25;color:rgb(96 111 123/var(--tw-text-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}input.form-control:focus{--tw-text-opacity:1;--tw-shadow:0 0 0 3px rgba(52,144,220,0.5);--tw-shadow-colored:0 0 0 3px var(--tw-shadow-color);outline:2px solid transparent;outline-offset:2px}.input-group-append .btn{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);border-color:#ced4da}label.control-label,label.form-check-label{display:block;font-size:.875rem;font-weight:700;--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.badge{border-radius:9999px;padding:.25rem .75rem;font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.badge-info{--tw-bg-opacity:1;background-color:rgb(56 178 172/var(--tw-bg-opacity))}.badge-success{--tw-bg-opacity:1;background-color:rgb(72 187 120/var(--tw-bg-opacity))}.badge-secondary{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.badge-warning{--tw-bg-opacity:1;background-color:rgb(246 173 85/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.card{border-color:#dae1e7;border-radius:.125rem;--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.card .card-header{border-top-left-radius:.125rem;border-top-right-radius:.125rem;border-bottom-width:0}a{display:inline-block;vertical-align:baseline;font-weight:700;color:rgb(108 178 235/var(--tw-text-opacity))}a,a:hover{--tw-text-opacity:1}a:hover{color:rgb(39 121 189/var(--tw-text-opacity));-webkit-text-decoration-line:none;text-decoration-line:none}.table-light td,.table-light thead th{border-color:#ced4da}.docstore table{width:100%;table-layout:auto}.docstore td{border-color:rgb(226 232 240/var(--tw-border-opacity));border-top-width:1px}.docstore td,.docstore td.top{--tw-border-opacity:1;padding:.5rem}.docstore td.top{border-top-width:2px;border-color:rgb(226 232 240/var(--tw-border-opacity))}.docstore td.meta{display:none;width:.25rem;white-space:nowrap}@media (min-width:1024px){.docstore td.meta{display:table-cell;width:.25rem;white-space:nowrap}}.docstore td.icon{margin-right:1rem;width:.25rem;white-space:nowrap;padding:.5rem;text-align:center}.tw-collapse{visibility:collapse}.tw-relative{position:relative}.tw-float-right{float:right}.tw-m-0{margin:0}.tw-m-2{margin:.5rem}.tw-mx-3{margin-left:.75rem;margin-right:.75rem}.tw-mx-4{margin-left:1rem;margin-right:1rem}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-my-0{margin-top:0;margin-bottom:0}.tw-my-1{margin-top:.25rem;margin-bottom:.25rem}.tw-my-10{margin-top:2.5rem;margin-bottom:2.5rem}.tw-my-12{margin-top:3rem;margin-bottom:3rem}.tw-my-4{margin-top:1rem;margin-bottom:1rem}.tw-my-6{margin-top:1.5rem;margin-bottom:1.5rem}.tw-my-8{margin-top:2rem;margin-bottom:2rem}.tw-mb-0{margin-bottom:0}.tw-mb-16{margin-bottom:4rem}.tw-mb-2{margin-bottom:.5rem}.tw-mb-6{margin-bottom:1.5rem}.tw-mb-8{margin-bottom:2rem}.tw-ml-12{margin-left:3rem}.tw-ml-2{margin-left:.5rem}.tw-ml-4{margin-left:1rem}.tw-ml-6{margin-left:1.5rem}.tw-ml-8{margin-left:2rem}.tw-mr-2{margin-right:.5rem}.tw-mr-3{margin-right:.75rem}.tw-mr-4{margin-right:1rem}.tw-mr-6{margin-right:1.5rem}.tw-mt-1{margin-top:.25rem}.tw-mt-16{margin-top:4rem}.tw-mt-2{margin-top:.5rem}.tw-mt-4{margin-top:1rem}.tw-mt-6{margin-top:1.5rem}.tw-mt-8{margin-top:2rem}.tw-block{display:block}.tw-inline-block{display:inline-block}.tw-inline{display:inline}.tw-flex{display:flex}.tw-hidden{display:none}.tw-h-24{height:6rem}.tw-w-6{width:1.5rem}.tw-w-auto{width:auto}.tw-w-full{width:100%}.tw-min-w-full{min-width:100%}.tw-max-w-lg{max-width:50rem}.tw-max-w-md{max-width:40rem}.tw-max-w-sm{max-width:30rem}.tw-flex-1{flex:1 1 0%}.tw-cursor-pointer{cursor:pointer}.tw-list-none{list-style-type:none}.tw-flex-wrap{flex-wrap:wrap}.tw-items-center{align-items:center}.tw-justify-between{justify-content:space-between}.tw-self-center{align-self:center}.tw-overflow-hidden{overflow:hidden}.tw-rounded-full{border-radius:9999px}.tw-rounded-lg{border-radius:.5rem}.tw-rounded-sm{border-radius:.125rem}.tw-border-2{border-width:2px}.tw-border-b-2{border-bottom-width:2px}.tw-border-l-4{border-left-width:4px}.tw-border-r-4{border-right-width:4px}.tw-border-t-2{border-top-width:2px}.tw-border-blue-500{--tw-border-opacity:1;border-color:rgb(66 153 225/var(--tw-border-opacity))}.tw-border-gray-200{--tw-border-opacity:1;border-color:rgb(237 242 247/var(--tw-border-opacity))}.tw-border-gray-300{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.tw-border-gray-400{--tw-border-opacity:1;border-color:rgb(203 213 224/var(--tw-border-opacity))}.tw-border-gray-500{--tw-border-opacity:1;border-color:rgb(160 174 192/var(--tw-border-opacity))}.tw-border-gray-600{--tw-border-opacity:1;border-color:rgb(113 128 150/var(--tw-border-opacity))}.tw-border-green-500{--tw-border-opacity:1;border-color:rgb(72 187 120/var(--tw-border-opacity))}.tw-border-grey-light{--tw-border-opacity:1;border-color:rgb(218 225 231/var(--tw-border-opacity))}.tw-border-grey-lighter{--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity))}.tw-border-orange-500{--tw-border-opacity:1;border-color:rgb(237 137 54/var(--tw-border-opacity))}.tw-border-red-500{--tw-border-opacity:1;border-color:rgb(245 101 101/var(--tw-border-opacity))}.tw-border-red-lighter{--tw-border-opacity:1;border-color:rgb(249 172 170/var(--tw-border-opacity))}.tw-bg-blue-100{--tw-bg-opacity:1;background-color:rgb(235 248 255/var(--tw-bg-opacity))}.tw-bg-blue-lightest{--tw-bg-opacity:1;background-color:rgb(239 248 255/var(--tw-bg-opacity))}.tw-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(247 250 252/var(--tw-bg-opacity))}.tw-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(237 242 247/var(--tw-bg-opacity))}.tw-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(160 174 192/var(--tw-bg-opacity))}.tw-bg-green-100{--tw-bg-opacity:1;background-color:rgb(240 255 244/var(--tw-bg-opacity))}.tw-bg-grey-lighter{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.tw-bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 250 240/var(--tw-bg-opacity))}.tw-bg-red-100{--tw-bg-opacity:1;background-color:rgb(255 245 245/var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.tw-p-0{padding:0}.tw-p-1{padding:.25rem}.tw-p-2{padding:.5rem}.tw-p-4{padding:1rem}.tw-p-5{padding:1.25rem}.tw-p-6{padding:1.5rem}.tw-px-1{padding-left:.25rem;padding-right:.25rem}.tw-px-10{padding-left:2.5rem;padding-right:2.5rem}.tw-px-3{padding-left:.75rem;padding-right:.75rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.tw-px-8{padding-left:2rem;padding-right:2rem}.tw-py-0{padding-top:0;padding-bottom:0}.tw-py-1{padding-top:.25rem;padding-bottom:.25rem}.tw-py-2{padding-top:.5rem;padding-bottom:.5rem}.tw-py-20{padding-top:5rem;padding-bottom:5rem}.tw-py-4{padding-top:1rem;padding-bottom:1rem}.tw-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.tw-pb-2{padding-bottom:.5rem}.tw-pb-8{padding-bottom:2rem}.tw-pl-0{padding-left:0}.tw-pl-16{padding-left:4rem}.tw-pl-2{padding-left:.5rem}.tw-pl-4{padding-left:1rem}.tw-pr-4{padding-right:1rem}.tw-pt-0{padding-top:0}.tw-pt-4{padding-top:1rem}.tw-pt-6{padding-top:1.5rem}.tw-text-center{text-align:center}.tw-text-right{text-align:right}.tw-align-middle{vertical-align:middle}.tw-font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.tw-text-base{font-size:1rem}.tw-text-lg{font-size:1.125rem}.tw-text-sm{font-size:.875rem}.tw-text-xl{font-size:1.25rem}.tw-text-xs{font-size:.75rem}.tw-font-bold{font-weight:700}.tw-font-normal{font-weight:400}.tw-font-semibold{font-weight:600}.tw-uppercase{text-transform:uppercase}.tw-italic{font-style:italic}.tw-leading-tight{line-height:1.25}.tw-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.tw-text-blue-700{--tw-text-opacity:1;color:rgb(43 108 176/var(--tw-text-opacity))}.tw-text-blue-dark{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity))}.tw-text-gray-500{--tw-text-opacity:1;color:rgb(160 174 192/var(--tw-text-opacity))}.tw-text-gray-600{--tw-text-opacity:1;color:rgb(113 128 150/var(--tw-text-opacity))}.tw-text-gray-700{--tw-text-opacity:1;color:rgb(74 85 104/var(--tw-text-opacity))}.tw-text-green-500{--tw-text-opacity:1;color:rgb(72 187 120/var(--tw-text-opacity))}.tw-text-green-600{--tw-text-opacity:1;color:rgb(56 161 105/var(--tw-text-opacity))}.tw-text-green-700{--tw-text-opacity:1;color:rgb(47 133 90/var(--tw-text-opacity))}.tw-text-green-dark{--tw-text-opacity:1;color:rgb(31 157 85/var(--tw-text-opacity))}.tw-text-grey-dark{--tw-text-opacity:1;color:rgb(135 149 161/var(--tw-text-opacity))}.tw-text-grey-darker{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.tw-text-grey-darkest{--tw-text-opacity:1;color:rgb(61 72 82/var(--tw-text-opacity))}.tw-text-orange-500{--tw-text-opacity:1;color:rgb(237 137 54/var(--tw-text-opacity))}.tw-text-orange-700{--tw-text-opacity:1;color:rgb(192 86 33/var(--tw-text-opacity))}.tw-text-red-500{--tw-text-opacity:1;color:rgb(245 101 101/var(--tw-text-opacity))}.tw-text-red-600{--tw-text-opacity:1;color:rgb(229 62 62/var(--tw-text-opacity))}.tw-text-red-700{--tw-text-opacity:1;color:rgb(197 48 48/var(--tw-text-opacity))}.tw-text-red-lighter{--tw-text-opacity:1;color:rgb(249 172 170/var(--tw-text-opacity))}.tw-line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.tw-shadow-lg{--tw-shadow:0 15px 30px 0 rgba(0,0,0,0.11),0 5px 15px 0 rgba(0,0,0,0.08);--tw-shadow-colored:0 15px 30px 0 var(--tw-shadow-color),0 5px 15px 0 var(--tw-shadow-color)}.tw-shadow-lg,.tw-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.tw-shadow-md{--tw-shadow:0 4px 8px 0 rgba(0,0,0,0.12),0 2px 4px 0 rgba(0,0,0,0.08);--tw-shadow-colored:0 4px 8px 0 var(--tw-shadow-color),0 2px 4px 0 var(--tw-shadow-color)}.\[a-f0-9\:\\\.\\-\]{a-f0-9:\.\-}.\[id\:\%d\]{id:%d}.hover\:tw-bg-grey-lighter:hover{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.hover\:tw-no-underline:hover{-webkit-text-decoration-line:none;text-decoration-line:none}@media (min-width:768px){.md\:tw-mt-0{margin-top:0}.md\:tw-inline{display:inline}.md\:tw-table-cell{display:table-cell}.md\:tw-text-left{text-align:left}.md\:tw-text-right{text-align:right}}@media (min-width:1024px){.lg\:tw-inline-block{display:inline-block}.lg\:tw-inline{display:inline}.lg\:tw-table-cell{display:table-cell}} \ No newline at end of file +/** + * This injects Tailwind's base styles, which is a combination of + * Normalize.css and some additional base styles. + * + * You can see the styles here: + * https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css + * + * If using `postcss-import`, use this import instead: + * + * @import "tailwindcss/preflight"; + */ +/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com + */ +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: currentColor; /* 2 */ +} +::before, +::after { + --tw-content: ''; +} +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ +html, +:host { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + -o-tab-size: 4; + tab-size: 4; /* 3 */ + font-family: system-ui, BlinkMacSystemFont, -apple-system, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +/* +Remove the default font size and weight for headings. +*/ +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ +a { + color: inherit; + text-decoration: inherit; +} +/* +Add the correct font weight in Edge and Safari. +*/ +b, +strong { + font-weight: bolder; +} +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ +code, +kbd, +samp, +pre { + font-family: Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; /* 1 */ + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; /* 3 */ + font-size: 1em; /* 4 */ +} +/* +Add the correct font size in all browsers. +*/ +small { + font-size: 80%; +} +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + letter-spacing: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ +button, +select { + text-transform: none; +} +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} +/* +Use the modern Firefox focus style for all focusable elements. +*/ +:-moz-focusring { + outline: auto; +} +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ +:-moz-ui-invalid { + box-shadow: none; +} +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ +progress { + vertical-align: baseline; +} +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} +/* +Add the correct display in Chrome and Safari. +*/ +summary { + display: list-item; +} +/* +Removes the default spacing and border for appropriate elements. +*/ +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} +fieldset { + margin: 0; + padding: 0; +} +legend { + padding: 0; +} +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} +/* +Reset default styling for dialogs. +*/ +dialog { + padding: 0; +} +/* +Prevent resizing textareas horizontally by default. +*/ +textarea { + resize: vertical; +} +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; /* 1 */ + color: #cbd5e0; /* 2 */ +} +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #cbd5e0; /* 2 */ +} +/* +Set the default cursor for buttons. +*/ +button, +[role="button"] { + cursor: pointer; +} +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled { + cursor: default; +} +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ +img, +video { + max-width: 100%; + height: auto; +} +/* Make elements with the HTML hidden attribute stay hidden by default */ +[hidden] { + display: none; +} +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(66 153 225 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(66 153 225 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +/** + * This injects any component classes registered by plugins. + * + * If using `postcss-import`, use this import instead: + * + * @import "tailwindcss/components"; + */ +/** + * Here you would add any of your custom component classes; stuff that you'd + * want loaded *before* the utilities so that the utilities could still + * override them. + * + * Example: + * + * .btn { ... } + * .form-input { ... } + * + * Or if using a preprocessor or `postcss-import`: + * + * @import "components/buttons"; + * @import "components/forms"; + */ +/**************************************************************************************** + **** Reset headings to ~ Bootstrap4 defaults + ****************************************************************************************/ +h1 { + font-size: 2.4rem; + line-height: 1; + color: #1a202c; + font-weight: 300; + margin-bottom: 1rem; +} + +h2 { + font-size: 2rem; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h3 { + font-size: 1.75rem; + margin-bottom: 0.5rem; + font-weight: 300; + line-height: 1.2; + color: #1a202c; +} + +h4 { + font-size: 1.5rem; + margin-bottom: 0.5rem; + font-weight: 300; + color: #1a202c; + line-height: 1; +} + +h5 { + font-size: 1.25rem; + margin-bottom: 0.5rem; + font-weight: 400; + line-height: 1.2; +} + +h6 { + font-size: 1rem; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +p { + margin-bottom: 1rem; +} + +li { + display: list-item; +} + +ol { + display: block; + list-style-type: decimal; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + padding-left: 40px; +} + +ul { + display: block; + list-style-type: disc; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + padding-left: 40px; +} + +dl { + display: block; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; +} + +dt { + display: block; +} + +code { + font-size: 0.9em; +} + +pre { + display: block; + font-family: monospace; + white-space: pre; + margin: 1em 0; + font-size: 0.9em; +} + +hr { + margin-bottom: 10px; +} + +/**************************************************************************************** + **** Reset anchors + ****************************************************************************************/ +a { + --tw-text-opacity: 1; + color: rgb(66 153 225 / var(--tw-text-opacity)); +} + +a:hover { + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +.tw-border-t-1 { + border-top-width: 1px; +} + +.tw-border-b-1 { + border-bottom-width: 1px; +} + +.tw-border-1 { + border-width: 1px; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +/**************************************************************************************** + **** LHS Menu in IXP Manager + + +
+ +
+ + + ****************************************************************************************/ +#side-navbar { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + padding-right: 0; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +#side-navbar ul, #side-navbar ol { + list-style: none; + margin: 0; + padding: 0; +} + +#side-navbar h6 { + margin: 0; + display: block; + border-right-width: 4px; + --tw-border-opacity: 1; + border-color: rgb(241 245 248 / var(--tw-border-opacity)); + padding: 1rem; + padding-left: 0.25rem; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +.nav-link { + display: block; + padding: 0.5rem; + padding-left: 0.75rem; + font-size: .875rem; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); + -webkit-text-decoration-line: none; + text-decoration-line: none; +} + +.nav-link:hover { + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +#side-navbar li { + display: block; + border-right-width: 4px; + --tw-border-opacity: 1; + border-color: rgb(241 245 248 / var(--tw-border-opacity)); + padding: 0; + font-weight: 500; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +#side-navbar li.active { + --tw-border-opacity: 1; + border-color: rgb(56 161 105 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); + font-weight: 700 !important; +} + +#side-navbar li:hover { + --tw-border-opacity: 1; + border-color: rgb(56 161 105 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +.nav-sub-menu-item { + margin-left: 2rem; +} + +.ixpm-table a { + --tw-text-opacity: 1; + color: rgb(39 121 189 / var(--tw-text-opacity)); + -webkit-text-decoration-line: none; + text-decoration-line: none; +} + +.ixpm-table a:hover { + --tw-text-opacity: 1; + color: rgb(66 153 225 / var(--tw-text-opacity)); + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +/**************************************************************************************** + **** Buttons + ****************************************************************************************/ +.btn { + border-radius: .125rem; + border-color: transparent; + font-weight: 700; +} + +.btn:hover { + border-color: transparent; +} + +.btn-primary { + --tw-bg-opacity: 1; + background-color: rgb(66 153 225 / var(--tw-bg-opacity)); + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.btn-primary:hover { + --tw-bg-opacity: 1; + background-color: rgb(39 121 189 / var(--tw-bg-opacity)); +} + +.btn-success { + --tw-bg-opacity: 1; + background-color: rgb(72 187 120 / var(--tw-bg-opacity)); + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.btn-success:hover { + --tw-bg-opacity: 1; + background-color: rgb(31 157 85 / var(--tw-bg-opacity)); +} + +.btn-secondary { + --tw-bg-opacity: 1; + background-color: rgb(135 149 161 / var(--tw-bg-opacity)); + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.btn-secondary:hover { + --tw-bg-opacity: 1; + background-color: rgb(96 111 123 / var(--tw-bg-opacity)); +} + +.btn-outline-secondary { + border-radius: .125rem; + --tw-border-opacity: 1; + border-color: rgb(184 194 204 / var(--tw-border-opacity)); + background-color: transparent; + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(184 194 204 / var(--tw-text-opacity)); + border-width: 1px; +} + +.btn-outline-secondary:hover { + --tw-bg-opacity: 1; + background-color: rgb(184 194 204 / var(--tw-bg-opacity)); +} + +.btn-white { + border-radius: .125rem; + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(61 72 82 / var(--tw-text-opacity)); + border-width: 1px; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +.btn-white:hover { + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); + border-width: 1px; +} + +.btn-info { + border-radius: .125rem; + --tw-border-opacity: 1; + border-color: rgb(56 178 172 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(56 178 172 / var(--tw-text-opacity)); + border-width: 1px; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +.btn-info:hover { + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(56 178 172 / var(--tw-bg-opacity)); + border-width: 1px; +} + +/****************************************************************************************ea + **** Inputs + ****************************************************************************************/ +input.form-control { + width: 100%; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: .125rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + line-height: 1.25; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); + border-width: 1px; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +input.form-control:focus { + line-height: 1.25; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); + --tw-shadow: 0 0 0 3px rgba(52,144,220,0.5); + --tw-shadow-colored: 0 0 0 3px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + outline: 2px solid transparent; + outline-offset: 2px; +} + +.input-group-append .btn { + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); + border-color: #ced4da; +} + +label.control-label, label.form-check-label { + display: block; + font-size: .875rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} + +/**************************************************************************************** + **** Badge + ****************************************************************************************/ +.badge { + border-radius: 9999px; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.75rem; + padding-right: 0.75rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.badge-info { + --tw-bg-opacity: 1; + background-color: rgb(56 178 172 / var(--tw-bg-opacity)); +} + +.badge-success { + --tw-bg-opacity: 1; + background-color: rgb(72 187 120 / var(--tw-bg-opacity)); +} + +.badge-secondary { + --tw-bg-opacity: 1; + background-color: rgb(184 194 204 / var(--tw-bg-opacity)); +} + +.badge-warning { + --tw-bg-opacity: 1; + background-color: rgb(246 173 85 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +/**************************************************************************************** + **** Card + ****************************************************************************************/ +.card { + border-color: #dae1e7; + border-radius: .125rem; + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); +} + +.card .card-header { + border-top-left-radius: .125rem; + border-top-right-radius: .125rem; + border-bottom-width: 0; +} + +a { + display: inline-block; + vertical-align: baseline; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(108 178 235 / var(--tw-text-opacity)); +} + +a:hover { + --tw-text-opacity: 1; + color: rgb(39 121 189 / var(--tw-text-opacity)); + -webkit-text-decoration-line: none; + text-decoration-line: none; +} + +/**************************************************************************************** + **** table + ****************************************************************************************/ +.table-light td, .table-light thead th { + border-color: #ced4da; +} + +/**************************************************************************************** + **** Docstore + ****************************************************************************************/ +.docstore table { + width: 100%; + table-layout: auto; +} + +.docstore td { + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + border-top-width: 1px; +} + +.docstore td.top { + border-top-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.docstore td.meta { + display: none; + width: 0.25rem; + white-space: nowrap; +} + +@media (min-width: 1024px) { + .docstore td.meta { + display: table-cell; + width: 0.25rem; + white-space: nowrap; + } +} +.docstore td.icon { + margin-right: 1rem; + width: 0.25rem; + white-space: nowrap; + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + text-align: center; +} + +/** + * This injects all of Tailwind's utility classes, generated based on your + * config file. + * + * If using `postcss-import`, use this import instead: + * + * @import "tailwindcss/utilities"; + */ +.tw-collapse { + visibility: collapse; +} +.tw-relative { + position: relative; +} +.tw-float-right { + float: right; +} +.tw-m-0 { + margin: 0; +} +.tw-m-2 { + margin: 0.5rem; +} +.tw-mx-3 { + margin-left: 0.75rem; + margin-right: 0.75rem; +} +.tw-mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} +.tw-mx-auto { + margin-left: auto; + margin-right: auto; +} +.tw-my-0 { + margin-top: 0; + margin-bottom: 0; +} +.tw-my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} +.tw-my-10 { + margin-top: 2.5rem; + margin-bottom: 2.5rem; +} +.tw-my-12 { + margin-top: 3rem; + margin-bottom: 3rem; +} +.tw-my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.tw-my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} +.tw-my-8 { + margin-top: 2rem; + margin-bottom: 2rem; +} +.tw-mb-0 { + margin-bottom: 0; +} +.tw-mb-16 { + margin-bottom: 4rem; +} +.tw-mb-2 { + margin-bottom: 0.5rem; +} +.tw-mb-6 { + margin-bottom: 1.5rem; +} +.tw-mb-8 { + margin-bottom: 2rem; +} +.tw-ml-12 { + margin-left: 3rem; +} +.tw-ml-2 { + margin-left: 0.5rem; +} +.tw-ml-4 { + margin-left: 1rem; +} +.tw-ml-6 { + margin-left: 1.5rem; +} +.tw-ml-8 { + margin-left: 2rem; +} +.tw-mr-2 { + margin-right: 0.5rem; +} +.tw-mr-3 { + margin-right: 0.75rem; +} +.tw-mr-4 { + margin-right: 1rem; +} +.tw-mr-6 { + margin-right: 1.5rem; +} +.tw-mt-1 { + margin-top: 0.25rem; +} +.tw-mt-16 { + margin-top: 4rem; +} +.tw-mt-2 { + margin-top: 0.5rem; +} +.tw-mt-4 { + margin-top: 1rem; +} +.tw-mt-6 { + margin-top: 1.5rem; +} +.tw-mt-8 { + margin-top: 2rem; +} +.tw-block { + display: block; +} +.tw-inline-block { + display: inline-block; +} +.tw-inline { + display: inline; +} +.tw-flex { + display: flex; +} +.tw-hidden { + display: none; +} +.tw-h-24 { + height: 6rem; +} +.tw-w-6 { + width: 1.5rem; +} +.tw-w-auto { + width: auto; +} +.tw-w-full { + width: 100%; +} +.tw-min-w-full { + min-width: 100%; +} +.tw-max-w-lg { + max-width: 50rem; +} +.tw-max-w-md { + max-width: 40rem; +} +.tw-max-w-sm { + max-width: 30rem; +} +.tw-flex-1 { + flex: 1 1 0%; +} +.tw-cursor-pointer { + cursor: pointer; +} +.tw-list-none { + list-style-type: none; +} +.tw-flex-wrap { + flex-wrap: wrap; +} +.tw-items-center { + align-items: center; +} +.tw-justify-between { + justify-content: space-between; +} +.tw-self-center { + align-self: center; +} +.tw-overflow-hidden { + overflow: hidden; +} +.tw-rounded-full { + border-radius: 9999px; +} +.tw-rounded-lg { + border-radius: .5rem; +} +.tw-rounded-sm { + border-radius: .125rem; +} +.tw-border-2 { + border-width: 2px; +} +.tw-border-b-2 { + border-bottom-width: 2px; +} +.tw-border-l-4 { + border-left-width: 4px; +} +.tw-border-r-4 { + border-right-width: 4px; +} +.tw-border-t-0 { + border-top-width: 0; +} +.tw-border-t-2 { + border-top-width: 2px; +} +.tw-border-blue-500 { + --tw-border-opacity: 1; + border-color: rgb(66 153 225 / var(--tw-border-opacity)); +} +.tw-border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(237 242 247 / var(--tw-border-opacity)); +} +.tw-border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity)); +} +.tw-border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(203 213 224 / var(--tw-border-opacity)); +} +.tw-border-gray-500 { + --tw-border-opacity: 1; + border-color: rgb(160 174 192 / var(--tw-border-opacity)); +} +.tw-border-gray-600 { + --tw-border-opacity: 1; + border-color: rgb(113 128 150 / var(--tw-border-opacity)); +} +.tw-border-green-500 { + --tw-border-opacity: 1; + border-color: rgb(72 187 120 / var(--tw-border-opacity)); +} +.tw-border-grey-light { + --tw-border-opacity: 1; + border-color: rgb(218 225 231 / var(--tw-border-opacity)); +} +.tw-border-grey-lighter { + --tw-border-opacity: 1; + border-color: rgb(241 245 248 / var(--tw-border-opacity)); +} +.tw-border-orange-500 { + --tw-border-opacity: 1; + border-color: rgb(237 137 54 / var(--tw-border-opacity)); +} +.tw-border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(245 101 101 / var(--tw-border-opacity)); +} +.tw-border-red-lighter { + --tw-border-opacity: 1; + border-color: rgb(249 172 170 / var(--tw-border-opacity)); +} +.tw-bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(235 248 255 / var(--tw-bg-opacity)); +} +.tw-bg-blue-lightest { + --tw-bg-opacity: 1; + background-color: rgb(239 248 255 / var(--tw-bg-opacity)); +} +.tw-bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(247 250 252 / var(--tw-bg-opacity)); +} +.tw-bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(237 242 247 / var(--tw-bg-opacity)); +} +.tw-bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(160 174 192 / var(--tw-bg-opacity)); +} +.tw-bg-green-100 { + --tw-bg-opacity: 1; + background-color: rgb(240 255 244 / var(--tw-bg-opacity)); +} +.tw-bg-grey-lighter { + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); +} +.tw-bg-orange-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 250 240 / var(--tw-bg-opacity)); +} +.tw-bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 245 245 / var(--tw-bg-opacity)); +} +.tw-bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.tw-p-0 { + padding: 0; +} +.tw-p-1 { + padding: 0.25rem; +} +.tw-p-2 { + padding: 0.5rem; +} +.tw-p-4 { + padding: 1rem; +} +.tw-p-5 { + padding: 1.25rem; +} +.tw-p-6 { + padding: 1.5rem; +} +.tw-px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.tw-px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; +} +.tw-px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} +.tw-px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.tw-px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.tw-px-8 { + padding-left: 2rem; + padding-right: 2rem; +} +.tw-py-0 { + padding-top: 0; + padding-bottom: 0; +} +.tw-py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} +.tw-py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.tw-py-20 { + padding-top: 5rem; + padding-bottom: 5rem; +} +.tw-py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.tw-py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} +.tw-pb-2 { + padding-bottom: 0.5rem; +} +.tw-pb-8 { + padding-bottom: 2rem; +} +.tw-pl-0 { + padding-left: 0; +} +.tw-pl-16 { + padding-left: 4rem; +} +.tw-pl-2 { + padding-left: 0.5rem; +} +.tw-pl-4 { + padding-left: 1rem; +} +.tw-pr-4 { + padding-right: 1rem; +} +.tw-pt-0 { + padding-top: 0; +} +.tw-pt-4 { + padding-top: 1rem; +} +.tw-pt-6 { + padding-top: 1.5rem; +} +.tw-text-center { + text-align: center; +} +.tw-text-right { + text-align: right; +} +.tw-align-middle { + vertical-align: middle; +} +.tw-font-mono { + font-family: Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; +} +.tw-text-base { + font-size: 1rem; +} +.tw-text-lg { + font-size: 1.125rem; +} +.tw-text-sm { + font-size: .875rem; +} +.tw-text-xl { + font-size: 1.25rem; +} +.tw-text-xs { + font-size: .75rem; +} +.tw-font-bold { + font-weight: 700; +} +.tw-font-normal { + font-weight: 400; +} +.tw-font-semibold { + font-weight: 600; +} +.tw-uppercase { + text-transform: uppercase; +} +.tw-italic { + font-style: italic; +} +.tw-leading-tight { + line-height: 1.25; +} +.tw-text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} +.tw-text-blue-700 { + --tw-text-opacity: 1; + color: rgb(43 108 176 / var(--tw-text-opacity)); +} +.tw-text-blue-dark { + --tw-text-opacity: 1; + color: rgb(39 121 189 / var(--tw-text-opacity)); +} +.tw-text-gray-500 { + --tw-text-opacity: 1; + color: rgb(160 174 192 / var(--tw-text-opacity)); +} +.tw-text-gray-600 { + --tw-text-opacity: 1; + color: rgb(113 128 150 / var(--tw-text-opacity)); +} +.tw-text-gray-700 { + --tw-text-opacity: 1; + color: rgb(74 85 104 / var(--tw-text-opacity)); +} +.tw-text-green-500 { + --tw-text-opacity: 1; + color: rgb(72 187 120 / var(--tw-text-opacity)); +} +.tw-text-green-600 { + --tw-text-opacity: 1; + color: rgb(56 161 105 / var(--tw-text-opacity)); +} +.tw-text-green-700 { + --tw-text-opacity: 1; + color: rgb(47 133 90 / var(--tw-text-opacity)); +} +.tw-text-green-dark { + --tw-text-opacity: 1; + color: rgb(31 157 85 / var(--tw-text-opacity)); +} +.tw-text-grey-dark { + --tw-text-opacity: 1; + color: rgb(135 149 161 / var(--tw-text-opacity)); +} +.tw-text-grey-darker { + --tw-text-opacity: 1; + color: rgb(96 111 123 / var(--tw-text-opacity)); +} +.tw-text-grey-darkest { + --tw-text-opacity: 1; + color: rgb(61 72 82 / var(--tw-text-opacity)); +} +.tw-text-orange-500 { + --tw-text-opacity: 1; + color: rgb(237 137 54 / var(--tw-text-opacity)); +} +.tw-text-orange-700 { + --tw-text-opacity: 1; + color: rgb(192 86 33 / var(--tw-text-opacity)); +} +.tw-text-red-500 { + --tw-text-opacity: 1; + color: rgb(245 101 101 / var(--tw-text-opacity)); +} +.tw-text-red-600 { + --tw-text-opacity: 1; + color: rgb(229 62 62 / var(--tw-text-opacity)); +} +.tw-text-red-700 { + --tw-text-opacity: 1; + color: rgb(197 48 48 / var(--tw-text-opacity)); +} +.tw-text-red-lighter { + --tw-text-opacity: 1; + color: rgb(249 172 170 / var(--tw-text-opacity)); +} +.tw-line-through { + -webkit-text-decoration-line: line-through; + text-decoration-line: line-through; +} +.tw-shadow-lg { + --tw-shadow: 0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08); + --tw-shadow-colored: 0 15px 30px 0 var(--tw-shadow-color), 0 5px 15px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.tw-shadow-md { + --tw-shadow: 0 4px 8px 0 rgba(0,0,0,0.12), 0 2px 4px 0 rgba(0,0,0,0.08); + --tw-shadow-colored: 0 4px 8px 0 var(--tw-shadow-color), 0 2px 4px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.\[a-f0-9\:\\\.\\-\] { + a-f0-9: \.\-; +} +.\[id\:\%d\] { + id: %d; +} +/** + * Here you would add any custom utilities you need that don't come out of the + * box with Tailwind. + * + * Example : + * + * .bg-pattern-graph-paper { ... } + * .skew-45 { ... } + * + * Or if using a preprocessor or `postcss-import`: + * + * @import "utilities/background-patterns"; + * @import "utilities/skew-transforms"; + */ +.hover\:tw-bg-grey-lighter:hover { + --tw-bg-opacity: 1; + background-color: rgb(241 245 248 / var(--tw-bg-opacity)); +} +.hover\:tw-no-underline:hover { + -webkit-text-decoration-line: none; + text-decoration-line: none; +} +@media (min-width: 768px) { + .md\:tw-mt-0 { + margin-top: 0; + } + .md\:tw-inline { + display: inline; + } + .md\:tw-table-cell { + display: table-cell; + } + .md\:tw-text-left { + text-align: left; + } + .md\:tw-text-right { + text-align: right; + } +} +@media (min-width: 1024px) { + .lg\:tw-inline-block { + display: inline-block; + } + .lg\:tw-inline { + display: inline; + } + .lg\:tw-table-cell { + display: table-cell; + } +} \ No newline at end of file diff --git a/public/js/ixp-manager.js b/public/js/ixp-manager.js index 2a175728c..f412e2042 100644 --- a/public/js/ixp-manager.js +++ b/public/js/ixp-manager.js @@ -250,5 +250,14 @@ function ixpWhoisPrefix( prefix, subnet = true ) { }) } +/***** Tab Panels START *****/ +$(document).on('click','.tabButton',function(e) { + $('.tabButton').removeClass('active'); + $(this).addClass('active'); + $('.tabPanel').removeClass('active'); + const target = $(this).data('target'); + $(target).addClass('active'); +}); +/***** Tab Panels END *******/ diff --git a/public/js/ixp-pack.js b/public/js/ixp-pack.js index 3bb80ba73..3c3c9debf 100644 --- a/public/js/ixp-pack.js +++ b/public/js/ixp-pack.js @@ -1 +1,28122 @@ -function ixpFormatFileSize(t){return"number"!=typeof t?"":t>=1073741824?(t/1073741824).toFixed(2)+" GB":t>=1048576?(t/1048576).toFixed(2)+" MB":(t/1024).toFixed(2)+" KB"}function ixpRandomString(t=12){let e="";if(void 0===window.crypto.getRandomValues)alert("No cryptographically secure PRNG available.");else{let i="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",r=new Uint32Array(t);window.crypto.getRandomValues(r);for(var n=0;n/g,">").replace(/"/g,""").replace(/'/g,""")}function ixpAsnumber(t){let e=WHOIS_ASN_URL+"/"+t,n='
';bootbox.dialog({message:'

',size:"large",title:"AS Number Lookup",onEscape:!0,buttons:{cancel:{label:"Close",callback:function(){return $(".bootbox.modal").modal("hide"),!1}}}});$.ajax(e).done(function(t){n+=t+"
",$(".bootbox-body").html(n).scrollTop()}).fail(function(){throw alert(`Error running ajax query for ${e}`),`Error running ajax query for ${e}`})}function ixpWhoisPrefix(t,e=!0){let n=t.split("/"),i=encodeURI(WHOIS_PREFIX_URL+"/"+n[0]+"/");if(e&&2!==n.length)return!1;e&&(i=encodeURI(WHOIS_PREFIX_URL+"/"+n[0]+"/"+n[1]));let r='
';bootbox.dialog({message:'

',size:"large",title:"Prefix Whois Lookup",onEscape:!0,buttons:{cancel:{label:"Close",callback:function(){return $(".bootbox.modal").modal("hide"),!1}}}});$.ajax(i).done(function(t){r+=t+"
",$(".bootbox-body").html(r).scrollTop()}).fail(function(){throw alert(`Error running ajax query for ${i}`),`Error running ajax query for ${i}`})}!function(t,e){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return e(t)}:e(t)}("undefined"!=typeof window?window:this,function(t,e){"use strict";var n=[],i=Object.getPrototypeOf,r=n.slice,s=n.flat?function(t){return n.flat.call(t)}:function(t){return n.concat.apply([],t)},o=n.push,a=n.indexOf,l={},u=l.toString,c=l.hasOwnProperty,h=c.toString,d=h.call(Object),f={},p=function(t){return"function"==typeof t&&"number"!=typeof t.nodeType&&"function"!=typeof t.item},g=function(t){return null!=t&&t===t.window},m=t.document,v={type:!0,src:!0,nonce:!0,noModule:!0};function _(t,e,n){var i,r,s=(n=n||m).createElement("script");if(s.text=t,e)for(i in v)(r=e[i]||e.getAttribute&&e.getAttribute(i))&&s.setAttribute(i,r);n.head.appendChild(s).parentNode.removeChild(s)}function y(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?l[u.call(t)]||"object":typeof t}var b="3.7.1",w=/HTML$/i,x=function(t,e){return new x.fn.init(t,e)};function S(t){var e=!!t&&"length"in t&&t.length,n=y(t);return!p(t)&&!g(t)&&("array"===n||0===e||"number"==typeof e&&0+~]|"+E+")"+E+"*"),B=new RegExp(E+"|>"),z=new RegExp(L),$=new RegExp("^"+R+"$"),q={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+j),PSEUDO:new RegExp("^"+L),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),bool:new RegExp("^(?:"+N+")$","i"),needsContext:new RegExp("^"+E+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,U=/^h\d$/i,V=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/[+~]/,X=new RegExp("\\\\[\\da-fA-F]{1,6}"+E+"?|\\\\([^\\r\\n\\f])","g"),K=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},Z=function(){lt()},Q=dt(function(t){return!0===t.disabled&&D(t,"fieldset")},{dir:"parentNode",next:"legend"});try{m.apply(n=r.call(M.childNodes),M.childNodes),n[M.childNodes.length].nodeType}catch(e){m={apply:function(t,e){P.apply(t,r.call(e))},call:function(t){P.apply(t,r.call(arguments,1))}}}function J(t,e,n,i){var r,s,o,a,l,c,h,g=e&&e.ownerDocument,_=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==_&&9!==_&&11!==_)return n;if(!i&&(lt(e),e=e||u,d)){if(11!==_&&(l=V.exec(t)))if(r=l[1]){if(9===_){if(!(o=e.getElementById(r)))return n;if(o.id===r)return m.call(n,o),n}else if(g&&(o=g.getElementById(r))&&J.contains(e,o)&&o.id===r)return m.call(n,o),n}else{if(l[2])return m.apply(n,e.getElementsByTagName(t)),n;if((r=l[3])&&e.getElementsByClassName)return m.apply(n,e.getElementsByClassName(r)),n}if(!(I[t+" "]||p&&p.test(t))){if(h=t,g=e,1===_&&(B.test(t)||W.test(t))){for((g=G.test(t)&&at(e.parentNode)||e)==e&&f.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=v)),s=(c=ct(t)).length;s--;)c[s]=(a?"#"+a:":scope")+" "+ht(c[s]);h=c.join(",")}try{return m.apply(n,g.querySelectorAll(h)),n}catch(e){I(t,!0)}finally{a===v&&e.removeAttribute("id")}}}return _t(t.replace(A,"$1"),e,n,i)}function tt(){var t=[];return function e(n,r){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=r}}function et(t){return t[v]=!0,t}function nt(t){var e=u.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return D(e,"input")&&e.type===t}}function rt(t){return function(e){return(D(e,"input")||D(e,"button"))&&e.type===t}}function st(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Q(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ot(t){return et(function(e){return e=+e,et(function(n,i){for(var r,s=t([],n.length,e),o=s.length;o--;)n[r=s[o]]&&(n[r]=!(i[r]=n[r]))})})}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var e,n=t?t.ownerDocument||t:M;return n!=u&&9===n.nodeType&&n.documentElement&&(h=(u=n).documentElement,d=!x.isXMLDoc(u),g=h.matches||h.webkitMatchesSelector||h.msMatchesSelector,h.msMatchesSelector&&M!=u&&(e=u.defaultView)&&e.top!==e&&e.addEventListener("unload",Z),f.getById=nt(function(t){return h.appendChild(t).id=x.expando,!u.getElementsByName||!u.getElementsByName(x.expando).length}),f.disconnectedMatch=nt(function(t){return g.call(t,"*")}),f.scope=nt(function(){return u.querySelectorAll(":scope")}),f.cssHas=nt(function(){try{return u.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}}),f.getById?(i.filter.ID=function(t){var e=t.replace(X,K);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&d){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(X,K);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&d){var n,i,r,s=e.getElementById(t);if(s){if((n=s.getAttributeNode("id"))&&n.value===t)return[s];for(r=e.getElementsByName(t),i=0;s=r[i++];)if((n=s.getAttributeNode("id"))&&n.value===t)return[s]}return[]}}),i.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},i.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&d)return e.getElementsByClassName(t)},p=[],nt(function(t){var e;h.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||p.push("\\["+E+"*(?:value|"+N+")"),t.querySelectorAll("[id~="+v+"-]").length||p.push("~="),t.querySelectorAll("a#"+v+"+*").length||p.push(".#.+[+~]"),t.querySelectorAll(":checked").length||p.push(":checked"),(e=u.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),h.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(e=u.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||p.push("\\["+E+"*name"+E+"*="+E+"*(?:''|\"\")")}),f.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),O=function(t,e){if(t===e)return l=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!f.sortDetached&&e.compareDocumentPosition(t)===n?t===u||t.ownerDocument==M&&J.contains(M,t)?-1:e===u||e.ownerDocument==M&&J.contains(M,e)?1:o?a.call(o,t)-a.call(o,e):0:4&n?-1:1)}),u}for(e in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),d&&!I[e+" "]&&(!p||!p.test(e)))try{var n=g.call(t,e);if(n||f.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){I(e,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(X,K),t[3]=(t[3]||t[4]||t[5]||"").replace(X,K),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return q.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&z.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(X,K).toLowerCase();return"*"===t?function(){return!0}:function(t){return D(t,e)}},CLASS:function(t){var e=b[t+" "];return e||(e=new RegExp("(^|"+E+")"+t+"("+E+"|$)"))&&b(t,function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(t,e,n){return function(i){var r=J.attr(i,t);return null==r?"!="===e:!e||(r+="","="===e?r===n:"!="===e?r!==n:"^="===e?n&&0===r.indexOf(n):"*="===e?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function H(t,e,n){return p(e)?x.grep(t,function(t,i){return!!e.call(t,i,t)!==n}):e.nodeType?x.grep(t,function(t){return t===e!==n}):"string"!=typeof e?x.grep(t,function(t){return-1)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,r;if(!t)return this;if(n=n||F,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&3<=t.length?[null,t,null]:W.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:m,!0)),L.test(i[1])&&x.isPlainObject(e))for(i in e)p(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(r=m.getElementById(i[2]))&&(this[0]=r,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):p(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,F=x(m);var B=/^(?:parents|prev(?:Until|All))/,z={children:!0,contents:!0,next:!0,prev:!0};function $(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter(function(){for(var t=0;t\x20\t\r\n\f]*)/i,St=/^$|^module$|\/(?:java|ecma)script/i;yt=m.createDocumentFragment().appendChild(m.createElement("div")),(bt=m.createElement("input")).setAttribute("type","radio"),bt.setAttribute("checked","checked"),bt.setAttribute("name","t"),yt.appendChild(bt),f.checkClone=yt.cloneNode(!0).cloneNode(!0).lastChild.checked,yt.innerHTML="",f.noCloneChecked=!!yt.cloneNode(!0).lastChild.defaultValue,yt.innerHTML="",f.option=!!yt.lastChild;var Dt={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Ct(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&D(t,e)?x.merge([t],n):n}function Tt(t,e){for(var n=0,i=t.length;n",""]);var kt=/<|&#?\w+;/;function Et(t,e,n,i,r){for(var s,o,a,l,u,c,h=e.createDocumentFragment(),d=[],f=0,p=t.length;f\s*$/g;function Lt(t,e){return D(t,"table")&&D(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Ht(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Ft(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,r,s,o,a;if(1===e.nodeType){if(rt.hasData(t)&&(a=rt.get(t).events))for(r in rt.remove(e,"handle events"),a)for(n=0,i=a[r].length;n").attr(t.scriptAttrs||{}).prop({charset:t.scriptCharset,src:t.url}).on("load error",n=function(t){e.remove(),n=null,t&&r("error"===t.type?404:200,t.type)}),m.head.appendChild(e[0])},abort:function(){n&&n()}}});var Ze,Qe=[],Je=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var t=Qe.pop()||x.expando+"_"+ke.guid++;return this[t]=!0,t}}),x.ajaxPrefilter("json jsonp",function(e,n,i){var r,s,o,a=!1!==e.jsonp&&(Je.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Je.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=p(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Je,"$1"+r):!1!==e.jsonp&&(e.url+=(Ee.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||x.error(r+" was not called"),o[0]},e.dataTypes[0]="json",s=t[r],t[r]=function(){o=arguments},i.always(function(){void 0===s?x(t).removeProp(r):t[r]=s,e[r]&&(e.jsonpCallback=n.jsonpCallback,Qe.push(r)),o&&p(s)&&s(o[0]),o=s=void 0}),"script"}),f.createHTMLDocument=((Ze=m.implementation.createHTMLDocument("").body).innerHTML="
",2===Ze.childNodes.length),x.parseHTML=function(t,e,n){return"string"!=typeof t?[]:("boolean"==typeof e&&(n=e,e=!1),e||(f.createHTMLDocument?((i=(e=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,e.head.appendChild(i)):e=m),s=!n&&[],(r=L.exec(t))?[e.createElement(r[1])]:(r=Et([t],e,s),s&&s.length&&x(s).remove(),x.merge([],r.childNodes)));var i,r,s},x.fn.load=function(t,e,n){var i,r,s,o=this,a=t.indexOf(" ");return-1").append(x.parseHTML(t)).find(i):t)}).always(n&&function(t,e){o.each(function(){n.apply(this,s||[t.responseText,e,t])})}),this},x.expr.pseudos.animated=function(t){return x.grep(x.timers,function(e){return t===e.elem}).length},x.offset={setOffset:function(t,e,n){var i,r,s,o,a,l,u=x.css(t,"position"),c=x(t),h={};"static"===u&&(t.style.position="relative"),a=c.offset(),s=x.css(t,"top"),l=x.css(t,"left"),("absolute"===u||"fixed"===u)&&-1<(s+l).indexOf("auto")?(o=(i=c.position()).top,r=i.left):(o=parseFloat(s)||0,r=parseFloat(l)||0),p(e)&&(e=e.call(t,n,x.extend({},a))),null!=e.top&&(h.top=e.top-a.top+o),null!=e.left&&(h.left=e.left-a.left+r),"using"in e?e.using.call(t,h):c.css(h)}},x.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){x.offset.setOffset(this,t,e)});var e,n,i=this[0];return i?i.getClientRects().length?(e=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var t,e,n,i=this[0],r={top:0,left:0};if("fixed"===x.css(i,"position"))e=i.getBoundingClientRect();else{for(e=this.offset(),n=i.ownerDocument,t=i.offsetParent||n.documentElement;t&&(t===n.body||t===n.documentElement)&&"static"===x.css(t,"position");)t=t.parentNode;t&&t!==i&&1===t.nodeType&&((r=x(t).offset()).top+=x.css(t,"borderTopWidth",!0),r.left+=x.css(t,"borderLeftWidth",!0))}return{top:e.top-r.top-x.css(i,"marginTop",!0),left:e.left-r.left-x.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent;t&&"static"===x.css(t,"position");)t=t.offsetParent;return t||dt})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,e){var n="pageYOffset"===e;x.fn[t]=function(i){return Z(this,function(t,i,r){var s;if(g(t)?s=t:9===t.nodeType&&(s=t.defaultView),void 0===r)return s?s[e]:t[i];s?s.scrollTo(n?s.pageXOffset:r,n?r:s.pageYOffset):t[i]=r},t,i,arguments.length)}}),x.each(["top","left"],function(t,e){x.cssHooks[e]=Xt(f.pixelPosition,function(t,n){if(n)return n=Gt(t,e),$t.test(n)?x(t).position()[e]+"px":n})}),x.each({Height:"height",Width:"width"},function(t,e){x.each({padding:"inner"+t,content:e,"":"outer"+t},function(n,i){x.fn[i]=function(r,s){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(!0===r||!0===s?"margin":"border");return Z(this,function(e,n,r){var s;return g(e)?0===i.indexOf("outer")?e["inner"+t]:e.document.documentElement["client"+t]:9===e.nodeType?(s=e.documentElement,Math.max(e.body["scroll"+t],s["scroll"+t],e.body["offset"+t],s["offset"+t],s["client"+t])):void 0===r?x.css(e,n,a):x.style(e,n,r,a)},e,o?r:void 0,o)}})}),x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(t,e){x.fn[e]=function(t){return this.on(e,t)}}),x.fn.extend({bind:function(t,e,n){return this.on(t,null,e,n)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,n,i){return this.on(e,t,n,i)},undelegate:function(t,e,n){return 1===arguments.length?this.off(t,"**"):this.off(e,t||"**",n)},hover:function(t,e){return this.on("mouseenter",t).on("mouseleave",e||t)}}),x.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(t,e){x.fn[e]=function(t,n){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,n){n=t(n||this.defaultElement||this)[0],this.element=t(n),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},n!==this&&(t.data(n,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===n&&this.destroy()}}),this.document=t(n.style?n.ownerDocument:n.document||n),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,n){e._removeClass(n,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,n){var i,r,s,o=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(o={},e=(i=e.split(".")).shift(),i.length){for(r=o[e]=t.widget.extend({},this.options[e]),s=0;s
"),r=i.children()[0];return t("body").append(i),e=r.offsetWidth,i.css("overflow","scroll"),e===(r=r.offsetWidth)&&(r=i[0].clientWidth),i.remove(),n=e-r},getScrollInfo:function(e){var n=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),i=e.isWindow||e.isDocument?"":e.element.css("overflow-y");n="scroll"===n||"auto"===n&&e.widthi(r(o),r(f))?p.important="horizontal":p.important="vertical",e.using.call(this,t,p)}),a.offset(t.extend(C,{using:o}))})},t.ui.position={fit:{left:function(t,e){var n=e.within,r=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=t.left-e.collisionPosition.marginLeft,a=r-o,l=o+e.collisionWidth-s-r;e.collisionWidth>s?0s?0")[0],E=_.each;function A(t){return null==t?t+"":"object"==typeof t?y[b.call(t)]||"object":typeof t}function I(t,e,n){var i=C[e.type]||{};return null==t?n||!e.def?null:e.def:(t=i.floor?~~t:parseFloat(t),isNaN(t)?e.def:i.mod?(t+i.mod)%i.mod:Math.min(i.max,Math.max(0,t)))}function O(t){var e=S(),n=e._rgba=[];return t=t.toLowerCase(),E(x,function(i,r){var s=(s=r.re.exec(t))&&r.parse(s);r=r.space||"rgba";if(s)return s=e[r](s),e[D[r].cache]=s[D[r].cache],n=e._rgba=s._rgba,!1}),n.length?("0,0,0,0"===n.join()&&_.extend(n,U.transparent),e):U[t]}function M(t,e,n){return 6*(n=(n+1)%1)<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}k.style.cssText="background-color:rgba(1,1,1,.5)",T.rgba=-1u.mod/2?a+=u.mod:a-l>u.mod/2&&(a-=u.mod)),s[i]=I((l-a)*e+a,n)))}),this[n](s)},blend:function(t){if(1===this._rgba[3])return this;var e=this._rgba.slice(),n=e.pop(),i=S(t)._rgba;return S(_.map(e,function(t,e){return(1-n)*i[e]+n*t}))},toRgbaString:function(){var t="rgba(",e=_.map(this._rgba,function(t,e){return null!=t?t:2
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),r={width:e.width(),height:e.height()},s=document.activeElement;try{s.id}catch(i){s=document.body}return e.wrap(i),e[0]!==s&&!t.contains(e[0],s)||t(s).trigger("focus"),i=e.parent(),"static"===e.css("position")?(i.css({position:"relative"}),e.css({position:"relative"})):(t.extend(n,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,i){n[i]=e.css(i),isNaN(parseInt(n[i],10))&&(n[i]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(r),i.css(n).show()},removeWrapper:function(e){var n=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),e[0]!==n&&!t.contains(e[0],n)||t(n).trigger("focus")),e}}),t.extend(t.effects,{version:"1.13.2",define:function(e,n,i){return i||(i=n,n="effect"),t.effects.effect[e]=i,t.effects.effect[e].mode=n,i},scaledDimensions:function(t,e,n){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var i="horizontal"!==n?(e||100)/100:1;e="vertical"!==n?(e||100)/100:1;return{height:t.height()*e,width:t.width()*i,outerHeight:t.outerHeight()*e,outerWidth:t.outerWidth()*i}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,n){var i=t.queue();1").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),float:e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(V+"placeholder",n)),e.css({position:i,left:r.left,top:r.top}),n},removePlaceholder:function(t){var e=V+"placeholder",n=t.data(e);n&&(n.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,n,i,r){return r=r||{},t.each(n,function(t,n){var s=e.cssUnit(n);0");u.appendTo("body").addClass(e.className).css({top:l.top-o,left:l.left-a,height:i.innerHeight(),width:i.innerWidth(),position:r?"fixed":"absolute"}).animate(s,e.duration,e.easing,function(){u.remove(),"function"==typeof n&&n()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=J(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})},z={},t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,e){z[e]=function(e){return Math.pow(e,t+2)}}),t.extend(z,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,n=4;t<((e=Math.pow(2,--n))-1)/11;);return 1/Math.pow(4,3-n)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(z,function(e,n){t.easing["easeIn"+e]=n,t.easing["easeOut"+e]=function(t){return 1-n(1-t)},t.easing["easeInOut"+e]=function(t){return t<.5?n(2*t)/2:1-n(-2*t+2)/2}}),k=t.effects,t.effects.define("blind","hide",function(e,n){var i={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},r=t(this),s=e.direction||"up",o=r.cssClip(),a={clip:t.extend({},o)},l=t.effects.createPlaceholder(r);a.clip[i[s][0]]=a.clip[i[s][1]],"show"===e.mode&&(r.cssClip(a.clip),l&&l.css(t.effects.clipToBox(a)),a.clip=o),l&&l.animate(t.effects.clipToBox(a),e.duration,e.easing),r.animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:n})}),t.effects.define("bounce",function(e,n){var i,r,s=t(this),o="hide"===(h=e.mode),a="show"===h,l=e.direction||"up",u=e.distance,c=e.times||5,h=2*c+(a||o?1:0),d=e.duration/h,f=e.easing,p="up"===l||"down"===l?"top":"left",g="up"===l||"left"===l,m=0;e=s.queue().length;for(t.effects.createPlaceholder(s),l=s.css(p),u=u||s["top"==p?"outerHeight":"outerWidth"]()/3,a&&((r={opacity:1})[p]=l,s.css("opacity",0).css(p,g?2*-u:2*u).animate(r,d,f)),o&&(u/=Math.pow(2,c-1)),(r={})[p]=l;m").css({position:"absolute",visibility:"visible",left:-r*p,top:-i*g}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:g,left:s+(d?a*p:0),top:o+(d?l*g:0),opacity:d?0:1}).animate({left:s+(d?0:a*p),top:o+(d?0:l*g),opacity:d?1:0},e.duration||500,e.easing,v)}),t.effects.define("fade","toggle",function(e,n){var i="show"===e.mode;t(this).css("opacity",i?0:1).animate({opacity:i?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:n})}),t.effects.define("fold","hide",function(e,n){var i=t(this),r="show"===(g=e.mode),s="hide"===g,o=e.size||15,a=/([0-9]+)%/.exec(o),l=e.horizFirst?["right","bottom"]:["bottom","right"],u=e.duration/2,c=t.effects.createPlaceholder(i),h=i.cssClip(),d={clip:t.extend({},h)},f={clip:t.extend({},h)},p=[h[l[0]],h[l[1]]],g=i.queue().length;a&&(o=parseInt(a[1],10)/100*p[s?0:1]),d.clip[l[0]]=o,f.clip[l[0]]=o,f.clip[l[1]]=0,r&&(i.cssClip(f.clip),c&&c.css(t.effects.clipToBox(f)),f.clip=h),i.queue(function(n){c&&c.animate(t.effects.clipToBox(d),u,e.easing).animate(t.effects.clipToBox(f),u,e.easing),n()}).animate(d,u,e.easing).animate(f,u,e.easing).queue(n),t.effects.unshift(i,g,4)}),t.effects.define("highlight","show",function(e,n){var i=t(this),r={backgroundColor:i.css("backgroundColor")};"hide"===e.mode&&(r.opacity=0),t.effects.saveStyle(i),i.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:n})}),t.effects.define("size",function(e,n){var i,r=t(this),s=["fontSize"],o=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],a=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],l=e.mode,u="effect"!==l,c=e.scale||"both",h=e.origin||["middle","center"],d=r.css("position"),f=r.position(),p=t.effects.scaledDimensions(r),g=e.from||p,m=e.to||t.effects.scaledDimensions(r,0);t.effects.createPlaceholder(r),"show"===l&&(l=g,g=m,m=l),i={from:{y:g.height/p.height,x:g.width/p.width},to:{y:m.height/p.height,x:m.width/p.width}},"box"!==c&&"both"!==c||(i.from.y!==i.to.y&&(g=t.effects.setTransition(r,o,i.from.y,g),m=t.effects.setTransition(r,o,i.to.y,m)),i.from.x!==i.to.x&&(g=t.effects.setTransition(r,a,i.from.x,g),m=t.effects.setTransition(r,a,i.to.x,m))),"content"!==c&&"both"!==c||i.from.y!==i.to.y&&(g=t.effects.setTransition(r,s,i.from.y,g),m=t.effects.setTransition(r,s,i.to.y,m)),h&&(h=t.effects.getBaseline(h,p),g.top=(p.outerHeight-g.outerHeight)*h.y+f.top,g.left=(p.outerWidth-g.outerWidth)*h.x+f.left,m.top=(p.outerHeight-m.outerHeight)*h.y+f.top,m.left=(p.outerWidth-m.outerWidth)*h.x+f.left),delete g.outerHeight,delete g.outerWidth,r.css(g),"content"!==c&&"both"!==c||(o=o.concat(["marginTop","marginBottom"]).concat(s),a=a.concat(["marginLeft","marginRight"]),r.find("*[width]").each(function(){var n=t(this),r={height:(s=t.effects.scaledDimensions(n)).height*i.from.y,width:s.width*i.from.x,outerHeight:s.outerHeight*i.from.y,outerWidth:s.outerWidth*i.from.x},s={height:s.height*i.to.y,width:s.width*i.to.x,outerHeight:s.height*i.to.y,outerWidth:s.width*i.to.x};i.from.y!==i.to.y&&(r=t.effects.setTransition(n,o,i.from.y,r),s=t.effects.setTransition(n,o,i.to.y,s)),i.from.x!==i.to.x&&(r=t.effects.setTransition(n,a,i.from.x,r),s=t.effects.setTransition(n,a,i.to.x,s)),u&&t.effects.saveStyle(n),n.css(r),n.animate(s,e.duration,e.easing,function(){u&&t.effects.restoreStyle(n)})})),r.animate(m,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=r.offset();0===m.opacity&&r.css("opacity",g.opacity),u||(r.css("position","static"===d?"relative":d).offset(e),t.effects.saveStyle(r)),n()}})}),t.effects.define("scale",function(e,n){var i=t(this),r=e.mode;r=parseInt(e.percent,10)||(0===parseInt(e.percent,10)||"effect"!==r?0:100),r=t.extend(!0,{from:t.effects.scaledDimensions(i),to:t.effects.scaledDimensions(i,r,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(r.from.opacity=1,r.to.opacity=0),t.effects.effect.size.call(this,r,n)}),t.effects.define("puff","hide",function(e,n){e=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150}),t.effects.effect.scale.call(this,e,n)}),t.effects.define("pulsate","show",function(e,n){var i=t(this),r="show"===(u=e.mode),s=2*(e.times||5)+(r||"hide"===u?1:0),o=e.duration/s,a=0,l=1,u=i.queue().length;for(!r&&i.is(":visible")||(i.css("opacity",0).show(),a=1);l li > :first-child").add(t.find("> :not(li)").even())},heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||!1!==e.active&&null!=e.active||(e.active=0),this._processPanels(),e.active<0&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,n=this.options.icons;n&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+n.header),e.prependTo(this.headers),e=this.active.children(".ui-accordion-header-icon"),this._removeClass(e,n.header)._addClass(e,null,n.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){"active"!==t?("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons())):this._activate(e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var n=t.ui.keyCode,i=this.headers.length,r=this.headers.index(e.target),s=!1;switch(e.keyCode){case n.RIGHT:case n.DOWN:s=this.headers[(r+1)%i];break;case n.LEFT:case n.UP:s=this.headers[(r-1+i)%i];break;case n.SPACE:case n.ENTER:this._eventHandler(e);break;case n.HOME:s=this.headers[0];break;case n.END:s=this.headers[i-1]}s&&(t(e.target).attr("tabIndex",-1),t(s).attr("tabIndex",0),t(s).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),!1===e.active&&!0===e.collapsible||!this.headers.length?(e.active=!1,this.active=t()):!1===e.active?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;"function"==typeof this.options.header?this.headers=this.options.header(this.element):this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,n=this.options,i=n.heightStyle,r=this.element.parent();this.active=this._findActive(n.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),n=e.uniqueId().attr("id"),i=e.next(),r=i.uniqueId().attr("id");e.attr("aria-controls",r),i.attr("aria-labelledby",n)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(n.event),"fill"===i?(e=r.height(),this.element.siblings(":visible").each(function(){var n=t(this),i=n.css("position");"absolute"!==i&&"fixed"!==i&&(e-=n.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===i&&(e=0,this.headers.next().each(function(){var n=t(this).is(":visible");n||t(this).show(),e=Math.max(e,t(this).css("height","").height()),n||t(this).hide()}).height(e))},_activate:function(e){(e=this._findActive(e)[0])!==this.active[0]&&(e=e||this.active[0],this._eventHandler({target:e,currentTarget:e,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var n={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){n[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,n),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var n=this.options,i=this.active,r=t(e.currentTarget),s=r[0]===i[0],o=s&&n.collapsible,a=o?t():r.next(),l=i.next();a={oldHeader:i,oldPanel:l,newHeader:o?t():r,newPanel:a};e.preventDefault(),s&&!n.collapsible||!1===this._trigger("beforeActivate",e,a)||(n.active=!o&&this.headers.index(r),this.active=s?t():r,this._toggle(a),this._removeClass(i,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=i.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),s||(this._removeClass(r,"ui-accordion-header-collapsed")._addClass(r,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=r.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(r.next(),"ui-accordion-content-active")))},_toggle:function(e){var n=e.newPanel,i=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=n,this.prevHide=i,this.options.animate?this._animate(n,i,e):(i.hide(),n.show(),this._toggleComplete(e)),i.attr({"aria-hidden":"true"}),i.prev().attr({"aria-selected":"false","aria-expanded":"false"}),n.length&&i.length?i.prev().attr({tabIndex:-1,"aria-expanded":"false"}):n.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),n.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,n){var i,r,s,o=this,a=0,l=t.css("box-sizing"),u=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(e){var n=t(e.target),i=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&n.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),n.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var n=this.active||this._menuItems().first();e||this.focus(t,n)},blur:function(e){this._delay(function(){t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]))||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(e){var n,i;this.previousFilter||e.clientX===this.lastMousePosition.x&&e.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:e.clientX,y:e.clientY},n=t(e.target).closest(".ui-menu-item"),i=t(e.currentTarget),n[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,i))))},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),e.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var n,i,r,s=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:n=this.previousFilter||"",r=s=!1,i=96<=e.keyCode&&e.keyCode<=105?(e.keyCode-96).toString():String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),i===n?r=!0:i=n+i,n=this._filterMenuItems(i),(n=r&&-1!==n.index(this.active.next())?this.active.nextAll(".ui-menu-item"):n).length||(i=String.fromCharCode(e.keyCode),n=this._filterMenuItems(i)),n.length?(this.focus(e,n),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}s&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,n,i=this,r=this.options.icons.submenu,s=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),n=s.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),n=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);i._addClass(s,"ui-menu-icon","ui-icon "+r),n.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",n.attr("id"))}),this._addClass(n,"ui-menu","ui-widget ui-widget-content ui-front"),(e=s.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var e=t(this);i._isDivider(e)&&i._addClass(e,"ui-menu-divider","ui-widget-content")}),s=(n=e.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(s,"ui-menu-item-wrapper"),e.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var n;"icons"===t&&(n=this.element.find(".ui-menu-icon"),this._removeClass(n,null,this.options.icons.submenu)._addClass(n,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),n=this.active.children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",n.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(n=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(n),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var n,i,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,r=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-r,i=this.activeMenu.scrollTop(),r=this.activeMenu.height(),e=e.outerHeight(),n<0?this.activeMenu.scrollTop(i+n):r",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var e,n,i,r="textarea"===(s=this.element[0].nodeName.toLowerCase()),s="input"===s;this.isMultiLine=r||!s&&this._isContentEditable(this.element),this.valueMethod=this.element[r||s?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(r){if(this.element.prop("readOnly"))n=i=e=!0;else{n=i=e=!1;var s=t.ui.keyCode;switch(r.keyCode){case s.PAGE_UP:e=!0,this._move("previousPage",r);break;case s.PAGE_DOWN:e=!0,this._move("nextPage",r);break;case s.UP:e=!0,this._keyEvent("previous",r);break;case s.DOWN:e=!0,this._keyEvent("next",r);break;case s.ENTER:this.menu.active&&(e=!0,r.preventDefault(),this.menu.select(r));break;case s.TAB:this.menu.active&&this.menu.select(r);break;case s.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(r),r.preventDefault());break;default:n=!0,this._searchTimeout(r)}}},keypress:function(i){if(e)return e=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||i.preventDefault());if(!n){var r=t.ui.keyCode;switch(i.keyCode){case r.PAGE_UP:this._move("previousPage",i);break;case r.PAGE_DOWN:this._move("nextPage",i);break;case r.UP:this._keyEvent("previous",i);break;case r.DOWN:this._keyEvent("next",i)}}},input:function(t){if(i)return i=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=t(" @@ -168,7 +171,7 @@ virtualInterface->customer->getFormattedName() ?> orderBy === 'traffic' && $dvli->total_traffic ): ?> - (total_traffic ) ?>) + (total_traffic ) ?>) diff --git a/routes/web.php b/routes/web.php index f45e0fc95..4d6b1100d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -101,6 +101,8 @@ Route::get( 'p2p/{srcVli}/{dstVli}', 'StatisticsController@p2p' )->name( 'statistics@p2p-get' ); Route::post( 'p2p/{srcVli}/{dstVli}', 'StatisticsController@p2p' )->name( 'statistics@p2p' ); Route::post( 'p2p', 'StatisticsController@p2pPost' )->name( 'statistics@p2p-post' ); + Route::get( 'p2p-table', 'StatisticsController@p2pTable' )->name( 'statistics@p2p-table' ); + Route::post( 'p2p-table', 'StatisticsController@p2pTable' )->name( 'statistics@p2p-table' ); Route::get( 'member/{cust?}', 'StatisticsController@member' )->name( 'statistics@member' ); Route::get( 'member-drilldown/{type}/{typeid}', 'StatisticsController@memberDrilldown' )->name( 'statistics@member-drilldown' ); Route::get( 'latency/{vli}/{protocol}', 'StatisticsController@latency' )->name( 'statistics@latency' ); From 37ca917d9d2e5eaf1924ac730f903a6ecebad07c Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Thu, 26 Sep 2024 14:48:55 +0100 Subject: [PATCH 145/145] CI fixes and general vendor updates --- .idea/IXP-Manager.iml | 5 + .idea/php.xml | 42 +- .phpstorm.meta.php/laravel.meta.php | 66 +- _ide_helper.php | 363 +-- app/Http/Controllers/StatisticsController.php | 5 +- app/Services/Grapher/Graph/Latency.php | 23 + composer.lock | 571 +++-- public/css/ixp-pack.css | 1972 +---------------- public/css/tailwind.css | 1972 +---------------- public/js/ixp-pack.js | 2 +- public/mix-manifest.json | 6 +- resources/views/search/do.foil.php | 2 +- .../views/statistics/p2p-single.foil.php | 2 +- .../Graph/Access/Web/P2pWebAccessTest.php | 104 +- 14 files changed, 641 insertions(+), 4494 deletions(-) diff --git a/.idea/IXP-Manager.iml b/.idea/IXP-Manager.iml index c60ae9b04..7ad71edb4 100644 --- a/.idea/IXP-Manager.iml +++ b/.idea/IXP-Manager.iml @@ -22,6 +22,11 @@ + + + + +
diff --git a/.idea/php.xml b/.idea/php.xml index 68d2d55fe..d2cc281fe 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -52,12 +52,10 @@ - - @@ -66,7 +64,6 @@ - @@ -91,7 +88,6 @@ - @@ -115,7 +111,6 @@ - @@ -162,7 +157,6 @@ - @@ -262,6 +256,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.phpstorm.meta.php/laravel.meta.php b/.phpstorm.meta.php/laravel.meta.php index 94fb2b221..6dc5f86d1 100644 --- a/.phpstorm.meta.php/laravel.meta.php +++ b/.phpstorm.meta.php/laravel.meta.php @@ -31,6 +31,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -159,6 +160,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -219,8 +221,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -278,6 +280,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -406,6 +409,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -466,8 +470,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -525,6 +529,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -653,6 +658,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -713,8 +719,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -772,6 +778,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -900,6 +907,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -960,8 +968,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -1019,6 +1027,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -1147,6 +1156,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -1207,8 +1217,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -1266,6 +1276,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -1394,6 +1405,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -1454,8 +1466,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -1513,6 +1525,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -1641,6 +1654,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -1701,8 +1715,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -1760,6 +1774,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -1888,6 +1903,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -1948,8 +1964,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -2007,6 +2023,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -2135,6 +2152,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -2195,8 +2213,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -2254,6 +2272,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -2382,6 +2401,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -2442,8 +2462,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, @@ -2501,6 +2521,7 @@ 'Illuminate\Cache\Console\ForgetCommand' => \Illuminate\Cache\Console\ForgetCommand::class, 'Illuminate\Cache\Console\PruneStaleTagsCommand' => \Illuminate\Cache\Console\PruneStaleTagsCommand::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Concurrency\Console\InvokeSerializedClosureCommand' => \Illuminate\Concurrency\Console\InvokeSerializedClosureCommand::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, @@ -2629,6 +2650,7 @@ 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Support\Defer\DeferredCallbackCollection' => \Illuminate\Support\Defer\DeferredCallbackCollection::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laravel\Horizon\AutoScaler' => \Laravel\Horizon\AutoScaler::class, 'Laravel\Horizon\Console\WorkCommand' => \Laravel\Horizon\Console\WorkCommand::class, @@ -2689,8 +2711,8 @@ 'events' => \Illuminate\Events\Dispatcher::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'filesystem.cloud' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, + 'filesystem.disk' => \Illuminate\Filesystem\LocalFilesystemAdapter::class, 'flare.logger' => \Monolog\Logger::class, 'former' => \Former\Former::class, 'former.dispatcher' => \Former\MethodDispatcher::class, diff --git a/_ide_helper.php b/_ide_helper.php index 241674f87..903397a73 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -5,7 +5,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 11.22.0. + * Generated for Laravel 11.25.0. * * This file should not be included in your code, only analyzed by your IDE! * @@ -3952,6 +3952,21 @@ { /** @var \Illuminate\Cache\Repository $instance */ return $instance->rememberForever($key, $callback); + } + /** + * Retrieve an item from the cache by key, refreshing it in the background if it is stale. + * + * @template TCacheValue + * @param string $key + * @param \Illuminate\Cache\array{ 0: \DateTimeInterface|\DateInterval|int, 1: \DateTimeInterface|\DateInterval|int } $ttl + * @param \Illuminate\Cache\(callable(): TCacheValue) $callback + * @param \Illuminate\Cache\array{ seconds?: int, owner?: string }|null $lock + * @return \Illuminate\Cache\TCacheValue + * @static + */ public static function flexible($key, $ttl, $callback, $lock = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->flexible($key, $ttl, $callback, $lock); } /** * Remove an item from the cache. @@ -6953,7 +6968,7 @@ /** * Define a new ability. * - * @param string $ability + * @param \BackedEnum|string $ability * @param callable|array|string $callback * @return \Illuminate\Auth\Access\Gate * @throws \InvalidArgumentException @@ -7013,7 +7028,7 @@ /** * Determine if all of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $ability + * @param \Illuminate\Auth\Access\iterable|\BackedEnum|string $ability * @param array|mixed $arguments * @return bool * @static @@ -7025,7 +7040,7 @@ /** * Determine if any of the given abilities should be denied for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $ability + * @param \Illuminate\Auth\Access\iterable|\BackedEnum|string $ability * @param array|mixed $arguments * @return bool * @static @@ -7037,7 +7052,7 @@ /** * Determine if all of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param \Illuminate\Auth\Access\iterable|\BackedEnum|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -7049,7 +7064,7 @@ /** * Determine if any one of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param \Illuminate\Auth\Access\iterable|\BackedEnum|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -7061,7 +7076,7 @@ /** * Determine if all of the given abilities should be denied for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param \Illuminate\Auth\Access\iterable|\BackedEnum|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -7073,7 +7088,7 @@ /** * Determine if the given ability should be granted for the current user. * - * @param string $ability + * @param \BackedEnum|string $ability * @param array|mixed $arguments * @return \Illuminate\Auth\Access\Response * @throws \Illuminate\Auth\Access\AuthorizationException @@ -7086,7 +7101,7 @@ /** * Inspect the user for the given ability. * - * @param string $ability + * @param \BackedEnum|string $ability * @param array|mixed $arguments * @return \Illuminate\Auth\Access\Response * @static @@ -8382,7 +8397,7 @@ * @method static \Illuminate\Contracts\View\Factory getViewFactory() * @method static void setSymfonyTransport(\Symfony\Component\Mailer\Transport\TransportInterface $transport) * @method static \Illuminate\Mail\Mailer setQueue(\Illuminate\Contracts\Queue\Factory $queue) - * @method static void macro(string $name, object|callable $macro, object|callable $macro = null) + * @method static void macro(string $name, object|callable $macro) * @method static void mixin(object $mixin, bool $replace = true) * @method static bool hasMacro(string $name) * @method static void flushMacros() @@ -13005,7 +13020,7 @@ /** * Alias for the "currentRouteUses" method. * - * @param array $patterns + * @param array|string $patterns * @return bool * @static */ public static function uses(...$patterns) @@ -14404,7 +14419,7 @@ * Get a filesystem instance. * * @param string|null $name - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function drive($name = null) { @@ -14415,7 +14430,7 @@ * Get a filesystem instance. * * @param string|null $name - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function disk($name = null) { @@ -14436,7 +14451,7 @@ * Build an on-demand disk. * * @param string|array $config - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function build($config) { @@ -14447,18 +14462,19 @@ * Create an instance of the local driver. * * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter + * @param string $name + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static - */ public static function createLocalDriver($config) + */ public static function createLocalDriver($config, $name = 'local') { /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createLocalDriver($config); + return $instance->createLocalDriver($config, $name); } /** * Create an instance of the ftp driver. * * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function createFtpDriver($config) { @@ -14469,7 +14485,7 @@ * Create an instance of the sftp driver. * * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function createSftpDriver($config) { @@ -14491,7 +14507,7 @@ * Create a scoped driver. * * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function createScopedDriver($config) { @@ -14574,39 +14590,85 @@ { /** @var \Illuminate\Filesystem\FilesystemManager $instance */ return $instance->setApplication($app); + } + /** + * Determine if temporary URLs can be generated. + * + * @return bool + * @static + */ public static function providesTemporaryUrls() + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->providesTemporaryUrls(); + } + /** + * Get a temporary URL for the file at the given path. + * + * @param string $path + * @param \DateTimeInterface $expiration + * @param array $options + * @return string + * @static + */ public static function temporaryUrl($path, $expiration, $options = []) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->temporaryUrl($path, $expiration, $options); + } + /** + * Specify the name of the disk the adapter is managing. + * + * @param string $disk + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ public static function diskName($disk) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->diskName($disk); + } + /** + * Indiate that signed URLs should serve the corresponding files. + * + * @param bool $serve + * @param \Closure|null $urlGeneratorResolver + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ public static function shouldServeSignedUrls($serve = true, $urlGeneratorResolver = null) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->shouldServeSignedUrls($serve, $urlGeneratorResolver); } /** * Assert that the given file or directory exists. * * @param string|array $path * @param string|null $content - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function assertExists($path, $content = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->assertExists($path, $content); } /** * Assert that the given file or directory does not exist. * * @param string|array $path - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function assertMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->assertMissing($path); } /** * Assert that the given directory is empty. * * @param string $path - * @return \Illuminate\Filesystem\FilesystemAdapter + * @return \Illuminate\Filesystem\LocalFilesystemAdapter * @static */ public static function assertDirectoryEmpty($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->assertDirectoryEmpty($path); } /** @@ -14616,8 +14678,8 @@ * @return bool * @static */ public static function exists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->exists($path); } /** @@ -14627,8 +14689,8 @@ * @return bool * @static */ public static function missing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->missing($path); } /** @@ -14638,8 +14700,8 @@ * @return bool * @static */ public static function fileExists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->fileExists($path); } /** @@ -14649,8 +14711,8 @@ * @return bool * @static */ public static function fileMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->fileMissing($path); } /** @@ -14660,8 +14722,8 @@ * @return bool * @static */ public static function directoryExists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->directoryExists($path); } /** @@ -14671,8 +14733,8 @@ * @return bool * @static */ public static function directoryMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->directoryMissing($path); } /** @@ -14682,8 +14744,8 @@ * @return string * @static */ public static function path($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->path($path); } /** @@ -14693,8 +14755,8 @@ * @return string|null * @static */ public static function get($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->get($path); } /** @@ -14705,8 +14767,8 @@ * @return array|null * @static */ public static function json($path, $flags = 0) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->json($path, $flags); } /** @@ -14719,20 +14781,35 @@ * @return \Symfony\Component\HttpFoundation\StreamedResponse * @static */ public static function response($path, $name = null, $headers = [], $disposition = 'inline') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->response($path, $name, $headers, $disposition); } /** * Create a streamed download response for a given file. * + * @param \Illuminate\Http\Request $request * @param string $path * @param string|null $name + * @param array $headers + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @static + */ public static function serve($request, $path, $name = null, $headers = []) + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->serve($request, $path, $name, $headers); + } + /** + * Create a streamed download response for a given file. + * + * @param string $path + * @param string|null $name + * @param array $headers * @return \Symfony\Component\HttpFoundation\StreamedResponse * @static */ public static function download($path, $name = null, $headers = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->download($path, $name, $headers); } /** @@ -14744,8 +14821,8 @@ * @return string|bool * @static */ public static function put($path, $contents, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->put($path, $contents, $options); } /** @@ -14757,8 +14834,8 @@ * @return string|false * @static */ public static function putFile($path, $file = null, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->putFile($path, $file, $options); } /** @@ -14771,8 +14848,8 @@ * @return string|false * @static */ public static function putFileAs($path, $file, $name = null, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->putFileAs($path, $file, $name, $options); } /** @@ -14782,8 +14859,8 @@ * @return string * @static */ public static function getVisibility($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->getVisibility($path); } /** @@ -14794,8 +14871,8 @@ * @return bool * @static */ public static function setVisibility($path, $visibility) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->setVisibility($path, $visibility); } /** @@ -14808,8 +14885,8 @@ * @static */ public static function prepend($path, $data, $separator = ' ') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->prepend($path, $data, $separator); } /** @@ -14822,8 +14899,8 @@ * @static */ public static function append($path, $data, $separator = ' ') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->append($path, $data, $separator); } /** @@ -14833,8 +14910,8 @@ * @return bool * @static */ public static function delete($paths) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->delete($paths); } /** @@ -14845,8 +14922,8 @@ * @return bool * @static */ public static function copy($from, $to) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->copy($from, $to); } /** @@ -14857,8 +14934,8 @@ * @return bool * @static */ public static function move($from, $to) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->move($from, $to); } /** @@ -14868,8 +14945,8 @@ * @return int * @static */ public static function size($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->size($path); } /** @@ -14879,8 +14956,8 @@ * @throws UnableToProvideChecksum * @static */ public static function checksum($path, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->checksum($path, $options); } /** @@ -14890,8 +14967,8 @@ * @return string|false * @static */ public static function mimeType($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->mimeType($path); } /** @@ -14901,8 +14978,8 @@ * @return int * @static */ public static function lastModified($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->lastModified($path); } /** @@ -14912,8 +14989,8 @@ * @return resource|null The path resource or null on failure. * @static */ public static function readStream($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->readStream($path); } /** @@ -14925,8 +15002,8 @@ * @return bool * @static */ public static function writeStream($path, $resource, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->writeStream($path, $resource, $options); } /** @@ -14937,33 +15014,9 @@ * @throws \RuntimeException * @static */ public static function url($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->url($path); - } - /** - * Determine if temporary URLs can be generated. - * - * @return bool - * @static - */ public static function providesTemporaryUrls() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->providesTemporaryUrls(); - } - /** - * Get a temporary URL for the file at the given path. - * - * @param string $path - * @param \DateTimeInterface $expiration - * @param array $options - * @return string - * @throws \RuntimeException - * @static - */ public static function temporaryUrl($path, $expiration, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->temporaryUrl($path, $expiration, $options); } /** * Get a temporary upload URL for the file at the given path. @@ -14975,8 +15028,8 @@ * @throws \RuntimeException * @static */ public static function temporaryUploadUrl($path, $expiration, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->temporaryUploadUrl($path, $expiration, $options); } /** @@ -14987,8 +15040,8 @@ * @return array * @static */ public static function files($directory = null, $recursive = false) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->files($directory, $recursive); } /** @@ -14998,8 +15051,8 @@ * @return array * @static */ public static function allFiles($directory = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->allFiles($directory); } /** @@ -15010,8 +15063,8 @@ * @return array * @static */ public static function directories($directory = null, $recursive = false) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->directories($directory, $recursive); } /** @@ -15021,8 +15074,8 @@ * @return array * @static */ public static function allDirectories($directory = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->allDirectories($directory); } /** @@ -15032,8 +15085,8 @@ * @return bool * @static */ public static function makeDirectory($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->makeDirectory($path); } /** @@ -15043,8 +15096,8 @@ * @return bool * @static */ public static function deleteDirectory($directory) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->deleteDirectory($directory); } /** @@ -15053,8 +15106,8 @@ * @return \League\Flysystem\FilesystemOperator * @static */ public static function getDriver() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->getDriver(); } /** @@ -15063,8 +15116,8 @@ * @return \League\Flysystem\FilesystemAdapter * @static */ public static function getAdapter() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->getAdapter(); } /** @@ -15073,9 +15126,20 @@ * @return array * @static */ public static function getConfig() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->getConfig(); + } + /** + * Define a custom callback that generates file download responses. + * + * @param \Closure $callback + * @return void + * @static + */ public static function serveUsing($callback) + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + $instance->serveUsing($callback); } /** * Define a custom temporary URL builder callback. @@ -15084,8 +15148,8 @@ * @return void * @static */ public static function buildTemporaryUrlsUsing($callback) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ $instance->buildTemporaryUrlsUsing($callback); } /** @@ -15100,7 +15164,7 @@ * @static */ public static function when($value = null, $callback = null, $default = null) { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->when($value, $callback, $default); } /** @@ -15115,7 +15179,7 @@ * @static */ public static function unless($value = null, $callback = null, $default = null) { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->unless($value, $callback, $default); } /** @@ -15127,8 +15191,8 @@ * @return void * @static */ public static function macro($name, $macro) - { - \Illuminate\Filesystem\FilesystemAdapter::macro($name, $macro); + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + \Illuminate\Filesystem\LocalFilesystemAdapter::macro($name, $macro); } /** * Mix another object into the class. @@ -15139,8 +15203,8 @@ * @throws \ReflectionException * @static */ public static function mixin($mixin, $replace = true) - { - \Illuminate\Filesystem\FilesystemAdapter::mixin($mixin, $replace); + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + \Illuminate\Filesystem\LocalFilesystemAdapter::mixin($mixin, $replace); } /** * Checks if macro is registered. @@ -15149,8 +15213,8 @@ * @return bool * @static */ public static function hasMacro($name) - { - return \Illuminate\Filesystem\FilesystemAdapter::hasMacro($name); + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + return \Illuminate\Filesystem\LocalFilesystemAdapter::hasMacro($name); } /** * Flush the existing macros. @@ -15158,8 +15222,8 @@ * @return void * @static */ public static function flushMacros() - { - \Illuminate\Filesystem\FilesystemAdapter::flushMacros(); + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + \Illuminate\Filesystem\LocalFilesystemAdapter::flushMacros(); } /** * Dynamically handle calls to the class. @@ -15170,8 +15234,8 @@ * @throws \BadMethodCallException * @static */ public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + { //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ return $instance->macroCall($method, $parameters); } } @@ -16044,6 +16108,17 @@ { /** @var \Illuminate\View\Factory $instance */ $instance->addLocation($location); + } + /** + * Prepend a location to the array of view locations. + * + * @param string $location + * @return void + * @static + */ public static function prependLocation($location) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->prependLocation($location); } /** * Add a new namespace to the loader. @@ -22259,7 +22334,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { /** * Set the relationships that should be eager loaded while removing any previously added eager loading specifications. * - * @param mixed $relations + * @param \Illuminate\Database\Eloquent\array): mixed)|string>|string $relations * @return \Illuminate\Database\Eloquent\Builder|static * @static */ public static function withOnly($relations) diff --git a/app/Http/Controllers/StatisticsController.php b/app/Http/Controllers/StatisticsController.php index a3dbbae72..d671c57b5 100644 --- a/app/Http/Controllers/StatisticsController.php +++ b/app/Http/Controllers/StatisticsController.php @@ -23,7 +23,9 @@ * http://www.gnu.org/licenses/gpl-2.0.html */ -use App, Auth, Carbon\Carbon; +use App, Carbon\Carbon; + +use Illuminate\Support\Facades\Auth; use Illuminate\Auth\Access\AuthorizationException; @@ -705,6 +707,7 @@ public function p2p( Request $request, VlanInterface $srcVli, VlanInterface $dst ->setProtocol( $data['protocol'] ) ->setCategory( $data['category'] ) ->setPeriod( $data['period'] ); + $graph->authorise(); return view( 'statistics/p2p-single', array_merge( $data, [ diff --git a/app/Services/Grapher/Graph/Latency.php b/app/Services/Grapher/Graph/Latency.php index 2ab592972..b65d37d81 100644 --- a/app/Services/Grapher/Graph/Latency.php +++ b/app/Services/Grapher/Graph/Latency.php @@ -163,6 +163,29 @@ public static function resolvePeriod( $period = null ): string return self::PERIODS[ $period ] ?? 'Unknown'; } + + /** + * Process user input for the parameter: period + * + * Note that this function just sets the default if the input is invalid. + * If you want to force an exception in such cases, use setPeriod() + * + * @param string|null $value The user input value + * @param string|null $default The preferred default value + * + * @return string|null The verified / sanitised / default value + */ + public static function processParameterPeriod( string $value = null, string $default = null, $withExtended = false ): string|null + { + if( $withExtended && !isset( self::PERIODS_EXTENDED[ $value ] ) ) { + $value = $default ?? self::PERIOD_DEFAULT; + } else if( !isset( self::PERIODS[ $value ] ) ) { + $value = $default ?? self::PERIOD_DEFAULT; + } + + return $value; + } + /** * Get the vlan interface we're meant to graph for latency * diff --git a/composer.lock b/composer.lock index ab2f3122e..2555bbec6 100644 --- a/composer.lock +++ b/composer.lock @@ -2270,16 +2270,16 @@ }, { "name": "laravel/framework", - "version": "v11.22.0", + "version": "v11.25.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "868c75beacc47d0f361b919bbc155c0b619bf3d5" + "reference": "b487a9089c0b1c71ac63bb6bc44fb4b00dc6da2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/868c75beacc47d0f361b919bbc155c0b619bf3d5", - "reference": "868c75beacc47d0f361b919bbc155c0b619bf3d5", + "url": "https://api.github.com/repos/laravel/framework/zipball/b487a9089c0b1c71ac63bb6bc44fb4b00dc6da2e", + "reference": "b487a9089c0b1c71ac63bb6bc44fb4b00dc6da2e", "shasum": "" }, "require": { @@ -2298,7 +2298,7 @@ "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18", + "laravel/prompts": "^0.1.18|^0.2.0", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", @@ -2341,6 +2341,7 @@ "illuminate/bus": "self.version", "illuminate/cache": "self.version", "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", "illuminate/conditionable": "self.version", "illuminate/config": "self.version", "illuminate/console": "self.version", @@ -2383,7 +2384,7 @@ "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.6", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^9.1.5", + "orchestra/testbench-core": "^9.5", "pda/pheanstalk": "^5.0", "phpstan/phpstan": "^1.11.5", "phpunit/phpunit": "^10.5|^11.0", @@ -2441,6 +2442,8 @@ "src/Illuminate/Events/functions.php", "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", "src/Illuminate/Support/helpers.php" ], "psr-4": { @@ -2472,20 +2475,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-09-03T15:27:15+00:00" + "time": "2024-09-26T11:21:58+00:00" }, { "name": "laravel/horizon", - "version": "v5.28.1", + "version": "v5.29.0", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "9d2c4eaeb11408384401f8a7d1b0ea4c76554f3f" + "reference": "1d97f94412e89ff48683acd58d4a702d6bee7b88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/9d2c4eaeb11408384401f8a7d1b0ea4c76554f3f", - "reference": "9d2c4eaeb11408384401f8a7d1b0ea4c76554f3f", + "url": "https://api.github.com/repos/laravel/horizon/zipball/1d97f94412e89ff48683acd58d4a702d6bee7b88", + "reference": "1d97f94412e89ff48683acd58d4a702d6bee7b88", "shasum": "" }, "require": { @@ -2549,22 +2552,22 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.28.1" + "source": "https://github.com/laravel/horizon/tree/v5.29.0" }, - "time": "2024-09-04T14:06:50+00:00" + "time": "2024-09-24T13:38:25+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.25", + "version": "v0.2.1", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" + "reference": "a132ccf64d46da183b7cf3729df260e836cc7e15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", - "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", + "url": "https://api.github.com/repos/laravel/prompts/zipball/a132ccf64d46da183b7cf3729df260e836cc7e15", + "reference": "a132ccf64d46da183b7cf3729df260e836cc7e15", "shasum": "" }, "require": { @@ -2589,7 +2592,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.1.x-dev" + "dev-main": "0.2.x-dev" } }, "autoload": { @@ -2607,22 +2610,22 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.25" + "source": "https://github.com/laravel/prompts/tree/v0.2.1" }, - "time": "2024-08-12T22:06:33+00:00" + "time": "2024-09-19T10:28:37+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.3.4", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", "shasum": "" }, "require": { @@ -2670,7 +2673,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-08-02T07:48:17+00:00" + "time": "2024-09-23T13:33:08+00:00" }, { "name": "laravel/socialite", @@ -2815,16 +2818,16 @@ }, { "name": "laravel/tinker", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", "shasum": "" }, "require": { @@ -2875,9 +2878,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.9.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.0" }, - "time": "2024-01-04T16:10:04+00:00" + "time": "2024-09-23T13:32:56+00:00" }, { "name": "laravel/ui", @@ -3264,16 +3267,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.15.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { @@ -3304,7 +3307,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { @@ -3316,7 +3319,7 @@ "type": "tidelift" } ], - "time": "2024-01-28T23:22:08+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { "name": "league/oauth1-client", @@ -3950,16 +3953,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", "shasum": "" }, "require": { @@ -4000,9 +4003,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-17T19:36:00+00:00" }, { "name": "nunomaduro/termwind", @@ -4476,16 +4479,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.41", + "version": "3.0.42", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb" + "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/621c73f7dcb310b61de34d1da4c4204e8ace6ceb", - "reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/db92f1b1987b12b13f248fe76c3a52cadb67bb98", + "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98", "shasum": "" }, "require": { @@ -4566,7 +4569,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.41" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.42" }, "funding": [ { @@ -4582,7 +4585,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T00:13:54+00:00" + "time": "2024-09-16T03:06:04+00:00" }, { "name": "pimple/pimple", @@ -5188,16 +5191,16 @@ }, { "name": "psr/log", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "79dff0b268932c640297f5208d6298f71855c03e" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", - "reference": "79dff0b268932c640297f5208d6298f71855c03e", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -5232,9 +5235,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.1" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2024-08-21T13:31:24+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -6241,16 +6244,16 @@ }, { "name": "symfony/console", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111" + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1eed7af6961d763e7832e874d7f9b21c3ea9c111", - "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111", + "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", "shasum": "" }, "require": { @@ -6314,7 +6317,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.4" + "source": "https://github.com/symfony/console/tree/v7.1.5" }, "funding": [ { @@ -6330,7 +6333,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:53+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/css-selector", @@ -6761,16 +6764,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.1.3", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a" + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", - "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", "shasum": "" }, "require": { @@ -6818,7 +6821,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" }, "funding": [ { @@ -6834,20 +6837,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6efcbd1b3f444f631c386504fc83eeca25963747" + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6efcbd1b3f444f631c386504fc83eeca25963747", - "reference": "6efcbd1b3f444f631c386504fc83eeca25963747", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", "shasum": "" }, "require": { @@ -6932,7 +6935,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" }, "funding": [ { @@ -6948,20 +6951,20 @@ "type": "tidelift" } ], - "time": "2024-08-30T17:02:28+00:00" + "time": "2024-09-21T06:09:21+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.2", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee" + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee", - "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee", + "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b", + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b", "shasum": "" }, "require": { @@ -7012,7 +7015,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.2" + "source": "https://github.com/symfony/mailer/tree/v7.1.5" }, "funding": [ { @@ -7028,20 +7031,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T08:00:31+00:00" + "time": "2024-09-08T12:32:26+00:00" }, { "name": "symfony/mime", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ccaa6c2503db867f472a587291e764d6a1e58758" + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ccaa6c2503db867f472a587291e764d6a1e58758", - "reference": "ccaa6c2503db867f472a587291e764d6a1e58758", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", "shasum": "" }, "require": { @@ -7096,7 +7099,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.4" + "source": "https://github.com/symfony/mime/tree/v7.1.5" }, "funding": [ { @@ -7112,24 +7115,24 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:28:19+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -7175,7 +7178,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -7191,24 +7194,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7253,7 +7256,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -7269,26 +7272,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -7337,7 +7339,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -7353,24 +7355,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7418,7 +7420,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -7434,24 +7436,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -7498,7 +7500,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -7514,97 +7516,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7651,7 +7580,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -7667,24 +7596,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7727,7 +7656,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -7743,24 +7672,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:35:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -7806,7 +7735,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -7822,20 +7751,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v7.1.3", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca" + "reference": "5c03ee6369281177f07f7c68252a280beccba847" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7f2f542c668ad6c313dc4a5e9c3321f733197eca", - "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", "shasum": "" }, "require": { @@ -7867,7 +7796,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.3" + "source": "https://github.com/symfony/process/tree/v7.1.5" }, "funding": [ { @@ -7883,7 +7812,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:44:47+00:00" + "time": "2024-09-19T21:48:23+00:00" }, { "name": "symfony/routing", @@ -8051,16 +7980,16 @@ }, { "name": "symfony/string", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b" + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/6cd670a6d968eaeb1c77c2e76091c45c56bc367b", - "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", "shasum": "" }, "require": { @@ -8118,7 +8047,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.4" + "source": "https://github.com/symfony/string/tree/v7.1.5" }, "funding": [ { @@ -8134,20 +8063,20 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:59:40+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/translation", - "version": "v7.1.3", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1" + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1", - "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1", + "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", "shasum": "" }, "require": { @@ -8212,7 +8141,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.3" + "source": "https://github.com/symfony/translation/tree/v7.1.5" }, "funding": [ { @@ -8228,7 +8157,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-09-16T06:30:38+00:00" }, { "name": "symfony/translation-contracts", @@ -8310,16 +8239,16 @@ }, { "name": "symfony/uid", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "82177535395109075cdb45a70533aa3d7a521cdf" + "reference": "8c7bb8acb933964055215d89f9a9871df0239317" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/82177535395109075cdb45a70533aa3d7a521cdf", - "reference": "82177535395109075cdb45a70533aa3d7a521cdf", + "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317", + "reference": "8c7bb8acb933964055215d89f9a9871df0239317", "shasum": "" }, "require": { @@ -8364,7 +8293,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.4" + "source": "https://github.com/symfony/uid/tree/v7.1.5" }, "funding": [ { @@ -8380,20 +8309,20 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:59:40+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa" + "reference": "e20e03889539fd4e4211e14d2179226c513c010d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a5fa7481b199090964d6fd5dab6294d5a870c7aa", - "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d", "shasum": "" }, "require": { @@ -8447,7 +8376,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.4" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" }, "funding": [ { @@ -8463,7 +8392,7 @@ "type": "tidelift" } ], - "time": "2024-08-30T16:12:47+00:00" + "time": "2024-09-16T10:07:02+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9416,24 +9345,24 @@ }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -9477,7 +9406,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -9493,7 +9422,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -9708,16 +9637,16 @@ }, { "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", + "version": "v1.5.3", "source": { "type": "git", "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { @@ -9758,9 +9687,9 @@ ], "support": { "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2022-03-02T22:36:06+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { "name": "fidry/cpu-core-counter", @@ -9825,26 +9754,26 @@ }, { "name": "filp/whoops", - "version": "2.15.4", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", + "php": "^7.1 || ^8.0", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -9884,7 +9813,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.4" + "source": "https://github.com/filp/whoops/tree/2.16.0" }, "funding": [ { @@ -9892,7 +9821,7 @@ "type": "github" } ], - "time": "2023-11-03T12:00:00+00:00" + "time": "2024-09-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -9947,16 +9876,16 @@ }, { "name": "laravel/dusk", - "version": "v8.2.5", + "version": "v8.2.6", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "e641800393ce4ad39f0a47133f51aae67ceb01ad" + "reference": "f0bf5fcf12bb8d88382513a4673c53123a2322f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/e641800393ce4ad39f0a47133f51aae67ceb01ad", - "reference": "e641800393ce4ad39f0a47133f51aae67ceb01ad", + "url": "https://api.github.com/repos/laravel/dusk/zipball/f0bf5fcf12bb8d88382513a4673c53123a2322f4", + "reference": "f0bf5fcf12bb8d88382513a4673c53123a2322f4", "shasum": "" }, "require": { @@ -10013,22 +9942,22 @@ ], "support": { "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v8.2.5" + "source": "https://github.com/laravel/dusk/tree/v8.2.6" }, - "time": "2024-08-26T12:34:33+00:00" + "time": "2024-09-24T13:39:00+00:00" }, { "name": "laravel/pint", - "version": "v1.17.3", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "9d77be916e145864f10788bb94531d03e1f7b482" + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/9d77be916e145864f10788bb94531d03e1f7b482", - "reference": "9d77be916e145864f10788bb94531d03e1f7b482", + "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", "shasum": "" }, "require": { @@ -10081,20 +10010,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-09-03T15:00:28+00:00" + "time": "2024-09-24T17:22:50+00:00" }, { "name": "laravel/sail", - "version": "v1.31.3", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1" + "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1", - "reference": "0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1", + "url": "https://api.github.com/repos/laravel/sail/zipball/d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", + "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", "shasum": "" }, "require": { @@ -10144,7 +10073,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-09-03T20:05:33+00:00" + "time": "2024-09-22T19:04:21+00:00" }, { "name": "mockery/mockery", @@ -10439,16 +10368,16 @@ }, { "name": "orchestra/testbench-core", - "version": "v9.4.0", + "version": "v9.5.1", "source": { "type": "git", "url": "https://github.com/orchestral/testbench-core.git", - "reference": "422827e195741ca397408eced09ca473ebbb4086" + "reference": "a083229e30daf7c9d6e323f19df0049a590fe51b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/422827e195741ca397408eced09ca473ebbb4086", - "reference": "422827e195741ca397408eced09ca473ebbb4086", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/a083229e30daf7c9d6e323f19df0049a590fe51b", + "reference": "a083229e30daf7c9d6e323f19df0049a590fe51b", "shasum": "" }, "require": { @@ -10461,7 +10390,7 @@ "laravel/framework": "<11.11.0 || >=12.0.0", "laravel/serializable-closure": "<1.3.0 || >=2.0.0", "nunomaduro/collision": "<8.0.0 || >=9.0.0", - "phpunit/phpunit": "<10.5.0 || 11.0.0 || >=11.4.0" + "phpunit/phpunit": "<10.5.0 || 11.0.0 || >=11.5.0" }, "require-dev": { "fakerphp/faker": "^1.23", @@ -10525,7 +10454,7 @@ "issues": "https://github.com/orchestral/testbench/issues", "source": "https://github.com/orchestral/testbench-core" }, - "time": "2024-08-26T05:01:33+00:00" + "time": "2024-09-25T10:02:32+00:00" }, { "name": "phar-io/manifest", @@ -10888,16 +10817,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.30.1", + "version": "1.32.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "51b95ec8670af41009e2b2b56873bad96682413e" + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e", - "reference": "51b95ec8670af41009e2b2b56873bad96682413e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", "shasum": "" }, "require": { @@ -10929,9 +10858,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0" }, - "time": "2024-09-07T20:13:05+00:00" + "time": "2024-09-26T07:23:32+00:00" }, { "name": "phpunit/php-code-coverage", @@ -11256,16 +11185,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.33", + "version": "10.5.35", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4def7a9cda75af9c2bc179ed53a8e41313e7f7cf" + "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4def7a9cda75af9c2bc179ed53a8e41313e7f7cf", - "reference": "4def7a9cda75af9c2bc179ed53a8e41313e7f7cf", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7ac8b4e63f456046dcb4c9787da9382831a1874b", + "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b", "shasum": "" }, "require": { @@ -11337,7 +11266,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.33" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.35" }, "funding": [ { @@ -11353,7 +11282,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T06:06:56+00:00" + "time": "2024-09-19T10:52:21+00:00" }, { "name": "psalm/plugin-laravel", @@ -12464,16 +12393,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.1.2", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "92a91985250c251de9b947a14bb2c9390b1a562c" + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/92a91985250c251de9b947a14bb2c9390b1a562c", - "reference": "92a91985250c251de9b947a14bb2c9390b1a562c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", "shasum": "" }, "require": { @@ -12510,7 +12439,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.2" + "source": "https://github.com/symfony/filesystem/tree/v7.1.5" }, "funding": [ { @@ -12526,20 +12455,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T10:03:55+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { "name": "symfony/yaml", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "92e080b851c1c655c786a2da77f188f2dccd0f4b" + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/92e080b851c1c655c786a2da77f188f2dccd0f4b", - "reference": "92e080b851c1c655c786a2da77f188f2dccd0f4b", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", "shasum": "" }, "require": { @@ -12581,7 +12510,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.4" + "source": "https://github.com/symfony/yaml/tree/v7.1.5" }, "funding": [ { @@ -12597,7 +12526,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:59:40+00:00" + "time": "2024-09-17T12:49:58+00:00" }, { "name": "theseer/tokenizer", @@ -12651,16 +12580,16 @@ }, { "name": "vimeo/psalm", - "version": "5.26.0", + "version": "5.26.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "4787eaf414e16c661902b94dfe5d882223e5b513" + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/4787eaf414e16c661902b94dfe5d882223e5b513", - "reference": "4787eaf414e16c661902b94dfe5d882223e5b513", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", "shasum": "" }, "require": { @@ -12757,7 +12686,7 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2024-09-08T00:00:18+00:00" + "time": "2024-09-08T18:53:08+00:00" } ], "aliases": [], diff --git a/public/css/ixp-pack.css b/public/css/ixp-pack.css index 0ac358672..2724ca06e 100644 --- a/public/css/ixp-pack.css +++ b/public/css/ixp-pack.css @@ -3306,1974 +3306,4 @@ td a:hover{ background: rgba(255, 255, 255, .9); border-radius: 0 0 0 1rem; } -/** - * This injects Tailwind's base styles, which is a combination of - * Normalize.css and some additional base styles. - * - * You can see the styles here: - * https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css - * - * If using `postcss-import`, use this import instead: - * - * @import "tailwindcss/preflight"; - */ -/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com - */ -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ -*, -::before, -::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: #e5e7eb; /* 2 */ -} -::before, -::after { - --tw-content: ''; -} -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ -html, -:host { - line-height: 1.5; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - -moz-tab-size: 4; /* 3 */ - -o-tab-size: 4; - tab-size: 4; /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ - font-feature-settings: normal; /* 5 */ - font-variation-settings: normal; /* 6 */ - -webkit-tap-highlight-color: transparent; /* 7 */ -} -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ -body { - margin: 0; /* 1 */ - line-height: inherit; /* 2 */ -} -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ - border-top-width: 1px; /* 3 */ -} -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} -/* -Remove the default font size and weight for headings. -*/ -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ -a { - color: inherit; - text-decoration: inherit; -} -/* -Add the correct font weight in Edge and Safari. -*/ -b, -strong { - font-weight: bolder; -} -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ - font-feature-settings: normal; /* 2 */ - font-variation-settings: normal; /* 3 */ - font-size: 1em; /* 4 */ -} -/* -Add the correct font size in all browsers. -*/ -small { - font-size: 80%; -} -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sub { - bottom: -0.25em; -} -sup { - top: -0.5em; -} -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ - border-collapse: collapse; /* 3 */ -} -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-feature-settings: inherit; /* 1 */ - font-variation-settings: inherit; /* 1 */ - font-size: 100%; /* 1 */ - font-weight: inherit; /* 1 */ - line-height: inherit; /* 1 */ - letter-spacing: inherit; /* 1 */ - color: inherit; /* 1 */ - margin: 0; /* 2 */ - padding: 0; /* 3 */ -} -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ -button, -select { - text-transform: none; -} -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - -webkit-appearance: button; /* 1 */ - background-color: transparent; /* 2 */ - background-image: none; /* 2 */ -} -/* -Use the modern Firefox focus style for all focusable elements. -*/ -:-moz-focusring { - outline: auto; -} -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ -:-moz-ui-invalid { - box-shadow: none; -} -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ -progress { - vertical-align: baseline; -} -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ -[type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} -/* -Add the correct display in Chrome and Safari. -*/ -summary { - display: list-item; -} -/* -Removes the default spacing and border for appropriate elements. -*/ -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} -fieldset { - margin: 0; - padding: 0; -} -legend { - padding: 0; -} -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} -/* -Reset default styling for dialogs. -*/ -dialog { - padding: 0; -} -/* -Prevent resizing textareas horizontally by default. -*/ -textarea { - resize: vertical; -} -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; /* 1 */ - color: #9ca3af; /* 2 */ -} -input::placeholder, -textarea::placeholder { - opacity: 1; /* 1 */ - color: #9ca3af; /* 2 */ -} -/* -Set the default cursor for buttons. -*/ -button, -[role="button"] { - cursor: pointer; -} -/* -Make sure disabled buttons don't get the pointer cursor. -*/ -:disabled { - cursor: default; -} -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; /* 1 */ - vertical-align: middle; /* 2 */ -} -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ -img, -video { - max-width: 100%; - height: auto; -} -/* Make elements with the HTML hidden attribute stay hidden by default */ -[hidden] { - display: none; -} -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} -/** - * This injects any component classes registered by plugins. - * - * If using `postcss-import`, use this import instead: - * - * @import "tailwindcss/components"; - */ -/** - * Here you would add any of your custom component classes; stuff that you'd - * want loaded *before* the utilities so that the utilities could still - * override them. - * - * Example: - * - * .btn { ... } - * .form-input { ... } - * - * Or if using a preprocessor or `postcss-import`: - * - * @import "components/buttons"; - * @import "components/forms"; - */ -/**************************************************************************************** - **** Reset headings to ~ Bootstrap4 defaults - ****************************************************************************************/ -h1 { - font-size: 2.4rem; - line-height: 1; - color: #1a202c; - font-weight: 300; - margin-bottom: 1rem; -} - -h2 { - font-size: 2rem; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -h3 { - font-size: 1.75rem; - margin-bottom: 0.5rem; - font-weight: 300; - line-height: 1.2; - color: #1a202c; -} - -h4 { - font-size: 1.5rem; - margin-bottom: 0.5rem; - font-weight: 300; - color: #1a202c; - line-height: 1; -} - -h5 { - font-size: 1.25rem; - margin-bottom: 0.5rem; - font-weight: 400; - line-height: 1.2; -} - -h6 { - font-size: 1rem; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -p { - margin-bottom: 1rem; -} - -li { - display: list-item; -} - -ol { - display: block; - list-style-type: decimal; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; - padding-left: 40px; -} - -ul { - display: block; - list-style-type: disc; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; - padding-left: 40px; -} - -dl { - display: block; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; -} - -dt { - display: block; -} - -code { - font-size: 0.9em; -} - -pre { - display: block; - font-family: monospace; - white-space: pre; - margin: 1em 0; - font-size: 0.9em; -} - -hr { - margin-bottom: 10px; -} - -/**************************************************************************************** - **** Reset anchors - ****************************************************************************************/ -a { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - -a:hover { - text-decoration-line: underline; -} - -.tw-border-t-1 { - border-top-width: 1px; -} - -.tw-border-b-1 { - border-bottom-width: 1px; -} - -.tw-border-1 { - border-width: 1px; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -/**************************************************************************************** - **** LHS Menu in IXP Manager - - -
- -
- - - ****************************************************************************************/ -#side-navbar { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - padding-right: 0px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -#side-navbar ul, #side-navbar ol { - list-style: none; - margin: 0; - padding: 0; -} - -#side-navbar h6 { - margin: 0px; - display: block; - border-right-width: 4px; - --tw-border-opacity: 1; - border-color: rgb(241 245 248 / var(--tw-border-opacity)); - padding: 1rem; - padding-left: 0.25rem; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -.nav-link { - display: block; - padding: 0.5rem; - padding-left: 0.75rem; - font-size: 0.875rem; - line-height: 1.25rem; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -.nav-link:hover { - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -#side-navbar li { - display: block; - border-right-width: 4px; - --tw-border-opacity: 1; - border-color: rgb(241 245 248 / var(--tw-border-opacity)); - padding: 0px; - font-weight: 500; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -#side-navbar li.active { - --tw-border-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); - font-weight: 700 !important; -} - -#side-navbar li:hover { - --tw-border-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -.nav-sub-menu-item { - margin-left: 2rem; -} - -.ixpm-table a { - --tw-text-opacity: 1; - color: rgb(39 121 189 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -.ixpm-table a:hover { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); - text-decoration-line: underline; -} - -/**************************************************************************************** - **** Buttons - ****************************************************************************************/ -.btn { - border-radius: 0.125rem; - border-color: transparent; - font-weight: 700; -} - -.btn:hover { - border-color: transparent; -} - -.btn-primary { - --tw-bg-opacity: 1; - background-color: rgb(59 130 246 / var(--tw-bg-opacity)); - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.btn-primary:hover { - --tw-bg-opacity: 1; - background-color: rgb(39 121 189 / var(--tw-bg-opacity)); -} - -.btn-success { - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.btn-success:hover { - --tw-bg-opacity: 1; - background-color: rgb(31 157 85 / var(--tw-bg-opacity)); -} - -.btn-secondary { - --tw-bg-opacity: 1; - background-color: rgb(135 149 161 / var(--tw-bg-opacity)); - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.btn-secondary:hover { - --tw-bg-opacity: 1; - background-color: rgb(96 111 123 / var(--tw-bg-opacity)); -} - -.btn-outline-secondary { - border-radius: 0.125rem; - --tw-border-opacity: 1; - border-color: rgb(184 194 204 / var(--tw-border-opacity)); - background-color: transparent; - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(184 194 204 / var(--tw-text-opacity)); - border-width: 1px; -} - -.btn-outline-secondary:hover { - --tw-bg-opacity: 1; - background-color: rgb(184 194 204 / var(--tw-bg-opacity)); -} - -.btn-white { - border-radius: 0.125rem; - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(61 72 82 / var(--tw-text-opacity)); - border-width: 1px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -.btn-white:hover { - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); - border-width: 1px; -} - -.btn-info { - border-radius: 0.125rem; - --tw-border-opacity: 1; - border-color: rgb(20 184 166 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(20 184 166 / var(--tw-text-opacity)); - border-width: 1px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -.btn-info:hover { - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); - border-width: 1px; -} - -/****************************************************************************************ea - **** Inputs - ****************************************************************************************/ -input.form-control { - width: 100%; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 0.125rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - line-height: 1.25; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); - border-width: 1px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -input.form-control:focus { - line-height: 1.25; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.input-group-append .btn { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); - border-color: #ced4da; -} - -label.control-label, label.form-check-label { - display: block; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -/**************************************************************************************** - **** Badge - ****************************************************************************************/ -.badge { - border-radius: 9999px; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.75rem; - padding-right: 0.75rem; - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.badge-info { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} - -.badge-success { - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); -} - -.badge-secondary { - --tw-bg-opacity: 1; - background-color: rgb(184 194 204 / var(--tw-bg-opacity)); -} - -.badge-warning { - --tw-bg-opacity: 1; - background-color: rgb(251 146 60 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} - -/**************************************************************************************** - **** Card - ****************************************************************************************/ -.card { - border-color: #dae1e7; - border-radius: 0.125rem; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -.card .card-header { - border-top-left-radius: 0.125rem; - border-top-right-radius: 0.125rem; - border-bottom-width: 0px; -} - -a { - display: inline-block; - vertical-align: baseline; - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(108 178 235 / var(--tw-text-opacity)); -} - -a:hover { - --tw-text-opacity: 1; - color: rgb(39 121 189 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -/**************************************************************************************** - **** table - ****************************************************************************************/ -.table-light td, .table-light thead th { - border-color: #ced4da; -} - -/**************************************************************************************** - **** Docstore - ****************************************************************************************/ -.docstore table { - width: 100%; - table-layout: auto; -} - -.docstore td { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - border-top-width: 1px; -} - -.docstore td.top { - border-top-width: 2px; - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.docstore td.meta { - display: none; - width: 0.25rem; - white-space: nowrap; -} - -@media (min-width: 1024px) { - .docstore td.meta { - display: table-cell; - width: 0.25rem; - white-space: nowrap; - } -} -.docstore td.icon { - margin-right: 1rem; - width: 0.25rem; - white-space: nowrap; - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - text-align: center; -} - -/** - * This injects all of Tailwind's utility classes, generated based on your - * config file. - * - * If using `postcss-import`, use this import instead: - * - * @import "tailwindcss/utilities"; - */ -.tw-collapse { - visibility: collapse; -} -.tw-absolute { - position: absolute; -} -.tw-relative { - position: relative; -} -.tw-inset-0 { - inset: 0px; -} -.tw-float-right { - float: right; -} -.tw-m-0 { - margin: 0px; -} -.tw-m-2 { - margin: 0.5rem; -} -.-tw-mx-4 { - margin-left: -1rem; - margin-right: -1rem; -} -.tw-mx-3 { - margin-left: 0.75rem; - margin-right: 0.75rem; -} -.tw-mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} -.tw-mx-auto { - margin-left: auto; - margin-right: auto; -} -.tw-my-0 { - margin-top: 0px; - margin-bottom: 0px; -} -.tw-my-1 { - margin-top: 0.25rem; - margin-bottom: 0.25rem; -} -.tw-my-10 { - margin-top: 2.5rem; - margin-bottom: 2.5rem; -} -.tw-my-12 { - margin-top: 3rem; - margin-bottom: 3rem; -} -.tw-my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} -.tw-my-6 { - margin-top: 1.5rem; - margin-bottom: 1.5rem; -} -.tw-my-8 { - margin-top: 2rem; - margin-bottom: 2rem; -} -.tw-mb-0 { - margin-bottom: 0px; -} -.tw-mb-16 { - margin-bottom: 4rem; -} -.tw-mb-2 { - margin-bottom: 0.5rem; -} -.tw-mb-6 { - margin-bottom: 1.5rem; -} -.tw-mb-8 { - margin-bottom: 2rem; -} -.tw-ml-12 { - margin-left: 3rem; -} -.tw-ml-2 { - margin-left: 0.5rem; -} -.tw-ml-4 { - margin-left: 1rem; -} -.tw-ml-6 { - margin-left: 1.5rem; -} -.tw-ml-8 { - margin-left: 2rem; -} -.tw-mr-2 { - margin-right: 0.5rem; -} -.tw-mr-3 { - margin-right: 0.75rem; -} -.tw-mr-4 { - margin-right: 1rem; -} -.tw-mr-6 { - margin-right: 1.5rem; -} -.tw-mt-1 { - margin-top: 0.25rem; -} -.tw-mt-16 { - margin-top: 4rem; -} -.tw-mt-2 { - margin-top: 0.5rem; -} -.tw-mt-4 { - margin-top: 1rem; -} -.tw-mt-6 { - margin-top: 1.5rem; -} -.tw-mt-8 { - margin-top: 2rem; -} -.tw-mt-3 { - margin-top: 0.75rem; -} -.tw-mr-1 { - margin-right: 0.25rem; -} -.tw-mb-1 { - margin-bottom: 0.25rem; -} -.tw-mb-4 { - margin-bottom: 1rem; -} -.tw-block { - display: block; -} -.tw-inline-block { - display: inline-block; -} -.tw-inline { - display: inline; -} -.tw-flex { - display: flex; -} -.tw-inline-flex { - display: inline-flex; -} -.tw-hidden { - display: none; -} -.tw-size-2\/3 { - width: 66.666667%; - height: 66.666667%; -} -.tw-h-24 { - height: 6rem; -} -.tw-h-5 { - height: 1.25rem; -} -.tw-h-8 { - height: 2rem; -} -.tw-h-7 { - height: 1.75rem; -} -.tw-h-6 { - height: 1.5rem; -} -.tw-h-4 { - height: 1rem; -} -.tw-w-10 { - width: 2.5rem; -} -.tw-w-20 { - width: 5rem; -} -.tw-w-6 { - width: 1.5rem; -} -.tw-w-auto { - width: auto; -} -.tw-w-full { - width: 100%; -} -.tw-w-7 { - width: 1.75rem; -} -.tw-w-5 { - width: 1.25rem; -} -.tw-w-4 { - width: 1rem; -} -.tw-min-w-full { - min-width: 100%; -} -.tw-min-w-24 { - min-width: 6rem; -} -.tw-min-w-20 { - min-width: 5rem; -} -.tw-min-w-16 { - min-width: 4rem; -} -.tw-min-w-96 { - min-width: 24rem; -} -.tw-max-w-lg { - max-width: 32rem; -} -.tw-max-w-md { - max-width: 28rem; -} -.tw-max-w-sm { - max-width: 24rem; -} -.tw-flex-1 { - flex: 1 1 0%; -} -.tw-cursor-pointer { - cursor: pointer; -} -.tw-list-none { - list-style-type: none; -} -.tw-flex-wrap { - flex-wrap: wrap; -} -.tw-items-center { - align-items: center; -} -.tw-justify-start { - justify-content: flex-start; -} -.tw-justify-center { - justify-content: center; -} -.tw-justify-between { - justify-content: space-between; -} -.tw-divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} -.tw-divide-gray-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-divide-opacity)); -} -.tw-divide-gray-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-divide-opacity)); -} -.tw-self-center { - align-self: center; -} -.tw-overflow-hidden { - overflow: hidden; -} -.tw-whitespace-nowrap { - white-space: nowrap; -} -.tw-rounded { - border-radius: 0.25rem; -} -.tw-rounded-full { - border-radius: 9999px; -} -.tw-rounded-lg { - border-radius: 0.5rem; -} -.tw-rounded-md { - border-radius: 0.375rem; -} -.tw-rounded-sm { - border-radius: 0.125rem; -} -.tw-border-2 { - border-width: 2px; -} -.tw-border-4 { - border-width: 4px; -} -.tw-border-b { - border-bottom-width: 1px; -} -.tw-border-b-2 { - border-bottom-width: 2px; -} -.tw-border-l-4 { - border-left-width: 4px; -} -.tw-border-r-4 { - border-right-width: 4px; -} -.tw-border-t { - border-top-width: 1px; -} -.tw-border-t-2 { - border-top-width: 2px; -} -.tw-border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} -.tw-border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity)); -} -.tw-border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} -.tw-border-gray-400 { - --tw-border-opacity: 1; - border-color: rgb(156 163 175 / var(--tw-border-opacity)); -} -.tw-border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); -} -.tw-border-gray-600 { - --tw-border-opacity: 1; - border-color: rgb(75 85 99 / var(--tw-border-opacity)); -} -.tw-border-green-500 { - --tw-border-opacity: 1; - border-color: rgb(16 185 129 / var(--tw-border-opacity)); -} -.tw-border-grey-light { - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); -} -.tw-border-grey-lighter { - --tw-border-opacity: 1; - border-color: rgb(241 245 248 / var(--tw-border-opacity)); -} -.tw-border-orange-500 { - --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); -} -.tw-border-red-500 { - --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); -} -.tw-border-red-lighter { - --tw-border-opacity: 1; - border-color: rgb(249 172 170 / var(--tw-border-opacity)); -} -.tw-border-gray-900 { - --tw-border-opacity: 1; - border-color: rgb(17 24 39 / var(--tw-border-opacity)); -} -.tw-border-gray-800 { - --tw-border-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-border-opacity)); -} -.tw-border-blue-800 { - --tw-border-opacity: 1; - border-color: rgb(30 64 175 / var(--tw-border-opacity)); -} -.tw-border-red-800 { - --tw-border-opacity: 1; - border-color: rgb(153 27 27 / var(--tw-border-opacity)); -} -.tw-border-amber-700 { - --tw-border-opacity: 1; - border-color: rgb(180 83 9 / var(--tw-border-opacity)); -} -.tw-border-lime-700 { - --tw-border-opacity: 1; - border-color: rgb(77 124 15 / var(--tw-border-opacity)); -} -.tw-border-red-700 { - --tw-border-opacity: 1; - border-color: rgb(185 28 28 / var(--tw-border-opacity)); -} -.tw-border-teal-700 { - --tw-border-opacity: 1; - border-color: rgb(15 118 110 / var(--tw-border-opacity)); -} -.tw-border-amber-600 { - --tw-border-opacity: 1; - border-color: rgb(217 119 6 / var(--tw-border-opacity)); -} -.tw-border-teal-400 { - --tw-border-opacity: 1; - border-color: rgb(45 212 191 / var(--tw-border-opacity)); -} -.tw-border-lime-500 { - --tw-border-opacity: 1; - border-color: rgb(132 204 22 / var(--tw-border-opacity)); -} -.tw-border-amber-400 { - --tw-border-opacity: 1; - border-color: rgb(251 191 36 / var(--tw-border-opacity)); -} -.tw-border-red-400 { - --tw-border-opacity: 1; - border-color: rgb(248 113 113 / var(--tw-border-opacity)); -} -.tw-border-red-600 { - --tw-border-opacity: 1; - border-color: rgb(220 38 38 / var(--tw-border-opacity)); -} -.tw-bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgb(219 234 254 / var(--tw-bg-opacity)); -} -.tw-bg-blue-50 { - --tw-bg-opacity: 1; - background-color: rgb(239 246 255 / var(--tw-bg-opacity)); -} -.tw-bg-blue-lightest { - --tw-bg-opacity: 1; - background-color: rgb(239 248 255 / var(--tw-bg-opacity)); -} -.tw-bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} -.tw-bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgb(229 231 235 / var(--tw-bg-opacity)); -} -.tw-bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.tw-bg-gray-500 { - --tw-bg-opacity: 1; - background-color: rgb(107 114 128 / var(--tw-bg-opacity)); -} -.tw-bg-green-100 { - --tw-bg-opacity: 1; - background-color: rgb(209 250 229 / var(--tw-bg-opacity)); -} -.tw-bg-green-50 { - --tw-bg-opacity: 1; - background-color: rgb(236 253 245 / var(--tw-bg-opacity)); -} -.tw-bg-grey-lighter { - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); -} -.tw-bg-orange-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 237 213 / var(--tw-bg-opacity)); -} -.tw-bg-pink-50 { - --tw-bg-opacity: 1; - background-color: rgb(253 242 248 / var(--tw-bg-opacity)); -} -.tw-bg-red-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} -.tw-bg-red-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity)); -} -.tw-bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} -.tw-bg-yellow-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 251 235 / var(--tw-bg-opacity)); -} -.tw-bg-amber-700 { - --tw-bg-opacity: 1; - background-color: rgb(180 83 9 / var(--tw-bg-opacity)); -} -.tw-bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgb(156 163 175 / var(--tw-bg-opacity)); -} -.tw-bg-lime-50 { - --tw-bg-opacity: 1; - background-color: rgb(247 254 231 / var(--tw-bg-opacity)); -} -.tw-bg-red-700 { - --tw-bg-opacity: 1; - background-color: rgb(185 28 28 / var(--tw-bg-opacity)); -} -.tw-bg-red-800 { - --tw-bg-opacity: 1; - background-color: rgb(153 27 27 / var(--tw-bg-opacity)); -} -.tw-bg-teal-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 250 / var(--tw-bg-opacity)); -} -.tw-bg-amber-600 { - --tw-bg-opacity: 1; - background-color: rgb(217 119 6 / var(--tw-bg-opacity)); -} -.tw-bg-teal-500 { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} -.tw-bg-lime-100 { - --tw-bg-opacity: 1; - background-color: rgb(236 252 203 / var(--tw-bg-opacity)); -} -.tw-bg-teal-400 { - --tw-bg-opacity: 1; - background-color: rgb(45 212 191 / var(--tw-bg-opacity)); -} -.tw-bg-gray-300 { - --tw-bg-opacity: 1; - background-color: rgb(209 213 219 / var(--tw-bg-opacity)); -} -.tw-bg-lime-500 { - --tw-bg-opacity: 1; - background-color: rgb(132 204 22 / var(--tw-bg-opacity)); -} -.tw-bg-amber-400 { - --tw-bg-opacity: 1; - background-color: rgb(251 191 36 / var(--tw-bg-opacity)); -} -.tw-bg-red-400 { - --tw-bg-opacity: 1; - background-color: rgb(248 113 113 / var(--tw-bg-opacity)); -} -.tw-bg-red-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); -} -.tw-p-0 { - padding: 0px; -} -.tw-p-1 { - padding: 0.25rem; -} -.tw-p-2 { - padding: 0.5rem; -} -.tw-p-4 { - padding: 1rem; -} -.tw-p-5 { - padding: 1.25rem; -} -.tw-p-6 { - padding: 1.5rem; -} -.tw-px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} -.tw-px-10 { - padding-left: 2.5rem; - padding-right: 2.5rem; -} -.tw-px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} -.tw-px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} -.tw-px-4 { - padding-left: 1rem; - padding-right: 1rem; -} -.tw-px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} -.tw-px-8 { - padding-left: 2rem; - padding-right: 2rem; -} -.tw-py-0 { - padding-top: 0px; - padding-bottom: 0px; -} -.tw-py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} -.tw-py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} -.tw-py-20 { - padding-top: 5rem; - padding-bottom: 5rem; -} -.tw-py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} -.tw-py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} -.tw-py-5 { - padding-top: 1.25rem; - padding-bottom: 1.25rem; -} -.tw-px-1\.5 { - padding-left: 0.375rem; - padding-right: 0.375rem; -} -.tw-py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} -.tw-pb-2 { - padding-bottom: 0.5rem; -} -.tw-pb-8 { - padding-bottom: 2rem; -} -.tw-pl-0 { - padding-left: 0px; -} -.tw-pl-16 { - padding-left: 4rem; -} -.tw-pl-2 { - padding-left: 0.5rem; -} -.tw-pl-4 { - padding-left: 1rem; -} -.tw-pr-4 { - padding-right: 1rem; -} -.tw-pt-0 { - padding-top: 0px; -} -.tw-pt-4 { - padding-top: 1rem; -} -.tw-pt-6 { - padding-top: 1.5rem; -} -.tw-pl-8 { - padding-left: 2rem; -} -.tw-pt-2 { - padding-top: 0.5rem; -} -.tw-pl-6 { - padding-left: 1.5rem; -} -.tw-text-center { - text-align: center; -} -.tw-text-right { - text-align: right; -} -.tw-align-middle { - vertical-align: middle; -} -.tw-font-mono { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} -.tw-text-base { - font-size: 1rem; - line-height: 1.5rem; -} -.tw-text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} -.tw-text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} -.tw-text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} -.tw-text-xs { - font-size: 0.75rem; - line-height: 1rem; -} -.tw-font-bold { - font-weight: 700; -} -.tw-font-medium { - font-weight: 500; -} -.tw-font-normal { - font-weight: 400; -} -.tw-font-semibold { - font-weight: 600; -} -.tw-uppercase { - text-transform: uppercase; -} -.tw-italic { - font-style: italic; -} -.tw-leading-6 { - line-height: 1.5rem; -} -.tw-leading-tight { - line-height: 1.25; -} -.tw-leading-7 { - line-height: 1.75rem; -} -.tw-leading-8 { - line-height: 2rem; -} -.tw-leading-5 { - line-height: 1.25rem; -} -.tw-leading-4 { - line-height: 1rem; -} -.tw-leading-3 { - line-height: .75rem; -} -.tw-text-black { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} -.tw-text-blue-600 { - --tw-text-opacity: 1; - color: rgb(37 99 235 / var(--tw-text-opacity)); -} -.tw-text-blue-700 { - --tw-text-opacity: 1; - color: rgb(29 78 216 / var(--tw-text-opacity)); -} -.tw-text-blue-dark { - --tw-text-opacity: 1; - color: rgb(39 121 189 / var(--tw-text-opacity)); -} -.tw-text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} -.tw-text-gray-600 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)); -} -.tw-text-gray-700 { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); -} -.tw-text-gray-800 { - --tw-text-opacity: 1; - color: rgb(31 41 55 / var(--tw-text-opacity)); -} -.tw-text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} -.tw-text-green-500 { - --tw-text-opacity: 1; - color: rgb(16 185 129 / var(--tw-text-opacity)); -} -.tw-text-green-600 { - --tw-text-opacity: 1; - color: rgb(5 150 105 / var(--tw-text-opacity)); -} -.tw-text-green-700 { - --tw-text-opacity: 1; - color: rgb(4 120 87 / var(--tw-text-opacity)); -} -.tw-text-green-dark { - --tw-text-opacity: 1; - color: rgb(31 157 85 / var(--tw-text-opacity)); -} -.tw-text-grey-dark { - --tw-text-opacity: 1; - color: rgb(135 149 161 / var(--tw-text-opacity)); -} -.tw-text-grey-darker { - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} -.tw-text-grey-darkest { - --tw-text-opacity: 1; - color: rgb(61 72 82 / var(--tw-text-opacity)); -} -.tw-text-orange-500 { - --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); -} -.tw-text-orange-700 { - --tw-text-opacity: 1; - color: rgb(194 65 12 / var(--tw-text-opacity)); -} -.tw-text-pink-700 { - --tw-text-opacity: 1; - color: rgb(190 24 93 / var(--tw-text-opacity)); -} -.tw-text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} -.tw-text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} -.tw-text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} -.tw-text-red-lighter { - --tw-text-opacity: 1; - color: rgb(249 172 170 / var(--tw-text-opacity)); -} -.tw-line-through { - text-decoration-line: line-through; -} -.tw-opacity-40 { - opacity: 0.4; -} -.tw-shadow-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-shadow-md { - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-ring-1 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} -.tw-ring-inset { - --tw-ring-inset: inset; -} -.tw-ring-blue-700\/10 { - --tw-ring-color: rgb(29 78 216 / 0.1); -} -.tw-ring-gray-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} -.tw-ring-gray-500\/10 { - --tw-ring-color: rgb(107 114 128 / 0.1); -} -.tw-ring-gray-800\/10 { - --tw-ring-color: rgb(31 41 55 / 0.1); -} -.tw-ring-green-600\/20 { - --tw-ring-color: rgb(5 150 105 / 0.2); -} -.tw-ring-pink-700\/10 { - --tw-ring-color: rgb(190 24 93 / 0.1); -} -.tw-ring-red-600\/10 { - --tw-ring-color: rgb(220 38 38 / 0.1); -} -.tw-ring-yellow-600\/20 { - --tw-ring-color: rgb(217 119 6 / 0.2); -} -.\[a-f0-9\:\\\.\\-\] { - a-f0-9: \.\-; -} -.\[id\:\%d\] { - id: %d; -} -/** - * Here you would add any custom utilities you need that don't come out of the - * box with Tailwind. - * - * Example : - * - * .bg-pattern-graph-paper { ... } - * .skew-45 { ... } - * - * Or if using a preprocessor or `postcss-import`: - * - * @import "utilities/background-patterns"; - * @import "utilities/skew-transforms"; - */ -.hover\:tw-border-gray-800:hover { - --tw-border-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-border-opacity)); -} -.hover\:tw-bg-gray-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.hover\:tw-bg-grey-lighter:hover { - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); -} -.hover\:tw-no-underline:hover { - text-decoration-line: none; -} -.hover\:tw-opacity-80:hover { - opacity: 0.8; -} -@media (min-width: 640px) { - .sm\:-tw-mx-0 { - margin-left: -0px; - margin-right: -0px; - } - .sm\:tw-flex { - display: flex; - } - .sm\:tw-flex-auto { - flex: 1 1 auto; - } - .sm\:tw-items-center { - align-items: center; - } - .sm\:tw-p-6 { - padding: 1.5rem; - } - .sm\:tw-px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - .sm\:tw-pl-0 { - padding-left: 0px; - } -} -@media (min-width: 768px) { - .md\:tw-mt-0 { - margin-top: 0px; - } - .md\:tw-inline { - display: inline; - } - .md\:tw-table-cell { - display: table-cell; - } - .md\:tw-text-left { - text-align: left; - } - .md\:tw-text-right { - text-align: right; - } -} -@media (min-width: 1024px) { - .lg\:tw-inline-block { - display: inline-block; - } - .lg\:tw-inline { - display: inline; - } - .lg\:tw-table-cell { - display: table-cell; - } - .lg\:tw-px-8 { - padding-left: 2rem; - padding-right: 2rem; - } -} +/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }h1{color:#1a202c;font-size:2.4rem;font-weight:300;line-height:1;margin-bottom:1rem}h2{font-size:2rem;font-weight:500;line-height:1.2;margin-bottom:.5rem}h3{font-size:1.75rem;line-height:1.2}h3,h4{color:#1a202c;font-weight:300;margin-bottom:.5rem}h4{font-size:1.5rem;line-height:1}h5{font-size:1.25rem;font-weight:400}h5,h6{line-height:1.2;margin-bottom:.5rem}h6{font-size:1rem;font-weight:500}p{margin-bottom:1rem}li{display:list-item}ol{list-style-type:decimal}ol,ul{display:block;margin:1em 0;padding-left:40px}ul{list-style-type:disc}dl{margin:1em 0}dl,dt{display:block}code,pre{font-size:.9em}pre{display:block;font-family:monospace;margin:1em 0;white-space:pre}hr{margin-bottom:10px}a{color:rgb(59 130 246/var(--tw-text-opacity))}a:hover{text-decoration-line:underline}.tw-border-t-1{border-top-width:1px}.tw-border-b-1{border-bottom-width:1px}.tw-border-1{border-width:1px}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}#side-navbar{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);background-color:rgb(255 255 255/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);padding-right:0}#side-navbar ol,#side-navbar ul{list-style:none;margin:0;padding:0}#side-navbar h6{--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));border-right-width:4px;margin:0;padding:1rem 1rem 1rem .25rem}#side-navbar h6,.nav-link{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity));display:block}.nav-link{font-size:.875rem;line-height:1.25rem;padding:.5rem .5rem .5rem .75rem;text-decoration-line:none}.nav-link:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}#side-navbar li{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));border-right-width:4px;color:rgb(96 111 123/var(--tw-text-opacity));display:block;font-weight:500;padding:0}#side-navbar li.active{font-weight:700!important}#side-navbar li.active,#side-navbar li:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity));border-color:rgb(5 150 105/var(--tw-border-opacity))}#side-navbar li:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.nav-sub-menu-item{margin-left:2rem}.ixpm-table a{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity));text-decoration-line:none}.ixpm-table a:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity));text-decoration-line:underline}.btn{border-radius:.125rem;font-weight:700}.btn,.btn:hover{border-color:transparent}.btn-primary{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(39 121 189/var(--tw-bg-opacity))}.btn-success{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700}.btn-success:hover{--tw-bg-opacity:1;background-color:rgb(31 157 85/var(--tw-bg-opacity))}.btn-secondary{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(135 149 161/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700}.btn-secondary:hover{--tw-bg-opacity:1;background-color:rgb(96 111 123/var(--tw-bg-opacity))}.btn-outline-secondary{--tw-border-opacity:1;--tw-text-opacity:1;background-color:transparent;border-color:rgb(184 194 204/var(--tw-border-opacity));border-radius:.125rem;border-width:1px;color:rgb(184 194 204/var(--tw-text-opacity));font-weight:600}.btn-outline-secondary:hover{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.btn-white{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);color:rgb(61 72 82/var(--tw-text-opacity));font-weight:600}.btn-white,.btn-white:hover{border-color:rgb(218 225 231/var(--tw-border-opacity));border-width:1px}.btn-white:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.btn-info{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(20 184 166/var(--tw-border-opacity));border-radius:.125rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);color:rgb(20 184 166/var(--tw-text-opacity));font-weight:600}.btn-info:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity));border-color:rgb(218 225 231/var(--tw-border-opacity));border-width:1px}input.form-control{--tw-text-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.125rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);padding:.5rem 1rem;width:100%}input.form-control,input.form-control:focus{color:rgb(96 111 123/var(--tw-text-opacity));line-height:1.25}input.form-control:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.input-group-append .btn{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-color:#ced4da;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}label.control-label,label.form-check-label{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity));display:block;font-size:.875rem;font-weight:700;line-height:1.25rem}.badge{--tw-text-opacity:1;border-radius:9999px;color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700;padding:.25rem .75rem}.badge-info{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.badge-success{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.badge-secondary{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.badge-warning{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity));color:rgb(0 0 0/var(--tw-text-opacity))}.card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-color:#dae1e7;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.card .card-header{border-bottom-width:0;border-top-left-radius:.125rem;border-top-right-radius:.125rem}a{color:rgb(108 178 235/var(--tw-text-opacity));display:inline-block;font-weight:700;vertical-align:baseline}a,a:hover{--tw-text-opacity:1}a:hover{color:rgb(39 121 189/var(--tw-text-opacity));text-decoration-line:none}.table-light td,.table-light thead th{border-color:#ced4da}.docstore table{table-layout:auto;width:100%}.docstore td{border-color:rgb(209 213 219/var(--tw-border-opacity));border-top-width:1px}.docstore td,.docstore td.top{--tw-border-opacity:1;padding:.5rem}.docstore td.top{border-color:rgb(209 213 219/var(--tw-border-opacity));border-top-width:2px}.docstore td.meta{display:none;white-space:nowrap;width:.25rem}@media (min-width:1024px){.docstore td.meta{display:table-cell;white-space:nowrap;width:.25rem}}.docstore td.icon{margin-right:1rem;padding:.5rem;text-align:center;white-space:nowrap;width:.25rem}.tw-collapse{visibility:collapse}.tw-absolute{position:absolute}.tw-relative{position:relative}.tw-inset-0{inset:0}.tw-float-right{float:right}.tw-m-0{margin:0}.tw-m-2{margin:.5rem}.tw-mx-3{margin-left:.75rem;margin-right:.75rem}.tw-mx-4{margin-left:1rem;margin-right:1rem}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-my-0{margin-bottom:0;margin-top:0}.tw-my-1{margin-bottom:.25rem;margin-top:.25rem}.tw-my-10{margin-bottom:2.5rem;margin-top:2.5rem}.tw-my-12{margin-bottom:3rem;margin-top:3rem}.tw-my-4{margin-bottom:1rem;margin-top:1rem}.tw-my-6{margin-bottom:1.5rem;margin-top:1.5rem}.tw-my-8{margin-bottom:2rem;margin-top:2rem}.tw-mb-0{margin-bottom:0}.tw-mb-16{margin-bottom:4rem}.tw-mb-2{margin-bottom:.5rem}.tw-mb-6{margin-bottom:1.5rem}.tw-mb-8{margin-bottom:2rem}.tw-ml-12{margin-left:3rem}.tw-ml-2{margin-left:.5rem}.tw-ml-4{margin-left:1rem}.tw-ml-6{margin-left:1.5rem}.tw-ml-8{margin-left:2rem}.tw-mr-1{margin-right:.25rem}.tw-mr-2{margin-right:.5rem}.tw-mr-3{margin-right:.75rem}.tw-mr-4{margin-right:1rem}.tw-mr-6{margin-right:1.5rem}.tw-mt-1{margin-top:.25rem}.tw-mt-16{margin-top:4rem}.tw-mt-2{margin-top:.5rem}.tw-mt-3{margin-top:.75rem}.tw-mt-4{margin-top:1rem}.tw-mt-6{margin-top:1.5rem}.tw-mt-8{margin-top:2rem}.tw-block{display:block}.tw-inline-block{display:inline-block}.tw-inline{display:inline}.tw-flex{display:flex}.tw-inline-flex{display:inline-flex}.tw-hidden{display:none}.tw-h-24{height:6rem}.tw-h-4{height:1rem}.tw-h-5{height:1.25rem}.tw-h-6{height:1.5rem}.tw-h-7{height:1.75rem}.tw-h-8{height:2rem}.tw-w-10{width:2.5rem}.tw-w-20{width:5rem}.tw-w-4{width:1rem}.tw-w-5{width:1.25rem}.tw-w-6{width:1.5rem}.tw-w-auto{width:auto}.tw-w-full{width:100%}.tw-min-w-16{min-width:4rem}.tw-min-w-full{min-width:100%}.tw-max-w-lg{max-width:32rem}.tw-max-w-md{max-width:28rem}.tw-max-w-sm{max-width:24rem}.tw-flex-1{flex:1 1 0%}.tw-cursor-pointer{cursor:pointer}.tw-list-none{list-style-type:none}.tw-flex-wrap{flex-wrap:wrap}.tw-items-center{align-items:center}.tw-justify-start{justify-content:flex-start}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.tw-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.tw-divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(209 213 219/var(--tw-divide-opacity))}.tw-self-center{align-self:center}.tw-overflow-hidden{overflow:hidden}.tw-whitespace-nowrap{white-space:nowrap}.tw-rounded{border-radius:.25rem}.tw-rounded-full{border-radius:9999px}.tw-rounded-lg{border-radius:.5rem}.tw-rounded-md{border-radius:.375rem}.tw-rounded-sm{border-radius:.125rem}.tw-border-2{border-width:2px}.tw-border-b{border-bottom-width:1px}.tw-border-b-2{border-bottom-width:2px}.tw-border-l-4{border-left-width:4px}.tw-border-r-4{border-right-width:4px}.tw-border-t{border-top-width:1px}.tw-border-t-2{border-top-width:2px}.tw-border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.tw-border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.tw-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.tw-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.tw-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.tw-border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.tw-border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.tw-border-green-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.tw-border-grey-light{--tw-border-opacity:1;border-color:rgb(218 225 231/var(--tw-border-opacity))}.tw-border-grey-lighter{--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity))}.tw-border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.tw-border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.tw-border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.tw-border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.tw-border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.tw-border-red-lighter{--tw-border-opacity:1;border-color:rgb(249 172 170/var(--tw-border-opacity))}.tw-border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.tw-bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.tw-bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.tw-bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.tw-bg-blue-lightest{--tw-bg-opacity:1;background-color:rgb(239 248 255/var(--tw-bg-opacity))}.tw-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.tw-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.tw-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.tw-bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.tw-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.tw-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.tw-bg-green-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.tw-bg-green-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.tw-bg-grey-lighter{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.tw-bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.tw-bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.tw-bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.tw-bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.tw-bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.tw-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.tw-bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.tw-bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.tw-bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.tw-p-0{padding:0}.tw-p-1{padding:.25rem}.tw-p-2{padding:.5rem}.tw-p-4{padding:1rem}.tw-p-5{padding:1.25rem}.tw-p-6{padding:1.5rem}.tw-px-1{padding-left:.25rem;padding-right:.25rem}.tw-px-1\.5{padding-left:.375rem;padding-right:.375rem}.tw-px-10{padding-left:2.5rem;padding-right:2.5rem}.tw-px-2{padding-left:.5rem;padding-right:.5rem}.tw-px-3{padding-left:.75rem;padding-right:.75rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.tw-px-8{padding-left:2rem;padding-right:2rem}.tw-py-0{padding-bottom:0;padding-top:0}.tw-py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.tw-py-1{padding-bottom:.25rem;padding-top:.25rem}.tw-py-2{padding-bottom:.5rem;padding-top:.5rem}.tw-py-20{padding-bottom:5rem;padding-top:5rem}.tw-py-4{padding-bottom:1rem;padding-top:1rem}.tw-py-5{padding-bottom:1.25rem;padding-top:1.25rem}.tw-py-6{padding-bottom:1.5rem;padding-top:1.5rem}.tw-pb-2{padding-bottom:.5rem}.tw-pb-8{padding-bottom:2rem}.tw-pl-0{padding-left:0}.tw-pl-16{padding-left:4rem}.tw-pl-2{padding-left:.5rem}.tw-pl-4{padding-left:1rem}.tw-pr-4{padding-right:1rem}.tw-pt-0{padding-top:0}.tw-pt-4{padding-top:1rem}.tw-pt-6{padding-top:1.5rem}.tw-text-center{text-align:center}.tw-text-right{text-align:right}.tw-align-middle{vertical-align:middle}.tw-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.tw-text-base{font-size:1rem;line-height:1.5rem}.tw-text-lg{font-size:1.125rem;line-height:1.75rem}.tw-text-sm{font-size:.875rem;line-height:1.25rem}.tw-text-xl{font-size:1.25rem;line-height:1.75rem}.tw-text-xs{font-size:.75rem;line-height:1rem}.tw-font-bold{font-weight:700}.tw-font-medium{font-weight:500}.tw-font-normal{font-weight:400}.tw-font-semibold{font-weight:600}.tw-uppercase{text-transform:uppercase}.tw-italic{font-style:italic}.tw-slashed-zero{--tw-slashed-zero:slashed-zero}.tw-lining-nums,.tw-slashed-zero{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tw-lining-nums{--tw-numeric-figure:lining-nums}.tw-tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tw-leading-3{line-height:.75rem}.tw-leading-5{line-height:1.25rem}.tw-leading-6{line-height:1.5rem}.tw-leading-7{line-height:1.75rem}.tw-leading-8{line-height:2rem}.tw-leading-tight{line-height:1.25}.tw-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.tw-text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.tw-text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.tw-text-blue-dark{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity))}.tw-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.tw-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.tw-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.tw-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.tw-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.tw-text-green-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.tw-text-green-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.tw-text-green-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.tw-text-green-dark{--tw-text-opacity:1;color:rgb(31 157 85/var(--tw-text-opacity))}.tw-text-grey-dark{--tw-text-opacity:1;color:rgb(135 149 161/var(--tw-text-opacity))}.tw-text-grey-darker{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.tw-text-grey-darkest{--tw-text-opacity:1;color:rgb(61 72 82/var(--tw-text-opacity))}.tw-text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.tw-text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.tw-text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.tw-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.tw-text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.tw-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.tw-text-red-lighter{--tw-text-opacity:1;color:rgb(249 172 170/var(--tw-text-opacity))}.tw-line-through{text-decoration-line:line-through}.tw-opacity-40{opacity:.4}.tw-shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.tw-shadow,.tw-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tw-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.tw-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.tw-shadow-md,.tw-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tw-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.tw-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.tw-ring-inset{--tw-ring-inset:inset}.tw-ring-blue-700\/10{--tw-ring-color:rgba(29,78,216,.1)}.tw-ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.tw-ring-gray-500\/10{--tw-ring-color:hsla(220,9%,46%,.1)}.tw-ring-gray-800\/10{--tw-ring-color:rgba(31,41,55,.1)}.tw-ring-green-600\/20{--tw-ring-color:rgba(5,150,105,.2)}.tw-ring-pink-700\/10{--tw-ring-color:rgba(190,24,93,.1)}.tw-ring-red-600\/10{--tw-ring-color:rgba(220,38,38,.1)}.tw-ring-yellow-600\/20{--tw-ring-color:rgba(217,119,6,.2)}.\[a-f0-9\:\\\.\\-\]{a-f0-9:\.\-}.\[id\:\%d\]{id:%d}.hover\:tw-border-gray-800:hover{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.hover\:tw-bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:tw-bg-grey-lighter:hover{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.hover\:tw-no-underline:hover{text-decoration-line:none}.hover\:tw-opacity-80:hover{opacity:.8}@media (min-width:640px){.sm\:tw-p-6{padding:1.5rem}.sm\:tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:tw-pl-0{padding-left:0}}@media (min-width:768px){.md\:tw-mt-0{margin-top:0}.md\:tw-inline{display:inline}.md\:tw-table-cell{display:table-cell}.md\:tw-text-left{text-align:left}.md\:tw-text-right{text-align:right}}@media (min-width:1024px){.lg\:tw-inline-block{display:inline-block}.lg\:tw-inline{display:inline}.lg\:tw-table-cell{display:table-cell}} diff --git a/public/css/tailwind.css b/public/css/tailwind.css index 6cad4e442..ac2e8e7ac 100644 --- a/public/css/tailwind.css +++ b/public/css/tailwind.css @@ -1,1971 +1 @@ -/** - * This injects Tailwind's base styles, which is a combination of - * Normalize.css and some additional base styles. - * - * You can see the styles here: - * https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css - * - * If using `postcss-import`, use this import instead: - * - * @import "tailwindcss/preflight"; - */ -/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com - */ -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ -*, -::before, -::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: #e5e7eb; /* 2 */ -} -::before, -::after { - --tw-content: ''; -} -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ -html, -:host { - line-height: 1.5; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - -moz-tab-size: 4; /* 3 */ - -o-tab-size: 4; - tab-size: 4; /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ - font-feature-settings: normal; /* 5 */ - font-variation-settings: normal; /* 6 */ - -webkit-tap-highlight-color: transparent; /* 7 */ -} -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ -body { - margin: 0; /* 1 */ - line-height: inherit; /* 2 */ -} -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ - border-top-width: 1px; /* 3 */ -} -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} -/* -Remove the default font size and weight for headings. -*/ -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ -a { - color: inherit; - text-decoration: inherit; -} -/* -Add the correct font weight in Edge and Safari. -*/ -b, -strong { - font-weight: bolder; -} -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ - font-feature-settings: normal; /* 2 */ - font-variation-settings: normal; /* 3 */ - font-size: 1em; /* 4 */ -} -/* -Add the correct font size in all browsers. -*/ -small { - font-size: 80%; -} -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sub { - bottom: -0.25em; -} -sup { - top: -0.5em; -} -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ - border-collapse: collapse; /* 3 */ -} -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-feature-settings: inherit; /* 1 */ - font-variation-settings: inherit; /* 1 */ - font-size: 100%; /* 1 */ - font-weight: inherit; /* 1 */ - line-height: inherit; /* 1 */ - letter-spacing: inherit; /* 1 */ - color: inherit; /* 1 */ - margin: 0; /* 2 */ - padding: 0; /* 3 */ -} -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ -button, -select { - text-transform: none; -} -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - -webkit-appearance: button; /* 1 */ - background-color: transparent; /* 2 */ - background-image: none; /* 2 */ -} -/* -Use the modern Firefox focus style for all focusable elements. -*/ -:-moz-focusring { - outline: auto; -} -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ -:-moz-ui-invalid { - box-shadow: none; -} -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ -progress { - vertical-align: baseline; -} -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ -[type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} -/* -Add the correct display in Chrome and Safari. -*/ -summary { - display: list-item; -} -/* -Removes the default spacing and border for appropriate elements. -*/ -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} -fieldset { - margin: 0; - padding: 0; -} -legend { - padding: 0; -} -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} -/* -Reset default styling for dialogs. -*/ -dialog { - padding: 0; -} -/* -Prevent resizing textareas horizontally by default. -*/ -textarea { - resize: vertical; -} -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; /* 1 */ - color: #9ca3af; /* 2 */ -} -input::placeholder, -textarea::placeholder { - opacity: 1; /* 1 */ - color: #9ca3af; /* 2 */ -} -/* -Set the default cursor for buttons. -*/ -button, -[role="button"] { - cursor: pointer; -} -/* -Make sure disabled buttons don't get the pointer cursor. -*/ -:disabled { - cursor: default; -} -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; /* 1 */ - vertical-align: middle; /* 2 */ -} -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ -img, -video { - max-width: 100%; - height: auto; -} -/* Make elements with the HTML hidden attribute stay hidden by default */ -[hidden] { - display: none; -} -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} -/** - * This injects any component classes registered by plugins. - * - * If using `postcss-import`, use this import instead: - * - * @import "tailwindcss/components"; - */ -/** - * Here you would add any of your custom component classes; stuff that you'd - * want loaded *before* the utilities so that the utilities could still - * override them. - * - * Example: - * - * .btn { ... } - * .form-input { ... } - * - * Or if using a preprocessor or `postcss-import`: - * - * @import "components/buttons"; - * @import "components/forms"; - */ -/**************************************************************************************** - **** Reset headings to ~ Bootstrap4 defaults - ****************************************************************************************/ -h1 { - font-size: 2.4rem; - line-height: 1; - color: #1a202c; - font-weight: 300; - margin-bottom: 1rem; -} - -h2 { - font-size: 2rem; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -h3 { - font-size: 1.75rem; - margin-bottom: 0.5rem; - font-weight: 300; - line-height: 1.2; - color: #1a202c; -} - -h4 { - font-size: 1.5rem; - margin-bottom: 0.5rem; - font-weight: 300; - color: #1a202c; - line-height: 1; -} - -h5 { - font-size: 1.25rem; - margin-bottom: 0.5rem; - font-weight: 400; - line-height: 1.2; -} - -h6 { - font-size: 1rem; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -p { - margin-bottom: 1rem; -} - -li { - display: list-item; -} - -ol { - display: block; - list-style-type: decimal; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; - padding-left: 40px; -} - -ul { - display: block; - list-style-type: disc; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; - padding-left: 40px; -} - -dl { - display: block; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; -} - -dt { - display: block; -} - -code { - font-size: 0.9em; -} - -pre { - display: block; - font-family: monospace; - white-space: pre; - margin: 1em 0; - font-size: 0.9em; -} - -hr { - margin-bottom: 10px; -} - -/**************************************************************************************** - **** Reset anchors - ****************************************************************************************/ -a { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - -a:hover { - text-decoration-line: underline; -} - -.tw-border-t-1 { - border-top-width: 1px; -} - -.tw-border-b-1 { - border-bottom-width: 1px; -} - -.tw-border-1 { - border-width: 1px; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -/**************************************************************************************** - **** LHS Menu in IXP Manager - - -
- -
- - - ****************************************************************************************/ -#side-navbar { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - padding-right: 0px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -#side-navbar ul, #side-navbar ol { - list-style: none; - margin: 0; - padding: 0; -} - -#side-navbar h6 { - margin: 0px; - display: block; - border-right-width: 4px; - --tw-border-opacity: 1; - border-color: rgb(241 245 248 / var(--tw-border-opacity)); - padding: 1rem; - padding-left: 0.25rem; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -.nav-link { - display: block; - padding: 0.5rem; - padding-left: 0.75rem; - font-size: 0.875rem; - line-height: 1.25rem; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -.nav-link:hover { - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -#side-navbar li { - display: block; - border-right-width: 4px; - --tw-border-opacity: 1; - border-color: rgb(241 245 248 / var(--tw-border-opacity)); - padding: 0px; - font-weight: 500; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -#side-navbar li.active { - --tw-border-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); - font-weight: 700 !important; -} - -#side-navbar li:hover { - --tw-border-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -.nav-sub-menu-item { - margin-left: 2rem; -} - -.ixpm-table a { - --tw-text-opacity: 1; - color: rgb(39 121 189 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -.ixpm-table a:hover { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); - text-decoration-line: underline; -} - -/**************************************************************************************** - **** Buttons - ****************************************************************************************/ -.btn { - border-radius: 0.125rem; - border-color: transparent; - font-weight: 700; -} - -.btn:hover { - border-color: transparent; -} - -.btn-primary { - --tw-bg-opacity: 1; - background-color: rgb(59 130 246 / var(--tw-bg-opacity)); - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.btn-primary:hover { - --tw-bg-opacity: 1; - background-color: rgb(39 121 189 / var(--tw-bg-opacity)); -} - -.btn-success { - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.btn-success:hover { - --tw-bg-opacity: 1; - background-color: rgb(31 157 85 / var(--tw-bg-opacity)); -} - -.btn-secondary { - --tw-bg-opacity: 1; - background-color: rgb(135 149 161 / var(--tw-bg-opacity)); - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.btn-secondary:hover { - --tw-bg-opacity: 1; - background-color: rgb(96 111 123 / var(--tw-bg-opacity)); -} - -.btn-outline-secondary { - border-radius: 0.125rem; - --tw-border-opacity: 1; - border-color: rgb(184 194 204 / var(--tw-border-opacity)); - background-color: transparent; - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(184 194 204 / var(--tw-text-opacity)); - border-width: 1px; -} - -.btn-outline-secondary:hover { - --tw-bg-opacity: 1; - background-color: rgb(184 194 204 / var(--tw-bg-opacity)); -} - -.btn-white { - border-radius: 0.125rem; - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(61 72 82 / var(--tw-text-opacity)); - border-width: 1px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -.btn-white:hover { - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); - border-width: 1px; -} - -.btn-info { - border-radius: 0.125rem; - --tw-border-opacity: 1; - border-color: rgb(20 184 166 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(20 184 166 / var(--tw-text-opacity)); - border-width: 1px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -.btn-info:hover { - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); - border-width: 1px; -} - -/****************************************************************************************ea - **** Inputs - ****************************************************************************************/ -input.form-control { - width: 100%; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 0.125rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - line-height: 1.25; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); - border-width: 1px; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -input.form-control:focus { - line-height: 1.25; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.input-group-append .btn { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); - border-color: #ced4da; -} - -label.control-label, label.form-check-label { - display: block; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} - -/**************************************************************************************** - **** Badge - ****************************************************************************************/ -.badge { - border-radius: 9999px; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.75rem; - padding-right: 0.75rem; - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.badge-info { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} - -.badge-success { - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); -} - -.badge-secondary { - --tw-bg-opacity: 1; - background-color: rgb(184 194 204 / var(--tw-bg-opacity)); -} - -.badge-warning { - --tw-bg-opacity: 1; - background-color: rgb(251 146 60 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} - -/**************************************************************************************** - **** Card - ****************************************************************************************/ -.card { - border-color: #dae1e7; - border-radius: 0.125rem; - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow); -} - -.card .card-header { - border-top-left-radius: 0.125rem; - border-top-right-radius: 0.125rem; - border-bottom-width: 0px; -} - -a { - display: inline-block; - vertical-align: baseline; - font-weight: 700; - --tw-text-opacity: 1; - color: rgb(108 178 235 / var(--tw-text-opacity)); -} - -a:hover { - --tw-text-opacity: 1; - color: rgb(39 121 189 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -/**************************************************************************************** - **** table - ****************************************************************************************/ -.table-light td, .table-light thead th { - border-color: #ced4da; -} - -/**************************************************************************************** - **** Docstore - ****************************************************************************************/ -.docstore table { - width: 100%; - table-layout: auto; -} - -.docstore td { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - border-top-width: 1px; -} - -.docstore td.top { - border-top-width: 2px; - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.docstore td.meta { - display: none; - width: 0.25rem; - white-space: nowrap; -} - -@media (min-width: 1024px) { - .docstore td.meta { - display: table-cell; - width: 0.25rem; - white-space: nowrap; - } -} -.docstore td.icon { - margin-right: 1rem; - width: 0.25rem; - white-space: nowrap; - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - text-align: center; -} - -/** - * This injects all of Tailwind's utility classes, generated based on your - * config file. - * - * If using `postcss-import`, use this import instead: - * - * @import "tailwindcss/utilities"; - */ -.tw-collapse { - visibility: collapse; -} -.tw-absolute { - position: absolute; -} -.tw-relative { - position: relative; -} -.tw-inset-0 { - inset: 0px; -} -.tw-float-right { - float: right; -} -.tw-m-0 { - margin: 0px; -} -.tw-m-2 { - margin: 0.5rem; -} -.-tw-mx-4 { - margin-left: -1rem; - margin-right: -1rem; -} -.tw-mx-3 { - margin-left: 0.75rem; - margin-right: 0.75rem; -} -.tw-mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} -.tw-mx-auto { - margin-left: auto; - margin-right: auto; -} -.tw-my-0 { - margin-top: 0px; - margin-bottom: 0px; -} -.tw-my-1 { - margin-top: 0.25rem; - margin-bottom: 0.25rem; -} -.tw-my-10 { - margin-top: 2.5rem; - margin-bottom: 2.5rem; -} -.tw-my-12 { - margin-top: 3rem; - margin-bottom: 3rem; -} -.tw-my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} -.tw-my-6 { - margin-top: 1.5rem; - margin-bottom: 1.5rem; -} -.tw-my-8 { - margin-top: 2rem; - margin-bottom: 2rem; -} -.tw-mb-0 { - margin-bottom: 0px; -} -.tw-mb-16 { - margin-bottom: 4rem; -} -.tw-mb-2 { - margin-bottom: 0.5rem; -} -.tw-mb-6 { - margin-bottom: 1.5rem; -} -.tw-mb-8 { - margin-bottom: 2rem; -} -.tw-ml-12 { - margin-left: 3rem; -} -.tw-ml-2 { - margin-left: 0.5rem; -} -.tw-ml-4 { - margin-left: 1rem; -} -.tw-ml-6 { - margin-left: 1.5rem; -} -.tw-ml-8 { - margin-left: 2rem; -} -.tw-mr-2 { - margin-right: 0.5rem; -} -.tw-mr-3 { - margin-right: 0.75rem; -} -.tw-mr-4 { - margin-right: 1rem; -} -.tw-mr-6 { - margin-right: 1.5rem; -} -.tw-mt-1 { - margin-top: 0.25rem; -} -.tw-mt-16 { - margin-top: 4rem; -} -.tw-mt-2 { - margin-top: 0.5rem; -} -.tw-mt-4 { - margin-top: 1rem; -} -.tw-mt-6 { - margin-top: 1.5rem; -} -.tw-mt-8 { - margin-top: 2rem; -} -.tw-mt-3 { - margin-top: 0.75rem; -} -.tw-mr-1 { - margin-right: 0.25rem; -} -.tw-mb-1 { - margin-bottom: 0.25rem; -} -.tw-mb-4 { - margin-bottom: 1rem; -} -.tw-block { - display: block; -} -.tw-inline-block { - display: inline-block; -} -.tw-inline { - display: inline; -} -.tw-flex { - display: flex; -} -.tw-inline-flex { - display: inline-flex; -} -.tw-hidden { - display: none; -} -.tw-size-2\/3 { - width: 66.666667%; - height: 66.666667%; -} -.tw-h-24 { - height: 6rem; -} -.tw-h-5 { - height: 1.25rem; -} -.tw-h-8 { - height: 2rem; -} -.tw-h-7 { - height: 1.75rem; -} -.tw-h-6 { - height: 1.5rem; -} -.tw-h-4 { - height: 1rem; -} -.tw-w-10 { - width: 2.5rem; -} -.tw-w-20 { - width: 5rem; -} -.tw-w-6 { - width: 1.5rem; -} -.tw-w-auto { - width: auto; -} -.tw-w-full { - width: 100%; -} -.tw-w-7 { - width: 1.75rem; -} -.tw-w-5 { - width: 1.25rem; -} -.tw-w-4 { - width: 1rem; -} -.tw-min-w-full { - min-width: 100%; -} -.tw-min-w-24 { - min-width: 6rem; -} -.tw-min-w-20 { - min-width: 5rem; -} -.tw-min-w-16 { - min-width: 4rem; -} -.tw-min-w-96 { - min-width: 24rem; -} -.tw-max-w-lg { - max-width: 32rem; -} -.tw-max-w-md { - max-width: 28rem; -} -.tw-max-w-sm { - max-width: 24rem; -} -.tw-flex-1 { - flex: 1 1 0%; -} -.tw-cursor-pointer { - cursor: pointer; -} -.tw-list-none { - list-style-type: none; -} -.tw-flex-wrap { - flex-wrap: wrap; -} -.tw-items-center { - align-items: center; -} -.tw-justify-start { - justify-content: flex-start; -} -.tw-justify-center { - justify-content: center; -} -.tw-justify-between { - justify-content: space-between; -} -.tw-divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} -.tw-divide-gray-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-divide-opacity)); -} -.tw-divide-gray-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-divide-opacity)); -} -.tw-self-center { - align-self: center; -} -.tw-overflow-hidden { - overflow: hidden; -} -.tw-whitespace-nowrap { - white-space: nowrap; -} -.tw-rounded { - border-radius: 0.25rem; -} -.tw-rounded-full { - border-radius: 9999px; -} -.tw-rounded-lg { - border-radius: 0.5rem; -} -.tw-rounded-md { - border-radius: 0.375rem; -} -.tw-rounded-sm { - border-radius: 0.125rem; -} -.tw-border-2 { - border-width: 2px; -} -.tw-border-4 { - border-width: 4px; -} -.tw-border-b { - border-bottom-width: 1px; -} -.tw-border-b-2 { - border-bottom-width: 2px; -} -.tw-border-l-4 { - border-left-width: 4px; -} -.tw-border-r-4 { - border-right-width: 4px; -} -.tw-border-t { - border-top-width: 1px; -} -.tw-border-t-2 { - border-top-width: 2px; -} -.tw-border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} -.tw-border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity)); -} -.tw-border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} -.tw-border-gray-400 { - --tw-border-opacity: 1; - border-color: rgb(156 163 175 / var(--tw-border-opacity)); -} -.tw-border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); -} -.tw-border-gray-600 { - --tw-border-opacity: 1; - border-color: rgb(75 85 99 / var(--tw-border-opacity)); -} -.tw-border-green-500 { - --tw-border-opacity: 1; - border-color: rgb(16 185 129 / var(--tw-border-opacity)); -} -.tw-border-grey-light { - --tw-border-opacity: 1; - border-color: rgb(218 225 231 / var(--tw-border-opacity)); -} -.tw-border-grey-lighter { - --tw-border-opacity: 1; - border-color: rgb(241 245 248 / var(--tw-border-opacity)); -} -.tw-border-orange-500 { - --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); -} -.tw-border-red-500 { - --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); -} -.tw-border-red-lighter { - --tw-border-opacity: 1; - border-color: rgb(249 172 170 / var(--tw-border-opacity)); -} -.tw-border-gray-900 { - --tw-border-opacity: 1; - border-color: rgb(17 24 39 / var(--tw-border-opacity)); -} -.tw-border-gray-800 { - --tw-border-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-border-opacity)); -} -.tw-border-blue-800 { - --tw-border-opacity: 1; - border-color: rgb(30 64 175 / var(--tw-border-opacity)); -} -.tw-border-red-800 { - --tw-border-opacity: 1; - border-color: rgb(153 27 27 / var(--tw-border-opacity)); -} -.tw-border-amber-700 { - --tw-border-opacity: 1; - border-color: rgb(180 83 9 / var(--tw-border-opacity)); -} -.tw-border-lime-700 { - --tw-border-opacity: 1; - border-color: rgb(77 124 15 / var(--tw-border-opacity)); -} -.tw-border-red-700 { - --tw-border-opacity: 1; - border-color: rgb(185 28 28 / var(--tw-border-opacity)); -} -.tw-border-teal-700 { - --tw-border-opacity: 1; - border-color: rgb(15 118 110 / var(--tw-border-opacity)); -} -.tw-border-amber-600 { - --tw-border-opacity: 1; - border-color: rgb(217 119 6 / var(--tw-border-opacity)); -} -.tw-border-teal-400 { - --tw-border-opacity: 1; - border-color: rgb(45 212 191 / var(--tw-border-opacity)); -} -.tw-border-lime-500 { - --tw-border-opacity: 1; - border-color: rgb(132 204 22 / var(--tw-border-opacity)); -} -.tw-border-amber-400 { - --tw-border-opacity: 1; - border-color: rgb(251 191 36 / var(--tw-border-opacity)); -} -.tw-border-red-400 { - --tw-border-opacity: 1; - border-color: rgb(248 113 113 / var(--tw-border-opacity)); -} -.tw-border-red-600 { - --tw-border-opacity: 1; - border-color: rgb(220 38 38 / var(--tw-border-opacity)); -} -.tw-bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgb(219 234 254 / var(--tw-bg-opacity)); -} -.tw-bg-blue-50 { - --tw-bg-opacity: 1; - background-color: rgb(239 246 255 / var(--tw-bg-opacity)); -} -.tw-bg-blue-lightest { - --tw-bg-opacity: 1; - background-color: rgb(239 248 255 / var(--tw-bg-opacity)); -} -.tw-bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} -.tw-bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgb(229 231 235 / var(--tw-bg-opacity)); -} -.tw-bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.tw-bg-gray-500 { - --tw-bg-opacity: 1; - background-color: rgb(107 114 128 / var(--tw-bg-opacity)); -} -.tw-bg-green-100 { - --tw-bg-opacity: 1; - background-color: rgb(209 250 229 / var(--tw-bg-opacity)); -} -.tw-bg-green-50 { - --tw-bg-opacity: 1; - background-color: rgb(236 253 245 / var(--tw-bg-opacity)); -} -.tw-bg-grey-lighter { - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); -} -.tw-bg-orange-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 237 213 / var(--tw-bg-opacity)); -} -.tw-bg-pink-50 { - --tw-bg-opacity: 1; - background-color: rgb(253 242 248 / var(--tw-bg-opacity)); -} -.tw-bg-red-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} -.tw-bg-red-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity)); -} -.tw-bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} -.tw-bg-yellow-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 251 235 / var(--tw-bg-opacity)); -} -.tw-bg-amber-700 { - --tw-bg-opacity: 1; - background-color: rgb(180 83 9 / var(--tw-bg-opacity)); -} -.tw-bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgb(156 163 175 / var(--tw-bg-opacity)); -} -.tw-bg-lime-50 { - --tw-bg-opacity: 1; - background-color: rgb(247 254 231 / var(--tw-bg-opacity)); -} -.tw-bg-red-700 { - --tw-bg-opacity: 1; - background-color: rgb(185 28 28 / var(--tw-bg-opacity)); -} -.tw-bg-red-800 { - --tw-bg-opacity: 1; - background-color: rgb(153 27 27 / var(--tw-bg-opacity)); -} -.tw-bg-teal-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 250 / var(--tw-bg-opacity)); -} -.tw-bg-amber-600 { - --tw-bg-opacity: 1; - background-color: rgb(217 119 6 / var(--tw-bg-opacity)); -} -.tw-bg-teal-500 { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} -.tw-bg-lime-100 { - --tw-bg-opacity: 1; - background-color: rgb(236 252 203 / var(--tw-bg-opacity)); -} -.tw-bg-teal-400 { - --tw-bg-opacity: 1; - background-color: rgb(45 212 191 / var(--tw-bg-opacity)); -} -.tw-bg-gray-300 { - --tw-bg-opacity: 1; - background-color: rgb(209 213 219 / var(--tw-bg-opacity)); -} -.tw-bg-lime-500 { - --tw-bg-opacity: 1; - background-color: rgb(132 204 22 / var(--tw-bg-opacity)); -} -.tw-bg-amber-400 { - --tw-bg-opacity: 1; - background-color: rgb(251 191 36 / var(--tw-bg-opacity)); -} -.tw-bg-red-400 { - --tw-bg-opacity: 1; - background-color: rgb(248 113 113 / var(--tw-bg-opacity)); -} -.tw-bg-red-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); -} -.tw-p-0 { - padding: 0px; -} -.tw-p-1 { - padding: 0.25rem; -} -.tw-p-2 { - padding: 0.5rem; -} -.tw-p-4 { - padding: 1rem; -} -.tw-p-5 { - padding: 1.25rem; -} -.tw-p-6 { - padding: 1.5rem; -} -.tw-px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} -.tw-px-10 { - padding-left: 2.5rem; - padding-right: 2.5rem; -} -.tw-px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} -.tw-px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} -.tw-px-4 { - padding-left: 1rem; - padding-right: 1rem; -} -.tw-px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} -.tw-px-8 { - padding-left: 2rem; - padding-right: 2rem; -} -.tw-py-0 { - padding-top: 0px; - padding-bottom: 0px; -} -.tw-py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} -.tw-py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} -.tw-py-20 { - padding-top: 5rem; - padding-bottom: 5rem; -} -.tw-py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} -.tw-py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} -.tw-py-5 { - padding-top: 1.25rem; - padding-bottom: 1.25rem; -} -.tw-px-1\.5 { - padding-left: 0.375rem; - padding-right: 0.375rem; -} -.tw-py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} -.tw-pb-2 { - padding-bottom: 0.5rem; -} -.tw-pb-8 { - padding-bottom: 2rem; -} -.tw-pl-0 { - padding-left: 0px; -} -.tw-pl-16 { - padding-left: 4rem; -} -.tw-pl-2 { - padding-left: 0.5rem; -} -.tw-pl-4 { - padding-left: 1rem; -} -.tw-pr-4 { - padding-right: 1rem; -} -.tw-pt-0 { - padding-top: 0px; -} -.tw-pt-4 { - padding-top: 1rem; -} -.tw-pt-6 { - padding-top: 1.5rem; -} -.tw-pl-8 { - padding-left: 2rem; -} -.tw-pt-2 { - padding-top: 0.5rem; -} -.tw-pl-6 { - padding-left: 1.5rem; -} -.tw-text-center { - text-align: center; -} -.tw-text-right { - text-align: right; -} -.tw-align-middle { - vertical-align: middle; -} -.tw-font-mono { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} -.tw-text-base { - font-size: 1rem; - line-height: 1.5rem; -} -.tw-text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} -.tw-text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} -.tw-text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} -.tw-text-xs { - font-size: 0.75rem; - line-height: 1rem; -} -.tw-font-bold { - font-weight: 700; -} -.tw-font-medium { - font-weight: 500; -} -.tw-font-normal { - font-weight: 400; -} -.tw-font-semibold { - font-weight: 600; -} -.tw-uppercase { - text-transform: uppercase; -} -.tw-italic { - font-style: italic; -} -.tw-leading-6 { - line-height: 1.5rem; -} -.tw-leading-tight { - line-height: 1.25; -} -.tw-leading-7 { - line-height: 1.75rem; -} -.tw-leading-8 { - line-height: 2rem; -} -.tw-leading-5 { - line-height: 1.25rem; -} -.tw-leading-4 { - line-height: 1rem; -} -.tw-leading-3 { - line-height: .75rem; -} -.tw-text-black { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} -.tw-text-blue-600 { - --tw-text-opacity: 1; - color: rgb(37 99 235 / var(--tw-text-opacity)); -} -.tw-text-blue-700 { - --tw-text-opacity: 1; - color: rgb(29 78 216 / var(--tw-text-opacity)); -} -.tw-text-blue-dark { - --tw-text-opacity: 1; - color: rgb(39 121 189 / var(--tw-text-opacity)); -} -.tw-text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} -.tw-text-gray-600 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)); -} -.tw-text-gray-700 { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); -} -.tw-text-gray-800 { - --tw-text-opacity: 1; - color: rgb(31 41 55 / var(--tw-text-opacity)); -} -.tw-text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} -.tw-text-green-500 { - --tw-text-opacity: 1; - color: rgb(16 185 129 / var(--tw-text-opacity)); -} -.tw-text-green-600 { - --tw-text-opacity: 1; - color: rgb(5 150 105 / var(--tw-text-opacity)); -} -.tw-text-green-700 { - --tw-text-opacity: 1; - color: rgb(4 120 87 / var(--tw-text-opacity)); -} -.tw-text-green-dark { - --tw-text-opacity: 1; - color: rgb(31 157 85 / var(--tw-text-opacity)); -} -.tw-text-grey-dark { - --tw-text-opacity: 1; - color: rgb(135 149 161 / var(--tw-text-opacity)); -} -.tw-text-grey-darker { - --tw-text-opacity: 1; - color: rgb(96 111 123 / var(--tw-text-opacity)); -} -.tw-text-grey-darkest { - --tw-text-opacity: 1; - color: rgb(61 72 82 / var(--tw-text-opacity)); -} -.tw-text-orange-500 { - --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); -} -.tw-text-orange-700 { - --tw-text-opacity: 1; - color: rgb(194 65 12 / var(--tw-text-opacity)); -} -.tw-text-pink-700 { - --tw-text-opacity: 1; - color: rgb(190 24 93 / var(--tw-text-opacity)); -} -.tw-text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} -.tw-text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} -.tw-text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} -.tw-text-red-lighter { - --tw-text-opacity: 1; - color: rgb(249 172 170 / var(--tw-text-opacity)); -} -.tw-line-through { - text-decoration-line: line-through; -} -.tw-opacity-40 { - opacity: 0.4; -} -.tw-shadow-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-shadow-md { - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.tw-ring-1 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} -.tw-ring-inset { - --tw-ring-inset: inset; -} -.tw-ring-blue-700\/10 { - --tw-ring-color: rgb(29 78 216 / 0.1); -} -.tw-ring-gray-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} -.tw-ring-gray-500\/10 { - --tw-ring-color: rgb(107 114 128 / 0.1); -} -.tw-ring-gray-800\/10 { - --tw-ring-color: rgb(31 41 55 / 0.1); -} -.tw-ring-green-600\/20 { - --tw-ring-color: rgb(5 150 105 / 0.2); -} -.tw-ring-pink-700\/10 { - --tw-ring-color: rgb(190 24 93 / 0.1); -} -.tw-ring-red-600\/10 { - --tw-ring-color: rgb(220 38 38 / 0.1); -} -.tw-ring-yellow-600\/20 { - --tw-ring-color: rgb(217 119 6 / 0.2); -} -.\[a-f0-9\:\\\.\\-\] { - a-f0-9: \.\-; -} -.\[id\:\%d\] { - id: %d; -} -/** - * Here you would add any custom utilities you need that don't come out of the - * box with Tailwind. - * - * Example : - * - * .bg-pattern-graph-paper { ... } - * .skew-45 { ... } - * - * Or if using a preprocessor or `postcss-import`: - * - * @import "utilities/background-patterns"; - * @import "utilities/skew-transforms"; - */ -.hover\:tw-border-gray-800:hover { - --tw-border-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-border-opacity)); -} -.hover\:tw-bg-gray-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.hover\:tw-bg-grey-lighter:hover { - --tw-bg-opacity: 1; - background-color: rgb(241 245 248 / var(--tw-bg-opacity)); -} -.hover\:tw-no-underline:hover { - text-decoration-line: none; -} -.hover\:tw-opacity-80:hover { - opacity: 0.8; -} -@media (min-width: 640px) { - .sm\:-tw-mx-0 { - margin-left: -0px; - margin-right: -0px; - } - .sm\:tw-flex { - display: flex; - } - .sm\:tw-flex-auto { - flex: 1 1 auto; - } - .sm\:tw-items-center { - align-items: center; - } - .sm\:tw-p-6 { - padding: 1.5rem; - } - .sm\:tw-px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - .sm\:tw-pl-0 { - padding-left: 0px; - } -} -@media (min-width: 768px) { - .md\:tw-mt-0 { - margin-top: 0px; - } - .md\:tw-inline { - display: inline; - } - .md\:tw-table-cell { - display: table-cell; - } - .md\:tw-text-left { - text-align: left; - } - .md\:tw-text-right { - text-align: right; - } -} -@media (min-width: 1024px) { - .lg\:tw-inline-block { - display: inline-block; - } - .lg\:tw-inline { - display: inline; - } - .lg\:tw-table-cell { - display: table-cell; - } - .lg\:tw-px-8 { - padding-left: 2rem; - padding-right: 2rem; - } -} +/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }h1{color:#1a202c;font-size:2.4rem;font-weight:300;line-height:1;margin-bottom:1rem}h2{font-size:2rem;font-weight:500;line-height:1.2;margin-bottom:.5rem}h3{font-size:1.75rem;line-height:1.2}h3,h4{color:#1a202c;font-weight:300;margin-bottom:.5rem}h4{font-size:1.5rem;line-height:1}h5{font-size:1.25rem;font-weight:400}h5,h6{line-height:1.2;margin-bottom:.5rem}h6{font-size:1rem;font-weight:500}p{margin-bottom:1rem}li{display:list-item}ol{list-style-type:decimal}ol,ul{display:block;margin:1em 0;padding-left:40px}ul{list-style-type:disc}dl{margin:1em 0}dl,dt{display:block}code,pre{font-size:.9em}pre{display:block;font-family:monospace;margin:1em 0;white-space:pre}hr{margin-bottom:10px}a{color:rgb(59 130 246/var(--tw-text-opacity))}a:hover{text-decoration-line:underline}.tw-border-t-1{border-top-width:1px}.tw-border-b-1{border-bottom-width:1px}.tw-border-1{border-width:1px}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}#side-navbar{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);background-color:rgb(255 255 255/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);padding-right:0}#side-navbar ol,#side-navbar ul{list-style:none;margin:0;padding:0}#side-navbar h6{--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));border-right-width:4px;margin:0;padding:1rem 1rem 1rem .25rem}#side-navbar h6,.nav-link{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity));display:block}.nav-link{font-size:.875rem;line-height:1.25rem;padding:.5rem .5rem .5rem .75rem;text-decoration-line:none}.nav-link:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}#side-navbar li{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity));border-right-width:4px;color:rgb(96 111 123/var(--tw-text-opacity));display:block;font-weight:500;padding:0}#side-navbar li.active{font-weight:700!important}#side-navbar li.active,#side-navbar li:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity));border-color:rgb(5 150 105/var(--tw-border-opacity))}#side-navbar li:hover{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.nav-sub-menu-item{margin-left:2rem}.ixpm-table a{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity));text-decoration-line:none}.ixpm-table a:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity));text-decoration-line:underline}.btn{border-radius:.125rem;font-weight:700}.btn,.btn:hover{border-color:transparent}.btn-primary{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(39 121 189/var(--tw-bg-opacity))}.btn-success{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700}.btn-success:hover{--tw-bg-opacity:1;background-color:rgb(31 157 85/var(--tw-bg-opacity))}.btn-secondary{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(135 149 161/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700}.btn-secondary:hover{--tw-bg-opacity:1;background-color:rgb(96 111 123/var(--tw-bg-opacity))}.btn-outline-secondary{--tw-border-opacity:1;--tw-text-opacity:1;background-color:transparent;border-color:rgb(184 194 204/var(--tw-border-opacity));border-radius:.125rem;border-width:1px;color:rgb(184 194 204/var(--tw-text-opacity));font-weight:600}.btn-outline-secondary:hover{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.btn-white{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);color:rgb(61 72 82/var(--tw-text-opacity));font-weight:600}.btn-white,.btn-white:hover{border-color:rgb(218 225 231/var(--tw-border-opacity));border-width:1px}.btn-white:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.btn-info{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(20 184 166/var(--tw-border-opacity));border-radius:.125rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);color:rgb(20 184 166/var(--tw-text-opacity));font-weight:600}.btn-info:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity));border-color:rgb(218 225 231/var(--tw-border-opacity));border-width:1px}input.form-control{--tw-text-opacity:1;--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.125rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);padding:.5rem 1rem;width:100%}input.form-control,input.form-control:focus{color:rgb(96 111 123/var(--tw-text-opacity));line-height:1.25}input.form-control:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.input-group-append .btn{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-color:#ced4da;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}label.control-label,label.form-check-label{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity));display:block;font-size:.875rem;font-weight:700;line-height:1.25rem}.badge{--tw-text-opacity:1;border-radius:9999px;color:rgb(255 255 255/var(--tw-text-opacity));font-weight:700;padding:.25rem .75rem}.badge-info{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.badge-success{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.badge-secondary{--tw-bg-opacity:1;background-color:rgb(184 194 204/var(--tw-bg-opacity))}.badge-warning{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity));color:rgb(0 0 0/var(--tw-text-opacity))}.card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-color:#dae1e7;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.card .card-header{border-bottom-width:0;border-top-left-radius:.125rem;border-top-right-radius:.125rem}a{color:rgb(108 178 235/var(--tw-text-opacity));display:inline-block;font-weight:700;vertical-align:baseline}a,a:hover{--tw-text-opacity:1}a:hover{color:rgb(39 121 189/var(--tw-text-opacity));text-decoration-line:none}.table-light td,.table-light thead th{border-color:#ced4da}.docstore table{table-layout:auto;width:100%}.docstore td{border-color:rgb(209 213 219/var(--tw-border-opacity));border-top-width:1px}.docstore td,.docstore td.top{--tw-border-opacity:1;padding:.5rem}.docstore td.top{border-color:rgb(209 213 219/var(--tw-border-opacity));border-top-width:2px}.docstore td.meta{display:none;white-space:nowrap;width:.25rem}@media (min-width:1024px){.docstore td.meta{display:table-cell;white-space:nowrap;width:.25rem}}.docstore td.icon{margin-right:1rem;padding:.5rem;text-align:center;white-space:nowrap;width:.25rem}.tw-collapse{visibility:collapse}.tw-absolute{position:absolute}.tw-relative{position:relative}.tw-inset-0{inset:0}.tw-float-right{float:right}.tw-m-0{margin:0}.tw-m-2{margin:.5rem}.tw-mx-3{margin-left:.75rem;margin-right:.75rem}.tw-mx-4{margin-left:1rem;margin-right:1rem}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-my-0{margin-bottom:0;margin-top:0}.tw-my-1{margin-bottom:.25rem;margin-top:.25rem}.tw-my-10{margin-bottom:2.5rem;margin-top:2.5rem}.tw-my-12{margin-bottom:3rem;margin-top:3rem}.tw-my-4{margin-bottom:1rem;margin-top:1rem}.tw-my-6{margin-bottom:1.5rem;margin-top:1.5rem}.tw-my-8{margin-bottom:2rem;margin-top:2rem}.tw-mb-0{margin-bottom:0}.tw-mb-16{margin-bottom:4rem}.tw-mb-2{margin-bottom:.5rem}.tw-mb-6{margin-bottom:1.5rem}.tw-mb-8{margin-bottom:2rem}.tw-ml-12{margin-left:3rem}.tw-ml-2{margin-left:.5rem}.tw-ml-4{margin-left:1rem}.tw-ml-6{margin-left:1.5rem}.tw-ml-8{margin-left:2rem}.tw-mr-1{margin-right:.25rem}.tw-mr-2{margin-right:.5rem}.tw-mr-3{margin-right:.75rem}.tw-mr-4{margin-right:1rem}.tw-mr-6{margin-right:1.5rem}.tw-mt-1{margin-top:.25rem}.tw-mt-16{margin-top:4rem}.tw-mt-2{margin-top:.5rem}.tw-mt-3{margin-top:.75rem}.tw-mt-4{margin-top:1rem}.tw-mt-6{margin-top:1.5rem}.tw-mt-8{margin-top:2rem}.tw-block{display:block}.tw-inline-block{display:inline-block}.tw-inline{display:inline}.tw-flex{display:flex}.tw-inline-flex{display:inline-flex}.tw-hidden{display:none}.tw-h-24{height:6rem}.tw-h-4{height:1rem}.tw-h-5{height:1.25rem}.tw-h-6{height:1.5rem}.tw-h-7{height:1.75rem}.tw-h-8{height:2rem}.tw-w-10{width:2.5rem}.tw-w-20{width:5rem}.tw-w-4{width:1rem}.tw-w-5{width:1.25rem}.tw-w-6{width:1.5rem}.tw-w-auto{width:auto}.tw-w-full{width:100%}.tw-min-w-16{min-width:4rem}.tw-min-w-full{min-width:100%}.tw-max-w-lg{max-width:32rem}.tw-max-w-md{max-width:28rem}.tw-max-w-sm{max-width:24rem}.tw-flex-1{flex:1 1 0%}.tw-cursor-pointer{cursor:pointer}.tw-list-none{list-style-type:none}.tw-flex-wrap{flex-wrap:wrap}.tw-items-center{align-items:center}.tw-justify-start{justify-content:flex-start}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.tw-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.tw-divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(209 213 219/var(--tw-divide-opacity))}.tw-self-center{align-self:center}.tw-overflow-hidden{overflow:hidden}.tw-whitespace-nowrap{white-space:nowrap}.tw-rounded{border-radius:.25rem}.tw-rounded-full{border-radius:9999px}.tw-rounded-lg{border-radius:.5rem}.tw-rounded-md{border-radius:.375rem}.tw-rounded-sm{border-radius:.125rem}.tw-border-2{border-width:2px}.tw-border-b{border-bottom-width:1px}.tw-border-b-2{border-bottom-width:2px}.tw-border-l-4{border-left-width:4px}.tw-border-r-4{border-right-width:4px}.tw-border-t{border-top-width:1px}.tw-border-t-2{border-top-width:2px}.tw-border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.tw-border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.tw-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.tw-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.tw-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.tw-border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.tw-border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.tw-border-green-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.tw-border-grey-light{--tw-border-opacity:1;border-color:rgb(218 225 231/var(--tw-border-opacity))}.tw-border-grey-lighter{--tw-border-opacity:1;border-color:rgb(241 245 248/var(--tw-border-opacity))}.tw-border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.tw-border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.tw-border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.tw-border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.tw-border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.tw-border-red-lighter{--tw-border-opacity:1;border-color:rgb(249 172 170/var(--tw-border-opacity))}.tw-border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.tw-bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.tw-bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.tw-bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.tw-bg-blue-lightest{--tw-bg-opacity:1;background-color:rgb(239 248 255/var(--tw-bg-opacity))}.tw-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.tw-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.tw-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.tw-bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.tw-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.tw-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.tw-bg-green-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.tw-bg-green-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.tw-bg-grey-lighter{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.tw-bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.tw-bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.tw-bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.tw-bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.tw-bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.tw-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.tw-bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.tw-bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.tw-bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.tw-p-0{padding:0}.tw-p-1{padding:.25rem}.tw-p-2{padding:.5rem}.tw-p-4{padding:1rem}.tw-p-5{padding:1.25rem}.tw-p-6{padding:1.5rem}.tw-px-1{padding-left:.25rem;padding-right:.25rem}.tw-px-1\.5{padding-left:.375rem;padding-right:.375rem}.tw-px-10{padding-left:2.5rem;padding-right:2.5rem}.tw-px-2{padding-left:.5rem;padding-right:.5rem}.tw-px-3{padding-left:.75rem;padding-right:.75rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.tw-px-8{padding-left:2rem;padding-right:2rem}.tw-py-0{padding-bottom:0;padding-top:0}.tw-py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.tw-py-1{padding-bottom:.25rem;padding-top:.25rem}.tw-py-2{padding-bottom:.5rem;padding-top:.5rem}.tw-py-20{padding-bottom:5rem;padding-top:5rem}.tw-py-4{padding-bottom:1rem;padding-top:1rem}.tw-py-5{padding-bottom:1.25rem;padding-top:1.25rem}.tw-py-6{padding-bottom:1.5rem;padding-top:1.5rem}.tw-pb-2{padding-bottom:.5rem}.tw-pb-8{padding-bottom:2rem}.tw-pl-0{padding-left:0}.tw-pl-16{padding-left:4rem}.tw-pl-2{padding-left:.5rem}.tw-pl-4{padding-left:1rem}.tw-pr-4{padding-right:1rem}.tw-pt-0{padding-top:0}.tw-pt-4{padding-top:1rem}.tw-pt-6{padding-top:1.5rem}.tw-text-center{text-align:center}.tw-text-right{text-align:right}.tw-align-middle{vertical-align:middle}.tw-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.tw-text-base{font-size:1rem;line-height:1.5rem}.tw-text-lg{font-size:1.125rem;line-height:1.75rem}.tw-text-sm{font-size:.875rem;line-height:1.25rem}.tw-text-xl{font-size:1.25rem;line-height:1.75rem}.tw-text-xs{font-size:.75rem;line-height:1rem}.tw-font-bold{font-weight:700}.tw-font-medium{font-weight:500}.tw-font-normal{font-weight:400}.tw-font-semibold{font-weight:600}.tw-uppercase{text-transform:uppercase}.tw-italic{font-style:italic}.tw-slashed-zero{--tw-slashed-zero:slashed-zero}.tw-lining-nums,.tw-slashed-zero{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tw-lining-nums{--tw-numeric-figure:lining-nums}.tw-tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tw-leading-3{line-height:.75rem}.tw-leading-5{line-height:1.25rem}.tw-leading-6{line-height:1.5rem}.tw-leading-7{line-height:1.75rem}.tw-leading-8{line-height:2rem}.tw-leading-tight{line-height:1.25}.tw-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.tw-text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.tw-text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.tw-text-blue-dark{--tw-text-opacity:1;color:rgb(39 121 189/var(--tw-text-opacity))}.tw-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.tw-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.tw-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.tw-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.tw-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.tw-text-green-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.tw-text-green-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.tw-text-green-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.tw-text-green-dark{--tw-text-opacity:1;color:rgb(31 157 85/var(--tw-text-opacity))}.tw-text-grey-dark{--tw-text-opacity:1;color:rgb(135 149 161/var(--tw-text-opacity))}.tw-text-grey-darker{--tw-text-opacity:1;color:rgb(96 111 123/var(--tw-text-opacity))}.tw-text-grey-darkest{--tw-text-opacity:1;color:rgb(61 72 82/var(--tw-text-opacity))}.tw-text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.tw-text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.tw-text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.tw-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.tw-text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.tw-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.tw-text-red-lighter{--tw-text-opacity:1;color:rgb(249 172 170/var(--tw-text-opacity))}.tw-line-through{text-decoration-line:line-through}.tw-opacity-40{opacity:.4}.tw-shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.tw-shadow,.tw-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tw-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.tw-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.tw-shadow-md,.tw-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tw-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.tw-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.tw-ring-inset{--tw-ring-inset:inset}.tw-ring-blue-700\/10{--tw-ring-color:rgba(29,78,216,.1)}.tw-ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.tw-ring-gray-500\/10{--tw-ring-color:hsla(220,9%,46%,.1)}.tw-ring-gray-800\/10{--tw-ring-color:rgba(31,41,55,.1)}.tw-ring-green-600\/20{--tw-ring-color:rgba(5,150,105,.2)}.tw-ring-pink-700\/10{--tw-ring-color:rgba(190,24,93,.1)}.tw-ring-red-600\/10{--tw-ring-color:rgba(220,38,38,.1)}.tw-ring-yellow-600\/20{--tw-ring-color:rgba(217,119,6,.2)}.\[a-f0-9\:\\\.\\-\]{a-f0-9:\.\-}.\[id\:\%d\]{id:%d}.hover\:tw-border-gray-800:hover{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.hover\:tw-bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:tw-bg-grey-lighter:hover{--tw-bg-opacity:1;background-color:rgb(241 245 248/var(--tw-bg-opacity))}.hover\:tw-no-underline:hover{text-decoration-line:none}.hover\:tw-opacity-80:hover{opacity:.8}@media (min-width:640px){.sm\:tw-p-6{padding:1.5rem}.sm\:tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:tw-pl-0{padding-left:0}}@media (min-width:768px){.md\:tw-mt-0{margin-top:0}.md\:tw-inline{display:inline}.md\:tw-table-cell{display:table-cell}.md\:tw-text-left{text-align:left}.md\:tw-text-right{text-align:right}}@media (min-width:1024px){.lg\:tw-inline-block{display:inline-block}.lg\:tw-inline{display:inline}.lg\:tw-table-cell{display:table-cell}} diff --git a/public/js/ixp-pack.js b/public/js/ixp-pack.js index 1788527ee..d20434f90 100644 --- a/public/js/ixp-pack.js +++ b/public/js/ixp-pack.js @@ -23,7 +23,7 @@ * @license: MIT http://bootboxjs.com/license.txt */ !function(t,e){'use strict';'function'==typeof define&&define.amd?define(['jquery'],e):'object'==typeof exports?module.exports=e(require('jquery')):t.bootbox=e(t.jQuery)}(this,function e(s,c){'use strict';let r={};r.VERSION='6.0.0';let l={en:{OK:'OK',CANCEL:'Cancel',CONFIRM:'OK'}},u={dialog:'',header:'',footer:'',closeButton:'',form:'
',button:'',option:'',promptMessage:'
',inputs:{text:'',textarea:'',email:'',select:'',checkbox:'
',radio:'
',date:'',time:'',number:'',password:'',range:''}},p={locale:'en',backdrop:'static',animate:!0,className:null,closeButton:!0,show:!0,container:'body',value:'',inputType:'text',errorMessage:null,swapButtonOrder:!1,centerVertical:!1,multiple:!1,scrollable:!1,reusable:!1,relatedTarget:null,size:null,id:null};function i(t,e,o){return s.extend(!0,{},t,function(t,e){var o=t.length;let a={};if(o<1||2').attr('label',e.group)),o=r[e.group]);let a=s(u.option);a.attr('value',e.value).text(e.text),o.append(a)}),f(r,function(t,e){i.append(e)}),i.val(n.value),n.bootstrap<5&&i.removeClass('form-select').addClass('form-control');break;case'checkbox':let e=s.isArray(n.value)?n.value:[n.value];if(!(l=n.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "checkbox" requires at least one option');i=s('
'),f(l,function(t,o){if(o.value===c||o.text===c)throw new Error('each option needs a "value" property and a "text" property');let a=s(u.inputs[n.inputType]);a.find('input').attr('value',o.value),a.find('label').append('\n'+o.text),f(e,function(t,e){e===o.value&&a.find('input').prop('checked',!0)}),i.append(a)});break;case'radio':if(n.value!==c&&s.isArray(n.value))throw new Error('prompt with "inputType" set to "radio" requires a single, non-array value for "value"');if(!(l=n.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "radio" requires at least one option');i=s('
');let a=!0;f(l,function(t,e){if(e.value===c||e.text===c)throw new Error('each option needs a "value" property and a "text" property');let o=s(u.inputs[n.inputType]);o.find('input').attr('value',e.value),o.find('label').append('\n'+e.text),n.value!==c&&e.value===n.value&&(o.find('input').prop('checked',!0),a=!1),i.append(o)}),a&&i.find('input[type="radio"]').first().prop('checked',!0)}return t.append(i),t.on('submit',function(t){t.preventDefault(),t.stopPropagation(),e.find('.bootbox-accept').trigger('click')}),''!==s.trim(n.message)&&(a=s(u.promptMessage).html(n.message),t.prepend(a)),n.message=t,(e=r.dialog(n)).off('shown.bs.modal',m),e.on('shown.bs.modal',function(){i.focus()}),!0===o&&e.modal('show'),e},r}); -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e){var r,n;function o(r,n){try{var a=e[r](n),s=a.value,u=s instanceof t;Promise.resolve(u?s.v:s).then((function(t){if(u){var n="return"===r?"return":"next";if(!s.k||t.done)return o(n,t);t=e[n](t).value}i(a.done?"return":"normal",t)}),(function(e){o("throw",e)}))}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":r.resolve({value:t,done:!0});break;case"throw":r.reject(t);break;default:r.resolve({value:t,done:!1})}(r=r.next)?o(r.key,r.arg):n=null}this._invoke=function(e,t){return new Promise((function(i,a){var s={key:e,arg:t,resolve:i,reject:a,next:null};n?n=n.next=s:(r=n=s,o(e,t))}))},"function"!=typeof e.return&&(this.return=void 0)}function t(e,t){this.v=e,this.k=t}function r(e){var r={},n=!1;function o(r,o){return n=!0,o=new Promise((function(t){t(e[r](o))})),{done:!1,value:new t(o,1)}}return r["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},r.next=function(e){return n?(n=!1,e):o("next",e)},"function"==typeof e.throw&&(r.throw=function(e){if(n)throw n=!1,e;return o("throw",e)}),"function"==typeof e.return&&(r.return=function(e){return n?(n=!1,e):o("return",e)}),r}function n(e){var t,r,n,i=2;for("undefined"!=typeof Symbol&&(r=Symbol.asyncIterator,n=Symbol.iterator);i--;){if(r&&null!=(t=e[r]))return t.call(e);if(n&&null!=(t=e[n]))return new o(t.call(e));r="@@asyncIterator",n="@@iterator"}throw new TypeError("Object is not async iterable")}function o(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return o=function(e){this.s=e,this.n=e.next},o.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var r=this.s.return;return void 0===r?Promise.resolve({value:e,done:!0}):t(r.apply(this.s,arguments))},throw:function(e){var r=this.s.return;return void 0===r?Promise.reject(e):t(r.apply(this.s,arguments))}},new o(e)}function i(e){return new t(e,0)}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),A(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;A(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:L(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function l(e,t,r,n,o,i,a){try{var s=e[i](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,o)}function h(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){l(i,n,o,a,s,"next",e)}function s(e){l(i,n,o,a,s,"throw",e)}a(void 0)}))}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r2&&void 0!==arguments[2]?arguments[2]:{},i=o.allOwnKeys,a=void 0!==i&&i;if(null!=e)if("object"!==f(e)&&(e=[e]),L(e))for(r=0,n=e.length;r0;)if(t===(r=n[o]).toLowerCase())return r;return null}var Y="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Q=function(e){return!N(e)&&e!==Y};var Z,ee=(Z="undefined"!=typeof Uint8Array&&k(Uint8Array),function(e){return Z&&e instanceof Z}),te=A("HTMLFormElement"),re=function(e){var t=Object.prototype.hasOwnProperty;return function(e,r){return t.call(e,r)}}(),ne=A("RegExp"),oe=function(e,t){var r=Object.getOwnPropertyDescriptors(e),n={};X(r,(function(r,o){var i;!1!==(i=t(r,o,e))&&(n[o]=i||r)})),Object.defineProperties(e,n)},ie="abcdefghijklmnopqrstuvwxyz",ae="0123456789",se={DIGIT:ae,ALPHA:ie,ALPHA_DIGIT:ie+ie.toUpperCase()+ae};var ue,ce,fe,le,he=A("AsyncFunction"),pe=(ue="function"==typeof setImmediate,ce=F(Y.postMessage),ue?setImmediate:ce?(fe="axios@".concat(Math.random()),le=[],Y.addEventListener("message",(function(e){var t=e.source,r=e.data;t===Y&&r===fe&&le.length&&le.shift()()}),!1),function(e){le.push(e),Y.postMessage(fe,"*")}):function(e){return setTimeout(e)}),de="undefined"!=typeof queueMicrotask?queueMicrotask.bind(Y):"undefined"!=typeof process&&process.nextTick||pe,ve={isArray:L,isArrayBuffer:_,isBuffer:function(e){return null!==e&&!N(e)&&null!==e.constructor&&!N(e.constructor)&&F(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:function(e){var t;return e&&("function"==typeof FormData&&e instanceof FormData||F(e.append)&&("formdata"===(t=j(e))||"object"===t&&F(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&_(e.buffer)},isString:C,isNumber:U,isBoolean:function(e){return!0===e||!1===e},isObject:B,isPlainObject:D,isReadableStream:W,isRequest:G,isResponse:K,isHeaders:V,isUndefined:N,isDate:I,isFile:q,isBlob:M,isRegExp:ne,isFunction:F,isStream:function(e){return B(e)&&F(e.pipe)},isURLSearchParams:H,isTypedArray:ee,isFileList:z,forEach:X,merge:function e(){for(var t=Q(this)&&this||{},r=t.caseless,n={},o=function(t,o){var i=r&&$(n,o)||o;D(n[i])&&D(t)?n[i]=e(n[i],t):D(t)?n[i]=e({},t):L(t)?n[i]=t.slice():n[i]=t},i=0,a=arguments.length;i3&&void 0!==arguments[3]?arguments[3]:{},o=n.allOwnKeys;return X(t,(function(t,n){r&&F(t)?e[n]=x(t,r):e[n]=t}),{allOwnKeys:o}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,r,n){e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},toFlatObject:function(e,t,r,n){var o,i,a,s={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],n&&!n(a,e,t)||s[a]||(t[a]=e[a],s[a]=!0);e=!1!==r&&k(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:j,kindOfTest:A,endsWith:function(e,t,r){e=String(e),(void 0===r||r>e.length)&&(r=e.length),r-=t.length;var n=e.indexOf(t,r);return-1!==n&&n===r},toArray:function(e){if(!e)return null;if(L(e))return e;var t=e.length;if(!U(t))return null;for(var r=new Array(t);t-- >0;)r[t]=e[t];return r},forEachEntry:function(e,t){for(var r,n=(e&&e[Symbol.iterator]).call(e);(r=n.next())&&!r.done;){var o=r.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var r,n=[];null!==(r=e.exec(t));)n.push(r);return n},isHTMLForm:te,hasOwnProperty:re,hasOwnProp:re,reduceDescriptors:oe,freezeMethods:function(e){oe(e,(function(t,r){if(F(e)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;var n=e[r];F(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+r+"'")}))}))},toObjectSet:function(e,t){var r={},n=function(e){e.forEach((function(e){r[e]=!0}))};return L(e)?n(e):n(String(e).split(t)),r},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:$,global:Y,isContextDefined:Q,ALPHABET:se,generateString:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:16,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:se.ALPHA_DIGIT,r="",n=t.length;e--;)r+=t[Math.random()*n|0];return r},isSpecCompliantForm:function(e){return!!(e&&F(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:function(e){var t=new Array(10);return function e(r,n){if(B(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[n]=r;var o=L(r)?[]:{};return X(r,(function(t,r){var i=e(t,n+1);!N(i)&&(o[r]=i)})),t[n]=void 0,o}}return r}(e,0)},isAsyncFn:he,isThenable:function(e){return e&&(B(e)||F(e))&&F(e.then)&&F(e.catch)},setImmediate:pe,asap:de};function ye(e,t,r,n,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),o&&(this.response=o)}ve.inherits(ye,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:ve.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var me=ye.prototype,be={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){be[e]={value:e}})),Object.defineProperties(ye,be),Object.defineProperty(me,"isAxiosError",{value:!0}),ye.from=function(e,t,r,n,o,i){var a=Object.create(me);return ve.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),ye.call(a,e.message,t,r,n,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};function ge(e){return ve.isPlainObject(e)||ve.isArray(e)}function we(e){return ve.endsWith(e,"[]")?e.slice(0,-2):e}function Ee(e,t,r){return e?e.concat(t).map((function(e,t){return e=we(e),!r&&t?"["+e+"]":e})).join(r?".":""):t}var Oe=ve.toFlatObject(ve,{},null,(function(e){return/^is[A-Z]/.test(e)}));function Se(e,t,r){if(!ve.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var n=(r=ve.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!ve.isUndefined(t[e])}))).metaTokens,o=r.visitor||c,i=r.dots,a=r.indexes,s=(r.Blob||"undefined"!=typeof Blob&&Blob)&&ve.isSpecCompliantForm(t);if(!ve.isFunction(o))throw new TypeError("visitor must be a function");function u(e){if(null===e)return"";if(ve.isDate(e))return e.toISOString();if(!s&&ve.isBlob(e))throw new ye("Blob is not supported. Use a Buffer instead.");return ve.isArrayBuffer(e)||ve.isTypedArray(e)?s&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,r,o){var s=e;if(e&&!o&&"object"===f(e))if(ve.endsWith(r,"{}"))r=n?r:r.slice(0,-2),e=JSON.stringify(e);else if(ve.isArray(e)&&function(e){return ve.isArray(e)&&!e.some(ge)}(e)||(ve.isFileList(e)||ve.endsWith(r,"[]"))&&(s=ve.toArray(e)))return r=we(r),s.forEach((function(e,n){!ve.isUndefined(e)&&null!==e&&t.append(!0===a?Ee([r],n,i):null===a?r:r+"[]",u(e))})),!1;return!!ge(e)||(t.append(Ee(o,r,i),u(e)),!1)}var l=[],h=Object.assign(Oe,{defaultVisitor:c,convertValue:u,isVisitable:ge});if(!ve.isObject(e))throw new TypeError("data must be an object");return function e(r,n){if(!ve.isUndefined(r)){if(-1!==l.indexOf(r))throw Error("Circular reference detected in "+n.join("."));l.push(r),ve.forEach(r,(function(r,i){!0===(!(ve.isUndefined(r)||null===r)&&o.call(t,r,ve.isString(i)?i.trim():i,n,h))&&e(r,n?n.concat(i):[i])})),l.pop()}}(e),t}function xe(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Re(e,t){this._pairs=[],e&&Se(e,this,t)}var Te=Re.prototype;function ke(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function je(e,t,r){if(!t)return e;var n,o=r&&r.encode||ke,i=r&&r.serialize;if(n=i?i(t,r):ve.isURLSearchParams(t)?t.toString():new Re(t,r).toString(o)){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+n}return e}Te.append=function(e,t){this._pairs.push([e,t])},Te.toString=function(e){var t=e?function(t){return e.call(this,t,xe)}:xe;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Ae,Pe=function(){function e(){p(this,e),this.handlers=[]}return v(e,[{key:"use",value:function(e,t,r){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){ve.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),Le={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ne={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Re,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},_e="undefined"!=typeof window&&"undefined"!=typeof document,Ce=(Ae="undefined"!=typeof navigator&&navigator.product,_e&&["ReactNative","NativeScript","NS"].indexOf(Ae)<0),Fe="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,Ue=_e&&window.location.href||"http://localhost",Be=s(s({},Object.freeze({__proto__:null,hasBrowserEnv:_e,hasStandardBrowserWebWorkerEnv:Fe,hasStandardBrowserEnv:Ce,origin:Ue})),Ne);function De(e){function t(e,r,n,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),s=o>=e.length;return i=!i&&ve.isArray(n)?n.length:i,s?(ve.hasOwnProp(n,i)?n[i]=[n[i],r]:n[i]=r,!a):(n[i]&&ve.isObject(n[i])||(n[i]=[]),t(e,r,n[i],o)&&ve.isArray(n[i])&&(n[i]=function(e){var t,r,n={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=ve.isObject(e);if(i&&ve.isHTMLForm(e)&&(e=new FormData(e)),ve.isFormData(e))return o?JSON.stringify(De(e)):e;if(ve.isArrayBuffer(e)||ve.isBuffer(e)||ve.isStream(e)||ve.isFile(e)||ve.isBlob(e)||ve.isReadableStream(e))return e;if(ve.isArrayBufferView(e))return e.buffer;if(ve.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Se(e,new Be.classes.URLSearchParams,Object.assign({visitor:function(e,t,r,n){return Be.isNode&&ve.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((r=ve.isFileList(e))||n.indexOf("multipart/form-data")>-1){var a=this.env&&this.env.FormData;return Se(r?{"files[]":e}:e,a&&new a,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,r){if(ve.isString(e))try{return(t||JSON.parse)(e),ve.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(r||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||Ie.transitional,r=t&&t.forcedJSONParsing,n="json"===this.responseType;if(ve.isResponse(e)||ve.isReadableStream(e))return e;if(e&&ve.isString(e)&&(r&&!this.responseType||n)){var o=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw ye.from(e,ye.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Be.classes.FormData,Blob:Be.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};ve.forEach(["delete","get","head","post","put","patch"],(function(e){Ie.headers[e]={}}));var qe=Ie,Me=ve.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ze=Symbol("internals");function He(e){return e&&String(e).trim().toLowerCase()}function Je(e){return!1===e||null==e?e:ve.isArray(e)?e.map(Je):String(e)}function We(e,t,r,n,o){return ve.isFunction(n)?n.call(this,t,r):(o&&(t=r),ve.isString(t)?ve.isString(n)?-1!==t.indexOf(n):ve.isRegExp(n)?n.test(t):void 0:void 0)}var Ge=function(e,t){function r(e){p(this,r),e&&this.set(e)}return v(r,[{key:"set",value:function(e,t,r){var n=this;function o(e,t,r){var o=He(t);if(!o)throw new Error("header name must be a non-empty string");var i=ve.findKey(n,o);(!i||void 0===n[i]||!0===r||void 0===r&&!1!==n[i])&&(n[i||t]=Je(e))}var i=function(e,t){return ve.forEach(e,(function(e,r){return o(e,r,t)}))};if(ve.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(ve.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,r,n,o={};return e&&e.split("\n").forEach((function(e){n=e.indexOf(":"),t=e.substring(0,n).trim().toLowerCase(),r=e.substring(n+1).trim(),!t||o[t]&&Me[t]||("set-cookie"===t?o[t]?o[t].push(r):o[t]=[r]:o[t]=o[t]?o[t]+", "+r:r)})),o}(e),t);else if(ve.isHeaders(e)){var a,s=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=E(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}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 i,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw i}}}}(e.entries());try{for(s.s();!(a=s.n()).done;){var u=m(a.value,2),c=u[0];o(u[1],c,r)}}catch(e){s.e(e)}finally{s.f()}}else null!=e&&o(t,e,r);return this}},{key:"get",value:function(e,t){if(e=He(e)){var r=ve.findKey(this,e);if(r){var n=this[r];if(!t)return n;if(!0===t)return function(e){for(var t,r=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=n.exec(e);)r[t[1]]=t[2];return r}(n);if(ve.isFunction(t))return t.call(this,n,r);if(ve.isRegExp(t))return t.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=He(e)){var r=ve.findKey(this,e);return!(!r||void 0===this[r]||t&&!We(0,this[r],r,t))}return!1}},{key:"delete",value:function(e,t){var r=this,n=!1;function o(e){if(e=He(e)){var o=ve.findKey(r,e);!o||t&&!We(0,r[o],o,t)||(delete r[o],n=!0)}}return ve.isArray(e)?e.forEach(o):o(e),n}},{key:"clear",value:function(e){for(var t=Object.keys(this),r=t.length,n=!1;r--;){var o=t[r];e&&!We(0,this[o],o,e,!0)||(delete this[o],n=!0)}return n}},{key:"normalize",value:function(e){var t=this,r={};return ve.forEach(this,(function(n,o){var i=ve.findKey(r,o);if(i)return t[i]=Je(n),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=Je(n),r[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,r=new Array(t),n=0;n1?r-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,r=null,n&&(clearTimeout(n),n=null),e.apply(null,t)};return[function(){for(var e=Date.now(),t=e-o,s=arguments.length,u=new Array(s),c=0;c=i?a(u,e):(r=u,n||(n=setTimeout((function(){n=null,a(r)}),i-t)))},function(){return r&&a(r)}]}ve.inherits($e,ye,{__CANCEL__:!0});var et=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,n=0,o=Qe(50,250);return Ze((function(r){var i=r.loaded,a=r.lengthComputable?r.total:void 0,s=i-n,u=o(s);n=i;var c=y({loaded:i,total:a,progress:a?i/a:void 0,bytes:s,rate:u||void 0,estimated:u&&a&&i<=a?(a-i)/u:void 0,event:r,lengthComputable:null!=a},t?"download":"upload",!0);e(c)}),r)},tt=function(e,t){var r=null!=e;return[function(n){return t[0]({lengthComputable:r,total:e,loaded:n})},t[1]]},rt=function(e){return function(){for(var t=arguments.length,r=new Array(t),n=0;n1?t-1:0),n=1;n1?"since :\n"+s.map(kt).join("\n"):" "+kt(s[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return r};function Pt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new $e(null,e)}function Lt(e){return Pt(e),e.headers=Ke.from(e.headers),e.data=Ve.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),At(e.adapter||qe.adapter)(e).then((function(t){return Pt(e),t.data=Ve.call(e,e.transformResponse,t),t.headers=Ke.from(t.headers),t}),(function(t){return Xe(t)||(Pt(e),t&&t.response&&(t.response.data=Ve.call(e,e.transformResponse,t.response),t.response.headers=Ke.from(t.response.headers))),Promise.reject(t)}))}var Nt="1.7.4",_t={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){_t[e]=function(r){return f(r)===e||"a"+(t<1?"n ":" ")+e}}));var Ct={};_t.transitional=function(e,t,r){function n(e,t){return"[Axios v1.7.4] Transitional option '"+e+"'"+t+(r?". "+r:"")}return function(r,o,i){if(!1===e)throw new ye(n(o," has been removed"+(t?" in "+t:"")),ye.ERR_DEPRECATED);return t&&!Ct[o]&&(Ct[o]=!0,console.warn(n(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(r,o,i)}};var Ft={assertOptions:function(e,t,r){if("object"!==f(e))throw new ye("options must be an object",ye.ERR_BAD_OPTION_VALUE);for(var n=Object.keys(e),o=n.length;o-- >0;){var i=n[o],a=t[i];if(a){var s=e[i],u=void 0===s||a(s,i,e);if(!0!==u)throw new ye("option "+i+" must be "+u,ye.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new ye("Unknown option "+i,ye.ERR_BAD_OPTION)}},validators:_t},Ut=Ft.validators,Bt=function(){function e(t){p(this,e),this.defaults=t,this.interceptors={request:new Pe,response:new Pe}}var t;return v(e,[{key:"request",value:(t=h(u().mark((function e(t,r){var n,o;return u().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this._request(t,r);case 3:return e.abrupt("return",e.sent);case 6:if(e.prev=6,e.t0=e.catch(0),e.t0 instanceof Error){Error.captureStackTrace?Error.captureStackTrace(n={}):n=new Error,o=n.stack?n.stack.replace(/^.+\n/,""):"";try{e.t0.stack?o&&!String(e.t0.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(e.t0.stack+="\n"+o):e.t0.stack=o}catch(e){}}throw e.t0;case 10:case"end":return e.stop()}}),e,this,[[0,6]])}))),function(e,r){return t.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var r=t=st(this.defaults,t),n=r.transitional,o=r.paramsSerializer,i=r.headers;void 0!==n&&Ft.assertOptions(n,{silentJSONParsing:Ut.transitional(Ut.boolean),forcedJSONParsing:Ut.transitional(Ut.boolean),clarifyTimeoutError:Ut.transitional(Ut.boolean)},!1),null!=o&&(ve.isFunction(o)?t.paramsSerializer={serialize:o}:Ft.assertOptions(o,{encode:Ut.function,serialize:Ut.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&ve.merge(i.common,i[t.method]);i&&ve.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete i[e]})),t.headers=Ke.concat(a,i);var s=[],u=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(u=u&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,h=0;if(!u){var p=[Lt.bind(this),void 0];for(p.unshift.apply(p,s),p.push.apply(p,f),l=p.length,c=Promise.resolve(t);h0;)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},t((function(e,t,o){n.reason||(n.reason=new $e(e,t,o),r(n.reason))}))}return v(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}(),qt=It;var Mt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Mt).forEach((function(e){var t=m(e,2),r=t[0],n=t[1];Mt[n]=r}));var zt=Mt;var Ht=function e(t){var r=new Dt(t),n=x(Dt.prototype.request,r);return ve.extend(n,Dt.prototype,r,{allOwnKeys:!0}),ve.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return e(st(t,r))},n}(qe);return Ht.Axios=Dt,Ht.CanceledError=$e,Ht.CancelToken=qt,Ht.isCancel=Xe,Ht.VERSION=Nt,Ht.toFormData=Se,Ht.AxiosError=ye,Ht.Cancel=Ht.CanceledError,Ht.all=function(e){return Promise.all(e)},Ht.spread=function(e){return function(t){return e.apply(null,t)}},Ht.isAxiosError=function(e){return ve.isObject(e)&&!0===e.isAxiosError},Ht.mergeConfig=st,Ht.AxiosHeaders=Ke,Ht.formToJSON=function(e){return De(ve.isHTMLForm(e)?new FormData(e):e)},Ht.getAdapter=At,Ht.HttpStatusCode=zt,Ht.default=Ht,Ht})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e){var r,n;function o(r,n){try{var a=e[r](n),u=a.value,s=u instanceof t;Promise.resolve(s?u.v:u).then((function(t){if(s){var n="return"===r?"return":"next";if(!u.k||t.done)return o(n,t);t=e[n](t).value}i(a.done?"return":"normal",t)}),(function(e){o("throw",e)}))}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":r.resolve({value:t,done:!0});break;case"throw":r.reject(t);break;default:r.resolve({value:t,done:!1})}(r=r.next)?o(r.key,r.arg):n=null}this._invoke=function(e,t){return new Promise((function(i,a){var u={key:e,arg:t,resolve:i,reject:a,next:null};n?n=n.next=u:(r=n=u,o(e,t))}))},"function"!=typeof e.return&&(this.return=void 0)}function t(e,t){this.v=e,this.k=t}function r(e){var r={},n=!1;function o(r,o){return n=!0,o=new Promise((function(t){t(e[r](o))})),{done:!1,value:new t(o,1)}}return r["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},r.next=function(e){return n?(n=!1,e):o("next",e)},"function"==typeof e.throw&&(r.throw=function(e){if(n)throw n=!1,e;return o("throw",e)}),"function"==typeof e.return&&(r.return=function(e){return n?(n=!1,e):o("return",e)}),r}function n(e){var t,r,n,i=2;for("undefined"!=typeof Symbol&&(r=Symbol.asyncIterator,n=Symbol.iterator);i--;){if(r&&null!=(t=e[r]))return t.call(e);if(n&&null!=(t=e[n]))return new o(t.call(e));r="@@asyncIterator",n="@@iterator"}throw new TypeError("Object is not async iterable")}function o(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return o=function(e){this.s=e,this.n=e.next},o.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var r=this.s.return;return void 0===r?Promise.resolve({value:e,done:!0}):t(r.apply(this.s,arguments))},throw:function(e){var r=this.s.return;return void 0===r?Promise.reject(e):t(r.apply(this.s,arguments))}},new o(e)}function i(e){return new t(e,0)}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(s&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),j(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;j(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:L(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function l(t){return function(){return new e(t.apply(this,arguments))}}function h(e,t,r,n,o,i,a){try{var u=e[i](a),s=u.value}catch(e){return void r(e)}u.done?t(s):Promise.resolve(s).then(n,o)}function p(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){h(i,n,o,a,u,"next",e)}function u(e){h(i,n,o,a,u,"throw",e)}a(void 0)}))}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function v(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r2&&void 0!==arguments[2]?arguments[2]:{},i=o.allOwnKeys,a=void 0!==i&&i;if(null!=e)if("object"!==f(e)&&(e=[e]),N(e))for(r=0,n=e.length;r0;)if(t===(r=n[o]).toLowerCase())return r;return null}var Q="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Z=function(e){return!_(e)&&e!==Q};var ee,te=(ee="undefined"!=typeof Uint8Array&&A(Uint8Array),function(e){return ee&&e instanceof ee}),re=P("HTMLFormElement"),ne=function(e){var t=Object.prototype.hasOwnProperty;return function(e,r){return t.call(e,r)}}(),oe=P("RegExp"),ie=function(e,t){var r=Object.getOwnPropertyDescriptors(e),n={};$(r,(function(r,o){var i;!1!==(i=t(r,o,e))&&(n[o]=i||r)})),Object.defineProperties(e,n)},ae="abcdefghijklmnopqrstuvwxyz",ue="0123456789",se={DIGIT:ue,ALPHA:ae,ALPHA_DIGIT:ae+ae.toUpperCase()+ue};var ce,fe,le,he,pe=P("AsyncFunction"),de=(ce="function"==typeof setImmediate,fe=U(Q.postMessage),ce?setImmediate:fe?(le="axios@".concat(Math.random()),he=[],Q.addEventListener("message",(function(e){var t=e.source,r=e.data;t===Q&&r===le&&he.length&&he.shift()()}),!1),function(e){he.push(e),Q.postMessage(le,"*")}):function(e){return setTimeout(e)}),ve="undefined"!=typeof queueMicrotask?queueMicrotask.bind(Q):"undefined"!=typeof process&&process.nextTick||de,ye={isArray:N,isArrayBuffer:C,isBuffer:function(e){return null!==e&&!_(e)&&null!==e.constructor&&!_(e.constructor)&&U(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:function(e){var t;return e&&("function"==typeof FormData&&e instanceof FormData||U(e.append)&&("formdata"===(t=j(e))||"object"===t&&U(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&C(e.buffer)},isString:F,isNumber:B,isBoolean:function(e){return!0===e||!1===e},isObject:D,isPlainObject:I,isReadableStream:G,isRequest:K,isResponse:V,isHeaders:X,isUndefined:_,isDate:q,isFile:M,isBlob:z,isRegExp:oe,isFunction:U,isStream:function(e){return D(e)&&U(e.pipe)},isURLSearchParams:J,isTypedArray:te,isFileList:H,forEach:$,merge:function e(){for(var t=Z(this)&&this||{},r=t.caseless,n={},o=function(t,o){var i=r&&Y(n,o)||o;I(n[i])&&I(t)?n[i]=e(n[i],t):I(t)?n[i]=e({},t):N(t)?n[i]=t.slice():n[i]=t},i=0,a=arguments.length;i3&&void 0!==arguments[3]?arguments[3]:{},o=n.allOwnKeys;return $(t,(function(t,n){r&&U(t)?e[n]=R(t,r):e[n]=t}),{allOwnKeys:o}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,r,n){e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},toFlatObject:function(e,t,r,n){var o,i,a,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],n&&!n(a,e,t)||u[a]||(t[a]=e[a],u[a]=!0);e=!1!==r&&A(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:j,kindOfTest:P,endsWith:function(e,t,r){e=String(e),(void 0===r||r>e.length)&&(r=e.length),r-=t.length;var n=e.indexOf(t,r);return-1!==n&&n===r},toArray:function(e){if(!e)return null;if(N(e))return e;var t=e.length;if(!B(t))return null;for(var r=new Array(t);t-- >0;)r[t]=e[t];return r},forEachEntry:function(e,t){for(var r,n=(e&&e[Symbol.iterator]).call(e);(r=n.next())&&!r.done;){var o=r.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var r,n=[];null!==(r=e.exec(t));)n.push(r);return n},isHTMLForm:re,hasOwnProperty:ne,hasOwnProp:ne,reduceDescriptors:ie,freezeMethods:function(e){ie(e,(function(t,r){if(U(e)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;var n=e[r];U(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+r+"'")}))}))},toObjectSet:function(e,t){var r={},n=function(e){e.forEach((function(e){r[e]=!0}))};return N(e)?n(e):n(String(e).split(t)),r},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:Y,global:Q,isContextDefined:Z,ALPHABET:se,generateString:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:16,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:se.ALPHA_DIGIT,r="",n=t.length;e--;)r+=t[Math.random()*n|0];return r},isSpecCompliantForm:function(e){return!!(e&&U(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:function(e){var t=new Array(10);return function e(r,n){if(D(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[n]=r;var o=N(r)?[]:{};return $(r,(function(t,r){var i=e(t,n+1);!_(i)&&(o[r]=i)})),t[n]=void 0,o}}return r}(e,0)},isAsyncFn:pe,isThenable:function(e){return e&&(D(e)||U(e))&&U(e.then)&&U(e.catch)},setImmediate:de,asap:ve};function me(e,t,r,n,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),o&&(this.response=o,this.status=o.status?o.status:null)}ye.inherits(me,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:ye.toJSONObject(this.config),code:this.code,status:this.status}}});var be=me.prototype,ge={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){ge[e]={value:e}})),Object.defineProperties(me,ge),Object.defineProperty(be,"isAxiosError",{value:!0}),me.from=function(e,t,r,n,o,i){var a=Object.create(be);return ye.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),me.call(a,e.message,t,r,n,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};function we(e){return ye.isPlainObject(e)||ye.isArray(e)}function Ee(e){return ye.endsWith(e,"[]")?e.slice(0,-2):e}function Oe(e,t,r){return e?e.concat(t).map((function(e,t){return e=Ee(e),!r&&t?"["+e+"]":e})).join(r?".":""):t}var Se=ye.toFlatObject(ye,{},null,(function(e){return/^is[A-Z]/.test(e)}));function xe(e,t,r){if(!ye.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var n=(r=ye.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!ye.isUndefined(t[e])}))).metaTokens,o=r.visitor||c,i=r.dots,a=r.indexes,u=(r.Blob||"undefined"!=typeof Blob&&Blob)&&ye.isSpecCompliantForm(t);if(!ye.isFunction(o))throw new TypeError("visitor must be a function");function s(e){if(null===e)return"";if(ye.isDate(e))return e.toISOString();if(!u&&ye.isBlob(e))throw new me("Blob is not supported. Use a Buffer instead.");return ye.isArrayBuffer(e)||ye.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,r,o){var u=e;if(e&&!o&&"object"===f(e))if(ye.endsWith(r,"{}"))r=n?r:r.slice(0,-2),e=JSON.stringify(e);else if(ye.isArray(e)&&function(e){return ye.isArray(e)&&!e.some(we)}(e)||(ye.isFileList(e)||ye.endsWith(r,"[]"))&&(u=ye.toArray(e)))return r=Ee(r),u.forEach((function(e,n){!ye.isUndefined(e)&&null!==e&&t.append(!0===a?Oe([r],n,i):null===a?r:r+"[]",s(e))})),!1;return!!we(e)||(t.append(Oe(o,r,i),s(e)),!1)}var l=[],h=Object.assign(Se,{defaultVisitor:c,convertValue:s,isVisitable:we});if(!ye.isObject(e))throw new TypeError("data must be an object");return function e(r,n){if(!ye.isUndefined(r)){if(-1!==l.indexOf(r))throw Error("Circular reference detected in "+n.join("."));l.push(r),ye.forEach(r,(function(r,i){!0===(!(ye.isUndefined(r)||null===r)&&o.call(t,r,ye.isString(i)?i.trim():i,n,h))&&e(r,n?n.concat(i):[i])})),l.pop()}}(e),t}function Re(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Te(e,t){this._pairs=[],e&&xe(e,this,t)}var ke=Te.prototype;function Ae(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function je(e,t,r){if(!t)return e;var n,o=r&&r.encode||Ae,i=r&&r.serialize;if(n=i?i(t,r):ye.isURLSearchParams(t)?t.toString():new Te(t,r).toString(o)){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+n}return e}ke.append=function(e,t){this._pairs.push([e,t])},ke.toString=function(e){var t=e?function(t){return e.call(this,t,Re)}:Re;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Pe=function(){function e(){d(this,e),this.handlers=[]}return y(e,[{key:"use",value:function(e,t,r){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){ye.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),Le={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ne={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Te,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},_e="undefined"!=typeof window&&"undefined"!=typeof document,Ce="object"===("undefined"==typeof navigator?"undefined":f(navigator))&&navigator||void 0,Fe=_e&&(!Ce||["ReactNative","NativeScript","NS"].indexOf(Ce.product)<0),Ue="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,Be=_e&&window.location.href||"http://localhost",De=u(u({},Object.freeze({__proto__:null,hasBrowserEnv:_e,hasStandardBrowserWebWorkerEnv:Ue,hasStandardBrowserEnv:Fe,navigator:Ce,origin:Be})),Ne);function Ie(e){function t(e,r,n,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),u=o>=e.length;return i=!i&&ye.isArray(n)?n.length:i,u?(ye.hasOwnProp(n,i)?n[i]=[n[i],r]:n[i]=r,!a):(n[i]&&ye.isObject(n[i])||(n[i]=[]),t(e,r,n[i],o)&&ye.isArray(n[i])&&(n[i]=function(e){var t,r,n={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=ye.isObject(e);if(i&&ye.isHTMLForm(e)&&(e=new FormData(e)),ye.isFormData(e))return o?JSON.stringify(Ie(e)):e;if(ye.isArrayBuffer(e)||ye.isBuffer(e)||ye.isStream(e)||ye.isFile(e)||ye.isBlob(e)||ye.isReadableStream(e))return e;if(ye.isArrayBufferView(e))return e.buffer;if(ye.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return xe(e,new De.classes.URLSearchParams,Object.assign({visitor:function(e,t,r,n){return De.isNode&&ye.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((r=ye.isFileList(e))||n.indexOf("multipart/form-data")>-1){var a=this.env&&this.env.FormData;return xe(r?{"files[]":e}:e,a&&new a,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,r){if(ye.isString(e))try{return(t||JSON.parse)(e),ye.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(r||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||qe.transitional,r=t&&t.forcedJSONParsing,n="json"===this.responseType;if(ye.isResponse(e)||ye.isReadableStream(e))return e;if(e&&ye.isString(e)&&(r&&!this.responseType||n)){var o=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw me.from(e,me.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:De.classes.FormData,Blob:De.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};ye.forEach(["delete","get","head","post","put","patch"],(function(e){qe.headers[e]={}}));var Me=qe,ze=ye.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),He=Symbol("internals");function Je(e){return e&&String(e).trim().toLowerCase()}function We(e){return!1===e||null==e?e:ye.isArray(e)?e.map(We):String(e)}function Ge(e,t,r,n,o){return ye.isFunction(n)?n.call(this,t,r):(o&&(t=r),ye.isString(t)?ye.isString(n)?-1!==t.indexOf(n):ye.isRegExp(n)?n.test(t):void 0:void 0)}var Ke=function(e,t){function r(e){d(this,r),e&&this.set(e)}return y(r,[{key:"set",value:function(e,t,r){var n=this;function o(e,t,r){var o=Je(t);if(!o)throw new Error("header name must be a non-empty string");var i=ye.findKey(n,o);(!i||void 0===n[i]||!0===r||void 0===r&&!1!==n[i])&&(n[i||t]=We(e))}var i=function(e,t){return ye.forEach(e,(function(e,r){return o(e,r,t)}))};if(ye.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(ye.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,r,n,o={};return e&&e.split("\n").forEach((function(e){n=e.indexOf(":"),t=e.substring(0,n).trim().toLowerCase(),r=e.substring(n+1).trim(),!t||o[t]&&ze[t]||("set-cookie"===t?o[t]?o[t].push(r):o[t]=[r]:o[t]=o[t]?o[t]+", "+r:r)})),o}(e),t);else if(ye.isHeaders(e)){var a,u=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=O(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}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 i,a=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){u=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e.entries());try{for(u.s();!(a=u.n()).done;){var s=b(a.value,2),c=s[0];o(s[1],c,r)}}catch(e){u.e(e)}finally{u.f()}}else null!=e&&o(t,e,r);return this}},{key:"get",value:function(e,t){if(e=Je(e)){var r=ye.findKey(this,e);if(r){var n=this[r];if(!t)return n;if(!0===t)return function(e){for(var t,r=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=n.exec(e);)r[t[1]]=t[2];return r}(n);if(ye.isFunction(t))return t.call(this,n,r);if(ye.isRegExp(t))return t.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Je(e)){var r=ye.findKey(this,e);return!(!r||void 0===this[r]||t&&!Ge(0,this[r],r,t))}return!1}},{key:"delete",value:function(e,t){var r=this,n=!1;function o(e){if(e=Je(e)){var o=ye.findKey(r,e);!o||t&&!Ge(0,r[o],o,t)||(delete r[o],n=!0)}}return ye.isArray(e)?e.forEach(o):o(e),n}},{key:"clear",value:function(e){for(var t=Object.keys(this),r=t.length,n=!1;r--;){var o=t[r];e&&!Ge(0,this[o],o,e,!0)||(delete this[o],n=!0)}return n}},{key:"normalize",value:function(e){var t=this,r={};return ye.forEach(this,(function(n,o){var i=ye.findKey(r,o);if(i)return t[i]=We(n),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=We(n),r[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,r=new Array(t),n=0;n1?r-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,r=null,n&&(clearTimeout(n),n=null),e.apply(null,t)};return[function(){for(var e=Date.now(),t=e-o,u=arguments.length,s=new Array(u),c=0;c=i?a(s,e):(r=s,n||(n=setTimeout((function(){n=null,a(r)}),i-t)))},function(){return r&&a(r)}]}ye.inherits(Ye,me,{__CANCEL__:!0});var tt=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,n=0,o=Ze(50,250);return et((function(r){var i=r.loaded,a=r.lengthComputable?r.total:void 0,u=i-n,s=o(u);n=i;var c=m({loaded:i,total:a,progress:a?i/a:void 0,bytes:u,rate:s||void 0,estimated:s&&a&&i<=a?(a-i)/s:void 0,event:r,lengthComputable:null!=a},t?"download":"upload",!0);e(c)}),r)},rt=function(e,t){var r=null!=e;return[function(n){return t[0]({lengthComputable:r,total:e,loaded:n})},t[1]]},nt=function(e){return function(){for(var t=arguments.length,r=new Array(t),n=0;n1?t-1:0),n=1;n1?"since :\n"+u.map(jt).join("\n"):" "+jt(u[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return r};function Nt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ye(null,e)}function _t(e){return Nt(e),e.headers=Ve.from(e.headers),e.data=Xe.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Lt(e.adapter||Me.adapter)(e).then((function(t){return Nt(e),t.data=Xe.call(e,e.transformResponse,t),t.headers=Ve.from(t.headers),t}),(function(t){return $e(t)||(Nt(e),t&&t.response&&(t.response.data=Xe.call(e,e.transformResponse,t.response),t.response.headers=Ve.from(t.response.headers))),Promise.reject(t)}))}var Ct="1.7.7",Ft={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Ft[e]=function(r){return f(r)===e||"a"+(t<1?"n ":" ")+e}}));var Ut={};Ft.transitional=function(e,t,r){function n(e,t){return"[Axios v1.7.7] Transitional option '"+e+"'"+t+(r?". "+r:"")}return function(r,o,i){if(!1===e)throw new me(n(o," has been removed"+(t?" in "+t:"")),me.ERR_DEPRECATED);return t&&!Ut[o]&&(Ut[o]=!0,console.warn(n(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(r,o,i)}};var Bt={assertOptions:function(e,t,r){if("object"!==f(e))throw new me("options must be an object",me.ERR_BAD_OPTION_VALUE);for(var n=Object.keys(e),o=n.length;o-- >0;){var i=n[o],a=t[i];if(a){var u=e[i],s=void 0===u||a(u,i,e);if(!0!==s)throw new me("option "+i+" must be "+s,me.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new me("Unknown option "+i,me.ERR_BAD_OPTION)}},validators:Ft},Dt=Bt.validators,It=function(){function e(t){d(this,e),this.defaults=t,this.interceptors={request:new Pe,response:new Pe}}var t;return y(e,[{key:"request",value:(t=p(s().mark((function e(t,r){var n,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this._request(t,r);case 3:return e.abrupt("return",e.sent);case 6:if(e.prev=6,e.t0=e.catch(0),e.t0 instanceof Error){Error.captureStackTrace?Error.captureStackTrace(n={}):n=new Error,o=n.stack?n.stack.replace(/^.+\n/,""):"";try{e.t0.stack?o&&!String(e.t0.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(e.t0.stack+="\n"+o):e.t0.stack=o}catch(e){}}throw e.t0;case 10:case"end":return e.stop()}}),e,this,[[0,6]])}))),function(e,r){return t.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var r=t=st(this.defaults,t),n=r.transitional,o=r.paramsSerializer,i=r.headers;void 0!==n&&Bt.assertOptions(n,{silentJSONParsing:Dt.transitional(Dt.boolean),forcedJSONParsing:Dt.transitional(Dt.boolean),clarifyTimeoutError:Dt.transitional(Dt.boolean)},!1),null!=o&&(ye.isFunction(o)?t.paramsSerializer={serialize:o}:Bt.assertOptions(o,{encode:Dt.function,serialize:Dt.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&ye.merge(i.common,i[t.method]);i&&ye.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete i[e]})),t.headers=Ve.concat(a,i);var u=[],s=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,u.unshift(e.fulfilled,e.rejected))}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,h=0;if(!s){var p=[_t.bind(this),void 0];for(p.unshift.apply(p,u),p.push.apply(p,f),l=p.length,c=Promise.resolve(t);h0;)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},t((function(e,t,o){n.reason||(n.reason=new Ye(e,t,o),r(n.reason))}))}return y(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,r=function(e){t.abort(e)};return this.subscribe(r),t.signal.unsubscribe=function(){return e.unsubscribe(r)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}(),zt=Mt;var Ht={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ht).forEach((function(e){var t=b(e,2),r=t[0],n=t[1];Ht[n]=r}));var Jt=Ht;var Wt=function e(t){var r=new qt(t),n=R(qt.prototype.request,r);return ye.extend(n,qt.prototype,r,{allOwnKeys:!0}),ye.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return e(st(t,r))},n}(Me);return Wt.Axios=qt,Wt.CanceledError=Ye,Wt.CancelToken=zt,Wt.isCancel=$e,Wt.VERSION=Ct,Wt.toFormData=xe,Wt.AxiosError=me,Wt.Cancel=Wt.CanceledError,Wt.all=function(e){return Promise.all(e)},Wt.spread=function(e){return function(t){return e.apply(null,t)}},Wt.isAxiosError=function(e){return ye.isObject(e)&&!0===e.isAxiosError},Wt.mergeConfig=st,Wt.AxiosHeaders=Ve,Wt.formToJSON=function(e){return Ie(ye.isHTMLForm(e)?new FormData(e):e)},Wt.getAdapter=Lt,Wt.HttpStatusCode=Jt,Wt.default=Wt,Wt})); //# sourceMappingURL=axios.min.js.map /*! DataTables 1.13.11 diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 37f756fcd..64aef2acb 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,7 +1,7 @@ { - "/css/tailwind.css": "/css/tailwind.css?id=820650f050ef247ccfa8ba5af9ebe760", - "/js/ixp-pack.js": "/js/ixp-pack.js?id=447b77cec4ebc63face685b134faa221", - "/css/ixp-pack.css": "/css/ixp-pack.css?id=8f01a58283ab554aafb3eafe61b15cf6", + "/css/tailwind.css": "/css/tailwind.css?id=edeab1bbe825beb0b479da43f0531284", + "/js/ixp-pack.js": "/js/ixp-pack.js?id=aa4b6148295dbacae9adf143436b8e29", + "/css/ixp-pack.css": "/css/ixp-pack.css?id=a42a7a2792292ff166a1bf077220f0ab", "/fonts/FontAwesome.otf": "/fonts/FontAwesome.otf?id=663236d7aa447620b641032d1b7be57c", "/fonts/fontawesome-webfont.eot": "/fonts/fontawesome-webfont.eot?id=016fa45033a942ffecadc970f22fe41b", "/fonts/fontawesome-webfont.svg": "/fonts/fontawesome-webfont.svg?id=912ec66d7572ff821749319396470bde", diff --git a/resources/views/search/do.foil.php b/resources/views/search/do.foil.php index ccddbfd6e..56c2ae5ef 100644 --- a/resources/views/search/do.foil.php +++ b/resources/views/search/do.foil.php @@ -89,7 +89,7 @@ $cust->id, "type" => "agg" ] ) ?>"> Statistics - + P2P $cust->id, "tab" => "users" ] ) ?>"> diff --git a/resources/views/statistics/p2p-single.foil.php b/resources/views/statistics/p2p-single.foil.php index a85143c8d..26b333450 100644 --- a/resources/views/statistics/p2p-single.foil.php +++ b/resources/views/statistics/p2p-single.foil.php @@ -37,7 +37,7 @@ section( 'page-header-postamble' ) ?> - P2P Overview + P2P Overview append() ?> diff --git a/tests/Services/Grapher/Graph/Access/Web/P2pWebAccessTest.php b/tests/Services/Grapher/Graph/Access/Web/P2pWebAccessTest.php index f01fe67cb..0d2c9b0d5 100644 --- a/tests/Services/Grapher/Graph/Access/Web/P2pWebAccessTest.php +++ b/tests/Services/Grapher/Graph/Access/Web/P2pWebAccessTest.php @@ -48,23 +48,23 @@ class P2pWebAccessTest extends Access public function testApiPublicAccess(): void { // this should be the default - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); // force the default Config::set( 'grapher.access.p2p', 'own_graphs_only' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); // force public access Config::set( 'grapher.access.p2p', 0 ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); } @@ -76,33 +76,33 @@ public function testApiPublicAccess(): void public function testWebNonPublicAccess(): void { Config::set( 'grapher.access.p2p', '1' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); Config::set( 'grapher.access.p2p', '2' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); Config::set( 'grapher.access.p2p', '3' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); Config::set( 'grapher.access.p2p', 'blah' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); Config::set( 'grapher.access.p2p', null ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); } @@ -114,39 +114,39 @@ public function testWebNonPublicAccess(): void public function testWebOwnUserCustUserAccess(): void { Config::set( 'grapher.access.p2p', 'own_graphs_only' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); // customer user - $response = $this->actingAs( $this->getCustUser( 'hecustuser' ) )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustUser( 'hecustuser' ) )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getCustUser( 'hecustuser' ) )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustUser( 'hecustuser' ) )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); // customer admin user - $response = $this->actingAs( $this->getCustAdminUser( 'hecustadmin' ) )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustAdminUser( 'hecustadmin' ) )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getCustAdminUser( 'hecustadmin' ) )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustAdminUser( 'hecustadmin' ) )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); // non-customer user - $response = $this->actingAs( $this->getCustUser( 'imcustuser' ) )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustUser( 'imcustuser' ) )->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustUser( 'imcustuser' ) )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustUser( 'imcustuser' ) )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); // non-customer admin user - $response = $this->actingAs( $this->getCustAdminUser( 'imcustadmin' ) )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustAdminUser( 'imcustadmin' ) )->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustAdminUser( 'imcustadmin' ) )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustAdminUser( 'imcustadmin' ) )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); // superadmin - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); } @@ -158,24 +158,24 @@ public function testWebOwnUserCustUserAccess(): void public function testWebCustUserAccess(): void { Config::set( 'grapher.access.p2p', '1' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); - $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); } @@ -187,24 +187,24 @@ public function testWebCustUserAccess(): void public function testWebCustAdminAccess(): void { Config::set( 'grapher.access.p2p', '2' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); } @@ -216,24 +216,24 @@ public function testWebCustAdminAccess(): void public function testWebSuperuserAccess(): void { Config::set( 'grapher.access.p2p', '3' ); - $response = $this->get('/statistics/p2p/2'); + $response = $this->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2ps/2'); $response->assertStatus(403); - $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getCustAdminUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(403); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2ps/2'); $response->assertStatus(200); - $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/2?svli=1&dvli=6&protocol=ipv6'); + $response = $this->actingAs( $this->getSuperUser() )->get('/statistics/p2p/1/6?protocol=ipv6'); $response->assertStatus(200); } } \ No newline at end of file